View Javadoc

1   package org.andromda.cartridges.spring.metafacades;
2   
3   import java.util.Collection;
4   import java.util.Iterator;
5   
6   import org.andromda.cartridges.spring.SpringProfile;
7   import org.andromda.metafacades.uml.ClassifierFacade;
8   import org.andromda.metafacades.uml.ModelElementFacade;
9   import org.andromda.metafacades.uml.ParameterFacade;
10  import org.andromda.metafacades.uml.UMLProfile;
11  import org.apache.commons.lang.StringUtils;
12  
13  /***
14   * @see org.andromda.cartridges.hibernate.metafacades.SpringQueryOperation Metaclass facade implementation.
15   */
16  public class SpringQueryOperationLogicImpl
17          extends SpringQueryOperationLogic
18  {
19  
20      public SpringQueryOperationLogicImpl(Object metaObject, String context)
21      {
22          super(metaObject, context);
23      }
24  
25      /***
26       * @see org.andromda.cartridges.spring.metafacades.HibernateFinderMethod#getQuery()
27       */
28      protected String handleGetQuery()
29      {
30          return this.getQuery((SpringEntity)null);
31      }
32  
33      /***
34       * Stores the translated query so that its only translated once.
35       */
36      private String translatedQuery = null;
37  
38      /***
39       * Retrieves the translated query.
40       */
41      private String getTranslatedQuery()
42      {
43          if (this.translatedQuery == null)
44          {
45              this.translatedQuery = super.getQuery("query.Hibernate-QL");
46          }
47          return this.translatedQuery;
48      }
49  
50      /***
51       * Stores whether or not named parameters should be used in hibernate queries.
52       */
53      private static final String USE_NAMED_PARAMETERS = "hibernateQueryUseNamedParameters";
54  
55      /***
56       * @see org.andromda.cartridges.spring.metafacades.HibernateFinderMethod#isUseNamedParameters()
57       */
58      protected boolean handleIsUseNamedParameters()
59      {
60          boolean useNamedParameters = Boolean.valueOf(String.valueOf(this.getConfiguredProperty(USE_NAMED_PARAMETERS)))
61                  .booleanValue()
62                  || StringUtils.isNotBlank(this.getTranslatedQuery());
63  
64          return SpringMetafacadeUtils.getUseNamedParameters(this, useNamedParameters);
65      }
66  
67      /***
68       * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#isCriteriaFinder()
69       */
70      protected boolean handleIsCriteriaFinder()
71      {
72          return this.getCriteriaArgument() != null;
73      }
74  
75      /***
76       * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#getCriteriaArgument()
77       */
78      protected ParameterFacade handleGetCriteriaArgument()
79      {
80          ParameterFacade foundParameter = null;
81          for (final Iterator iterator = this.getParameters().iterator(); iterator.hasNext();)
82          {
83              final ParameterFacade parameter = (ParameterFacade)iterator.next();
84              final ClassifierFacade type = parameter.getType();
85              if (type != null && type.hasStereotype(UMLProfile.STEREOTYPE_CRITERIA))
86              {
87                  foundParameter = parameter;
88                  break;
89              }
90          }
91          return foundParameter;
92      }
93  
94      /***
95       * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#getQuery(org.andromda.cartridges.spring.metafacades.SpringEntity)
96       */
97      protected String handleGetQuery(SpringEntity entity)
98      {
99          // first see if we can retrieve the query from the super class as an OCL
100         // translation
101         String queryString = this.getTranslatedQuery();
102 
103         // otherwise see if there is a query stored as a tagged value
104         if (StringUtils.isEmpty(queryString))
105         {
106             Object value = this.findTaggedValue(SpringProfile.TAGGEDVALUE_HIBERNATE_QUERY);
107             queryString = (String)value;
108             if (queryString != null)
109             {
110                 // remove any excess whitespace
111                 queryString = queryString.replaceAll("[$//s]+", " ");
112             }
113         }
114 
115         // if there wasn't any stored query, create one by default.
116         if (StringUtils.isEmpty(queryString))
117         {
118             ModelElementFacade owner;
119             if (entity == null)
120             {
121                 owner = this.getOwner();
122             }
123             else
124             {
125                 owner = entity;
126             }
127             String variableName = StringUtils.uncapitalize(owner.getName());
128             queryString = "from " + owner.getFullyQualifiedName() + " as " + variableName;
129             if (this.getArguments().size() > 0)
130             {
131                 queryString = queryString + " where";
132                 Collection arguments = this.getArguments();
133                 if (arguments != null && !arguments.isEmpty())
134                 {
135                     Iterator argumentIt = arguments.iterator();
136                     for (int ctr = 0; argumentIt.hasNext(); ctr++)
137                     {
138                         ParameterFacade argument = (ParameterFacade)argumentIt.next();
139                         String parameter = "?";
140                         if (this.isUseNamedParameters())
141                         {
142                             parameter = ":" + argument.getName();
143                         }
144                         queryString = queryString + " " + variableName + "." + argument.getName() + " = " + parameter;
145                         if (argumentIt.hasNext())
146                         {
147                             queryString = queryString + " and";
148                         }
149                     }
150                 }
151             }
152         }
153         return queryString;
154     }
155 }