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);
  
  
  

Reply via email to