You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/04/06 02:08:03 UTC
svn commit: r526009 - in /incubator/openejb/trunk/openejb3/container:
openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java
openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java
Author: dain
Date: Thu Apr 5 17:08:02 2007
New Revision: 526009
URL: http://svn.apache.org/viewvc?view=rev&rev=526009
Log:
Map full super class chain for cmp1 beans
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java?view=diff&rev=526009&r1=526008&r2=526009
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java Thu Apr 5 17:08:02 2007
@@ -64,6 +64,7 @@
import java.util.Set;
import java.util.TreeSet;
import java.util.HashSet;
+import java.util.Collection;
import java.lang.reflect.Modifier;
public class CmpJpaConversion implements DynamicDeployer {
@@ -180,16 +181,13 @@
// for CMP 1 we also need apply the mappings to a super-mappings
// declaration since fields are on the super-class
String cmpImplClassName = CmpUtil.getCmpImplClassName(bean.getAbstractSchemaName(), bean.getEjbClass());
- boolean generateMappedSuperclass = bean.getCmpVersion() == CmpVersion.CMP1 && !bean.getEjbClass().equals(cmpImplClassName);
- // map the cmp class, but if we are using a mapped super class, generate attribute-override instead of id and basic
- mapClass(cmpImplClassName, entity, bean, classLoader, generateMappedSuperclass);
-
- if (generateMappedSuperclass) {
- // finally declare the mapped super class, if needed
- MappedSuperclass mappedSuperclass = new MappedSuperclass();
- mapClass(bean.getEjbClass(), mappedSuperclass, bean, classLoader, false);
- entityMappings.getMappedSuperclass().add(mappedSuperclass);
+ if (bean.getCmpVersion() == CmpVersion.CMP2) {
+ mapClass2x(cmpImplClassName, entity, bean, classLoader);
+ } else {
+ // map the cmp class, but if we are using a mapped super class, generate attribute-override instead of id and basic
+ Collection<MappedSuperclass> mappedSuperclasses = mapClass1x(cmpImplClassName, entity, bean, classLoader);
+ entityMappings.getMappedSuperclass().addAll(mappedSuperclasses);
}
// process queries
@@ -404,7 +402,7 @@
}
}
- private void mapClass(String className, Mapping mapping, EntityBean bean, ClassLoader classLoader, boolean createOverrides) {
+ private void mapClass2x(String className, Mapping mapping, EntityBean bean, ClassLoader classLoader) {
// class: the java class for the entity
mapping.setClazz(className);
@@ -414,53 +412,31 @@
}
//
- // Map fields remembering the names of the mapped fields
- //
- Set<String> persistantFields = new TreeSet<String>();
-
- //
// id: the primary key
//
Set<String> primaryKeyFields = new HashSet<String>();
if (bean.getPrimkeyField() != null) {
String fieldName = bean.getPrimkeyField();
- Field field;
- if (!createOverrides) {
- field = new Id(fieldName);
- } else {
- field = new AttributeOverride(fieldName);
- }
+ Field field = new Id(fieldName);
mapping.addField(field);
- persistantFields.add(fieldName);
primaryKeyFields.add(fieldName);
} else if ("java.lang.Object".equals(bean.getPrimKeyClass())) {
- if (createOverrides || CmpVersion.CMP2.equals(bean.getCmpVersion())) {
- String fieldName = "OpenEJB_pk";
- Id field = new Id(fieldName);
- field.setGeneratedValue(new GeneratedValue(GenerationType.AUTO));
- mapping.addField(field);
- persistantFields.add(fieldName);
- primaryKeyFields.add(fieldName);
- }
+ String fieldName = "OpenEJB_pk";
+ Id field = new Id(fieldName);
+ field.setGeneratedValue(new GeneratedValue(GenerationType.AUTO));
+ mapping.addField(field);
+ primaryKeyFields.add(fieldName);
} else if (bean.getPrimKeyClass() != null) {
Class<?> pkClass = null;
try {
pkClass = classLoader.loadClass(bean.getPrimKeyClass());
- if (!createOverrides) {
- mapping.setIdClass(new IdClass(bean.getPrimKeyClass()));
- }
+ mapping.setIdClass(new IdClass(bean.getPrimKeyClass()));
for (java.lang.reflect.Field pkField : pkClass.getFields()) {
String pkFieldName = pkField.getName();
int modifiers = pkField.getModifiers();
if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers) && allFields.contains(pkFieldName)) {
- Field field;
- if (!createOverrides) {
- field = new Id(pkFieldName);
- } else {
- field = new AttributeOverride(pkFieldName);
- }
+ Field field = new Id(pkFieldName);
mapping.addField(field);
- persistantFields.add(pkFieldName);
primaryKeyFields.add(pkFieldName);
}
}
@@ -474,33 +450,111 @@
//
for (CmpField cmpField : bean.getCmpField()) {
if (!primaryKeyFields.contains(cmpField.getFieldName())) {
- Field field;
- if (!createOverrides) {
- field = new Basic(cmpField.getFieldName());
- } else {
- field = new AttributeOverride(cmpField.getFieldName());
- }
+ Field field = new Basic(cmpField.getFieldName());
mapping.addField(field);
- persistantFields.add(cmpField.getFieldName());
}
}
+ }
+
+ private Collection<MappedSuperclass> mapClass1x(String className, Mapping mapping, EntityBean bean, ClassLoader classLoader) {
+ // class: the java class for the entity
+ mapping.setClazz(className);
+
+ Class ejbClass = null;
+ try {
+ ejbClass = classLoader.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ // build a set of all field names
+ Set<String> allFields = new TreeSet<String>();
+ for (CmpField cmpField : bean.getCmpField()) {
+ allFields.add(cmpField.getFieldName());
+ }
+
+ // build a map from the field name to the super class that contains that field
+ Map<String, MappedSuperclass> superclassByField = mapFields(ejbClass, allFields);
//
- // transient: non-persistent fields
+ // id: the primary key
//
- if (classLoader != null && bean.getCmpVersion() == CmpVersion.CMP1) {
+ Set<String> primaryKeyFields = new HashSet<String>();
+ if (bean.getPrimkeyField() != null) {
+ String fieldName = bean.getPrimkeyField();
+ MappedSuperclass superclass = superclassByField.get(fieldName);
+ if (superclass == null) {
+ throw new IllegalStateException("Primary key field " + fieldName + " is not defined in class " + className + " or any super classes");
+ }
+ superclass.addField(new Id(fieldName));
+ mapping.addField(new AttributeOverride(fieldName));
+ primaryKeyFields.add(fieldName);
+ } else if ("java.lang.Object".equals(bean.getPrimKeyClass())) {
+ String fieldName = "OpenEJB_pk";
+ Id field = new Id(fieldName);
+ field.setGeneratedValue(new GeneratedValue(GenerationType.AUTO));
+ mapping.addField(field);
+ } else if (bean.getPrimKeyClass() != null) {
+ Class<?> pkClass = null;
try {
- Class ejbClass = classLoader.loadClass(className);
- for (java.lang.reflect.Field field : ejbClass.getDeclaredFields()) {
- if (!persistantFields.contains(field.getName())) {
- Transient transientField = new Transient(field.getName());
- mapping.addField(transientField);
+ pkClass = classLoader.loadClass(bean.getPrimKeyClass());
+ mapping.setIdClass(new IdClass(bean.getPrimKeyClass()));
+ for (java.lang.reflect.Field pkField : pkClass.getFields()) {
+ String fieldName = pkField.getName();
+ int modifiers = pkField.getModifiers();
+ if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers) && allFields.contains(fieldName)) {
+ MappedSuperclass superclass = superclassByField.get(fieldName);
+ if (superclass == null) {
+ throw new IllegalStateException("Primary key field " + fieldName + " is not defined in class " + className + " or any super classes");
+ }
+ superclass.addField(new Id(fieldName));
+ mapping.addField(new AttributeOverride(fieldName));
+ primaryKeyFields.add(fieldName);
}
}
} catch (ClassNotFoundException e) {
- // todo warn
+ // todo throw exception
}
}
+
+ //
+ // basic: cmp-fields
+ //
+ for (CmpField cmpField : bean.getCmpField()) {
+ String fieldName = cmpField.getFieldName();
+ if (!primaryKeyFields.contains(fieldName)) {
+ MappedSuperclass superclass = superclassByField.get(fieldName);
+ if (superclass == null) {
+ throw new IllegalStateException("Primary key field " + fieldName + " is not defined in class " + className + " or any super classes");
+ }
+ superclass.addField(new Basic(fieldName));
+ mapping.addField(new AttributeOverride(fieldName));
+ }
+ }
+
+ return superclassByField.values();
+ }
+
+ private Map<String, MappedSuperclass> mapFields(Class clazz, Set<String> persistantFields) {
+ persistantFields = new TreeSet<String>(persistantFields);
+ Map<String,MappedSuperclass> fields = new HashMap<String,MappedSuperclass>();
+
+ while (!persistantFields.isEmpty() && !clazz.equals(Object.class)) {
+ MappedSuperclass superclass = new MappedSuperclass(clazz.getName());
+ for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
+ String fieldName = field.getName();
+ if (!persistantFields.contains(fieldName)) {
+ fields.put(fieldName, superclass);
+ persistantFields.remove(fieldName);
+ } else {
+ Transient transientField = new Transient(field.getName());
+ superclass.addField(transientField);
+ }
+ }
+ clazz = clazz.getSuperclass();
+ }
+
+ return fields;
}
private boolean addPersistenceContextRef(EntityBean bean) {
Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java?view=diff&rev=526009&r1=526008&r2=526009
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/jpa/MappedSuperclass.java Thu Apr 5 17:08:02 2007
@@ -121,6 +121,13 @@
@XmlAttribute(name = "metadata-complete")
protected Boolean metadataComplete;
+ public MappedSuperclass() {
+ }
+
+ public MappedSuperclass(String clazz) {
+ this.clazz = clazz;
+ }
+
/**
* Gets the value of the description property.
*