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}