001package org.andromda.cartridges.ejb3.metafacades;
002
003import java.util.Collection;
004import org.andromda.cartridges.ejb3.EJB3Profile;
005import org.andromda.metafacades.uml.ModelElementFacade;
006import org.andromda.metafacades.uml.ParameterFacade;
007import org.apache.commons.lang.BooleanUtils;
008import org.apache.commons.lang.StringUtils;
009
010/**
011 * <p/>
012 * Represents an EJB finder method. </p>
013 *
014 * MetafacadeLogic implementation for org.andromda.cartridges.ejb3.metafacades.EJB3FinderMethodFacade.
015 *
016 * @see EJB3FinderMethodFacade
017 */
018public class EJB3FinderMethodFacadeLogicImpl
019    extends EJB3FinderMethodFacadeLogic
020{
021    private static final long serialVersionUID = 34L;
022    /**
023     * Stores whether or not named parameters should be used in EJB queries.
024     */
025    private static final String QUERY_USE_NAMED_PARAMETERS = "queryUseNamedParameters";
026
027    // ---------------- constructor -------------------------------
028
029    /**
030     * @param metaObject
031     * @param context
032     */
033    public EJB3FinderMethodFacadeLogicImpl(final Object metaObject, final String context)
034    {
035        super (metaObject, context);
036    }
037
038    // --------------- methods ---------------------
039
040    /**
041     * Stores the translated query so that its only translated once.
042     */
043    private String translatedQuery = null;
044
045    /**
046     * Retrieves the translated query.
047     */
048    private String getTranslatedQuery()
049    {
050        if (this.translatedQuery == null)
051        {
052            this.translatedQuery = super.getQuery("query.Hibernate-QL");
053        }
054        return this.translatedQuery;
055    }
056
057    /**
058     * @see EJB3FinderMethodFacade#getQuery()
059     */
060    @Override
061    protected String handleGetQuery()
062    {
063        return this.getQuery((EJB3EntityFacade)null);
064    }
065
066    /**
067     * @see EJB3FinderMethodFacade#getTransactionType()
068     */
069    @Override
070    protected String handleGetTransactionType()
071    {
072        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_TRANSACTION_TYPE, true);
073    }
074
075    /**
076     * @see EJB3FinderMethodFacadeLogic#handleIsUseNamedParameters()
077     */
078    @Override
079    protected boolean handleIsUseNamedParameters()
080    {
081        return BooleanUtils.toBoolean(String.valueOf(
082                this.getConfiguredProperty(QUERY_USE_NAMED_PARAMETERS)));
083    }
084
085    /**
086     * @see EJB3FinderMethodFacadeLogic#handleIsUseQueryCache()
087     */
088    @Override
089    protected boolean handleIsUseQueryCache()
090    {
091        boolean queryCacheEnabled = ((EJB3EntityFacade)this.getOwner()).isUseQueryCache();
092        String queryCacheEnabledStr = (String)super.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_USE_QUERY_CACHE);
093        if (StringUtils.isNotBlank(queryCacheEnabledStr))
094        {
095            queryCacheEnabled = BooleanUtils.toBoolean(queryCacheEnabledStr);
096        }
097        return queryCacheEnabled;
098    }
099
100    /**
101     * @see EJB3FinderMethodFacadeLogic#handleGetQuery(EJB3EntityFacade)
102     */
103    @Override
104    protected String handleGetQuery(final EJB3EntityFacade entity)
105    {
106        // first see if we can retrieve the query from the super class as an OCL
107        // translation
108        String queryString = this.getTranslatedQuery();
109
110        boolean whereClauseExists = false;
111
112        // otherwise see if there is a query stored as a tagged value
113        if (StringUtils.isBlank(queryString))
114        {
115            queryString = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_QUERY);
116            if (queryString != null)
117            {
118                // remove any excess whitespace
119                queryString = queryString.replaceAll("[$\\s]+", " ");
120            }
121        }
122
123        // if there wasn't any stored query, create one by default.
124        if (StringUtils.isBlank(queryString))
125        {
126            ModelElementFacade owner;
127            if (entity == null)
128            {
129                owner = this.getOwner();
130            }
131            else
132            {
133                owner = entity;
134            }
135            String variableName = StringUtils.uncapitalize(owner.getName()).substring(0,1);
136            queryString = "SELECT " + variableName + " from " + owner.getName() + " as " + variableName;
137            Collection<ParameterFacade> arguments = this.getArguments();
138            //int size = this.getArguments().size();
139            int argCount = 0;
140            if (arguments != null && !arguments.isEmpty())
141            {
142                for (ParameterFacade facade : arguments)
143                {
144                    EJB3FinderMethodArgumentFacade argument = (EJB3FinderMethodArgumentFacade)facade;
145                    if (!argument.isFirstResult() && !argument.isMaxResults())
146                    {
147                        if (!whereClauseExists)
148                        {
149                            queryString += " WHERE";
150                            whereClauseExists = true;
151                        }
152                        String parameter = "?";
153                        if (this.isUseNamedParameters())
154                        {
155                            parameter = ':' + argument.getName();
156                        }
157                        queryString += ' ' + variableName + '.' + argument.getName() + " = " + parameter + " AND";
158                        argCount++;
159                    }
160                }
161                if (argCount > 0)
162                {
163                    // Remove the final ' and'
164                    queryString = queryString.substring(0, queryString.length()-4);
165                }
166            }
167        }
168        return queryString;
169    }
170
171    /**
172     * @see EJB3FinderMethodFacadeLogic#handleIsNamedQuery()
173     */
174    @Override
175    protected boolean handleIsNamedQuery()
176    {
177        boolean isNamedQuery = true;
178        final String query = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_QUERY);
179        if (StringUtils.isNotBlank(query))
180        {
181            isNamedQuery = false;
182        }
183        return isNamedQuery;
184    }
185}