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
100
101 String queryString = this.getTranslatedQuery();
102
103
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
111 queryString = queryString.replaceAll("[$//s]+", " ");
112 }
113 }
114
115
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 }