gdamour 2005/03/02 06:43:22
Modified: modules/openejb-builder/src/java/org/openejb/deployment
CMPContainerBuilder.java CMPEntityBuilder.java
Log:
GERONIMO-580
o add an itests test verifying the correct behavior of the implementation.
GERONIMO-598
o add the flush-cache-before-query optional element, which identifies if
the transactional cache should be flushed before the execution of the
associated finder or select operation; and
o update the various XValuedFinder and XValuedSelect in order to flush
the transaction cache if required.
Revision Changes Path
1.15 +27 -37
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
Index: CMPContainerBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- CMPContainerBuilder.java 20 Feb 2005 15:44:49 -0000 1.14
+++ CMPContainerBuilder.java 2 Mar 2005 11:43:21 -0000 1.15
@@ -49,7 +49,6 @@
import java.lang.reflect.Method;
import java.util.HashMap;
-import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -104,9 +103,9 @@
import org.tranql.ejb.CMPFieldTransform;
import org.tranql.ejb.CMRField;
import org.tranql.ejb.EJB;
-import org.tranql.ejb.EJBQLQuery;
import org.tranql.ejb.EJBQueryBuilder;
import org.tranql.ejb.EJBSchema;
+import org.tranql.ejb.FinderEJBQLQuery;
import org.tranql.ejb.LocalProxyTransform;
import org.tranql.ejb.ManyToManyCMR;
import org.tranql.ejb.ManyToOneCMR;
@@ -115,6 +114,7 @@
import org.tranql.ejb.OneToManyCMR;
import org.tranql.ejb.OneToOneCMR;
import org.tranql.ejb.RemoteProxyTransform;
+import org.tranql.ejb.SelectEJBQLQuery;
import org.tranql.ejb.SingleValuedCMRAccessor;
import org.tranql.ejb.SingleValuedCMRFaultHandler;
import org.tranql.ejb.TransactionManagerDelegate;
@@ -256,14 +256,16 @@
QueryCommand remoteProxyLoad =
mapper.transform(remoteProxyLoadView.getQueryCommand());
remoteProxyLoadView = new QueryCommandView(remoteProxyLoad,
remoteProxyLoadView.getView());
- finders.put(new InterfaceMethodSignature("findByPrimaryKey",
- new String[]{getPrimaryKeyClassName()}, true),
- new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
+ FinderEJBQLQuery pkFinder = new FinderEJBQLQuery("findByPrimaryKey",
new Class[] {ejb.getPrimaryKeyClass()}, "UNDEFINED");
+ FinderEJBQLQuery previousPkFinder = (FinderEJBQLQuery)
finders.put(pkFinder, new QueryCommandView[]{localProxyLoadView,
remoteProxyLoadView});
+ if (null != previousPkFinder) {
+
pkFinder.setFlushCacheBeforeQuery(previousPkFinder.isFlushCacheBeforeQuery());
+ }
// build the instance factory
LinkedHashMap cmpFieldAccessors =
createCMPFieldAccessors(faultHandler);
LinkedHashMap cmrFieldAccessors = createCMRFieldAccessors();
- LinkedHashMap selects = createSelects(ejb);
+ Map selects = createSelects(ejb);
Map instanceMap = null;
CMP1Bridge cmp1Bridge = null;
if (cmp2) {
@@ -307,31 +309,15 @@
private Map createFinders(EJB ejb) throws Exception {
EJBQLToPhysicalQuery toPhysicalQuery = new
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
- IdentityHashMap findersMap = toPhysicalQuery.buildFinders(ejb);
- return createEJBQLQueryMap(findersMap);
+ return toPhysicalQuery.buildFinders(ejb);
}
- private LinkedHashMap createSelects(EJB ejb) throws Exception {
+ private Map createSelects(EJB ejb) throws Exception {
EJBQLToPhysicalQuery toPhysicalQuery = new
EJBQLToPhysicalQuery(ejbSchema, sqlSchema, globalSchema);
- IdentityHashMap selectsMap = toPhysicalQuery.buildSelects(ejb);
- return createEJBQLQueryMap(selectsMap);
+ return toPhysicalQuery.buildSelects(ejb);
}
- private LinkedHashMap createEJBQLQueryMap(Map ejbQLMap) {
- LinkedHashMap queryCommands = new LinkedHashMap();
-
- for (Iterator iter = ejbQLMap.entrySet().iterator();
iter.hasNext();) {
- Map.Entry entry = (Map.Entry) iter.next();
- EJBQLQuery ejbQLQuery = (EJBQLQuery) entry.getKey();
-
- MethodSignature signature = new
MethodSignature(ejbQLQuery.getMethodName(), ejbQLQuery.getParameterTypes());
- queryCommands.put(new InterfaceMethodSignature(signature, true),
entry.getValue());
- }
-
- return queryCommands;
- }
-
private LinkedHashMap createCMPFieldAccessors(FaultHandler faultHandler)
{
List attributes = ejb.getAttributes();
List virtualAttributes = ejb.getVirtualCMPFields();
@@ -436,7 +422,7 @@
new ReferenceAccessor(relatedIdentityDefiner));
}
- private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields,
LinkedHashMap cmrFields, LinkedHashMap selects) {
+ private Map buildInstanceMap(Class beanClass, LinkedHashMap cmpFields,
LinkedHashMap cmrFields, Map selects) {
Map instanceMap;
instanceMap = new HashMap();
@@ -471,10 +457,12 @@
}
}
- private void addSelects(Map instanceMap, Class beanClass, LinkedHashMap
selects) throws IllegalArgumentException {
+ private void addSelects(Map instanceMap, Class beanClass, Map selects)
throws IllegalArgumentException {
for (Iterator iterator = selects.entrySet().iterator();
iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
- InterfaceMethodSignature signature = (InterfaceMethodSignature)
entry.getKey();
+ SelectEJBQLQuery query = (SelectEJBQLQuery) entry.getKey();
+
+ InterfaceMethodSignature signature = new
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(),
true);
QueryCommandView view = (QueryCommandView) entry.getValue();
Method method = signature.getMethod(beanClass);
@@ -485,11 +473,11 @@
String returnType = method.getReturnType().getName();
if (returnType.equals("java.util.Collection")) {
- instanceMap.put(methodSignature, new
CollectionValuedSelect(view));
+ instanceMap.put(methodSignature, new
CollectionValuedSelect(view, query.isFlushCacheBeforeQuery()));
} else if (returnType.equals("java.util.Set")) {
- instanceMap.put(methodSignature, new SetValuedSelect(view));
+ instanceMap.put(methodSignature, new SetValuedSelect(view,
query.isFlushCacheBeforeQuery()));
} else {
- instanceMap.put(methodSignature, new
SingleValuedSelect(view));
+ instanceMap.put(methodSignature, new
SingleValuedSelect(view, query.isFlushCacheBeforeQuery()));
}
}
}
@@ -607,7 +595,9 @@
Class localHomeInterface = proxyInfo.getLocalHomeInterface();
for (Iterator iterator = finders.entrySet().iterator();
iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
- InterfaceMethodSignature signature = (InterfaceMethodSignature)
entry.getKey();
+ FinderEJBQLQuery query = (FinderEJBQLQuery) entry.getKey();
+
+ InterfaceMethodSignature signature = new
InterfaceMethodSignature(query.getMethodName(), query.getParameterTypes(),
true);
QueryCommandView[] views = (QueryCommandView[]) entry.getValue();
Method method = signature.getMethod(homeInterface);
@@ -620,13 +610,13 @@
String returnType = method.getReturnType().getName();
if (returnType.equals("java.util.Collection")) {
- vopMap.put(signature, new CollectionValuedFinder(views[0],
views[1]));
+ vopMap.put(signature, new CollectionValuedFinder(views[0],
views[1], query.isFlushCacheBeforeQuery()));
} else if (returnType.equals("java.util.Set")) {
- vopMap.put(signature, new SetValuedFinder(views[0],
views[1]));
+ vopMap.put(signature, new SetValuedFinder(views[0],
views[1], query.isFlushCacheBeforeQuery()));
} else if (returnType.equals("java.util.Enumeration")) {
- vopMap.put(signature, new EnumerationValuedFinder(views[0],
views[1]));
+ vopMap.put(signature, new EnumerationValuedFinder(views[0],
views[1], query.isFlushCacheBeforeQuery()));
} else {
- vopMap.put(signature, new SingleValuedFinder(views[0],
views[1]));
+ vopMap.put(signature, new SingleValuedFinder(views[0],
views[1], query.isFlushCacheBeforeQuery()));
}
}
1.20 +41 -10
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
Index: CMPEntityBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- CMPEntityBuilder.java 27 Feb 2005 07:20:58 -0000 1.19
+++ CMPEntityBuilder.java 2 Mar 2005 11:43:21 -0000 1.20
@@ -337,6 +337,8 @@
}
private void processQuery(EJB ejb, EntityBeanType entityBean,
OpenejbEntityBeanType openEjbEntity, ClassLoader cl) throws DeploymentException
{
+ Map queries = new HashMap();
+
QueryType[] queryTypes = entityBean.getQueryArray();
if (null != queryTypes) {
for (int i = 0; i < queryTypes.length; i++) {
@@ -358,7 +360,9 @@
}
String ejbQL = queryType.getEjbQl().getStringValue();
if (methodName.startsWith("find")) {
- ejb.addFinder(new FinderEJBQLQuery(methodName,
parameterTypes, ejbQL));
+ FinderEJBQLQuery query = new
FinderEJBQLQuery(methodName, parameterTypes, ejbQL);
+ ejb.addFinder(query);
+ queries.put(query, query);
} else if (methodName.startsWith("ejbSelect")) {
boolean isLocal = true;
if (queryType.isSetResultTypeMapping()) {
@@ -367,13 +371,15 @@
isLocal = false;
}
}
- ejb.addSelect(new SelectEJBQLQuery(methodName,
parameterTypes, ejbQL, isLocal));
+ SelectEJBQLQuery query = new
SelectEJBQLQuery(methodName, parameterTypes, ejbQL, isLocal);
+ ejb.addSelect(query);
+ queries.put(query, query);
} else {
- throw new DeploymentException("EJB [" + ejb.getName() +
"] is misconfigured: method " +
- methodName + " is neiher a finder nor a
select.");
+ throw new DeploymentException("Method " + methodName + "
is neiher a finder nor a select.");
}
}
}
+
OpenejbQueryType[] openejbQueryTypes = openEjbEntity.getQueryArray();
if (null != openejbQueryTypes) {
for (int i = 0; i < openejbQueryTypes.length; i++) {
@@ -393,9 +399,26 @@
}
}
}
- String ejbQL = openejbQueryType.getEjbQl();
+
+ boolean flushCacheBeforeQuery =
openejbQueryType.isSetFlushCacheBeforeQuery();
+ String ejbQL = null;
+ if (openejbQueryType.isSetEjbQl()) {
+ ejbQL = openejbQueryType.getEjbQl();
+ } else if (false == flushCacheBeforeQuery) {
+ throw new DeploymentException("No ejb-ql defined and
flush-cache-before-query not set. method " + methodName);
+ }
+
if (methodName.startsWith("find")) {
- ejb.addFinder(new FinderEJBQLQuery(methodName,
parameterTypes, ejbQL));
+ FinderEJBQLQuery query = new
FinderEJBQLQuery(methodName, parameterTypes, ejbQL);
+ if (null == ejbQL) {
+ query = (FinderEJBQLQuery) queries.get(query);
+ if (null == query) {
+ throw new DeploymentException("Method " +
methodName + " does not define an ejb-ql.");
+ }
+ } else {
+ ejb.addFinder(query);
+ }
+ query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
} else if (methodName.startsWith("ejbSelect")) {
boolean isLocal = true;
if (openejbQueryType.isSetResultTypeMapping()) {
@@ -404,10 +427,18 @@
isLocal = false;
}
}
- ejb.addSelect(new SelectEJBQLQuery(methodName,
parameterTypes, ejbQL, isLocal));
+ SelectEJBQLQuery query = new
SelectEJBQLQuery(methodName, parameterTypes, ejbQL, isLocal);
+ if (null == ejbQL) {
+ query = (SelectEJBQLQuery) queries.get(query);
+ if (null == query) {
+ throw new DeploymentException("Method " +
methodName + " does not define an ejb-ql.");
+ }
+ } else {
+ ejb.addSelect(query);
+ }
+ query.setFlushCacheBeforeQuery(flushCacheBeforeQuery);
} else {
- throw new DeploymentException("EJB [" + ejb.getName() +
"] is misconfigured: method " +
- methodName + " is neiher a finder nor a
select.");
+ throw new DeploymentException("Method " + methodName + "
is neiher a finder nor a select.");
}
}
}