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