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;
+}