You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/01/04 05:23:10 UTC

svn commit: r492404 [1/3] - in /incubator/openejb/trunk/openejb3: container/openejb-core/ container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/alt/assembler/ container/openejb-core/src/main/ja...

Author: dain
Date: Wed Jan  3 20:23:04 2007
New Revision: 492404

URL: http://svn.apache.org/viewvc?view=rev&rev=492404
Log:
Cmp2 generator

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorComplexKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorSimpleKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Cmp2Builder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmrFieldInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/AbstractKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ComplexKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java   (contents, props changed)
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/SimpleKeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Entity.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2KeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Util.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpUtil.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/CmpField.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/CmrField.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/CmrSet.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CmrSet.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/CmrStyle.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/CollectionRef.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CollectionRef.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/SetValuedCmr.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/MultiValuedCmr.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/SingleValuedCmr.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/SingleValuedCmr.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetomany/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetomany/ExampleABean_JPA.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetomany/ExampleBBean_JPA.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetoone/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetoone/ExampleABean_JPA.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetoone/ABean_JPA.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/test/entity/cmr/onetoone/ExampleBBean_JPA.java
      - copied, changed from r491148, incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetoone/BBean_JPA.java
Removed:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/assembler/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGenerator.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGeneratorFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/util/resources/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpUtil.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/instrument/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CmpWrapper.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CmpWrapperFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CmrFactoryImpl.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CmrSet.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/CollectionRef.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/MultiValuedCmrImpl.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/SingleValuedCmrImpl.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/CmrFactory.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/MultiValuedCmr.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/SingleValuedCmr.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/EncCmp2Bean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/RmiIiopCmp2Bean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetomany/ABean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetomany/BBean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetoone/ABean_JPA.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmr/onetoone/BBean_JPA.java
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityBeanInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/CmpDeploymentFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/CmrFieldType.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRelation.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/jpa.mapping.xml
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml Wed Jan  3 20:23:04 2007
@@ -144,7 +144,7 @@
         </executions>
         <configuration>
           <namespace>http://openejb.apache.org/schemas/core</namespace>
-          <excludedClasses>org.apache.openejb.alt.config.ejb,org.apache.openejb.util.io,org.apache.openejb.InterfaceType,org.apache.openejb.BeanType</excludedClasses>
+          <excludedClasses>org.apache.openejb.alt.config.ejb,org.apache.openejb.util.io,org.apache.openejb.InterfaceType,org.apache.openejb.BeanType,org.apache.openejb.core.cmp.cmp2.CmrStyle</excludedClasses>
         </configuration>
       </plugin>
     </plugins>

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java Wed Jan  3 20:23:04 2007
@@ -67,7 +67,7 @@
 
     public Class getBusinessRemoteInterface();
 
-    public java.lang.reflect.Field getPrimaryKeyField();
+    public String getPrimaryKeyField();
 
     public boolean isReentrant();
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java Wed Jan  3 20:23:04 2007
@@ -35,6 +35,7 @@
 import org.apache.openejb.assembler.classic.SecurityRoleReferenceInfo;
 import org.apache.openejb.assembler.classic.StatefulBeanInfo;
 import org.apache.openejb.assembler.classic.StatelessBeanInfo;
+import org.apache.openejb.assembler.classic.CmrFieldInfo;
 import org.apache.openejb.jee.AroundInvoke;
 import org.apache.openejb.jee.CmpField;
 import org.apache.openejb.jee.CmpVersion;
@@ -61,6 +62,9 @@
 import org.apache.openejb.jee.TransactionType;
 import org.apache.openejb.jee.ActivationConfig;
 import org.apache.openejb.jee.ActivationConfigProperty;
+import org.apache.openejb.jee.EjbRelation;
+import org.apache.openejb.jee.EjbRelationshipRole;
+import org.apache.openejb.jee.Multiplicity;
 import org.apache.openejb.loader.SystemInstance;
 
 import java.util.ArrayList;
@@ -68,6 +72,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Collections;
+import java.util.Iterator;
 
 /**
  * @version $Revision$ $Date$
@@ -147,6 +152,10 @@
             }
         }
 
+        if (jar.getEjbJar().getRelationships() != null) {
+            initRelationships(jar, infos);
+        }
+
         if (!"tomcat-webapp".equals(SystemInstance.get().getProperty("openejb.loader"))) {
 //            try {
 //                File jarFile = new File(jar.getJarURI());
@@ -157,6 +166,58 @@
 //            }
         }
         return ejbJar;
+    }
+
+    private void initRelationships(EjbModule jar, Map<String, EnterpriseBeanInfo> infos) throws OpenEJBException {
+        for (EjbRelation ejbRelation : jar.getEjbJar().getRelationships().getEjbRelation()) {
+            Iterator<EjbRelationshipRole> iterator = ejbRelation.getEjbRelationshipRole().iterator();
+            EjbRelationshipRole left = iterator.next();
+            EjbRelationshipRole right = iterator.next();
+
+            // left role info
+            CmrFieldInfo leftCmrFieldInfo = initRelationshipRole(left, infos);
+            CmrFieldInfo rightCmrFieldInfo = initRelationshipRole(right, infos);
+            leftCmrFieldInfo.mappedBy = rightCmrFieldInfo;
+            rightCmrFieldInfo.mappedBy = leftCmrFieldInfo;
+        }
+    }
+
+    private CmrFieldInfo initRelationshipRole(EjbRelationshipRole role, Map<String, EnterpriseBeanInfo> infos) throws OpenEJBException {
+        CmrFieldInfo cmrFieldInfo = new CmrFieldInfo();
+
+        // find the entityBeanInfo info for this role
+        String ejbName = role.getRelationshipRoleSource().getEjbName();
+        EnterpriseBeanInfo enterpriseBeanInfo = infos.get(ejbName);
+        if (enterpriseBeanInfo == null) {
+            throw new OpenEJBException("Relation role source ejb not found " + ejbName);
+        }
+        if (!(enterpriseBeanInfo instanceof EntityBeanInfo)) {
+            throw new OpenEJBException("Relation role source ejb is not an entity bean " + ejbName);
+        }
+        EntityBeanInfo entityBeanInfo = (EntityBeanInfo) enterpriseBeanInfo;
+        cmrFieldInfo.roleSource = entityBeanInfo;
+
+        // RoleName: this may be null
+        cmrFieldInfo.roleName = role.getEjbRelationshipRoleName();
+
+        // CmrFieldName: is null for uni-directional relationships
+        if (role.getCmrField() != null) {
+            cmrFieldInfo.fieldName = role.getCmrField().getCmrFieldName();
+            // CollectionType: java.util.Collection or java.util.Set
+            if (role.getCmrField().getCmrFieldType() != null) {
+                cmrFieldInfo.fieldType = role.getCmrField().getCmrFieldType().toString();
+            }
+        }
+
+        // CascadeDelete
+        cmrFieldInfo.cascadeDelete = role.getCascadeDelete() != null;
+        // Multiplicity: one or many
+        cmrFieldInfo.many = role.getMultiplicity() == Multiplicity.MANY;
+
+        // add the field to the entityBean
+        entityBeanInfo.cmrFields.add(cmrFieldInfo);
+
+        return cmrFieldInfo;
     }
 
     private void initInterceptors(EjbModule jar, EjbJarInfo ejbJar, Map<String, EnterpriseBeanInfo> beanInfos) throws OpenEJBException {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCmpEngine.java Wed Jan  3 20:23:04 2007
@@ -17,12 +17,37 @@
  */
 package org.apache.openejb.alt.containers.castor_cmp11;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import javax.ejb.CreateException;
+import javax.ejb.DuplicateKeyException;
+import javax.ejb.EJBException;
+import javax.ejb.EJBObject;
+import javax.ejb.EntityBean;
+import javax.ejb.FinderException;
+import javax.ejb.RemoveException;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+import javax.transaction.TransactionManager;
+
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.SystemException;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.cmp.CmpCallback;
 import org.apache.openejb.core.cmp.CmpEngine;
+import org.apache.openejb.core.cmp.KeyGenerator;
 import org.apache.openejb.util.Logger;
 import org.exolab.castor.jdo.Database;
 import org.exolab.castor.jdo.JDOManager;
@@ -33,30 +58,6 @@
 import org.exolab.castor.persist.spi.CallbackInterceptor;
 import org.exolab.castor.persist.spi.InstanceFactory;
 
-import javax.ejb.CreateException;
-import javax.ejb.DuplicateKeyException;
-import javax.ejb.EJBException;
-import javax.ejb.EJBObject;
-import javax.ejb.EntityBean;
-import javax.ejb.FinderException;
-import javax.ejb.RemoveException;
-import javax.naming.InitialContext;
-import javax.sql.DataSource;
-import javax.transaction.TransactionManager;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
 public class CastorCmpEngine implements CmpEngine {
     private static final Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.core.cmp");
     private static final Object[] NO_ARGS = new Object[0];
@@ -316,7 +317,7 @@
     }
 
     private Object getCastorPrimaryKey(ThreadContext callContext, Object primaryKey) {
-        KeyGenerator kg = callContext.getDeploymentInfo().getKeyGenerator();
+        CastorKeyGenerator kg = (CastorKeyGenerator) callContext.getDeploymentInfo().getKeyGenerator();
         if (kg.isKeyComplex()) {
             return kg.getJdoComplex(primaryKey);
         } else {
@@ -348,8 +349,13 @@
 
     private void configureKeyGenerator(CoreDeploymentInfo di) throws SystemException {
         try {
-            KeyGenerator kg = KeyGeneratorFactory.createKeyGenerator(di);
-            di.setKeyGenerator(kg);
+            String primaryKeyField = di.getPrimaryKeyField();
+            Class beanClass = di.getBeanClass();
+            if (primaryKeyField != null) {
+                di.setKeyGenerator(new CastorSimpleKeyGenerator(beanClass, primaryKeyField));
+            } else {
+                di.setKeyGenerator(new CastorComplexKeyGenerator(beanClass, di.getPrimaryKeyClass()));
+            }
         } catch (Exception e) {
             logger.error("Unable to create KeyGenerator for deployment id = " + di.getDeploymentID(), e);
             throw new SystemException("Unable to create KeyGenerator for deployment id = " + di.getDeploymentID(), e);

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorComplexKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorComplexKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorComplexKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorComplexKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,43 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.alt.containers.castor_cmp11;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.core.cmp.ComplexKeyGenerator;
+import org.exolab.castor.persist.spi.Complex;
+
+public class CastorComplexKeyGenerator extends ComplexKeyGenerator implements CastorKeyGenerator {
+    public CastorComplexKeyGenerator(Class entityBeanClass, Class pkClass) throws OpenEJBException {
+        super(entityBeanClass, pkClass);
+    }
+
+    public Complex getJdoComplex(Object primaryKey) {
+        Object[] pkValues = new Object[fields.size()];
+        for (int i = 0; i < fields.size(); i++) {
+            PkField pkField = fields.get(i);
+            Object pkValue = pkField.getPkFieldValue(primaryKey);
+            pkValues[i] = pkValue;
+        }
+        Complex complex = new Complex(pkValues);
+        return complex;
+    }
+
+    public boolean isKeyComplex() {
+        return true;
+    }
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,26 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.alt.containers.castor_cmp11;
+
+import org.exolab.castor.persist.spi.Complex;
+import org.apache.openejb.core.cmp.KeyGenerator;
+
+public interface CastorKeyGenerator extends KeyGenerator {
+    Complex getJdoComplex(Object primaryKey);
+    boolean isKeyComplex();
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorSimpleKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorSimpleKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorSimpleKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorSimpleKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,37 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.alt.containers.castor_cmp11;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.core.cmp.SimpleKeyGenerator;
+import org.exolab.castor.persist.spi.Complex;
+
+public class CastorSimpleKeyGenerator extends SimpleKeyGenerator implements CastorKeyGenerator {
+    public CastorSimpleKeyGenerator(Class beanClass, String pkField) throws OpenEJBException {
+        super(beanClass, pkField);
+    }
+
+    public Complex getJdoComplex(Object primaryKey) {
+        Complex complex = new Complex(primaryKey);
+        return complex;
+    }
+
+    public boolean isKeyComplex() {
+        return false;
+    }
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Wed Jan  3 20:23:04 2007
@@ -16,21 +16,40 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.Instrumentation;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import javax.naming.Context;
+import javax.persistence.EntityManagerFactory;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.transaction.TransactionManager;
+
 import org.apache.openejb.Container;
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.EnvProps;
 import org.apache.openejb.Injection;
+import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.core.ConnectorReference;
 import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.TemporaryClassLoader;
 import org.apache.openejb.core.TransactionManagerWrapper;
+import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.persistence.GlobalJndiDataSourceResolver;
+import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.persistence.PersistenceDeployer;
 import org.apache.openejb.persistence.PersistenceDeployerException;
-import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
-import org.apache.openejb.core.TemporaryClassLoader;
 import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.OpenEJBErrorHandler;
@@ -39,24 +58,6 @@
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.StaticRecipe;
 
-import javax.naming.Context;
-import javax.persistence.EntityManagerFactory;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.transaction.TransactionManager;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.Instrumentation;
-
 public class Assembler extends AssemblerTool implements org.apache.openejb.spi.Assembler {
 
     public static final Logger logger = Logger.getInstance("OpenEJB.startup", Assembler.class.getPackage().getName());
@@ -267,8 +268,15 @@
                 jars.add(toUrl(jarPath));
             }
 
+            // Generate the cmp2 concrete subclasses
+            Cmp2Builder cmp2Builder = new Cmp2Builder(appInfo);
+            File generatedJar = cmp2Builder.getJarFile();
+            if (generatedJar != null) {
+                jars.add(generatedJar.toURL());
+            }
+
             // Create the class loader
-            ClassLoader classLoader = new URLClassLoader(jars.toArray(new URL[]{}), org.apache.openejb.OpenEJB.class.getClassLoader());
+            ClassLoader classLoader = new URLClassLoader(jars.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
 
             // JPA - Persistence Units MUST be processed first since they will add ClassFileTransformers
             // to the class loader which must be added before any classes are loaded

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Cmp2Builder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Cmp2Builder.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Cmp2Builder.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Cmp2Builder.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,183 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.FileOutputStream;
+import java.util.jar.JarOutputStream;
+import java.util.jar.JarEntry;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.ArrayList;
+import java.net.URL;
+
+import org.apache.openejb.core.TemporaryClassLoader;
+import org.apache.openejb.core.cmp.cmp2.Cmp2Generator;
+import org.apache.openejb.core.cmp.cmp2.CmrField;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.OpenEJBException;
+
+public class Cmp2Builder {
+    private final ClassLoader tempClassLoader;
+
+    private File jarFile;
+    private final Set<String> entries = new TreeSet<String>();
+    private final AppInfo appInfo;
+
+    public Cmp2Builder(AppInfo appInfo) throws OpenEJBException {
+        this.appInfo = appInfo;
+
+        // create a tempClassLoader
+        try {
+            List<URL> jars = null;
+            jars = new ArrayList<URL>();
+            for (EjbJarInfo info : appInfo.ejbJars) {
+                jars.add(new File(info.jarPath).toURL());
+            }
+            for (ClientInfo info : appInfo.clients) {
+                jars.add(new File(info.codebase).toURL());
+            }
+            for (String jarPath : appInfo.libs) {
+                jars.add(new File(jarPath).toURL());
+            }
+            tempClassLoader = new TemporaryClassLoader(jars.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
+        } catch (Exception e) {
+            throw new OpenEJBException("Unable to create temporary class loader", e);
+        }
+    }
+
+    public File getJarFile() throws IOException {
+        if (jarFile == null) {
+            generate();
+        }
+        return jarFile;
+    }
+
+    private void generate() throws IOException {
+        boolean threwException = false;
+        JarOutputStream jarOutputStream = openJarFile();
+        try {
+            // Generate CMP2 implementation classes
+            for (EjbJarInfo ejbJar : appInfo.ejbJars) {
+                for (EnterpriseBeanInfo beanInfo : ejbJar.enterpriseBeans) {
+                    if (beanInfo instanceof EntityBeanInfo) {
+                        EntityBeanInfo entityBeanInfo = (EntityBeanInfo) beanInfo;
+                        generateClass(jarOutputStream, entityBeanInfo);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            threwException = true;
+            throw e;
+        } finally {
+            close(jarOutputStream);
+            if (threwException) {
+                jarFile.delete();
+                jarFile = null;
+            }
+        }
+    }
+
+    private void generateClass(JarOutputStream jarOutputStream, EntityBeanInfo entityBeanInfo) throws IOException {
+        // only generate for cmp2 classes
+        if (entityBeanInfo.cmpVersion != 2) {
+            return;
+        }
+
+        // don't generate if there is aleady an implementation class
+        String className = entityBeanInfo.ejbClass + "_JPA";
+        String entryName = className.replace(".", "/") + ".class";
+        if (entries.contains(entryName) || tempClassLoader.getResource(entryName) != null) {
+            return;
+        }
+
+        // load the bean class, which is used buy the generator
+        Class<?> beanClass = null;
+        try {
+            beanClass = tempClassLoader.loadClass(entityBeanInfo.ejbClass);
+        } catch (ClassNotFoundException e) {
+            throw new IOException("Could not find entity bean class " + beanClass);
+        }
+
+        // generte the implementation class
+        Cmp2Generator cmp2Generator = new Cmp2Generator(beanClass,
+                entityBeanInfo.primKeyField,
+                entityBeanInfo.cmpFieldNames.toArray(new String[entityBeanInfo.cmpFieldNames.size()]));
+        for (CmrFieldInfo cmrFieldInfo : entityBeanInfo.cmrFields) {
+            if (cmrFieldInfo.fieldName != null) {
+                CmrField cmrField = new CmrField(cmrFieldInfo.fieldName,
+                        cmrFieldInfo.fieldType,
+                        cmrFieldInfo.mappedBy.roleSource.ejbClass,
+                        cmrFieldInfo.mappedBy.roleSource.local,
+                        cmrFieldInfo.mappedBy.fieldName);
+                cmp2Generator.addCmrField(cmrField);
+            }
+        }
+        byte[] bytes = cmp2Generator.generate();
+
+        // add the generated class to the jar
+        addJarEntry(jarOutputStream, entryName, bytes);
+    }
+
+    private void addJarEntry(JarOutputStream jarOutputStream, String fileName, byte[] bytes) throws IOException {
+        // add all missing directory entried
+        String path = "";
+        for (StringTokenizer tokenizer = new StringTokenizer(fileName, "/"); tokenizer.hasMoreTokens();) {
+            String part = tokenizer.nextToken();
+            if (tokenizer.hasMoreTokens()) {
+                path += part + "/";
+                if (!entries.contains(path)) {
+                    jarOutputStream.putNextEntry(new JarEntry(path));
+                    jarOutputStream.closeEntry();
+                    entries.add(path);
+                }
+            }
+        }
+
+        // write the bytes
+        jarOutputStream.putNextEntry(new JarEntry(fileName));
+        try {
+            jarOutputStream.write(bytes);
+        } finally {
+            jarOutputStream.closeEntry();
+            entries.add(fileName);
+        }
+    }
+
+    private JarOutputStream openJarFile() throws IOException {
+        if (jarFile != null) {
+            throw new IllegalStateException("Jar file is closed");
+        }
+        jarFile = File.createTempFile("OpenEJB_Generated_", ".jar");
+        jarFile.deleteOnExit();
+        JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(jarFile));
+        return jarOutputStream;
+    }
+
+    private void close(JarOutputStream jarOutputStream) {
+        if (jarOutputStream != null) {
+            try {
+                jarOutputStream.close();
+            } catch (IOException ignored) {
+            }
+        }
+    }
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmrFieldInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmrFieldInfo.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmrFieldInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmrFieldInfo.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,28 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+public class CmrFieldInfo extends InfoObject {
+    public EntityBeanInfo roleSource;
+    public String roleName;
+    public String fieldName;
+    public String fieldType;
+    public boolean cascadeDelete;
+    public boolean many;
+    public CmrFieldInfo mappedBy;
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java Wed Jan  3 20:23:04 2007
@@ -19,7 +19,6 @@
 import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.SystemException;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.DeploymentContext;
 import org.apache.openejb.core.interceptor.InterceptorData;
@@ -101,7 +100,7 @@
         JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(bean.jndiEnc, transactionType, ejbType, factories, new File(bean.codebase).getPath());
         IvmContext root = (IvmContext) jndiEncBuilder.build();
 
-        DeploymentContext deploymentContext = new DeploymentContext(bean.ejbDeploymentId, ejbClass.getClassLoader(), root);
+        DeploymentContext deploymentContext = new DeploymentContext(bean.ejbDeploymentId, cl, root);
         CoreDeploymentInfo deployment;
         if (BeanType.MESSAGE_DRIVEN != ejbType) {
             deployment = new CoreDeploymentInfo(deploymentContext, ejbClass, home, remote, localhome, local, businessLocal, businessRemote, primaryKey, ejbType);
@@ -174,6 +173,7 @@
         if (ejbType.isEntity()) {
             EntityBeanInfo entity = (EntityBeanInfo) bean;
 
+            deployment.setCmp2(entity.cmpVersion == 2);
             deployment.setIsReentrant(entity.reentrant.equalsIgnoreCase("true"));
 
             if (ejbType == BeanType.CMP_ENTITY) {
@@ -194,11 +194,7 @@
                 deployment.setCmrFields(entity.cmpFieldNames.toArray(new String[]{}));
 
                 if (entity.primKeyField != null) {
-                    try {
-                        deployment.setPrimKeyField(entity.primKeyField);
-                    } catch (NoSuchFieldException e) {
-                        throw new SystemException("Can not set prim-key-field on deployment " + entity.ejbDeploymentId, e);
-                    }
+                    deployment.setPrimaryKeyField(entity.primKeyField);
                 }
             }
         }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityBeanInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityBeanInfo.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityBeanInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityBeanInfo.java Wed Jan  3 20:23:04 2007
@@ -26,6 +26,7 @@
     public String persistenceType;
     public String reentrant;
     public final List<String> cmpFieldNames = new ArrayList<String>();
+    public final List<CmrFieldInfo> cmrFields = new ArrayList<CmrFieldInfo>();
     public int cmpVersion;
     public final List<QueryInfo> queries = new ArrayList<QueryInfo>();
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/CmpDeploymentFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/CmpDeploymentFactory.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/CmpDeploymentFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/CmpDeploymentFactory.java Wed Jan  3 20:23:04 2007
@@ -91,11 +91,7 @@
         deploymentInfo.setCmrFields(cmpFields == null? new String[0] : cmpFields);
         deploymentInfo.setIsReentrant(reentrant);
         if (primKeyField != null) {
-            try {
-                deploymentInfo.setPrimKeyField(primKeyField);
-            } catch (NoSuchFieldException e) {
-                throw new SystemException("Can not set prim-key-field on deployment " + id, e);
-            }
+            deploymentInfo.setPrimaryKeyField(primKeyField);
         }
 
         Class home = deploymentInfo.getHomeInterface();

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Wed Jan  3 20:23:04 2007
@@ -16,7 +16,6 @@
  */
 package org.apache.openejb.core;
 
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -42,7 +41,7 @@
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
-import org.apache.openejb.alt.containers.castor_cmp11.KeyGenerator;
+import org.apache.openejb.core.cmp.KeyGenerator;
 import org.apache.openejb.core.entity.EntityEjbHomeHandler;
 import org.apache.openejb.core.ivm.EjbHomeProxyHandler;
 import org.apache.openejb.core.stateful.SessionSynchronizationTxPolicy;
@@ -215,10 +214,11 @@
 
     public byte getTransactionAttribute(Method method) {
         Byte byteWrapper = methodTransactionAttributes.get(method);
-        if (byteWrapper == null)
+        if (byteWrapper == null) {
             return TX_NOT_SUPPORTED;// non remote or home interface method
-        else
+        } else {
             return byteWrapper;
+        }
     }
 
     public TransactionPolicy getTransactionPolicy(Method method) {
@@ -244,7 +244,9 @@
             }
             methodTransactionPolicies.put(method, policy);
         }
-        if (policy == null) policy = new NoTransactionPolicy();
+        if (policy == null) {
+            policy = new NoTransactionPolicy();
+        }
         return policy ;
     }
 
@@ -263,7 +265,9 @@
     }
     public Collection<String> getAuthorizedRoles(Method method) {
         Collection<String> roleSet = methodPermissions.get(method);
-        if (roleSet == null) return Collections.emptySet();
+        if (roleSet == null) {
+            return Collections.emptySet();
+        }
         return roleSet;
     }
 
@@ -723,12 +727,13 @@
     }
 
     protected String extractHomeBeanMethodName(String methodName) {
-        if (methodName.equals("create"))
+        if (methodName.equals("create")) {
             return "ejbCreate";
-        else if (methodName.startsWith("find"))
+        } else if (methodName.startsWith("find")) {
             return "ejbF" + methodName.substring(1);
-        else
+        } else {
             return "ejbH" + methodName.substring(1);
+        }
     }
 
     public Method getCreateMethod() {
@@ -776,20 +781,28 @@
     // CMP specific data
     //
 
+    private boolean cmp2;
     private KeyGenerator keyGenerator;
-    private Field primKeyField;
+    private String primaryKeyField;
     private String[] cmrFields;
+    private Class cmpBeanImpl;
 
     private Map<Method, String> queryMethodMap = new HashMap<Method, String>();
 
-    public Field getPrimaryKeyField() {
-        return primKeyField;
+    public boolean isCmp2() {
+        return cmp2;
     }
 
-    public void setPrimKeyField(String fieldName) throws java.lang.NoSuchFieldException {
-        if (componentType == BeanType.CMP_ENTITY && !java.lang.reflect.Modifier.isAbstract(beanClass.getModifiers())) {
-            primKeyField = beanClass.getField(fieldName);
-        }
+    public void setCmp2(boolean cmp2) {
+        this.cmp2 = cmp2;
+    }
+
+    public String getPrimaryKeyField() {
+        return primaryKeyField;
+    }
+
+    public void setPrimaryKeyField(String primaryKeyField) {
+        this.primaryKeyField = primaryKeyField;
     }
 
     public String [] getCmrFields() {
@@ -814,6 +827,14 @@
 
     public String getQuery(Method queryMethod) {
         return queryMethodMap.get(queryMethod);
+    }
+
+    public Class getCmpBeanImpl() {
+        return cmpBeanImpl;
+    }
+
+    public void setCmpBeanImpl(Class cmpBeanImpl) {
+        this.cmpBeanImpl = cmpBeanImpl;
     }
 
     public void setJarPath(String jarPath) {

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/AbstractKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/AbstractKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/AbstractKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/AbstractKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,60 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.cmp;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+import javax.ejb.EJBException;
+
+import org.apache.openejb.OpenEJBException;
+
+public abstract class AbstractKeyGenerator implements KeyGenerator {
+    public static boolean isValidPkField(Field field) {
+        int modifiers = field.getModifiers();
+        return Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers);
+    }
+
+    public static Field getField(Class clazz, String fieldName) throws OpenEJBException {
+        try {
+            return clazz.getField(fieldName);
+        } catch (NoSuchFieldException e) {
+            throw new OpenEJBException("Unable to get primary key field from entity bean class: " + clazz.getName(), e);
+        }
+    }
+
+    public static Object getFieldValue(Field field, Object object) throws EJBException {
+        if (field == null)  throw new NullPointerException("field is null");
+        if (object == null)  throw new NullPointerException("object is null");
+        try {
+            return field.get(object);
+        } catch (Exception e) {
+            throw new EJBException("Could not get field value for field " + field, e);
+        }
+    }
+
+    public static void setFieldValue(Field field, Object object, Object value) throws EJBException {
+        if (field == null)  throw new NullPointerException("field is null");
+        if (object == null)  throw new NullPointerException("object is null");
+        try {
+            field.set(object, value);
+        } catch (Exception e) {
+            throw new EJBException("Could not set field value for field " + field, e);
+        }
+    }
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java Wed Jan  3 20:23:04 2007
@@ -17,47 +17,46 @@
  */
 package org.apache.openejb.core.cmp;
 
-import org.apache.openejb.RpcContainer;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.rmi.NoSuchObjectException;
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+import javax.ejb.CreateException;
+import javax.ejb.EJBException;
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalHome;
+import javax.ejb.EJBLocalObject;
+import javax.ejb.EJBObject;
+import javax.ejb.EntityBean;
+import javax.ejb.ObjectNotFoundException;
+import javax.ejb.RemoveException;
+import javax.transaction.TransactionManager;
+
+import org.apache.openejb.ApplicationException;
+import org.apache.openejb.Container;
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.Container;
-import org.apache.openejb.ApplicationException;
 import org.apache.openejb.ProxyInfo;
-import org.apache.openejb.spi.SecurityService;
-import org.apache.openejb.util.Enumerator;
-import org.apache.openejb.alt.containers.castor_cmp11.KeyGenerator;
+import org.apache.openejb.RpcContainer;
+import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.Operations;
+import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.entity.EntityContext;
 import org.apache.openejb.core.transaction.TransactionContainer;
-import org.apache.openejb.core.transaction.TransactionPolicy;
 import org.apache.openejb.core.transaction.TransactionContext;
-import org.apache.openejb.core.transaction.TxRequired;
+import org.apache.openejb.core.transaction.TransactionPolicy;
 import org.apache.openejb.core.transaction.TxManditory;
+import org.apache.openejb.core.transaction.TxRequired;
 import org.apache.openejb.core.transaction.TxRequiresNew;
-import org.apache.openejb.core.CoreDeploymentInfo;
-import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.core.Operations;
-import org.apache.openejb.core.entity.EntityContext;
-
-import javax.ejb.EntityBean;
-import javax.ejb.RemoveException;
-import javax.ejb.EJBException;
-import javax.ejb.EJBHome;
-import javax.ejb.EJBLocalHome;
-import javax.ejb.EJBObject;
-import javax.ejb.EJBLocalObject;
-import javax.ejb.CreateException;
-import javax.ejb.ObjectNotFoundException;
-import javax.transaction.TransactionManager;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Field;
-import java.rmi.RemoteException;
-import java.rmi.NoSuchObjectException;
-import java.util.List;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.Vector;
-import java.util.Map;
-import java.util.HashMap;
+import org.apache.openejb.spi.SecurityService;
+import org.apache.openejb.util.Enumerator;
 
 /**
  * @org.apache.xbean.XBean element="cmpContainer"
@@ -125,20 +124,8 @@
     }
 
     public void deploy(CoreDeploymentInfo deploymentInfo) throws OpenEJBException {
-        // try to set deploymentInfo static field on bean implementation class
-        try {
-            Field field = deploymentInfo.getBeanClass().getField("deploymentInfo");
-            field.set(null, deploymentInfo);
-        } catch (Exception e) {
-            // ignore
-        }
-
         Object deploymentId = deploymentInfo.getDeploymentID();
 
-        deploymentsById.put(deploymentId, deploymentInfo);
-        deploymentsByClass.put(deploymentInfo.getBeanClass(), deploymentInfo);
-        deploymentInfo.setContainer(this);
-
         Object cmpEngineKey = deploymentInfo.getJarPath();
         if (cmpEngineKey == null) {
             cmpEngineKey = deploymentInfo.getClassLoader();
@@ -151,6 +138,19 @@
         }
         cmpEngine.deploy(deploymentInfo);
         cmpEnginesByDeployment.put(deploymentId, cmpEngine);
+
+        // try to set deploymentInfo static field on bean implementation class
+        try {
+            Field field = deploymentInfo.getCmpBeanImpl().getField("deploymentInfo");
+            field.set(null, deploymentInfo);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        // add to indexes
+        deploymentsById.put(deploymentId, deploymentInfo);
+        deploymentsByClass.put(deploymentInfo.getCmpBeanImpl(), deploymentInfo);
+        deploymentInfo.setContainer(this);
     }
 
     public Object getEjbInstance(CoreDeploymentInfo deployInfo, Object primaryKey) {
@@ -203,6 +203,8 @@
 
         ThreadContext oldCallContext = ThreadContext.getThreadContext();
         ThreadContext.setThreadContext(callContext);
+        ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(deployInfo.getClassLoader());
         try {
 
             boolean authorized = securityService.isCallerAuthorized(securityIdentity, deployInfo.getAuthorizedRoles(callMethod));
@@ -254,6 +256,7 @@
                 obtains from the DeploymentInfo object associated with the current thread context.
             */
             ThreadContext.setThreadContext(oldCallContext);
+            Thread.currentThread().setContextClassLoader(oldCL);
         }
     }
 
@@ -263,10 +266,10 @@
     private EntityBean createNewInstance(ThreadContext callContext) {
         CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
         try {
-            EntityBean bean = (EntityBean) deploymentInfo.getBeanClass().newInstance();
+            EntityBean bean = (EntityBean) deploymentInfo.getCmpBeanImpl().newInstance();
             return bean;
         } catch (Exception e) {
-            throw new EJBException("Unable to create new entity bean instance");
+            throw new EJBException("Unable to create new entity bean instance " + deploymentInfo.getCmpBeanImpl(), e);
         }
     }
 
@@ -383,14 +386,6 @@
             return entityBean.getClass().getField("deleted").getBoolean(entityBean);
         } catch (NoSuchFieldException e) {
             return false;
-        } catch (Exception e) {
-            throw new EJBException(e);
-        }
-    }
-
-    private void setDeleted(EntityBean entityBean, boolean deleted) {
-        try {
-            entityBean.getClass().getField("deleted").setBoolean(entityBean, deleted);
         } catch (Exception e) {
             throw new EJBException(e);
         }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java?view=diff&rev=492404&r1=492403&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java Wed Jan  3 20:23:04 2007
@@ -20,6 +20,7 @@
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.SystemException;
+import org.apache.openejb.OpenEJBException;
 
 import javax.persistence.EntityTransaction;
 import javax.ejb.EntityBean;
@@ -38,5 +39,5 @@
 
     List<Object> queryBeans(ThreadContext callContext, String queryString, Object[] args) throws FinderException;
 
-    void deploy(CoreDeploymentInfo deploymentInfo) throws SystemException;
+    void deploy(CoreDeploymentInfo deploymentInfo) throws OpenEJBException;
 }

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ComplexKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ComplexKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ComplexKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ComplexKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,81 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.cmp;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.ejb.EJBException;
+import javax.ejb.EntityBean;
+
+import org.apache.openejb.OpenEJBException;
+
+public class ComplexKeyGenerator extends AbstractKeyGenerator {
+    protected final List<PkField> fields;
+    private final Class pkClass;
+
+    public ComplexKeyGenerator(Class entityBeanClass, Class pkClass) throws OpenEJBException {
+        this.pkClass = pkClass;
+        List<org.apache.openejb.core.cmp.ComplexKeyGenerator.PkField> fields = new ArrayList<PkField>();
+        for (Field pkObjectField : pkClass.getFields()) {
+            if (!isValidPkField(pkObjectField)) {
+                Field entityBeanField = getField(entityBeanClass, pkObjectField.getName());
+                if (!isValidPkField(entityBeanField)) {
+                    throw new OpenEJBException("Invalid primray key field on entity bean class: " + entityBeanClass.getName());
+                }
+                org.apache.openejb.core.cmp.ComplexKeyGenerator.PkField pkField = new org.apache.openejb.core.cmp.ComplexKeyGenerator.PkField(entityBeanField, pkObjectField);
+                fields.add(pkField);
+            }
+        }
+        this.fields = Collections.unmodifiableList(fields);
+    }
+
+    public Object getPrimaryKey(EntityBean bean) {
+        Object pkObject = null;
+        try {
+            pkObject = pkClass.newInstance();
+        } catch (Exception e) {
+            throw new EJBException("Unable to create complex primary key instance: " + pkClass.getName(), e);
+        }
+        for (org.apache.openejb.core.cmp.ComplexKeyGenerator.PkField pkField : fields) {
+            pkField.copyToPkObject(bean, pkObject);
+        }
+        return pkObject;
+    }
+
+    protected static class PkField {
+        private final Field entityBeanField;
+        private final Field pkObjectField;
+
+        public PkField(Field entityBeanField, Field pkObjectField) {
+            this.entityBeanField = entityBeanField;
+            this.pkObjectField = pkObjectField;
+        }
+
+        public void copyToPkObject(EntityBean bean, Object pkObject) {
+            Object value = getFieldValue(entityBeanField, bean);
+            setFieldValue(pkObjectField, bean, value);
+        }
+
+        public Object getPkFieldValue(Object pkObject) {
+            Object value = getFieldValue(pkObjectField, pkObject);
+            return value;
+        }
+    }
+}

Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java (from r491148, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGenerator.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java?view=diff&rev=492404&p1=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGenerator.java&r1=491148&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java&r2=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/KeyGenerator.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -14,16 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.openejb.alt.containers.castor_cmp11;
-
-import org.exolab.castor.persist.spi.Complex;
+package org.apache.openejb.core.cmp;
 
 public interface KeyGenerator {
-
-    public Object getPrimaryKey(javax.ejb.EntityBean bean);
-
-    public Complex getJdoComplex(Object primaryKey);
-
-    public boolean isKeyComplex();
-
+    Object getPrimaryKey(javax.ejb.EntityBean bean);
 }

Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/KeyGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author Id Revision HeadURL

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/SimpleKeyGenerator.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/SimpleKeyGenerator.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/SimpleKeyGenerator.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/SimpleKeyGenerator.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,39 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.cmp;
+
+import java.lang.reflect.Field;
+import javax.ejb.EntityBean;
+
+import org.apache.openejb.OpenEJBException;
+
+public class SimpleKeyGenerator extends AbstractKeyGenerator {
+    private final Field pkField;
+
+    public SimpleKeyGenerator(Class beanClass, String pkField) throws OpenEJBException {
+        this.pkField = getField(beanClass, pkField);
+        if (!isValidPkField(this.pkField)) {
+            throw new OpenEJBException("Invalid primray key field: " + pkField);
+        }
+    }
+
+    public Object getPrimaryKey(EntityBean bean) {
+        Object value = getFieldValue(pkField, bean);
+        return value;
+    }
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Entity.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Entity.java?view=auto&rev=492404
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Entity.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Entity.java Wed Jan  3 20:23:04 2007
@@ -0,0 +1,31 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.cmp.cmp2;
+
+//
+// WARNING: Do not refactor this class.  It is used by the Cmp2Generator.
+//
+public interface Cmp2Entity {
+    Object OpenEJB_getPrimaryKey();
+
+    void OpenEJB_deleted();
+
+    Object OpenEJB_addCmr(String name, Object bean);
+
+    void OpenEJB_removeCmr(String name, Object value);
+}