gdamour 2004/10/25 10:24:32
Modified: modules/core/src/java/org/openejb/deployment
CMPEntityBuilder.java OpenEJBModuleBuilder.java
Log:
o Update the way CMR fields are mapped.
The previous implementation was using the <ejb-relation-name> and
<ejb-relationship-role-name> elements, which were optional elements.
The new implementation uses the fact that at least one <relationship-role-source>
and <cmr-field> couple exists for a given relationship.
o It is no more required to configure a TransactionManager for EJB having OTM or MTM
relationships. One uses the TransactionManager contained by the
TransactionContextManager associated to the provided EARContext.
Revision Changes Path
1.9 +72 -27
openejb/modules/core/src/java/org/openejb/deployment/CMPEntityBuilder.java
Index: CMPEntityBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- CMPEntityBuilder.java 15 Oct 2004 14:56:47 -0000 1.8
+++ CMPEntityBuilder.java 25 Oct 2004 14:24:32 -0000 1.9
@@ -336,29 +336,42 @@
private void processRelationships(EARContext earContext, String ejbModuleName,
EjbJarType ejbJar, OpenejbOpenejbJarType openejbEjbJar, ClassLoader cl, EJBSchema
ejbSchema, SQL92Schema sqlSchema) throws DeploymentException {
if ( !ejbJar.isSetRelationships() ) {
return;
+ } else if ( !openejbEjbJar.isSetRelationships() ) {
+ throw new DeploymentException("Relationships are not mapped by OpenEJB
DD.");
}
Map openEjbRelations = new HashMap();
OpenejbEjbRelationType[] openEJBRelations =
openejbEjbJar.getRelationships().getEjbRelationArray();
for (int i = 0; i < openEJBRelations.length; i++) {
OpenejbEjbRelationType relation = openEJBRelations[i];
- openEjbRelations.put(relation.getEjbRelationName(), relation);
+ OpenejbEjbRelationshipRoleType[] roles =
relation.getEjbRelationshipRoleArray();
+ for (int j = 0; j < roles.length; j++) {
+ OpenejbEjbRelationshipRoleType role = roles[j];
+ if ( !role.isSetCmrField() ) {
+ continue;
+ }
+ String ejbName = role.getRelationshipRoleSource().getEjbName();
+ String cmrFieldName = role.getCmrField().getCmrFieldName();
+ RoleInfo roleInfo = new RoleInfo(ejbName, cmrFieldName);
+ openEjbRelations.put(roleInfo, relation);
+ }
}
EjbRelationType[] relations =
ejbJar.getRelationships().getEjbRelationArray();
for (int i = 0; i < relations.length; i++) {
- EjbRelationType relation = relations[i];
- String name = relation.getEjbRelationName().getStringValue();
- OpenejbEjbRelationType openEjbRelation = (OpenejbEjbRelationType)
openEjbRelations.get(name);
- if (null == openEjbRelation) {
- throw new DeploymentException("Relation [" + name + "] is
misconfigured: no CMR mapping defined by OpenEJB DD.");
- }
-
- EjbRelationshipRoleType[] roles =
relation.getEjbRelationshipRoleArray();
+ EjbRelationshipRoleType[] roles =
relations[i].getEjbRelationshipRoleArray();
RoleInfo[] roleInfo = new RoleInfo[2];
roleInfo[0] = extractRoleInfo(ejbSchema, sqlSchema, roles[0]);
roleInfo[1] = extractRoleInfo(ejbSchema, sqlSchema, roles[1]);
+ OpenejbEjbRelationType openEjbRelation = (OpenejbEjbRelationType)
openEjbRelations.get(roleInfo[0]);
+ if (null == openEjbRelation) {
+ openEjbRelation = (OpenejbEjbRelationType)
openEjbRelations.get(roleInfo[1]);
+ if ( null == openEjbRelation ) {
+ throw new DeploymentException("No CMR mapping defined by
OpenEJB DD for roles " + roleInfo[0] + " or " + roleInfo[1]);
+ }
+ }
+
OpenejbEjbRelationshipRoleType[] openEjbRoles =
openEjbRelation.getEjbRelationshipRoleArray();
for (int j = 0; j < openEjbRoles.length; j++) {
extractJoinInfo(roleInfo, openEjbRoles[j]);
@@ -367,7 +380,8 @@
String mtmTableName = null;
if ( !roleInfo[0].isOne && !roleInfo[1].isOne ) {
if ( !openEjbRelation.isSetManyToManyTableName() ) {
- throw new DeploymentException("Relation [" + name + "] is
misconfigured: no many to many table defined by OpenEJB DD.");
+ throw new DeploymentException("MTM relation between " +
roleInfo[0] + " and " + roleInfo[1] +
+ " is misconfigured: no many to many table defined by
OpenEJB DD.");
}
mtmTableName = openEjbRelation.getManyToManyTableName();
}
@@ -377,14 +391,14 @@
}
private RoleInfo extractRoleInfo(EJBSchema ejbSchema, SQLSchema sqlSchema,
EjbRelationshipRoleType role) {
- String sourceEjbName =
role.getRelationshipRoleSource().getEjbName().getStringValue();
- RoleInfo roleInfo = new RoleInfo();
- roleInfo.name = role.getEjbRelationshipRoleName().getStringValue();
- roleInfo.ejb = ejbSchema.getEJB(sourceEjbName);
- roleInfo.table = sqlSchema.getTable(sourceEjbName);
- if (role.isSetCmrField()) {
- roleInfo.cmrFieldName =
role.getCmrField().getCmrFieldName().getStringValue();
- }
+ String entityName =
role.getRelationshipRoleSource().getEjbName().getStringValue();
+ String cmrFieldName = null;
+ if ( role.isSetCmrField() ) {
+ cmrFieldName = role.getCmrField().getCmrFieldName().getStringValue();
+ }
+ RoleInfo roleInfo = new RoleInfo(entityName, cmrFieldName);
+ roleInfo.ejb = ejbSchema.getEJB(entityName);
+ roleInfo.table = sqlSchema.getTable(entityName);
if ("One".equals(role.getMultiplicity().getStringValue())) {
roleInfo.isOne = true;
}
@@ -392,15 +406,24 @@
}
private void extractJoinInfo(RoleInfo[] roleInfo,
OpenejbEjbRelationshipRoleType role) throws DeploymentException {
- String roleName = role.getEjbRelationshipRoleName();
+ String ejbName = role.getRelationshipRoleSource().getEjbName();
+ String cmrFieldName = null;
+ if ( role.isSetCmrField() ) {
+ cmrFieldName = role.getCmrField().getCmrFieldName();
+ }
+ RoleInfo sourceRoleInfo = new RoleInfo(ejbName, cmrFieldName);
RoleInfo[] mappedRoleInfo = new RoleInfo[2];
- if (roleInfo[0].name.equals(roleName)) {
+ if (roleInfo[0].equals(sourceRoleInfo)) {
mappedRoleInfo = roleInfo;
- } else if (roleInfo[1].name.equals(roleName)) {
+ } else {
mappedRoleInfo[0] = roleInfo[1];
mappedRoleInfo[1] = roleInfo[0];
- } else {
- throw new DeploymentException("Role [" + roleName + "] defined by
OpenEJB DD is not defined by ejb-jar.xml.");
+ }
+
+ if ( role.isSetForeignKeyColumnOnSource() ) {
+ RoleInfo tmp = mappedRoleInfo[0];
+ mappedRoleInfo[0] = mappedRoleInfo[1];
+ mappedRoleInfo[1] = tmp;
}
Map pkToFkMap = new HashMap();
@@ -419,7 +442,7 @@
String pkColumn = att.getPhysicalName();
String fkColumn = (String) pkToFkMap.get(pkColumn);
if (null == fkColumn) {
- throw new DeploymentException("Role [" + roleName + "] is
misconfigured: column [" + pkColumn + "] is not a primary key.");
+ throw new DeploymentException("Role " + sourceRoleInfo + " is
misconfigured: column [" + pkColumn + "] is not a primary key.");
}
pkToFkMapEJB.put(pkEJB.getAttribute(att.getName()), new
FKField(fkColumn, att.getType()));
pkToFkMapTable.put(att, new FKColumn(fkColumn, att.getType()));
@@ -663,13 +686,35 @@
}
private static class RoleInfo {
- private String name;
- private Table table;
+ private final String entityName;
+ private final String cmrFieldName;
private EJB ejb;
- private String cmrFieldName;
+ private Table table;
private boolean isOne;
private JoinDefinition ejbJDef;
private JoinDefinition tableJDef;
+ private RoleInfo(String entityName, String cmrFieldName) {
+ this.entityName = entityName;
+ this.cmrFieldName = cmrFieldName;
+ }
+ public int hashCode() {
+ if ( null == cmrFieldName ) {
+ return entityName.hashCode();
+ } else {
+ return entityName.hashCode() ^ cmrFieldName.hashCode();
+ }
+ }
+ public boolean equals(Object obj) {
+ if ( false == obj instanceof RoleInfo ) {
+ return false;
+ }
+ RoleInfo other = (RoleInfo) obj;
+ return entityName.equals(other.entityName) &&
+ null == cmrFieldName?null ==
other.cmrFieldName:cmrFieldName.equals(other.cmrFieldName);
+ }
+ public String toString() {
+ return "EJB [" + entityName + "]; CMR field [" + cmrFieldName + "]";
+ }
}
private static String getString(org.apache.geronimo.xbeans.j2ee.String value) {
1.41 +4 -15
openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java
Index: OpenEJBModuleBuilder.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/deployment/OpenEJBModuleBuilder.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- OpenEJBModuleBuilder.java 15 Oct 2004 01:48:51 -0000 1.40
+++ OpenEJBModuleBuilder.java 25 Oct 2004 14:24:32 -0000 1.41
@@ -327,19 +327,10 @@
throw new DeploymentException("Unable to construct ObjectName", e);
}
- TransactionManagerDelegate tmDelegate = null;
- ObjectName tmObjectName = null;
- if ( null != openejbEjbJar.getTransactionManager() ) {
- try {
- tmObjectName =
ObjectName.getInstance(openejbEjbJar.getTransactionManager());
- } catch (MalformedObjectNameException e) {
- throw new DeploymentException("transaction-manager incorrect", e);
- }
- tmDelegate = new TransactionManagerDelegate();
- }
// EJBModule GBean
String connectionFactoryName = openejbEjbJar.getCmpConnectionFactory();
EJBSchema ejbSchema = new EJBSchema(module.getName());
+ TransactionManagerDelegate tmDelegate = new TransactionManagerDelegate();
DataSourceDelegate delegate = new DataSourceDelegate();
SQL92Schema sqlSchema = new SQL92Schema(module.getName(), delegate);
GlobalSchema globalSchema = new GlobalSchema(module.getName());
@@ -359,10 +350,8 @@
ejbModuleGBean.setAttribute("Delegate", delegate);
}
- if ( null != tmObjectName ) {
- ejbModuleGBean.setReferencePattern("TransactionManager",
tmObjectName);
- ejbModuleGBean.setAttribute("TMDelegate", tmDelegate);
- }
+ ejbModuleGBean.setReferencePattern("TransactionContextManager",
earContext.getTransactionContextManagerObjectName());
+ ejbModuleGBean.setAttribute("TMDelegate", tmDelegate);
} catch (Exception e) {
throw new DeploymentException("Unable to initialize EJBModule GBean",
e);
}