You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/04/30 23:54:41 UTC

svn commit: r398449 - in /incubator/cayenne/jpa/trunk: cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/ cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/ cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/ ...

Author: aadamchik
Date: Sun Apr 30 14:54:38 2006
New Revision: 398449

URL: http://svn.apache.org/viewcvs?rev=398449&view=rev
Log:
map converter is in a good enough state to run the example SQLTemplates and SelectQueries
now we need a class enhancer..

Modified:
    incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java
    incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Person.java
    incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Project.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaClassDescriptor.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaLoaderContext.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java Sun Apr 30 14:54:38 2006
@@ -18,6 +18,7 @@
 import java.util.List;
 
 import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.QueryHint;
@@ -31,6 +32,9 @@
 })
 public class Department {
 
+    @Id
+    protected int department_id;
+    
     protected String name;
     protected String description;
     

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Person.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Person.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Person.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Person.java Sun Apr 30 14:54:38 2006
@@ -19,12 +19,16 @@
 import java.util.List;
 
 import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 
 @Entity
 public class Person {
+
+    @Id
+    protected int person_id;
 
     protected double baseSalary;
     protected Date dateHired;

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Project.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Project.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Project.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Project.java Sun Apr 30 14:54:38 2006
@@ -18,20 +18,24 @@
 import java.util.List;
 
 import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 
 @Entity
 public class Project {
 
+    @Id
+    protected int project_id;
+
     protected String name;
-    
+
     @ManyToOne
     protected Department department;
-    
+
     @ManyToOne
     protected Person manager;
-    
+
     @OneToMany
     protected List<Person> members;
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java Sun Apr 30 14:54:38 2006
@@ -20,12 +20,14 @@
 
 import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.conf.JpaLoaderContext;
+import org.apache.cayenne.jpa.conf.JpaPropertyDescriptor;
 import org.apache.cayenne.jpa.map.AccessType;
 import org.apache.cayenne.jpa.map.JpaAttribute;
 import org.apache.cayenne.jpa.map.JpaBasic;
 import org.apache.cayenne.jpa.map.JpaColumn;
 import org.apache.cayenne.jpa.map.JpaEntity;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.map.JpaId;
 import org.apache.cayenne.jpa.map.JpaManyToMany;
 import org.apache.cayenne.jpa.map.JpaManyToOne;
 import org.apache.cayenne.jpa.map.JpaNamedQuery;
@@ -62,16 +64,13 @@
     protected ProjectPath targetPath;
     protected HierarchicalTreeVisitor visitor;
 
-    public DataMapConverter(JpaLoaderContext context) {
+    public synchronized DataMap toDataMap(String name, JpaLoaderContext context) {
         this.context = context;
-    }
-
-    public synchronized DataMap toDataMap(String name, JpaEntityMap jpaMap) {
 
         // reset
         DataMap dataMap = new DataMap(name);
-        dataMap.setDefaultPackage(jpaMap.getPackageName());
-        dataMap.setDefaultSchema(jpaMap.getSchema());
+        dataMap.setDefaultPackage(context.getEntityMap().getPackageName());
+        dataMap.setDefaultSchema(context.getEntityMap().getSchema());
 
         this.targetPath = new ProjectPath(dataMap);
 
@@ -79,7 +78,7 @@
             visitor = createVisitor();
         }
 
-        TraversalUtil.traverse(jpaMap, visitor);
+        TraversalUtil.traverse(context.getEntityMap(), visitor);
         return dataMap;
     }
 
@@ -212,6 +211,53 @@
         }
     }
 
+    class JpaIdColumnVisitor extends BaseTreeVisitor {
+
+        @Override
+        public boolean onStartNode(ProjectPath path) {
+            JpaColumn jpaColumn = (JpaColumn) path.getObject();
+
+            DbAttribute dbAttribute = new DbAttribute(jpaColumn.getName());
+
+            // TODO, andrus, 4/28/2006 - per JPA spec, is there a way to override the type
+            // doing conversion implicitly???
+
+            JpaEntity jpaEntity = (JpaEntity) path.firstInstanceOf(JpaEntity.class);
+            JpaId jpaId = (JpaId) path.firstInstanceOf(JpaId.class);
+
+            JpaPropertyDescriptor property = context.getLoadedDescriptor(
+                    jpaEntity.getClassName()).getProperty(jpaId.getName());
+
+            dbAttribute.setType(TypesMapping.getSqlTypeByJava(property.getType()));
+
+            dbAttribute.setMandatory(true);
+            dbAttribute.setPrimaryKey(true);
+
+            // TODO, andrus, 4/28/2006 - note that Cayenne DbAttribute's precision is
+            // really scale (and precision is not defined at all). Fix this in
+            // DbAttribute.
+            dbAttribute.setPrecision(jpaColumn.getScale());
+
+            if (jpaColumn.getTable() == null) {
+                recordConflict(path, "No table defined for JpaColumn '"
+                        + jpaColumn.getName());
+                return false;
+            }
+
+            DbEntity entity = ((DataMap) targetPath.firstInstanceOf(DataMap.class))
+                    .getDbEntity(jpaColumn.getTable());
+
+            if (entity == null) {
+                recordConflict(path, "Invalid table definition for JpaColumn: "
+                        + jpaColumn.getTable());
+                return false;
+            }
+
+            entity.addAttribute(dbAttribute);
+            return false;
+        }
+    }
+
     class JpaEntityVisitor extends NestedVisitor {
 
         JpaEntityVisitor() {
@@ -231,6 +277,11 @@
             attributeVisitor.addChildVisitor(JpaBasic.class, new JpaBasicVisitor());
 
             addChildVisitor(JpaAttribute.class, attributeVisitor);
+
+            BaseTreeVisitor idVisitor = new BaseTreeVisitor();
+            idVisitor.addChildVisitor(JpaColumn.class, new JpaIdColumnVisitor());
+            addChildVisitor(JpaId.class, idVisitor);
+
             addChildVisitor(JpaTable.class, new JpaTableVisitor());
             addChildVisitor(JpaNamedQuery.class, new JpaNamedQueryVisitor());
         }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoader.java Sun Apr 30 14:54:38 2006
@@ -42,7 +42,6 @@
 
 import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.map.JpaAbstractEntity;
-import org.apache.cayenne.jpa.map.JpaEntityMap;
 import org.objectstyle.cayenne.util.Util;
 
 /**
@@ -113,8 +112,7 @@
      * Processes annotations of a single Java class, loading ORM mapping information to
      * the provided entity map.
      */
-    public void loadClassMapping(JpaEntityMap entityMap, Class managedClass)
-            throws JpaProviderException {
+    public void loadClassMapping(Class managedClass) throws JpaProviderException {
 
         Annotation[] classAnnotations = managedClass.getAnnotations();
 
@@ -122,7 +120,7 @@
         Arrays.sort(classAnnotations, typeAnnotationsSorter);
 
         AnnotationProcessorStack stack = context.createAnnotationProcessorContext();
-        stack.push(entityMap);
+        stack.push(context.getEntityMap());
 
         // === push class-level stuff
         for (int i = 0; i < classAnnotations.length; i++) {
@@ -160,8 +158,7 @@
             applyMemberAnnotations(property.getMember(), stack);
         }
 
-        for (JpaPropertyDescriptor property : descriptor
-                .getPropertyDescriptors()) {
+        for (JpaPropertyDescriptor property : descriptor.getPropertyDescriptors()) {
             applyMemberAnnotations(property.getMember(), stack);
         }
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java Sun Apr 30 14:54:38 2006
@@ -239,8 +239,12 @@
             JpaId id = (JpaId) path.getObject();
 
             if (id.getColumn() == null) {
+
                 JpaColumn column = new JpaColumn(AnnotationPrototypes.getColumn());
                 column.setName(id.getName());
+
+                JpaEntity entity = (JpaEntity) path.getObjectParent();
+                column.setTable(entity.getTable().getName());
                 id.setColumn(column);
             }
 
@@ -329,18 +333,10 @@
                 JpaEntity entity = (JpaEntity) path.firstInstanceOf(JpaEntity.class);
 
                 String name = relationship.getParent().getName();
-                JpaEntityMap entityMap = (JpaEntityMap) path.getRoot();
 
                 JpaClassDescriptor srcDescriptor = context.getLoadedDescriptor(entity
                         .getClassName());
-                JpaPropertyDescriptor property;
-
-                if (entityMap.getAccess() == AccessType.FIELD) {
-                    property = srcDescriptor.getFieldDescriptor(name);
-                }
-                else {
-                    property = srcDescriptor.getPropertyDescriptor(name);
-                }
+                JpaPropertyDescriptor property = srcDescriptor.getProperty(name);
 
                 Class targetEntityType = property.getTargetEntityType();
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java Sun Apr 30 14:54:38 2006
@@ -70,8 +70,7 @@
      * from all locations supported by the JPA specification.
      */
     public EntityMapLoader(PersistenceUnitInfo persistenceUnit) {
-        this.context = new JpaLoaderContext();
-        this.entityMap = loadEntityMap(persistenceUnit);
+        loadEntityMap(persistenceUnit);
     }
 
     /**
@@ -85,15 +84,16 @@
      * Loads a combined entity map including managed class descriptors from all supported
      * locations.
      */
-    protected JpaEntityMap loadEntityMap(PersistenceUnitInfo persistenceUnit)
+    protected void loadEntityMap(PersistenceUnitInfo persistenceUnit)
             throws JpaProviderException {
 
-        try {
-            JpaEntityMap baseMap = loadFromAnnotations(persistenceUnit);
-            updateFromXML(baseMap, persistenceUnit);
-            updateFromDefaults(baseMap);
+        this.entityMap = new JpaEntityMap();
+        this.context = new JpaLoaderContext(entityMap);
 
-            return baseMap;
+        try {
+            loadFromAnnotations(persistenceUnit);
+            updateFromXML(entityMap, persistenceUnit);
+            updateFromDefaults(entityMap);
         }
         catch (JpaProviderException e) {
             throw e;
@@ -165,11 +165,9 @@
     }
 
     /**
-     * Creates a new JpaEntityMap based on metadata annotations of persistent classes.
+     * Loads JpaEntityMap based on metadata annotations of persistent classes.
      */
-    protected JpaEntityMap loadFromAnnotations(PersistenceUnitInfo persistenceUnit) {
-
-        JpaEntityMap map = new JpaEntityMap();
+    protected void loadFromAnnotations(PersistenceUnitInfo persistenceUnit) {
 
         if (!persistenceUnit.getManagedClassNames().isEmpty()) {
 
@@ -187,11 +185,9 @@
                     throw new JpaProviderException("Class not found: " + className, e);
                 }
 
-                annotationLoader.loadClassMapping(map, managedClass);
+                annotationLoader.loadClassMapping(managedClass);
             }
         }
-
-        return map;
     }
 
     public JpaLoaderContext getContext() {

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaClassDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaClassDescriptor.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaClassDescriptor.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaClassDescriptor.java Sun Apr 30 14:54:38 2006
@@ -26,6 +26,9 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.cayenne.jpa.map.AccessType;
+import org.apache.cayenne.jpa.map.JpaEntityMap;
+
 /**
  * Provides the JPA information about a class, such potential persistence fields, etc.
  * 
@@ -39,49 +42,67 @@
     protected Collection<JpaPropertyDescriptor> fieldDescriptors;
     protected Collection<JpaPropertyDescriptor> propertyDescriptors;
     protected Class managedClass;
+    protected JpaEntityMap entityMap;
 
-    public JpaClassDescriptor(Class managedClass) {
+    public JpaClassDescriptor(JpaEntityMap entityMap, Class managedClass) {
         this.managedClass = managedClass;
+        this.entityMap = entityMap;
     }
 
     public Class getManagedClass() {
         return managedClass;
     }
 
-    public JpaPropertyDescriptor getFieldDescriptor(String name) {
-        for (JpaPropertyDescriptor d : getFieldDescriptors()) {
-            if (name.equals(d.getName())) {
-                return d;
-            }
-        }
+    public boolean isFieldAccess() {
+        return entityMap.getAccess() == AccessType.FIELD;
+    }
 
-        return null;
+    public boolean isPropertyAccess() {
+        return entityMap.getAccess() == AccessType.PROPERTY;
     }
 
-    public JpaPropertyDescriptor getPropertyDescriptor(String name) {
-        for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
-            if (name.equals(d.getName())) {
-                return d;
+    /**
+     * Returns descriptor matching the property name. If the underlying entity map uses
+     * FIELD access, a descritor is looked up in the list of class fields, if it uses
+     * PROPERTY access - descriptor is looked up in the list of class properties.
+     */
+    public JpaPropertyDescriptor getProperty(String name) {
+        if (isFieldAccess()) {
+            for (JpaPropertyDescriptor d : getFieldDescriptors()) {
+                if (name.equals(d.getName())) {
+                    return d;
+                }
             }
         }
-
-        return null;
-    }
-
-    public JpaPropertyDescriptor getFieldDescriptor(Member field) {
-        for (JpaPropertyDescriptor d : getFieldDescriptors()) {
-            if (d.getMember().equals(field)) {
-                return d;
+        else if (isPropertyAccess()) {
+            for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
+                if (name.equals(d.getName())) {
+                    return d;
+                }
             }
         }
 
         return null;
     }
 
-    public JpaPropertyDescriptor getPropertyDescriptor(Member getter) {
-        for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
-            if (d.getMember().equals(getter)) {
-                return d;
+    /**
+     * Returns descriptor matching the property name. Note that entity map access type is
+     * ignored and instead field vs. property descriptor is determined from the member
+     * type.
+     */
+    public JpaPropertyDescriptor getPropertyForMember(Member classMember) {
+        if (classMember instanceof Field) {
+            for (JpaPropertyDescriptor d : getFieldDescriptors()) {
+                if (d.getMember().equals(classMember)) {
+                    return d;
+                }
+            }
+        }
+        else if (classMember instanceof Method) {
+            for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
+                if (d.getMember().equals(classMember)) {
+                    return d;
+                }
             }
         }
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaLoaderContext.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaLoaderContext.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaLoaderContext.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaLoaderContext.java Sun Apr 30 14:54:38 2006
@@ -16,13 +16,12 @@
 package org.apache.cayenne.jpa.conf;
 
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
 import java.lang.reflect.Member;
-import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 
+import org.apache.cayenne.jpa.map.JpaEntityMap;
 import org.objectstyle.cayenne.validation.SimpleValidationFailure;
 import org.objectstyle.cayenne.validation.ValidationFailure;
 import org.objectstyle.cayenne.validation.ValidationResult;
@@ -36,9 +35,15 @@
 
     protected Map<String, JpaClassDescriptor> descriptors;
     protected ValidationResult conflicts;
+    protected JpaEntityMap entityMap;
 
-    public JpaLoaderContext() {
+    public JpaLoaderContext(JpaEntityMap map) {
         this.conflicts = new ValidationResult();
+        this.entityMap = map;
+    }
+
+    public JpaEntityMap getEntityMap() {
+        return entityMap;
     }
 
     public AnnotationProcessorStack createAnnotationProcessorContext() {
@@ -60,14 +65,7 @@
 
         if (element instanceof Member) {
             Member member = (Member) element;
-
-            JpaClassDescriptor classDescriptor = getDescriptor(member.getDeclaringClass());
-            if (member instanceof Field) {
-                return classDescriptor.getFieldDescriptor(member);
-            }
-            else if (member instanceof Method) {
-                return classDescriptor.getPropertyDescriptor(member);
-            }
+            return getDescriptor(member.getDeclaringClass()).getPropertyForMember(member);
         }
 
         return null;
@@ -89,7 +87,7 @@
         }
 
         if (descriptor == null) {
-            descriptor = new JpaClassDescriptor(managedClass);
+            descriptor = new JpaClassDescriptor(entityMap, managedClass);
             descriptors.put(name, descriptor);
         }
 
@@ -147,4 +145,5 @@
                     buffer.toString()));
         }
     }
+
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java Sun Apr 30 14:54:38 2006
@@ -28,7 +28,6 @@
 import org.apache.cayenne.jpa.bridge.DataMapConverter;
 import org.apache.cayenne.jpa.conf.EntityMapLoader;
 import org.apache.cayenne.jpa.conf.JpaLoaderContext;
-import org.apache.cayenne.jpa.map.JpaEntityMap;
 import org.apache.cayenne.jpa.spi.JpaPersistenceProvider;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -98,10 +97,8 @@
             configuration.addDomain(domain);
 
             EntityMapLoader loader = new EntityMapLoader(info);
-            JpaEntityMap jpaMap = loader.getEntityMap();
-
-            DataMapConverter converter = new DataMapConverter(loader.getContext());
-            DataMap cayenneMap = converter.toDataMap(name, jpaMap);
+            DataMapConverter converter = new DataMapConverter();
+            DataMap cayenneMap = converter.toDataMap(name, loader.getContext());
 
             DataSource dataSource = info.getTransactionType() == PersistenceUnitTransactionType.JTA
                     ? info.getJtaDataSource()

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java Sun Apr 30 14:54:38 2006
@@ -38,8 +38,8 @@
         // TODO: unsupported by DataMap
         // jpaMap.setCatalog("c1");
 
-        DataMap cayenneMap = new DataMapConverter(new JpaLoaderContext())
-                .toDataMap("n1", jpaMap);
+        DataMap cayenneMap = new DataMapConverter().toDataMap("n1", new JpaLoaderContext(
+                jpaMap));
         assertEquals("n1", cayenneMap.getName());
         assertEquals("p1", cayenneMap.getDefaultPackage());
         assertEquals("s1", cayenneMap.getDefaultSchema());
@@ -50,15 +50,15 @@
      */
     public void testLoadClassMapping() throws Exception {
         JpaEntityMap map = new JpaEntityMap();
-        JpaLoaderContext context = new JpaLoaderContext();
+        JpaLoaderContext context = new JpaLoaderContext(map);
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
 
-        loader.loadClassMapping(map, MockCayenneEntity1.class);
-        loader.loadClassMapping(map, MockCayenneEntity2.class);
-        loader.loadClassMapping(map, MockCayenneTargetEntity1.class);
-        loader.loadClassMapping(map, MockCayenneTargetEntity2.class);
+        loader.loadClassMapping(MockCayenneEntity1.class);
+        loader.loadClassMapping(MockCayenneEntity2.class);
+        loader.loadClassMapping(MockCayenneTargetEntity1.class);
+        loader.loadClassMapping(MockCayenneTargetEntity2.class);
 
-        loader.loadClassMapping(map, MockCayenneEntityMap1.class);
+        loader.loadClassMapping(MockCayenneEntityMap1.class);
 
         // apply defaults before conversion
         new EntityMapDefaultsProcessor(context).applyDefaults(map);
@@ -67,7 +67,7 @@
                 .getConflicts()
                 .hasFailures());
 
-        DataMap dataMap = new DataMapConverter(context).toDataMap("n1", map);
+        DataMap dataMap = new DataMapConverter().toDataMap("n1", context);
         assertFalse("Found DataMap conflicts: " + context.getConflicts(), context
                 .getConflicts()
                 .hasFailures());

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java Sun Apr 30 14:54:38 2006
@@ -15,13 +15,17 @@
  */
 package org.apache.cayenne.jpa.bridge;
 
+import java.sql.Types;
 import java.util.Iterator;
+import java.util.List;
 
 import junit.framework.Assert;
 
 import org.apache.cayenne.jpa.entity.cayenne.MockCayenneEntity1;
 import org.apache.cayenne.jpa.entity.cayenne.MockCayenneEntity2;
+import org.objectstyle.cayenne.dba.TypesMapping;
 import org.objectstyle.cayenne.map.DataMap;
+import org.objectstyle.cayenne.map.DbAttribute;
 import org.objectstyle.cayenne.map.DbEntity;
 import org.objectstyle.cayenne.map.ObjAttribute;
 import org.objectstyle.cayenne.map.ObjEntity;
@@ -66,6 +70,17 @@
         assertEquals("mock_persistent_1", table.getName());
         assertEquals("catalog1", table.getCatalog());
         assertEquals("schema1", table.getSchema());
+
+        List pks = table.getPrimaryKey();
+        assertEquals(1, pks.size());
+        DbAttribute pk = (DbAttribute) pks.get(0);
+        assertEquals("id", pk.getName());
+        assertTrue(pk.isPrimaryKey());
+        assertTrue(pk.isMandatory());
+        assertEquals(
+                "Invalid SQL type: " + TypesMapping.getSqlNameByType(pk.getType()),
+                Types.INTEGER,
+                pk.getType());
     }
 
     protected void assertObjAttributes(ObjEntity entity1) {
@@ -92,8 +107,9 @@
 
     protected void assertObjRelationships(ObjEntity entity1) {
         assertEquals(4, entity1.getRelationshipMap().size());
-        
-        ObjRelationship attribute5 = (ObjRelationship) entity1.getRelationship("attribute5");
+
+        ObjRelationship attribute5 = (ObjRelationship) entity1
+                .getRelationship("attribute5");
         assertNotNull(attribute5);
         assertFalse(attribute5.isToMany());
         assertEquals("attribute5", attribute5.getDbRelationshipPath());

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java Sun Apr 30 14:54:38 2006
@@ -46,7 +46,7 @@
     public void testSortAnnotations() throws Exception {
 
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(
-                new JpaLoaderContext());
+                new JpaLoaderContext(new JpaEntityMap()));
 
         Annotation[] a1 = new Annotation[3];
         a1[0] = MockAnnotatedBean1.class.getAnnotation(NamedQuery.class);
@@ -66,9 +66,9 @@
      */
     public void testAttributeOverride() {
         JpaEntityMap map = new JpaEntityMap();
-        JpaLoaderContext context = new JpaLoaderContext();
+        JpaLoaderContext context = new JpaLoaderContext(map);
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
-        loader.loadClassMapping(map, MockAnnotatedBean2.class);
+        loader.loadClassMapping(MockAnnotatedBean2.class);
 
         assertEquals(1, map.getEntities().size());
         JpaEntity entity = map.getEntities().iterator().next();
@@ -96,24 +96,24 @@
      */
     public void testLoadClassMapping() throws Exception {
         JpaEntityMap map = new JpaEntityMap();
-        JpaLoaderContext context = new JpaLoaderContext();
+        JpaLoaderContext context = new JpaLoaderContext(map);
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
 
-        loader.loadClassMapping(map, MockEntity1.class);
-        loader.loadClassMapping(map, MockEntity2.class);
-        loader.loadClassMapping(map, MockEntity3.class);
-        loader.loadClassMapping(map, MockEntity4.class);
-        loader.loadClassMapping(map, MockEntity5.class);
-
-        loader.loadClassMapping(map, MockEmbed1.class);
-        loader.loadClassMapping(map, MockEmbed2.class);
-
-        loader.loadClassMapping(map, MockMappedSuperclass1.class);
-        loader.loadClassMapping(map, MockMappedSuperclass2.class);
-        loader.loadClassMapping(map, MockMappedSuperclass3.class);
+        loader.loadClassMapping(MockEntity1.class);
+        loader.loadClassMapping(MockEntity2.class);
+        loader.loadClassMapping(MockEntity3.class);
+        loader.loadClassMapping(MockEntity4.class);
+        loader.loadClassMapping(MockEntity5.class);
+
+        loader.loadClassMapping(MockEmbed1.class);
+        loader.loadClassMapping(MockEmbed2.class);
+
+        loader.loadClassMapping(MockMappedSuperclass1.class);
+        loader.loadClassMapping(MockMappedSuperclass2.class);
+        loader.loadClassMapping(MockMappedSuperclass3.class);
 
-        loader.loadClassMapping(map, MockEntityMap1.class);
-        loader.loadClassMapping(map, MockEntityMap2.class);
+        loader.loadClassMapping(MockEntityMap1.class);
+        loader.loadClassMapping(MockEntityMap2.class);
 
         assertFalse("Found conflicts: " + context.getConflicts(), context
                 .getConflicts()

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java Sun Apr 30 14:54:38 2006
@@ -22,6 +22,7 @@
 import org.apache.cayenne.jpa.map.JpaAttribute;
 import org.apache.cayenne.jpa.map.JpaEntity;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.map.JpaId;
 
 public class EntityMapDefaultsProcessorTest extends TestCase {
 
@@ -34,10 +35,10 @@
         assertFalse(Serializable.class.isAssignableFrom(MockAnnotatedBean3.class));
 
         JpaEntityMap map = new JpaEntityMap();
-        context = new JpaLoaderContext();
+        context = new JpaLoaderContext(map);
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
-        loader.loadClassMapping(map, MockAnnotatedBean1.class);
-        loader.loadClassMapping(map, MockAnnotatedBean3.class);
+        loader.loadClassMapping(MockAnnotatedBean1.class);
+        loader.loadClassMapping(MockAnnotatedBean3.class);
 
         // apply defaults
         EntityMapDefaultsProcessor defaultsProcessor = new EntityMapDefaultsProcessor(
@@ -90,5 +91,13 @@
 
         assertNotNull(toBean2s2.getOneToMany());
         assertNull(toBean2s2.getOneToMany().getTargetEntityName());
+    }
+
+    public void testId() {
+        assertEquals(1, entity.getIds().size());
+        JpaId id = entity.getIds().iterator().next();
+        assertEquals("pk", id.getName());
+        assertNotNull(id.getColumn());
+        assertEquals("pk", id.getColumn().getName());
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java Sun Apr 30 14:54:38 2006
@@ -17,6 +17,9 @@
 
 import java.util.regex.Matcher;
 
+import org.apache.cayenne.jpa.map.AccessType;
+import org.apache.cayenne.jpa.map.JpaEntityMap;
+
 import junit.framework.TestCase;
 
 public class JpaClassDescriptorTest extends TestCase {
@@ -46,17 +49,20 @@
         assertEquals("This", m3.group(1));
     }
 
-    public void testGetPropertyDescriptors() throws Exception {
+    public void testGetMemberDescriptors() throws Exception {
 
+        JpaEntityMap map = new JpaEntityMap();
+        map.setAccess(AccessType.PROPERTY);
         JpaClassDescriptor descriptor = new JpaClassDescriptor(
+                map,
                 MockPropertyRegressionBean.class);
 
         assertEquals(2, descriptor.getPropertyDescriptors().size());
 
-        assertNotNull(descriptor.getPropertyDescriptor(MockPropertyRegressionBean.class
+        assertNotNull(descriptor.getPropertyForMember(MockPropertyRegressionBean.class
                 .getDeclaredMethod("getP2", new Class[] {})));
 
-        assertNotNull(descriptor.getPropertyDescriptor(MockPropertyRegressionBean.class
+        assertNotNull(descriptor.getPropertyForMember(MockPropertyRegressionBean.class
                 .getDeclaredMethod("getP3", new Class[] {})));
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java?rev=398449&r1=398448&r2=398449&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java Sun Apr 30 14:54:38 2006
@@ -19,11 +19,15 @@
 
 import javax.persistence.Basic;
 import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 
 @Entity
 public class MockAnnotatedBean3 {
+    
+    @Id
+    protected int pk;
 
     @Basic
     protected String attribute1;