001: package org.andromda.cartridges.spring.metafacades;
002:
003: import java.util.Collection;
004: import java.util.Iterator;
005:
006: import org.andromda.cartridges.spring.SpringProfile;
007: import org.andromda.metafacades.uml.ClassifierFacade;
008: import org.andromda.metafacades.uml.ModelElementFacade;
009: import org.andromda.metafacades.uml.ParameterFacade;
010: import org.andromda.metafacades.uml.UMLProfile;
011: import org.apache.commons.lang.StringUtils;
012:
013: /**
014: * @see org.andromda.cartridges.hibernate.metafacades.SpringQueryOperation Metaclass facade implementation.
015: */
016: public class SpringQueryOperationLogicImpl extends
017: SpringQueryOperationLogic {
018:
019: public SpringQueryOperationLogicImpl(Object metaObject,
020: String context) {
021: super (metaObject, context);
022: }
023:
024: /**
025: * @see org.andromda.cartridges.spring.metafacades.HibernateFinderMethod#getQuery()
026: */
027: protected String handleGetQuery() {
028: return this .getQuery((SpringEntity) null);
029: }
030:
031: /**
032: * Stores the translated query so that its only translated once.
033: */
034: private String translatedQuery = null;
035:
036: /**
037: * Retrieves the translated query.
038: */
039: private String getTranslatedQuery() {
040: if (this .translatedQuery == null) {
041: this .translatedQuery = super .getQuery("query.Hibernate-QL");
042: }
043: return this .translatedQuery;
044: }
045:
046: /**
047: * Stores whether or not named parameters should be used in hibernate queries.
048: */
049: private static final String USE_NAMED_PARAMETERS = "hibernateQueryUseNamedParameters";
050:
051: /**
052: * @see org.andromda.cartridges.spring.metafacades.HibernateFinderMethod#isUseNamedParameters()
053: */
054: protected boolean handleIsUseNamedParameters() {
055: boolean useNamedParameters = Boolean.valueOf(
056: String.valueOf(this
057: .getConfiguredProperty(USE_NAMED_PARAMETERS)))
058: .booleanValue()
059: || StringUtils.isNotBlank(this .getTranslatedQuery());
060:
061: return SpringMetafacadeUtils.getUseNamedParameters(this ,
062: useNamedParameters);
063: }
064:
065: /**
066: * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#isCriteriaFinder()
067: */
068: protected boolean handleIsCriteriaFinder() {
069: return this .getCriteriaArgument() != null;
070: }
071:
072: /**
073: * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#getCriteriaArgument()
074: */
075: protected ParameterFacade handleGetCriteriaArgument() {
076: ParameterFacade foundParameter = null;
077: for (final Iterator iterator = this .getParameters().iterator(); iterator
078: .hasNext();) {
079: final ParameterFacade parameter = (ParameterFacade) iterator
080: .next();
081: final ClassifierFacade type = parameter.getType();
082: if (type != null
083: && type
084: .hasStereotype(UMLProfile.STEREOTYPE_CRITERIA)) {
085: foundParameter = parameter;
086: break;
087: }
088: }
089: return foundParameter;
090: }
091:
092: /**
093: * @see org.andromda.cartridges.spring.metafacades.SpringQueryOperation#getQuery(org.andromda.cartridges.spring.metafacades.SpringEntity)
094: */
095: protected String handleGetQuery(SpringEntity entity) {
096: // first see if we can retrieve the query from the super class as an OCL
097: // translation
098: String queryString = this .getTranslatedQuery();
099:
100: // otherwise see if there is a query stored as a tagged value
101: if (StringUtils.isEmpty(queryString)) {
102: Object value = this
103: .findTaggedValue(SpringProfile.TAGGEDVALUE_HIBERNATE_QUERY);
104: queryString = (String) value;
105: if (queryString != null) {
106: // remove any excess whitespace
107: queryString = queryString.replaceAll("[$\\s]+", " ");
108: }
109: }
110:
111: // if there wasn't any stored query, create one by default.
112: if (StringUtils.isEmpty(queryString)) {
113: ModelElementFacade owner;
114: if (entity == null) {
115: owner = this .getOwner();
116: } else {
117: owner = entity;
118: }
119: String variableName = StringUtils.uncapitalize(owner
120: .getName());
121: queryString = "from " + owner.getFullyQualifiedName()
122: + " as " + variableName;
123: if (this .getArguments().size() > 0) {
124: queryString = queryString + " where";
125: Collection arguments = this .getArguments();
126: if (arguments != null && !arguments.isEmpty()) {
127: Iterator argumentIt = arguments.iterator();
128: for (int ctr = 0; argumentIt.hasNext(); ctr++) {
129: ParameterFacade argument = (ParameterFacade) argumentIt
130: .next();
131: String parameter = "?";
132: if (this .isUseNamedParameters()) {
133: parameter = ":" + argument.getName();
134: }
135: queryString = queryString + " " + variableName
136: + "." + argument.getName() + " = "
137: + parameter;
138: if (argumentIt.hasNext()) {
139: queryString = queryString + " and";
140: }
141: }
142: }
143: }
144: }
145: return queryString;
146: }
147: }
|