dain 2004/04/11 12:58:04
Modified: modules/core/src/java/org/openejb/entity/cmp
CMPContainerBuilder.java CMPFinder.java
CMPInstanceContext.java
CMPInstanceContextFactory.java CMPRemoveMethod.java
Log:
Enabled findByPrimaryKey; finders should still be considered a hack
Fixed remove command
Changed CMPInstanceContext to inject pk into a new cache row
Revision Changes Path
1.6 +33 -29
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPContainerBuilder.java
Index: CMPContainerBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/CMPContainerBuilder.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- CMPContainerBuilder.java 11 Apr 2004 05:55:25 -0000 1.5
+++ CMPContainerBuilder.java 11 Apr 2004 16:58:04 -0000 1.6
@@ -54,9 +54,9 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import javax.sql.DataSource;
import javax.ejb.EJBLocalObject;
import javax.ejb.EJBObject;
+import javax.sql.DataSource;
import org.openejb.AbstractContainerBuilder;
import org.openejb.EJBComponentType;
@@ -86,6 +86,7 @@
import org.tranql.ejb.LocalProxyTransform;
import org.tranql.ejb.RemoteProxyTransform;
import org.tranql.ejb.SimplePKTransform;
+import org.tranql.ejb.ProxyQueryCommand;
import org.tranql.field.FieldAccessor;
import org.tranql.field.FieldTransform;
import org.tranql.identity.IdentityDefiner;
@@ -99,8 +100,8 @@
import org.tranql.query.QueryCommand;
import org.tranql.query.UpdateCommand;
import org.tranql.schema.Attribute;
-import org.tranql.sql.SQLQuery;
import org.tranql.sql.SQL92Generator;
+import org.tranql.sql.SQLQuery;
import org.tranql.sql.SQLTransform;
import org.tranql.sql.jdbc.InputBinding;
import org.tranql.sql.jdbc.JDBCQueryCommand;
@@ -116,7 +117,6 @@
public class CMPContainerBuilder extends AbstractContainerBuilder {
private EJB ejb;
private DataSource dataSource;
- private IdentityDefiner identityDefiner;
protected int getEJBComponentType() {
return EJBComponentType.CMP_ENTITY;
@@ -149,7 +149,7 @@
CacheTable cacheTable = createCacheTable(ejb, queryTransformer, dataSource);
// identity definer
- identityDefiner = new UserDefinedIdentity(cacheTable, 0); // todo
+ IdentityDefiner identityDefiner = new UserDefinedIdentity(cacheTable, 0);
// the load all by primary key command
QueryCommand loadCommand = createLoadAllCommand(ejb, queryTransformer,
identityDefiner, dataSource);
@@ -166,8 +166,16 @@
IdentityTransform localProxyTransform = new
LocalProxyTransform(primaryKeyTransform, tranqlEJBProxyFactory);
IdentityTransform remoteProxyTransform = new
RemoteProxyTransform(primaryKeyTransform, tranqlEJBProxyFactory);
+ // queries
+ LinkedHashMap queries = new LinkedHashMap();
+ QueryCommand localProxyLoad = new ProxyQueryCommand(loadCommand,
identityDefiner, localProxyTransform);
+ QueryCommand remoteProxyLoad = new ProxyQueryCommand(loadCommand,
identityDefiner, remoteProxyTransform);
+ queries.put(
+ new InterfaceMethodSignature("findByPrimaryKey", new String[]
{getPrimaryKeyClassName()}, true),
+ new QueryCommand[] {localProxyLoad, remoteProxyLoad});
+
// build the vop table
- LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable,
primaryKeyTransform, localProxyTransform, remoteProxyTransform);
+ LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, identityDefiner,
primaryKeyTransform, localProxyTransform, remoteProxyTransform, queries);
InterfaceMethodSignature[] signatures = (InterfaceMethodSignature[])
vopMap.keySet().toArray(new InterfaceMethodSignature[vopMap.size()]);
VirtualOperation[] vtable = (VirtualOperation[])
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
@@ -181,7 +189,7 @@
// build the instance factory
Map instanceMap = buildInstanceMap(beanClass, cmpFieldAccessors);
- InstanceContextFactory contextFactory = new
CMPInstanceContextFactory(getContainerId(), proxyFactory, cacheTable,
primaryKeyTransform, beanClass, instanceMap);
+ InstanceContextFactory contextFactory = new
CMPInstanceContextFactory(getContainerId(), proxyFactory, cacheTable, identityDefiner,
primaryKeyTransform, beanClass, instanceMap);
EntityInstanceFactory instanceFactory = new
EntityInstanceFactory(getComponentContext(), contextFactory);
// build the pool
@@ -241,15 +249,14 @@
// todo shouldn't query builder do this transform?
List attributes = ejb.getAttributes();
List updateTransformList = new ArrayList(attributes.size() * 2 + 1);
- for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
- Attribute attribute = (Attribute) iterator.next();
- if (!attribute.isIdentity()) {
- int index = updateTransformList.size() / 2;
- updateTransformList.add(new ModifiedSlotDetector(index));
- updateTransformList.add(new ModifiedSlotAccessor(index));
+ for (int i = 0; i < attributes.size(); i++) {
+ Attribute attribute = (Attribute) attributes.get(i);
+ if(!attribute.isIdentity()) {
+ updateTransformList.add(new ModifiedSlotDetector(i));
+ updateTransformList.add(new ModifiedSlotAccessor(i));
}
-
}
+
// todo I'd bet this is wrong
updateTransformList.add(new FieldAccessor(0));
FieldTransform[] updateTransforms = (FieldTransform[])
updateTransformList.toArray(new FieldTransform[updateTransformList.size()]);
@@ -355,9 +362,11 @@
protected LinkedHashMap buildVopMap(
Class beanClass,
CacheTable cacheTable,
+ IdentityDefiner identityDefiner,
IdentityTransform primaryKeyTransform,
IdentityTransform localProxyTransform,
- IdentityTransform remoteProxyTransform) throws Exception {
+ IdentityTransform remoteProxyTransform,
+ LinkedHashMap queries) throws Exception {
LinkedHashMap vopMap = new LinkedHashMap();
@@ -417,18 +426,18 @@
// ejbObject.remove()
vopMap.put(
new InterfaceMethodSignature("remove", false),
- new CMPRemoveMethod(beanClass, signature,
primaryKeyTransform));
+ new CMPRemoveMethod(beanClass, signature));
// ejbHome.remove(primaryKey)
vopMap.put(
new InterfaceMethodSignature("ejbRemove", new
Class[]{Object.class}, true),
- new CMPRemoveMethod(beanClass, signature,
primaryKeyTransform));
+ new CMPRemoveMethod(beanClass, signature));
// ejbHome.remove(handle)
Class handleClass = getClassLoader().loadClass("javax.ejb.Handle");
vopMap.put(
new InterfaceMethodSignature("ejbRemove", new
Class[]{handleClass}, true),
- new CMPRemoveMethod(beanClass, signature,
primaryKeyTransform));
+ new CMPRemoveMethod(beanClass, signature));
} else if (name.startsWith("ejb")) {
continue;
} else {
@@ -438,17 +447,12 @@
}
}
-// for (int i = 0; i < queries.length; i++) {
-// MethodSignature signature = queries[i];
-// if (signature.getMethodName().startsWith("ejbFind")) {
-// // add the finder method to the virtual operation table
-// QueryCommand localQuery = queryCommands[i][0];
-// QueryCommand remoteQuery = queryCommands[i][1];
-// vopMap.put(
-// MethodHelper.translateToInterface(signature),
-// new CMPFinder(localQuery, remoteQuery));
-// }
-// }
+ for (Iterator iterator = queries.entrySet().iterator();
iterator.hasNext();) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ InterfaceMethodSignature signature =
(InterfaceMethodSignature)entry.getKey();
+ QueryCommand[] queryCommands = (QueryCommand[])entry.getValue();
+ vopMap.put(signature, new CMPFinder(queryCommands[0],
queryCommands[1]));
+ }
return vopMap;
}
1.4 +9 -2
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPFinder.java
Index: CMPFinder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/CMPFinder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- CMPFinder.java 22 Mar 2004 00:41:19 -0000 1.3
+++ CMPFinder.java 11 Apr 2004 16:58:04 -0000 1.4
@@ -49,6 +49,7 @@
import java.io.Serializable;
import javax.ejb.FinderException;
+import javax.ejb.ObjectNotFoundException;
import org.apache.geronimo.core.service.InvocationResult;
import org.apache.geronimo.core.service.SimpleInvocationResult;
@@ -58,6 +59,7 @@
import org.tranql.cache.InTxCache;
import org.tranql.ql.QueryException;
import org.tranql.query.QueryCommand;
+import org.tranql.query.QueryResult;
import org.tranql.field.Row;
/**
@@ -78,7 +80,12 @@
InTxCache inTxCache = invocation.getTransactionContext().getInTxCache();
try {
if (invocation.getType().isLocal()) {
- return new SimpleInvocationResult(true,
localQuery.execute(inTxCache, new Row(invocation.getArguments())));
+ QueryResult result = localQuery.execute(inTxCache, new
Row(invocation.getArguments()));
+ if(result.next()) {
+ return new SimpleInvocationResult(true,
result.getValues().get(0));
+ } else {
+ return new SimpleInvocationResult(false, new
ObjectNotFoundException());
+ }
} else {
return new SimpleInvocationResult(true,
remoteQuery.execute(inTxCache, new Row(invocation.getArguments())));
}
1.5 +13 -3
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPInstanceContext.java
Index: CMPInstanceContext.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/CMPInstanceContext.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- CMPInstanceContext.java 11 Apr 2004 05:55:25 -0000 1.4
+++ CMPInstanceContext.java 11 Apr 2004 16:58:04 -0000 1.5
@@ -50,6 +50,7 @@
import java.lang.reflect.Method;
import javax.ejb.EnterpriseBean;
import javax.ejb.EntityBean;
+import javax.ejb.NoSuchObjectLocalException;
import org.apache.geronimo.transaction.TransactionContext;
@@ -60,8 +61,10 @@
import org.tranql.cache.CacheRow;
import org.tranql.cache.CacheTable;
import org.tranql.cache.InTxCache;
+import org.tranql.cache.CacheRowState;
import org.tranql.identity.IdentityTransform;
import org.tranql.identity.GlobalIdentity;
+import org.tranql.identity.IdentityDefiner;
/**
*
@@ -71,15 +74,17 @@
public final class CMPInstanceContext extends EntityInstanceContext implements
MethodInterceptor {
private final EntityBean instance;
private final InstanceOperation[] itable;
+ private final IdentityDefiner identityDefiner;
private final IdentityTransform primaryKeyTransform;
private CacheRow cacheRow;
private TransactionContext transactionContext;
private final CacheTable cacheTable;
- public CMPInstanceContext(Object containerId, EJBProxyFactory proxyFactory,
InstanceOperation[] itable, CacheTable cacheTable, IdentityTransform
primaryKeyTransform, CMPInstanceContextFactory contextFactory) throws Exception {
+ public CMPInstanceContext(Object containerId, EJBProxyFactory proxyFactory,
InstanceOperation[] itable, CacheTable cacheTable, IdentityDefiner identityDefiner,
IdentityTransform primaryKeyTransform, CMPInstanceContextFactory contextFactory)
throws Exception {
super(containerId, proxyFactory);
this.itable = itable;
this.cacheTable = cacheTable;
+ this.identityDefiner = identityDefiner;
this.primaryKeyTransform = primaryKeyTransform;
instance = contextFactory.createCMPBeanInstance(this);
}
@@ -117,8 +122,13 @@
GlobalIdentity globalId = primaryKeyTransform.getGlobalIdentity(id);
InTxCache inTxCache = transactionContext.getInTxCache();
cacheRow = inTxCache.get(globalId);
- if (cacheRow == null) {
+ if (cacheRow != null) {
+ if(cacheRow.getState() == CacheRowState.REMOVED) {
+ throw new NoSuchObjectLocalException("Entity has been reomved");
+ }
+ } else {
cacheRow = cacheTable.newRow(globalId);
+ identityDefiner.injectIdentity(cacheRow);
inTxCache.associate(cacheRow);
}
}
1.5 +6 -3
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPInstanceContextFactory.java
Index: CMPInstanceContextFactory.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/CMPInstanceContextFactory.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- CMPInstanceContextFactory.java 11 Apr 2004 05:55:25 -0000 1.4
+++ CMPInstanceContextFactory.java 11 Apr 2004 16:58:04 -0000 1.5
@@ -69,6 +69,7 @@
import org.openejb.InstanceContextFactory;
import org.openejb.proxy.EJBProxyFactory;
import org.tranql.identity.IdentityTransform;
+import org.tranql.identity.IdentityDefiner;
import org.tranql.cache.CacheTable;
/**
@@ -80,16 +81,18 @@
private final Object containerId;
private final EJBProxyFactory proxyFactory;
private final CacheTable cacheTable;
+ private final IdentityDefiner identityDefiner;
private final IdentityTransform primaryKeyTransform;
private final Class beanClass;
private final Map imap;
private final InstanceOperation[] itable;
private transient final Enhancer enhancer;
- public CMPInstanceContextFactory(Object containerId, EJBProxyFactory
proxyFactory, CacheTable cacheTable, IdentityTransform primaryKeyTransform, Class
beanClass, Map imap) throws ClassNotFoundException {
+ public CMPInstanceContextFactory(Object containerId, EJBProxyFactory
proxyFactory, CacheTable cacheTable, IdentityDefiner identityDefiner,
IdentityTransform primaryKeyTransform, Class beanClass, Map imap) throws
ClassNotFoundException {
this.containerId = containerId;
this.proxyFactory = proxyFactory;
this.cacheTable = cacheTable;
+ this.identityDefiner = identityDefiner;
this.primaryKeyTransform = primaryKeyTransform;
this.beanClass = beanClass;
this.imap = imap;
@@ -114,7 +117,7 @@
}
public synchronized InstanceContext newInstance() throws Exception {
- return new CMPInstanceContext(containerId, proxyFactory, itable,
cacheTable, primaryKeyTransform, this);
+ return new CMPInstanceContext(containerId, proxyFactory, itable,
cacheTable, identityDefiner, primaryKeyTransform, this);
}
public synchronized EntityBean createCMPBeanInstance(CMPInstanceContext
instanceContext) {
@@ -133,7 +136,7 @@
private Object readResolve() throws ObjectStreamException {
try {
- return new CMPInstanceContextFactory(containerId, proxyFactory,
cacheTable, primaryKeyTransform, beanClass, imap);
+ return new CMPInstanceContextFactory(containerId, proxyFactory,
cacheTable, identityDefiner, primaryKeyTransform, beanClass, imap);
} catch (ClassNotFoundException e) {
throw (InvalidClassException) new InvalidClassException("Cound not load
method argument class").initCause(e);
}
1.4 +7 -9
openejb/modules/core/src/java/org/openejb/entity/cmp/CMPRemoveMethod.java
Index: CMPRemoveMethod.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/CMPRemoveMethod.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- CMPRemoveMethod.java 22 Mar 2004 00:41:19 -0000 1.3
+++ CMPRemoveMethod.java 11 Apr 2004 16:58:04 -0000 1.4
@@ -48,13 +48,13 @@
package org.openejb.entity.cmp;
import org.apache.geronimo.core.service.InvocationResult;
+
import org.openejb.EJBInvocation;
import org.openejb.EJBOperation;
import org.openejb.dispatch.AbstractMethodOperation;
import org.openejb.dispatch.MethodSignature;
import org.tranql.cache.InTxCache;
-import org.tranql.identity.GlobalIdentity;
-import org.tranql.identity.IdentityTransform;
+import org.tranql.cache.CacheRow;
/**
* Virtual operation handling removal of an instance.
@@ -62,11 +62,8 @@
* @version $Revision$ $Date$
*/
public class CMPRemoveMethod extends AbstractMethodOperation {
- private final IdentityTransform primaryKeyTransform;
-
- public CMPRemoveMethod(Class beanClass, MethodSignature signature,
IdentityTransform primaryKeyTransform) {
+ public CMPRemoveMethod(Class beanClass, MethodSignature signature) {
super(beanClass, signature);
- this.primaryKeyTransform = primaryKeyTransform;
}
public InvocationResult execute(EJBInvocation invocation) throws Throwable {
@@ -76,8 +73,9 @@
if (result.isNormal()) {
// delete this row in the persistence engine
InTxCache cache = invocation.getTransactionContext().getInTxCache();
- GlobalIdentity globalId =
primaryKeyTransform.getGlobalIdentity(ctx.getId());
-// cache.remove(globalId);
+ CacheRow cacheRow = ctx.getCacheRow();
+ cacheRow.markRemoved();
+ cache.remove(cacheRow);
// clear id and row data from the instance
ctx.setId(null);