HibernateFinderMethodLogicImpl.java

package org.andromda.cartridges.hibernate.metafacades;

import java.util.Collection;
import java.util.Iterator;
import org.andromda.cartridges.hibernate.HibernateProfile;
import org.andromda.metafacades.uml.ParameterFacade;
import org.apache.commons.lang.StringUtils;

/**
 * @author Chad Brandon
 * @author Carlos Cuenca
 * @see HibernateFinderMethodLogic
 *      Metaclass facade implementation.
 */
public class HibernateFinderMethodLogicImpl
    extends HibernateFinderMethodLogic
{
    private static final long serialVersionUID = 34L;
    // ---------------- constructor -------------------------------
    /**
     * @param metaObject
     * @param context
     */
    public HibernateFinderMethodLogicImpl(
        Object metaObject,
        String context)
    {
        super(metaObject, context);
    }

    /**
     * @see org.andromda.cartridges.hibernate.metafacades.HibernateFinderMethod#getQuery()
     */
    @Override
    protected String handleGetQuery()
    {
        // first see if we can retrieve the query from the super class as an OCL
        // translation
        String queryString = this.getTranslatedQuery();

        // otherwise see if there is a query stored as a tagged value
        if (StringUtils.isEmpty(queryString))
        {
            Object value = this.findTaggedValue(HibernateProfile.TAGGEDVALUE_HIBERNATE_QUERY);
            queryString = (String)value;
            if (queryString != null)
            {
                // remove any excess whitespace
                queryString = queryString.replaceAll("[$\\s]+", " ");
            }
        }

        // if there wasn't any stored query, create one by default.
        if (StringUtils.isEmpty(queryString))
        {
            String variableName = StringUtils.uncapitalize(this.getOwner().getName()).substring(0,1);
            queryString = "SELECT " + variableName + " FROM " + this.getOwner().getName() + " AS " + variableName;
            Collection arguments = this.getArguments();
            if (arguments != null && !arguments.isEmpty())
            {
                queryString = queryString + " WHERE";
                Iterator argumentIt = arguments.iterator();
                for (; argumentIt.hasNext();)
                {
                    ParameterFacade argument = (ParameterFacade)argumentIt.next();
                    String parameter = "?";
                    if (this.isUseNamedParameters())
                    {
                        parameter = ':' + argument.getName();
                    }
                    queryString = queryString + ' ' + variableName + '.' + argument.getName() + " = " + parameter;
                    if (argumentIt.hasNext())
                    {
                        queryString = queryString + " AND";
                    }
                }
            }
        }
        return queryString;
    }

    /**
     * Stores the translated query so that its only translated once.
     */
    private String translatedQuery = null;

    /**
     * Retrieves the translated query.
     */
    private String getTranslatedQuery()
    {
        if (StringUtils.isBlank(this.translatedQuery))
        {
            this.translatedQuery = super.getQuery("query.Hibernate-QL");
        }
        return this.translatedQuery;
    }

    /**
     * Stores whether or not named parameters should be used in hibernate
     * queries.
     */
    private static final String USE_NAMED_PARAMETERS = "hibernateQueryUseNamedParameters";

    /**
     * @see org.andromda.cartridges.hibernate.metafacades.HibernateFinderMethod#isUseNamedParameters()
     */
    @Override
    protected boolean handleIsUseNamedParameters()
    {
        boolean useNamedParameters = Boolean.valueOf(String.valueOf(this.getConfiguredProperty(USE_NAMED_PARAMETERS))).booleanValue()
                || StringUtils.isNotBlank(this.getTranslatedQuery());
        return HibernateMetafacadeUtils.getUseNamedParameters(this, useNamedParameters);
    }

    /**
     * Stores the value indicating whether or not to use hibernate query
     * caching.
     */
    private static final String HIBERNATE_USE_QUERY_CACHE = "hibernateUseQueryCache";

    /**
     * @see org.andromda.cartridges.hibernate.metafacades.HibernateFinderMethod#isUseQueryCache()
     */
    @Override
    protected boolean handleIsUseQueryCache()
    {
        boolean useQueryCache =
            Boolean.valueOf(String.valueOf(this.getConfiguredProperty(HIBERNATE_USE_QUERY_CACHE))).booleanValue();

        if (useQueryCache)
        {
            useQueryCache =
                    Boolean.valueOf(
                    String.valueOf(findTaggedValue(HibernateProfile.TAGGEDVALUE_HIBERNATE_USE_QUERY_CACHE)))
                       .booleanValue();
        }
        return useQueryCache;
    }
}