Author: aadamchik
Date: Sat Apr 29 17:40:26 2006
New Revision: 398256

URL: http://svn.apache.org/viewcvs?rev=398256&view=rev
Log:
refactoring; adding check for missing annotations

Added:
    
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaPropertyDescriptor.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/MockAnnotatedBean3.java
Modified:
    
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/AnnotationProcessorFactory.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/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/conf/MemberAnnotationProcessorFactory.java
    
incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/JpaClassDescriptorTest.java

Modified: 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/AnnotationProcessorFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/AnnotationProcessorFactory.java?rev=398256&r1=398255&r2=398256&view=diff
==============================================================================
--- 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/AnnotationProcessorFactory.java
 (original)
+++ 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/AnnotationProcessorFactory.java
 Sat Apr 29 17:40:26 2006
@@ -28,7 +28,7 @@
  * 
  * @author Andrus Adamchik
  */
-public abstract class AnnotationProcessorFactory {
+abstract class AnnotationProcessorFactory {
 
     static final String ANNOTATIONS_PACKAGE = "javax.persistence.";
     static final String PROCESSOR_NAME_SUFFIX = "Processor";

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=398256&r1=398255&r2=398256&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
 Sat Apr 29 17:40:26 2006
@@ -17,7 +17,6 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -157,12 +156,13 @@
         // (using FIELD access for now).
 
         JpaClassDescriptor descriptor = 
this.context.getDescriptor(managedClass);
-        for (Field field : descriptor.getPersistentFieldCandidates()) {
-            applyMemberAnnotations(field, stack);
+        for (JpaPropertyDescriptor property : 
descriptor.getFieldDescriptors()) {
+            applyMemberAnnotations(property.getMember(), stack);
         }
 
-        for (Method propertyGetter : 
descriptor.getPersistentPropertyCandidates()) {
-            applyMemberAnnotations(propertyGetter, stack);
+        for (JpaPropertyDescriptor property : descriptor
+                .getPropertyDescriptors()) {
+            applyMemberAnnotations(property.getMember(), stack);
         }
 
         // === pop class-level stuff

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=398256&r1=398255&r2=398256&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
 Sat Apr 29 17:40:26 2006
@@ -15,8 +15,6 @@
  */
 package org.apache.cayenne.jpa.conf;
 
-import java.lang.reflect.Member;
-
 import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.map.AccessType;
 import org.apache.cayenne.jpa.map.JpaAttribute;
@@ -30,6 +28,7 @@
 import org.apache.cayenne.util.HierarchicalTreeVisitor;
 import org.apache.cayenne.util.TraversalUtil;
 import org.objectstyle.cayenne.project.ProjectPath;
+import org.objectstyle.cayenne.validation.SimpleValidationFailure;
 
 /**
  * Initializes JPA specification compatible mapping defaults.
@@ -95,13 +94,14 @@
 
             JpaEntityMap root = (JpaEntityMap) path.getRoot();
             if (root.getAccess() == AccessType.FIELD) {
-                for (Member candidate : 
descriptor.getPersistentFieldCandidates()) {
-                    processCandidate(entity, descriptor, candidate);
+                for (JpaPropertyDescriptor candidate : 
descriptor.getFieldDescriptors()) {
+                    processProperty(entity, descriptor, candidate);
                 }
             }
             else {
-                for (Member candidate : 
descriptor.getPersistentPropertyCandidates()) {
-                    processCandidate(entity, descriptor, candidate);
+                for (JpaPropertyDescriptor candidate : descriptor
+                        .getPropertyDescriptors()) {
+                    processProperty(entity, descriptor, candidate);
                 }
             }
 
@@ -115,39 +115,30 @@
             return true;
         }
 
-        void processCandidate(
+        void processProperty(
                 JpaEntity entity,
                 JpaClassDescriptor descriptor,
-                Member candidate) {
-
-            String key = descriptor.getPersistentCandidateName(candidate);
+                JpaPropertyDescriptor property) {
 
-            // this shouldn't actually happen...
-            if (key == null) {
+            if (entity.attributeForName(property.getName()) != null) {
                 return;
             }
 
-            if (entity.attributeForName(key) != null) {
-                return;
-            }
+            if (property.isDefaultNonRelationalType()) {
 
-            // JPA Spec, 2.1.6:
-            // If the type of the field or property is one of the following, 
it is mapped
-            // in the same way as it would if it were annotated as Basic: Java 
primitive
-            // types, wrappers of the primitive types, java.lang.String,
-            // java.math.BigInteger, java.math.BigDecimal, java.util.Date,
-            // java.util.Calendar, java.sql.Date, java.sql.Time,
-            // java.sql.Timestamp, byte[], Byte[], char[], Character[], enums, 
any other
-            // type that implements Serializable. See Sections 9.1.16 through 
9.1.19.
-            // It is an error if no annotation is present and none of the 
above rules
-            // apply.
-
-            // TODO: andrus, 4/28/2006 check attribute type per comment above..
-
-            JpaAttribute attribute = new JpaAttribute();
-            attribute.setBasic(new JpaBasic());
-            attribute.setName(key);
-            entity.getAttributes().add(attribute);
+                JpaAttribute attribute = new JpaAttribute();
+                attribute.setBasic(new JpaBasic());
+                attribute.setName(property.getName());
+                entity.getAttributes().add(attribute);
+            }
+            else {
+                String path = descriptor.getManagedClass().getName()
+                        + "."
+                        + property.getName();
+                context.recordConflict(new SimpleValidationFailure(
+                        property.getMember(),
+                        "Undefined property persistence status: " + path));
+            }
         }
     }
 

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=398256&r1=398255&r2=398256&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
 Sat Apr 29 17:40:26 2006
@@ -36,8 +36,8 @@
     static final Pattern GETTER_PATTERN = 
Pattern.compile("^(is|get)([A-Z].*)$");
     static final Pattern SETTER_PATTERN = Pattern.compile("^set([A-Z].*)$");
 
-    protected Collection<Field> persistentFieldCandidates;
-    protected Collection<Method> persistentPropertyCandidates;
+    protected Collection<JpaPropertyDescriptor> fieldDescriptors;
+    protected Collection<JpaPropertyDescriptor> propertyDescriptors;
     protected Class managedClass;
 
     public JpaClassDescriptor(Class managedClass) {
@@ -47,61 +47,51 @@
     public Class getManagedClass() {
         return managedClass;
     }
+    
+    public JpaPropertyDescriptor getFieldDescriptor(Member field) {
+        for (JpaPropertyDescriptor d : getFieldDescriptors()) {
+            if (d.getMember().equals(field)) {
+                return d;
+            }
+        }
 
-    /**
-     * Returns an abstract persistent attribute name for a given member. If 
this member
-     * does not correspond to a valid persistence attribute, returns null.
-     */
-    public String getPersistentCandidateName(Member member) {
-        if (member instanceof Field) {
-            return getPersistentFieldCandidates().contains(member) ? ((Field) 
member)
-                    .getName() : null;
-        }
-        else if (member instanceof Method) {
-            if (getPersistentPropertyCandidates().contains(member)) {
-                String name = ((Method) member).getName();
-                Matcher getterMatcher = GETTER_PATTERN.matcher(name);
+        return null;
+    }
 
-                if (getterMatcher.matches()) {
-                    return getterMatcher.group(2);
-                }
-                else {
-                    return null;
-                }
-            }
-            else {
-                return null;
+    public JpaPropertyDescriptor getPropertyDescriptor(Member getter) {
+        for (JpaPropertyDescriptor d : getPropertyDescriptors()) {
+            if (d.getMember().equals(getter)) {
+                return d;
             }
         }
-        else {
-            return null;
-        }
+
+        return null;
     }
 
-    public Collection<Field> getPersistentFieldCandidates() {
-        if (persistentFieldCandidates == null) {
-            compileFieldCandidates();
+    public Collection<JpaPropertyDescriptor> getFieldDescriptors() {
+        if (fieldDescriptors == null) {
+            compileFields();
         }
 
-        return persistentFieldCandidates;
+        return fieldDescriptors;
     }
 
     /**
      * Returns getters for public and protected methods that look like 
read/write bean
      * properties, as those are potential persistent properties.
      */
-    public Collection<Method> getPersistentPropertyCandidates() {
-        if (persistentPropertyCandidates == null) {
-            compilePropertyCandidates();
+    public Collection<JpaPropertyDescriptor> getPropertyDescriptors() {
+        if (propertyDescriptors == null) {
+            compileProperties();
         }
 
-        return persistentPropertyCandidates;
+        return propertyDescriptors;
     }
 
-    protected void compileFieldCandidates() {
+    protected void compileFields() {
 
         Field[] fields = managedClass.getDeclaredFields();
-        persistentFieldCandidates = new ArrayList<Field>(fields.length);
+        fieldDescriptors = new ArrayList<JpaPropertyDescriptor>(fields.length);
 
         for (int i = 0; i < fields.length; i++) {
 
@@ -110,11 +100,11 @@
                 continue;
             }
 
-            persistentFieldCandidates.add(fields[i]);
+            fieldDescriptors.add(new JpaPropertyDescriptor(fields[i]));
         }
     }
 
-    protected void compilePropertyCandidates() {
+    protected void compileProperties() {
 
         Map<String, PropertyTuple> properties = new HashMap<String, 
PropertyTuple>();
 
@@ -149,7 +139,8 @@
                 Matcher getMatch = GETTER_PATTERN.matcher(name);
                 if (getMatch.matches()) {
 
-                    String key = getMatch.group(2) + ":" + 
returnType.getName();
+                    String propertyName = getMatch.group(2);
+                    String key = propertyName + ":" + returnType.getName();
                     PropertyTuple t = properties.get(key);
                     if (t == null) {
                         t = new PropertyTuple();
@@ -157,6 +148,7 @@
                     }
 
                     t.getter = methods[i];
+                    t.name = propertyName;
                     continue;
                 }
             }
@@ -178,17 +170,18 @@
             }
         }
 
-        this.persistentPropertyCandidates = new 
ArrayList<Method>(properties.size());
+        this.propertyDescriptors = new 
ArrayList<JpaPropertyDescriptor>(properties.size());
 
         for (PropertyTuple t : properties.values()) {
             if (t.getter != null && t.setter != null) {
-                persistentPropertyCandidates.add(t.getter);
+                propertyDescriptors.add(new JpaPropertyDescriptor(t.getter, 
t.name));
             }
         }
     }
 
     final class PropertyTuple {
 
+        String name;
         Method getter;
         Method setter;
     }

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=398256&r1=398255&r2=398256&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
 Sat Apr 29 17:40:26 2006
@@ -16,6 +16,9 @@
 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;
@@ -48,6 +51,26 @@
      */
     public JpaClassDescriptor getLoadedDescriptor(String managedClassName) {
         return (descriptors != null) ? descriptors.get(managedClassName) : 
null;
+    }
+
+    /**
+     * Returns a descriptor for a given class member.
+     */
+    public JpaPropertyDescriptor getPropertyDescriptor(AnnotatedElement 
element) {
+
+        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 null;
     }
 
     /**

Added: 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaPropertyDescriptor.java
URL: 
http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaPropertyDescriptor.java?rev=398256&view=auto
==============================================================================
--- 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaPropertyDescriptor.java
 (added)
+++ 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/JpaPropertyDescriptor.java
 Sat Apr 29 17:40:26 2006
@@ -0,0 +1,94 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.cayenne.jpa.conf;
+
+import java.io.Serializable;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.regex.Matcher;
+
+import org.apache.cayenne.jpa.JpaProviderException;
+
+/**
+ * A descriptor of a class property that may or may not be persistent.
+ * 
+ * @author Andrus Adamchik
+ */
+public class JpaPropertyDescriptor {
+
+    protected AnnotatedElement member;
+    protected String name;
+    protected Class type;
+
+    public JpaPropertyDescriptor(Field field) {
+        this.member = field;
+        this.name = field.getName();
+        this.type = field.getType();
+    }
+
+    public JpaPropertyDescriptor(Method getter, String name) {
+        Matcher getterMatcher = 
JpaClassDescriptor.GETTER_PATTERN.matcher(getter
+                .getName());
+
+        if (!getterMatcher.matches()) {
+            throw new JpaProviderException("Invalid property getter name: "
+                    + getter.getName());
+        }
+
+        this.member = getter;
+        this.name = name;
+        this.type = getter.getReturnType();
+    }
+
+    public AnnotatedElement getMember() {
+        return member;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Class getType() {
+        return type;
+    }
+
+    /**
+     * Returns true if the property is a default simple attribute.
+     * <h3>JPA Spec, 2.1.6:</h3>
+     * If the type of the field or property is one of the following, it is 
mapped in the
+     * same way as it would if it were annotated as Basic: Java primitive 
types, wrappers
+     * of the primitive types, java.lang.String, java.math.BigInteger,
+     * java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date,
+     * java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[], 
enums, any
+     * other type that implements Serializable. See Sections 9.1.16 through 
9.1.19. It is
+     * an error if no annotation is present and none of the above rules apply.
+     */
+    public boolean isDefaultNonRelationalType() {
+
+        if (type.isPrimitive() || type.isEnum()) {
+            return true;
+        }
+
+        if (type.isArray()) {
+            type = type.getComponentType();
+        }
+
+        // it is sufficient to check serializability as all the types 
mentioned in the
+        // spec are serializable
+        return Serializable.class.isAssignableFrom(type);
+    }
+}

Modified: 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/MemberAnnotationProcessorFactory.java
URL: 
http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/MemberAnnotationProcessorFactory.java?rev=398256&r1=398255&r2=398256&view=diff
==============================================================================
--- 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/MemberAnnotationProcessorFactory.java
 (original)
+++ 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/MemberAnnotationProcessorFactory.java
 Sat Apr 29 17:40:26 2006
@@ -16,7 +16,6 @@
 package org.apache.cayenne.jpa.conf;
 
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Member;
 
 import javax.persistence.AttributeOverride;
 import javax.persistence.AttributeOverrides;
@@ -25,7 +24,6 @@
 import javax.persistence.EmbeddedId;
 import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinColumns;
 import javax.persistence.JoinTable;
@@ -61,33 +59,6 @@
  */
 class MemberAnnotationProcessorFactory extends AnnotationProcessorFactory {
 
-    static String getMemberName(
-            AnnotatedElement element,
-            AnnotationProcessorStack context,
-            Class annotatedType) {
-
-        String name = null;
-
-        if (element instanceof Member) {
-            Member member = (Member) element;
-            name = context
-                    .getContext()
-                    .getDescriptor(member.getDeclaringClass())
-                    .getPersistentCandidateName(member);
-            if (name == null) {
-                context.recordConflict(
-                        element,
-                        annotatedType,
-                        "Annotated method is not a property getter: " + name);
-            }
-        }
-        else {
-            context.recordConflict(element, annotatedType, "Not expected here: 
" + name);
-        }
-
-        return name;
-    }
-
     static final class FlushModeProcessor implements AnnotationProcessor {
 
         public void onStartElement(
@@ -115,7 +86,7 @@
                 AnnotationProcessorStack context) {
 
             JpaEmbeddedId id = new JpaEmbeddedId();
-            id.setName(getMemberName(element, context, EmbeddedId.class));
+            
id.setName(context.getContext().getPropertyDescriptor(element).getName());
 
             Object parent = context.peek();
             if (parent instanceof JpaAbstractEntity) {
@@ -144,7 +115,7 @@
                 AnnotationProcessorStack context) {
 
             JpaId id = new JpaId();
-            id.setName(getMemberName(element, context, Id.class));
+            
id.setName(context.getContext().getPropertyDescriptor(element).getName());
 
             Object parent = context.peek();
             if (parent instanceof JpaAbstractEntity) {
@@ -188,10 +159,7 @@
 
                 // attribute implied...
                 JpaAttribute attribute = new JpaAttribute();
-                attribute.setName(getMemberName(
-                        element,
-                        context,
-                        
AnnotationProcessorFactory.annotationClass(getClass())));
+                
attribute.setName(context.getContext().getPropertyDescriptor(element).getName());
                 entity.getAttributes().add(attribute);
                 context.push(attribute);
 
@@ -205,10 +173,7 @@
 
                 // embeddable attribute implied...
                 JpaEmbeddableAttribute attribute = new 
JpaEmbeddableAttribute();
-                attribute.setName(getMemberName(
-                        element,
-                        context,
-                        
AnnotationProcessorFactory.annotationClass(getClass())));
+                
attribute.setName(context.getContext().getPropertyDescriptor(element).getName());
                 embeddable.getEmbeddableAttributes().add(attribute);
                 context.push(attribute);
 

Added: 
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=398256&view=auto
==============================================================================
--- 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
 (added)
+++ 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
 Sat Apr 29 17:40:26 2006
@@ -0,0 +1,48 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.cayenne.jpa.conf;
+
+import java.io.Serializable;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.jpa.map.JpaEntity;
+import org.apache.cayenne.jpa.map.JpaEntityMap;
+
+public class EntityMapDefaultsProcessorTest extends TestCase {
+
+    public void testMissingAttributeAnnotation() {
+
+        // sanity check - test object must not be serializable to be 
rejected...
+        
assertFalse(Serializable.class.isAssignableFrom(MockAnnotatedBean3.class));
+
+        JpaEntityMap map = new JpaEntityMap();
+        JpaLoaderContext context = new JpaLoaderContext();
+        EntityMapAnnotationLoader loader = new 
EntityMapAnnotationLoader(context);
+        loader.loadClassMapping(map, MockAnnotatedBean3.class);
+
+        // apply defaults
+        EntityMapDefaultsProcessor defaultsProcessor = new 
EntityMapDefaultsProcessor(
+                context);
+        defaultsProcessor.applyDefaults(map);
+
+        assertEquals(1, map.getEntities().size());
+        JpaEntity entity = map.getEntities().iterator().next();
+        assertEquals(1, entity.getAttributes().size());
+
+        assertTrue(context.getConflicts().hasFailures());
+    }
+}

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=398256&r1=398255&r2=398256&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
 Sat Apr 29 17:40:26 2006
@@ -15,8 +15,6 @@
  */
 package org.apache.cayenne.jpa.conf;
 
-import java.lang.reflect.Method;
-import java.util.Collection;
 import java.util.regex.Matcher;
 
 import junit.framework.TestCase;
@@ -48,18 +46,17 @@
         assertEquals("This", m3.group(1));
     }
 
-    public void testGetPropertyGetters() throws Exception {
+    public void testGetPropertyDescriptors() throws Exception {
 
         JpaClassDescriptor descriptor = new JpaClassDescriptor(
                 MockPropertyRegressionBean.class);
-        Collection<Method> validGetters = 
descriptor.getPersistentPropertyCandidates();
-        assertEquals(2, validGetters.size());
 
-        assertTrue(validGetters.contains(MockPropertyRegressionBean.class
+        assertEquals(2, descriptor.getPropertyDescriptors().size());
+
+        
assertNotNull(descriptor.getPropertyDescriptor(MockPropertyRegressionBean.class
                 .getDeclaredMethod("getP2", new Class[] {})));
 
-        assertTrue(validGetters.contains(MockPropertyRegressionBean.class
+        
assertNotNull(descriptor.getPropertyDescriptor(MockPropertyRegressionBean.class
                 .getDeclaredMethod("getP3", new Class[] {})));
     }
-
 }

Added: 
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=398256&view=auto
==============================================================================
--- 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java
 (added)
+++ 
incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java
 Sat Apr 29 17:40:26 2006
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.cayenne.jpa.conf;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+
[EMAIL PROTECTED]
+public class MockAnnotatedBean3 {
+
+    @Basic
+    protected String attribute1;
+
+    // no annotation here should result in a conflict.
+    protected MockAnnotatedBean1 attribute2;
+}


Reply via email to