gdamour     2005/08/05 06:55:29

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPEntityBuilder.java
  Log:

  GERONIMO-827 - Support CMR mapping via ejb-relation-name and 
ejb-relationship-role-name.
  
  Revision  Changes    Path
  1.40      +75 -35    
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
  
  Index: CMPEntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- CMPEntityBuilder.java     28 Jul 2005 02:40:30 -0000      1.39
  +++ CMPEntityBuilder.java     5 Aug 2005 10:55:29 -0000       1.40
  @@ -546,15 +546,14 @@
           OpenejbEjbRelationType[] openEJBRelations = 
openejbEjbJar.getRelationships().getEjbRelationArray();
           for (int i = 0; i < openEJBRelations.length; i++) {
               OpenejbEjbRelationType relation = openEJBRelations[i];
  +            String relationName = relation.isSetEjbRelationName() ? 
relation.getEjbRelationName() : null;
               OpenejbEjbRelationshipRoleType[] roles = 
relation.getEjbRelationshipRoleArray();
               for (int j = 0; j < roles.length; j++) {
                   OpenejbEjbRelationshipRoleType role = roles[j];
  -                if ( !role.isSetCmrField() ) {
  -                    continue;
  -                }
  +                String roleName = role.isSetEjbRelationshipRoleName() ? 
role.getEjbRelationshipRoleName() : null;
                   String ejbName = 
role.getRelationshipRoleSource().getEjbName();
  -                String cmrFieldName = role.getCmrField().getCmrFieldName();
  -                RoleInfo roleInfo = new RoleInfo(ejbName, cmrFieldName);
  +                String cmrFieldName = role.isSetCmrField() ? 
role.getCmrField().getCmrFieldName() : null;
  +                RoleInfo roleInfo = new RoleInfo(relationName, roleName, 
ejbName, cmrFieldName);
                   // Note: we're putting the whole relation into the map, not 
just the relationship-role that we found
                   // Later, we'll dig out both roles for a many-to-many 
relationship, even if only one of them
                   //   had a cmr-field and got past the isSetCmrField test 
above
  @@ -565,17 +564,24 @@
           EjbRelationType[] relations = 
ejbJar.getRelationships().getEjbRelationArray();
           for (int i = 0; i < relations.length; i++) {
               EjbRelationshipRoleType[] roles = 
relations[i].getEjbRelationshipRoleArray();
  +            String relationName = relations[i].isSetEjbRelationName() ? 
relations[i].getEjbRelationName().getStringValue() : null; 
               RoleInfo[] roleInfo = new RoleInfo[2];
  -            roleInfo[0] = extractRoleInfo(ejbSchema, sqlSchema, roles[0]);
  -            roleInfo[1] = extractRoleInfo(ejbSchema, sqlSchema, roles[1]);
  +            roleInfo[0] = extractRoleInfo(ejbSchema, sqlSchema, roles[0], 
relationName);
  +            roleInfo[1] = extractRoleInfo(ejbSchema, sqlSchema, roles[1], 
relationName);
   
  -            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]);
  +            OpenejbEjbRelationType openEjbRelation = null; 
  +            for (Iterator iter = openEjbRelations.entrySet().iterator(); 
iter.hasNext();) {
  +                Map.Entry entry = (Map.Entry) iter.next();
  +                RoleInfo currRoleInfo = (RoleInfo) entry.getKey();
  +                if (currRoleInfo.implies(roleInfo[0]) || 
currRoleInfo.implies(roleInfo[1])) {
  +                    openEjbRelation = (OpenejbEjbRelationType) 
entry.getValue();
  +                    break;
                   }
               }
  +            
  +            if (null == openEjbRelation) {
  +                throw new DeploymentException("No CMR mapping defined by 
OpenEJB DD for roles " + roleInfo[0] + " or " + roleInfo[1]);
  +            }
   
               String mtmTableName = null;
               if ( !roleInfo[0].isOne && !roleInfo[1].isOne ) {
  @@ -588,20 +594,18 @@
   
               OpenejbEjbRelationshipRoleType[] openEjbRoles = 
openEjbRelation.getEjbRelationshipRoleArray();
               for (int j = 0; j < openEjbRoles.length; j++) {
  -                extractJoinInfo(roleInfo, mtmTableName, ejbSchema, 
sqlSchema, openEjbRoles[j]);
  +                extractJoinInfo(roleInfo, mtmTableName, ejbSchema, 
sqlSchema, openEjbRoles[j], relationName);
               }
   
               buildSchemaForJoin(roleInfo, mtmTableName, ejbSchema, sqlSchema, 
i);
           }
       }
   
  -    private RoleInfo extractRoleInfo(EJBSchema ejbSchema, SQLSchema 
sqlSchema, EjbRelationshipRoleType role) {
  +    private RoleInfo extractRoleInfo(EJBSchema ejbSchema, SQLSchema 
sqlSchema, EjbRelationshipRoleType role, String relationName) {
           String entityName = 
role.getRelationshipRoleSource().getEjbName().getStringValue();
  -        String cmrFieldName = null;
  -        if ( role.isSetCmrField() ) {
  -            cmrFieldName = 
role.getCmrField().getCmrFieldName().getStringValue();
  -        }
  -        RoleInfo roleInfo = new RoleInfo(entityName, cmrFieldName);
  +        String roleName = role.isSetEjbRelationshipRoleName() ? 
role.getEjbRelationshipRoleName().getStringValue() : null;
  +        String cmrFieldName = role.isSetCmrField() ? 
role.getCmrField().getCmrFieldName().getStringValue() : null;
  +        RoleInfo roleInfo = new RoleInfo(relationName, roleName, entityName, 
cmrFieldName);
           roleInfo.ejb = ejbSchema.getEJB(entityName);
           roleInfo.table = sqlSchema.getTable(entityName);
           if ("One".equals(role.getMultiplicity().getStringValue())) {
  @@ -613,16 +617,13 @@
           return roleInfo;
       }
   
  -    private void extractJoinInfo(RoleInfo[] roleInfo, String mtmEntityName, 
EJBSchema ejbSchema, SQLSchema sqlSchema, OpenejbEjbRelationshipRoleType role) 
throws DeploymentException {
  +    private void extractJoinInfo(RoleInfo[] roleInfo, String mtmEntityName, 
EJBSchema ejbSchema, SQLSchema sqlSchema, OpenejbEjbRelationshipRoleType role, 
String relationName) throws DeploymentException {
           String ejbName = role.getRelationshipRoleSource().getEjbName();
  -        String cmrFieldName = null;
  -        String groupName = null;
  -        if ( role.isSetCmrField() ) {
  -            cmrFieldName = role.getCmrField().getCmrFieldName();
  -        }
  -        RoleInfo sourceRoleInfo = new RoleInfo(ejbName, cmrFieldName);
  +        String roleName = role.isSetEjbRelationshipRoleName() ? 
role.getEjbRelationshipRoleName() : null;
  +        String cmrFieldName = role.isSetCmrField() ? 
role.getCmrField().getCmrFieldName() : null;
  +        RoleInfo sourceRoleInfo = new RoleInfo(relationName, roleName, 
ejbName, cmrFieldName);
           RoleInfo[] mappedRoleInfo = new RoleInfo[2];
  -        if (roleInfo[0].equals(sourceRoleInfo)) {
  +        if (roleInfo[0].implies(sourceRoleInfo)) {
               mappedRoleInfo = roleInfo;
               roleInfo[0].isOnPKSide |= true;
           } else {
  @@ -830,6 +831,8 @@
       }
   
       private static class RoleInfo {
  +        private final String relationName;
  +        private final String roleName;
           private final String entityName;
           private final String cmrFieldName;
           private EJB ejb;
  @@ -839,26 +842,63 @@
           private boolean isOnPKSide;
           private JoinDefinition ejbJDef;
           private JoinDefinition tableJDef;
  -        private RoleInfo(String entityName, String cmrFieldName) {
  +        private RoleInfo(String relationName, String roleName, String 
entityName, String cmrFieldName) {
  +            this.relationName = relationName;
  +            this.roleName = roleName;
               this.entityName = entityName;
               this.cmrFieldName = cmrFieldName;
           }
  +        public boolean implies(RoleInfo other) {
  +            if (false == entityName.equals(other.entityName)) {
  +                return false;
  +            }
  +            if (null != relationName && 
relationName.equals(other.relationName)) {
  +                if (null != roleName && null != other.roleName) {
  +                    if (false == roleName.equals(other.roleName)) {
  +                        return false;
  +                    }
  +                    if (null != cmrFieldName && null != other.cmrFieldName 
&& false == cmrFieldName.equals(other.cmrFieldName)) {
  +                        throw new 
IllegalArgumentException("ejb-relation-name [" + relationName +
  +                                "]/ejb-relationship-role-name [" + roleName 
+"] is invalid: CMR field [" +
  +                                other.cmrFieldName + "] is expected for this 
role. Found [" + cmrFieldName + "].");
  +                    }
  +                    return true;
  +                }
  +            }
  +            return null != cmrFieldName && null != other.cmrFieldName && 
cmrFieldName.equals(other.cmrFieldName);
  +        }
           public int hashCode() {
  -            if ( null == cmrFieldName ) {
  -                return entityName.hashCode();
  +            int code = entityName.hashCode();
  +            if (null != relationName) {
  +                code ^= relationName.hashCode();
  +            }
  +            if (null != roleName) {
  +                code ^= roleName.hashCode();
  +            }
  +            if (null != cmrFieldName) {
  +                code ^= cmrFieldName.hashCode();
               }
  -            return entityName.hashCode() ^ cmrFieldName.hashCode();
  +            return code;
           }
           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);
  +            if (null != relationName && false == 
relationName.equals(other.relationName)) {
  +                return false;
  +            }
  +            if (null != roleName && false == 
roleName.equals(other.roleName)) {
  +                return false;
  +            }
  +            if (null != cmrFieldName && false == 
cmrFieldName.equals(other.cmrFieldName)) {
  +                return false;
  +            }
  +            return entityName.equals(other.entityName);
           }
           public String toString() {
  -            return "EJB [" + entityName + "]; CMR field [" + cmrFieldName + 
"]";
  +            return "Relation Name [" + relationName + "]; Role Name [" + 
roleName + 
  +                "]; EJB [" + entityName + "]; CMR field [" + cmrFieldName + 
"]";
           }
       }
   
  
  
  

Reply via email to