You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/01/26 04:48:19 UTC
svn commit: r500133 - in /incubator/openejb/trunk/openejb3/container:
openejb-core/src/main/java/org/apache/openejb/config/
openejb-core/src/test/java/org/apache/openejb/config/
openejb-core/src/test/resources/convert/ openejb-core/src/test/resources/c...
Author: dain
Date: Thu Jan 25 19:48:18 2007
New Revision: 500133
URL: http://svn.apache.org/viewvc?view=rev&rev=500133
Log:
Moved conversion code to core module
Added:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/OpenEjb2CmpConversion.java
- copied, changed from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/Cmp2ConversionTest.java
- copied, changed from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/
- copied from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/oej2/
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/daytrader/
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/daytrader/daytrader-ejb-jar.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/daytrader/daytrader-openejb-jar.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-corrected.xml
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/daytrader/daytrader-orm.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-orm.xml
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/itest-2.2/
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/itest-2.2/itest-2.2-ejb-jar.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/itest-2.2-ejb-jar.xml
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/itest-2.2/itest-2.2-openejb-jar.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/openejb-jar-2.2.xml
incubator/openejb/trunk/openejb3/container/openejb-core/src/test/resources/convert/oej2/cmp/itest-2.2/itest-2.2-orm.xml
- copied unchanged from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/itest-2.2-orm.xml
Removed:
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-orm.xml
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/itest-2.2-ejb-jar.xml
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/itest-2.2-orm.xml
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/oej2/
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/openejb-jar-2.2.xml
Added: 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=auto&rev=500133
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/CmpJpaConversion.java Thu Jan 25 19:48:18 2007
@@ -0,0 +1,278 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.config;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.openejb.jee.CmpField;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EjbRelation;
+import org.apache.openejb.jee.EjbRelationshipRole;
+import org.apache.openejb.jee.EntityBean;
+import org.apache.openejb.jee.Multiplicity;
+import org.apache.openejb.jee.PersistenceType;
+import org.apache.openejb.jee.RelationshipRoleSource;
+import org.apache.openejb.jee.Relationships;
+import org.apache.openejb.jee.jpa.EntityMappings;
+import org.apache.openejb.jee.jpa.Entity;
+import org.apache.openejb.jee.jpa.Attributes;
+import org.apache.openejb.jee.jpa.Id;
+import org.apache.openejb.jee.jpa.Basic;
+import org.apache.openejb.jee.jpa.OneToOne;
+import org.apache.openejb.jee.jpa.OneToMany;
+import org.apache.openejb.jee.jpa.ManyToOne;
+import org.apache.openejb.jee.jpa.ManyToMany;
+import org.apache.openejb.jee.jpa.RelationField;
+import org.apache.openejb.jee.jpa.CascadeType;
+
+public class CmpJpaConversion {
+ public EntityMappings generateEntityMappings(EjbJar ejbJar) {
+ EntityMappings entityMappings = new EntityMappings();
+ Map<String, Entity> entitiesByName = new HashMap<String,Entity>();
+ for (org.apache.openejb.jee.EnterpriseBean enterpriseBean : ejbJar.getEnterpriseBeans()) {
+ // skip all non-CMP beans
+ if (!(enterpriseBean instanceof EntityBean) ||
+ ((EntityBean) enterpriseBean).getPersistenceType() != PersistenceType.CONTAINER) {
+ continue;
+ }
+ EntityBean bean = (EntityBean) enterpriseBean;
+
+ Entity entity = new Entity();
+
+ // description: contains the name of the entity bean
+ entity.setDescription(bean.getEjbName());
+
+ // class: the java class for the entity
+ entity.setClazz(bean.getEjbClass());
+
+ // name: the name of the entity in queries
+ if (bean.getAbstractSchemaName() != null) {
+ entity.setName(bean.getAbstractSchemaName());
+ } else {
+ String name = bean.getEjbName().trim().replaceAll("[ \\t\\n\\r]+", "_");
+ entity.setName(name);
+ }
+
+ //
+ // atributes: holds id, basic, oneToMany, manyToOne and manyToMany
+ //
+ Attributes attributes = new Attributes();
+ entity.setAttributes(attributes);
+
+ //
+ // id: the primary key
+ //
+ Id id = new Id();
+ // todo complex primary key
+ // todo unknown primary key
+ id.setName(bean.getPrimkeyField());
+ attributes.getId().add(id);
+
+ //
+ // basic: cmp-fields
+ //
+ for (CmpField cmpField : bean.getCmpField()) {
+ Basic basic = new Basic();
+ if (!cmpField.getFieldName().equals(bean.getPrimkeyField())) {
+ basic.setName(cmpField.getFieldName());
+ attributes.getBasic().add(basic);
+ }
+ }
+
+ // add the entity
+ entityMappings.getEntity().add(entity);
+ entitiesByName.put(bean.getEjbName(), entity);
+ }
+
+ Relationships relationships = ejbJar.getRelationships();
+ if (relationships != null) {
+ for (EjbRelation relation : relationships.getEjbRelation()) {
+ List<EjbRelationshipRole> roles = relation.getEjbRelationshipRole();
+ // if we don't have two roles, the relation is bad so we skip it
+ if (roles.size() != 2) {
+ continue;
+ }
+
+ EjbRelationshipRole leftRole = roles.get(0);
+ RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
+ String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
+ Entity leftEntity = entitiesByName.get(leftEjbName);
+ String leftFieldName = null;
+ if (leftRole.getCmrField() != null) {
+ leftFieldName = leftRole.getCmrField().getCmrFieldName();
+ }
+ boolean leftIsOne = leftRole.getMultiplicity() == Multiplicity.ONE;
+
+ EjbRelationshipRole rightRole = roles.get(1);
+ RelationshipRoleSource rightRoleSource = rightRole.getRelationshipRoleSource();
+ String rightEjbName = rightRoleSource == null ? null : rightRoleSource.getEjbName();
+ Entity rightEntity = entitiesByName.get(rightEjbName);
+ String rightFieldName = null;
+ if (rightRole.getCmrField() != null) {
+ rightFieldName = rightRole.getCmrField().getCmrFieldName();
+ }
+ boolean rightIsOne = rightRole.getMultiplicity() == Multiplicity.ONE;
+
+ if (leftIsOne && rightIsOne) {
+ //
+ // one-to-one
+ //
+
+ // left
+ OneToOne leftOneToOne = null;
+ if (leftFieldName != null) {
+ leftOneToOne = new OneToOne();
+ leftOneToOne.setName(leftFieldName);
+ setCascade(leftRole, leftOneToOne);
+ leftEntity.getAttributes().getOneToOne().add(leftOneToOne);
+ }
+
+ // right
+ OneToOne rightOneToOne = null;
+ if (rightFieldName != null) {
+ rightOneToOne = new OneToOne();
+ rightOneToOne.setName(rightFieldName);
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightOneToOne.setMappedBy(leftFieldName);
+ }
+ setCascade(rightRole, rightOneToOne);
+ rightEntity.getAttributes().getOneToOne().add(rightOneToOne);
+ }
+
+ // link
+ if (leftFieldName != null && rightFieldName != null) {
+ leftOneToOne.setRelatedField(rightOneToOne);
+ rightOneToOne.setRelatedField(leftOneToOne);
+ }
+ } else if (leftIsOne && !rightIsOne) {
+ //
+ // one-to-many
+ //
+
+ // left
+ OneToMany leftOneToMany = null;
+ if (leftFieldName != null) {
+ leftOneToMany = new OneToMany();
+ leftOneToMany.setName(leftFieldName);
+ // mapped by only required for bi-directional
+ if (rightFieldName != null) {
+ leftOneToMany.setMappedBy(rightFieldName);
+ }
+ setCascade(leftRole, leftOneToMany);
+ leftEntity.getAttributes().getOneToMany().add(leftOneToMany);
+ }
+
+ // right
+ ManyToOne rightManyToOne = null;
+ if (rightFieldName != null) {
+ rightManyToOne = new ManyToOne();
+ rightManyToOne.setName(rightFieldName);
+ setCascade(rightRole, rightManyToOne);
+ rightEntity.getAttributes().getManyToOne().add(rightManyToOne);
+ }
+
+ // link
+ if (leftFieldName != null && rightFieldName != null) {
+ leftOneToMany.setRelatedField(rightManyToOne);
+ rightManyToOne.setRelatedField(leftOneToMany);
+ }
+ } else if (!leftIsOne && rightIsOne) {
+ //
+ // many-to-one
+ //
+
+ // left
+ ManyToOne leftManyToOne = null;
+ if (leftFieldName != null) {
+ leftManyToOne = new ManyToOne();
+ leftManyToOne.setName(leftFieldName);
+ setCascade(leftRole, leftManyToOne);
+ leftEntity.getAttributes().getManyToOne().add(leftManyToOne);
+ }
+
+ // right
+ OneToMany rightOneToMany = null;
+ if (rightFieldName != null) {
+ rightOneToMany = new OneToMany();
+ rightOneToMany.setName(rightFieldName);
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightOneToMany.setMappedBy(leftFieldName);
+ }
+ setCascade(rightRole, rightOneToMany);
+ rightEntity.getAttributes().getOneToMany().add(rightOneToMany);
+ }
+
+ // link
+ if (leftFieldName != null && rightFieldName != null) {
+ leftManyToOne.setRelatedField(rightOneToMany);
+ rightOneToMany.setRelatedField(leftManyToOne);
+ }
+ } else if (!leftIsOne && !rightIsOne) {
+ //
+ // many-to-many
+ //
+
+ // left
+ ManyToMany leftManyToMany = null;
+ if (leftFieldName != null) {
+ leftManyToMany = new ManyToMany();
+ leftManyToMany.setName(leftFieldName);
+ setCascade(leftRole, leftManyToMany);
+ leftEntity.getAttributes().getManyToMany().add(leftManyToMany);
+ }
+
+ // right
+ ManyToMany rightManyToMany = null;
+ if (rightFieldName != null) {
+ rightManyToMany = new ManyToMany();
+ rightManyToMany.setName(rightFieldName);
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightManyToMany.setMappedBy(leftFieldName);
+ }
+ setCascade(rightRole, rightManyToMany);
+ rightEntity.getAttributes().getManyToMany().add(rightManyToMany);
+ }
+
+ // link
+ if (leftFieldName != null && rightFieldName != null) {
+ leftManyToMany.setRelatedField(rightManyToMany);
+ rightManyToMany.setRelatedField(leftManyToMany);
+ }
+ }
+ }
+ }
+
+ //
+ // transient: non-persistent fields
+ //
+ // todo scan class file for fields that are not cmp-fields or cmr-fields and mark them transient
+ return entityMappings;
+ }
+
+ private void setCascade(EjbRelationshipRole role, RelationField field) {
+ if (role.getCascadeDelete()) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ field.setCascade(cascadeType);
+ }
+ }
+}
Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/OpenEjb2CmpConversion.java (from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/OpenEjb2CmpConversion.java?view=diff&rev=500133&p1=incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java&r1=500112&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/OpenEjb2CmpConversion.java&r2=500133
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/OpenEjb2CmpConversion.java Thu Jan 25 19:48:18 2007
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.openejb.jee.jpa;
+package org.apache.openejb.config;
import java.util.Map;
import java.util.TreeMap;
@@ -25,6 +25,20 @@
import org.apache.openejb.jee.oejb2.EntityBeanType;
import org.apache.openejb.jee.oejb2.OpenejbJarType;
import org.apache.openejb.jee.oejb2.EjbRelationshipRoleType;
+import org.apache.openejb.jee.jpa.EntityMappings;
+import org.apache.openejb.jee.jpa.Entity;
+import org.apache.openejb.jee.jpa.Table;
+import org.apache.openejb.jee.jpa.Field;
+import org.apache.openejb.jee.jpa.Column;
+import org.apache.openejb.jee.jpa.Id;
+import org.apache.openejb.jee.jpa.GeneratedValue;
+import org.apache.openejb.jee.jpa.RelationField;
+import org.apache.openejb.jee.jpa.OneToMany;
+import org.apache.openejb.jee.jpa.OneToOne;
+import org.apache.openejb.jee.jpa.JoinColumn;
+import org.apache.openejb.jee.jpa.JoinTable;
+import org.apache.openejb.jee.jpa.Basic;
+import org.apache.openejb.jee.jpa.Attributes;
public class OpenEjb2CmpConversion {
@@ -108,7 +122,7 @@
if (field == null) {
if (other instanceof OneToMany) {
// for a unidirectional oneToMany, the join column declaration
- // is placed on the oneToMany element instead of manyToOne
+ // is placed on the oneToMany element instead of manyToOne
field = other;
} else {
continue;
Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/Cmp2ConversionTest.java (from r500112, incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/Cmp2ConversionTest.java?view=diff&rev=500133&p1=incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java&r1=500112&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/Cmp2ConversionTest.java&r2=500133
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/Cmp2ConversionTest.java Thu Jan 25 19:48:18 2007
@@ -14,32 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.openejb.jee.jpa;
+package org.apache.openejb.config;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import junit.framework.TestCase;
-import org.apache.openejb.jee.CmpField;
import org.apache.openejb.jee.EjbJar;
-import org.apache.openejb.jee.EjbRelation;
-import org.apache.openejb.jee.EjbRelationshipRole;
-import org.apache.openejb.jee.EntityBean;
import org.apache.openejb.jee.JaxbJavaee;
-import org.apache.openejb.jee.Multiplicity;
-import org.apache.openejb.jee.PersistenceType;
-import org.apache.openejb.jee.RelationshipRoleSource;
-import org.apache.openejb.jee.Relationships;
+import org.apache.openejb.jee.jpa.EntityMappings;
import org.apache.openejb.jee.oejb2.JaxbOpenejbJar2;
import org.apache.openejb.jee.oejb2.OpenejbJarType;
@@ -48,39 +38,39 @@
*/
public class Cmp2ConversionTest extends TestCase {
public void testItests22() throws Exception {
- convert("itest-2.2-ejb-jar.xml", "openejb-jar-2.2.xml", "itest-2.2-orm.xml");
+ convert("convert/oej2/cmp/itest-2.2/itest-2.2-");
}
public void testDaytrader() throws Exception {
- convert("daytrader-ejb-jar.xml", "daytrader-corrected.xml", "daytrader-orm.xml");
+ convert("convert/oej2/cmp/daytrader/daytrader-");
}
public void testOneToOne() throws Exception {
- convert("oej2/cmp/onetoone/simplepk/");
+ convert("convert/oej2/cmp/onetoone/simplepk/");
}
public void testOneToOneUni() throws Exception {
- convert("oej2/cmp/onetoone/simplepk/unidirectional-");
+ convert("convert/oej2/cmp/onetoone/simplepk/unidirectional-");
}
public void testOneToMany() throws Exception {
- convert("oej2/cmp/onetomany/simplepk/ejb-jar.xml", "oej2/cmp/onetomany/simplepk/openejb-jar.xml", null);
+ convert("convert/oej2/cmp/onetomany/simplepk/");
}
public void testOneToManyUni() throws Exception {
- convert("oej2/cmp/onetomany/simplepk/one-unidirectional-");
+ convert("convert/oej2/cmp/onetomany/simplepk/one-unidirectional-");
}
public void testManyToOneUni() throws Exception {
- convert("oej2/cmp/onetomany/simplepk/many-unidirectional-");
+ convert("convert/oej2/cmp/onetomany/simplepk/many-unidirectional-");
}
public void testManyToMany() throws Exception {
- convert("oej2/cmp/manytomany/simplepk/");
+ convert("convert/oej2/cmp/manytomany/simplepk/");
}
public void testManyToManyUni() throws Exception {
- convert("oej2/cmp/manytomany/simplepk/unidirectional-");
+ convert("convert/oej2/cmp/manytomany/simplepk/unidirectional-");
}
private EntityMappings convert(String prefix) throws Exception {
@@ -88,7 +78,10 @@
}
private EntityMappings convert(String ejbJarFileName, String openejbJarFileName, String expectedFileName) throws Exception {
- EntityMappings entityMappings = generateEntityMappings(ejbJarFileName);
+ InputStream in = getClass().getClassLoader().getResourceAsStream(ejbJarFileName);
+ EjbJar ejbJar = (EjbJar) JaxbJavaee.unmarshal(EjbJar.class, new ByteArrayInputStream(readContent(in).getBytes()));
+ CmpJpaConversion cmpJpaConversion = new CmpJpaConversion();
+ EntityMappings entityMappings = cmpJpaConversion.generateEntityMappings(ejbJar);
String openejbJarXml = readContent(getClass().getClassLoader().getResourceAsStream(openejbJarFileName));
JAXBElement element = (JAXBElement) JaxbOpenejbJar2.unmarshal(OpenejbJarType.class, new ByteArrayInputStream(openejbJarXml.getBytes()));
@@ -98,7 +91,7 @@
openEjb2CmpConversion.mergeEntityMappings(entityMappings, openejbJarType);
if (expectedFileName != null) {
- InputStream in = getClass().getClassLoader().getResourceAsStream(expectedFileName);
+ in = getClass().getClassLoader().getResourceAsStream(expectedFileName);
String expected = readContent(in);
String actual = toString(entityMappings);
assertEquals(expected, actual);
@@ -120,244 +113,6 @@
return actual.trim();
}
- private EntityMappings generateEntityMappings(String fileName) throws Exception {
- InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
- String expected = readContent(in);
-
- EjbJar ejbJar = (EjbJar) JaxbJavaee.unmarshal(EjbJar.class, new ByteArrayInputStream(expected.getBytes()));
-
- EntityMappings entityMappings = new EntityMappings();
- Map<String, Entity> entitiesByName = new HashMap<String,Entity>();
- for (org.apache.openejb.jee.EnterpriseBean enterpriseBean : ejbJar.getEnterpriseBeans()) {
- // skip all non-CMP beans
- if (!(enterpriseBean instanceof EntityBean) ||
- ((EntityBean) enterpriseBean).getPersistenceType() != PersistenceType.CONTAINER) {
- continue;
- }
- EntityBean bean = (EntityBean) enterpriseBean;
-
- Entity entity = new Entity();
-
- // description: contains the name of the entity bean
- entity.setDescription(bean.getEjbName());
-
- // class: the java class for the entity
- entity.setClazz(bean.getEjbClass());
-
- // name: the name of the entity in queries
- if (bean.getAbstractSchemaName() != null) {
- entity.setName(bean.getAbstractSchemaName());
- } else {
- String name = bean.getEjbName().trim().replaceAll("[ \\t\\n\\r]+", "_");
- entity.setName(name);
- }
-
- //
- // atributes: holds id, basic, oneToMany, manyToOne and manyToMany
- //
- Attributes attributes = new Attributes();
- entity.setAttributes(attributes);
-
- //
- // id: the primary key
- //
- Id id = new Id();
- // todo complex primary key
- // todo unknown primary key
- id.setName(bean.getPrimkeyField());
- attributes.getId().add(id);
-
- //
- // basic: cmp-fields
- //
- for (CmpField cmpField : bean.getCmpField()) {
- Basic basic = new Basic();
- if (!cmpField.getFieldName().equals(bean.getPrimkeyField())) {
- basic.setName(cmpField.getFieldName());
- attributes.getBasic().add(basic);
- }
- }
-
- // add the entity
- entityMappings.getEntity().add(entity);
- entitiesByName.put(bean.getEjbName(), entity);
- }
-
- Relationships relationships = ejbJar.getRelationships();
- if (relationships != null) {
- for (EjbRelation relation : relationships.getEjbRelation()) {
- List<EjbRelationshipRole> roles = relation.getEjbRelationshipRole();
- // if we don't have two roles, the relation is bad so we skip it
- if (roles.size() != 2) {
- continue;
- }
-
- EjbRelationshipRole leftRole = roles.get(0);
- RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
- String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
- Entity leftEntity = entitiesByName.get(leftEjbName);
- String leftFieldName = null;
- if (leftRole.getCmrField() != null) {
- leftFieldName = leftRole.getCmrField().getCmrFieldName();
- }
- boolean leftIsOne = leftRole.getMultiplicity() == Multiplicity.ONE;
-
- EjbRelationshipRole rightRole = roles.get(1);
- RelationshipRoleSource rightRoleSource = rightRole.getRelationshipRoleSource();
- String rightEjbName = rightRoleSource == null ? null : rightRoleSource.getEjbName();
- Entity rightEntity = entitiesByName.get(rightEjbName);
- String rightFieldName = null;
- if (rightRole.getCmrField() != null) {
- rightFieldName = rightRole.getCmrField().getCmrFieldName();
- }
- boolean rightIsOne = rightRole.getMultiplicity() == Multiplicity.ONE;
-
- if (leftIsOne && rightIsOne) {
- //
- // one-to-one
- //
-
- // left
- OneToOne leftOneToOne = null;
- if (leftFieldName != null) {
- leftOneToOne = new OneToOne();
- leftOneToOne.setName(leftFieldName);
- setCascade(leftRole, leftOneToOne);
- leftEntity.getAttributes().getOneToOne().add(leftOneToOne);
- }
-
- // right
- OneToOne rightOneToOne = null;
- if (rightFieldName != null) {
- rightOneToOne = new OneToOne();
- rightOneToOne.setName(rightFieldName);
- // mapped by only required for bi-directional
- if (leftFieldName != null) {
- rightOneToOne.setMappedBy(leftFieldName);
- }
- setCascade(rightRole, rightOneToOne);
- rightEntity.getAttributes().getOneToOne().add(rightOneToOne);
- }
-
- // link
- if (leftFieldName != null && rightFieldName != null) {
- leftOneToOne.setRelatedField(rightOneToOne);
- rightOneToOne.setRelatedField(leftOneToOne);
- }
- } else if (leftIsOne && !rightIsOne) {
- //
- // one-to-many
- //
-
- // left
- OneToMany leftOneToMany = null;
- if (leftFieldName != null) {
- leftOneToMany = new OneToMany();
- leftOneToMany.setName(leftFieldName);
- // mapped by only required for bi-directional
- if (rightFieldName != null) {
- leftOneToMany.setMappedBy(rightFieldName);
- }
- setCascade(leftRole, leftOneToMany);
- leftEntity.getAttributes().getOneToMany().add(leftOneToMany);
- }
-
- // right
- ManyToOne rightManyToOne = null;
- if (rightFieldName != null) {
- rightManyToOne = new ManyToOne();
- rightManyToOne.setName(rightFieldName);
- setCascade(rightRole, rightManyToOne);
- rightEntity.getAttributes().getManyToOne().add(rightManyToOne);
- }
-
- // link
- if (leftFieldName != null && rightFieldName != null) {
- leftOneToMany.setRelatedField(rightManyToOne);
- rightManyToOne.setRelatedField(leftOneToMany);
- }
- } else if (!leftIsOne && rightIsOne) {
- //
- // many-to-one
- //
-
- // left
- ManyToOne leftManyToOne = null;
- if (leftFieldName != null) {
- leftManyToOne = new ManyToOne();
- leftManyToOne.setName(leftFieldName);
- setCascade(leftRole, leftManyToOne);
- leftEntity.getAttributes().getManyToOne().add(leftManyToOne);
- }
-
- // right
- OneToMany rightOneToMany = null;
- if (rightFieldName != null) {
- rightOneToMany = new OneToMany();
- rightOneToMany.setName(rightFieldName);
- // mapped by only required for bi-directional
- if (leftFieldName != null) {
- rightOneToMany.setMappedBy(leftFieldName);
- }
- setCascade(rightRole, rightOneToMany);
- rightEntity.getAttributes().getOneToMany().add(rightOneToMany);
- }
-
- // link
- if (leftFieldName != null && rightFieldName != null) {
- leftManyToOne.setRelatedField(rightOneToMany);
- rightOneToMany.setRelatedField(leftManyToOne);
- }
- } else if (!leftIsOne && !rightIsOne) {
- //
- // many-to-many
- //
-
- // left
- ManyToMany leftManyToMany = null;
- if (leftFieldName != null) {
- leftManyToMany = new ManyToMany();
- leftManyToMany.setName(leftFieldName);
- setCascade(leftRole, leftManyToMany);
- leftEntity.getAttributes().getManyToMany().add(leftManyToMany);
- }
-
- // right
- ManyToMany rightManyToMany = null;
- if (rightFieldName != null) {
- rightManyToMany = new ManyToMany();
- rightManyToMany.setName(rightFieldName);
- // mapped by only required for bi-directional
- if (leftFieldName != null) {
- rightManyToMany.setMappedBy(leftFieldName);
- }
- setCascade(rightRole, rightManyToMany);
- rightEntity.getAttributes().getManyToMany().add(rightManyToMany);
- }
-
- // link
- if (leftFieldName != null && rightFieldName != null) {
- leftManyToMany.setRelatedField(rightManyToMany);
- rightManyToMany.setRelatedField(leftManyToMany);
- }
- }
- }
- }
-
- //
- // transient: non-persistent fields
- //
- // todo scan class file for fields that are not cmp-fields or cmr-fields and mark them transient
- return entityMappings;
- }
-
- private void setCascade(EjbRelationshipRole role, RelationField field) {
- if (role.getCascadeDelete()) {
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- field.setCascade(cascadeType);
- }
- }
private String readContent(InputStream in) throws IOException {
StringBuffer sb = new StringBuffer();