gdamour     2005/07/09 09:33:38

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

  It is now possible to set the value of a CMP field mapped to a FK column, in
  other words a CMR field. The previous implementation was only allowing for a
  read access.
  
  Note that in the case of a CMP field mapped to a CMR field related to an EJB
  having a compound PK, the implementation is still read-only.
  
  Revision  Changes    Path
  1.25      +33 -22    
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
  
  Index: CMPContainerBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- CMPContainerBuilder.java  7 Jul 2005 23:15:15 -0000       1.24
  +++ CMPContainerBuilder.java  9 Jul 2005 13:33:38 -0000       1.25
  @@ -103,6 +103,7 @@
   import org.tranql.ejb.CMPFieldIdentityExtractorAccessor;
   import org.tranql.ejb.CMPFieldNestedRowAccessor;
   import org.tranql.ejb.CMPFieldTransform;
  +import org.tranql.ejb.CMPMappedToCMRAccessor;
   import org.tranql.ejb.CMRField;
   import org.tranql.ejb.EJB;
   import org.tranql.ejb.EJBSchema;
  @@ -128,13 +129,13 @@
   import org.tranql.identity.IdentityDefinerBuilder;
   import org.tranql.identity.IdentityTransform;
   import org.tranql.identity.UserDefinedIdentity;
  -import org.tranql.pkgenerator.PrimaryKeyGeneratorDelegate;
   import org.tranql.pkgenerator.PrimaryKeyGenerator;
   import org.tranql.ql.QueryException;
   import org.tranql.query.QueryCommand;
   import org.tranql.schema.Association;
   import org.tranql.schema.AssociationEnd;
   import org.tranql.schema.Attribute;
  +import org.tranql.schema.Entity;
   import org.tranql.schema.FKAttribute;
   import org.tranql.schema.Schema;
   import org.tranql.sql.SQLQueryBuilder;
  @@ -315,7 +316,7 @@
           }
       }
   
  -    private LinkedHashMap createCMPFieldAccessors(SQLQueryBuilder 
queryBuilder, LinkedHashMap cmrFieldAccessors) throws QueryException {
  +    private LinkedHashMap createCMPFieldAccessors(SQLQueryBuilder 
queryBuilder, LinkedHashMap cmrFieldAccessor) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
   
           Table table = (Table) sqlSchema.getEntity(ejb.getName());
  @@ -330,36 +331,46 @@
               }
               String name = attribute.getName();
               
  -            CMPFieldTransform accessor;
  +            CMPFieldTransform accessor = new CMPFieldAccessor(new 
CacheRowAccessor(i, attribute.getType()), name);
               String columnName = table.getAttribute(name).getPhysicalName();
               AssociationEnd end = 
table.getAssociationEndDefiningFKAttribute(columnName);
               if (null != end) {
  -                accessor = (CMPFieldTransform) 
cmrFieldAccessors.get(end.getName());
  -                IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(end.getEntity());
  -                accessor = new CMPFieldIdentityExtractorAccessor(accessor, 
identityDefiner);
  -
  -                int index = 0;
  -                LinkedHashMap pkToFK = 
end.getAssociation().getJoinDefinition().getPKToFKMapping();
  -                for (Iterator iter = pkToFK.entrySet().iterator(); 
iter.hasNext();) {
  -                    Map.Entry entry = (Map.Entry) iter.next();
  -                    FKAttribute fkAttribute = (FKAttribute) entry.getValue();
  -                    if (fkAttribute.getName().equals(columnName)) {
  -                        accessor = new CMPFieldNestedRowAccessor(accessor, 
index);
  -                        break;
  +                CMPFieldTransform cmrAccessor = (CMPFieldTransform) 
cmrFieldAccessor.get(end.getName());
  +
  +                Entity relatedEntity = end.getEntity();
  +                if (1 < relatedEntity.getPrimaryKeyFields().size()) {
  +                    IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(end.getEntity());
  +                    accessor = new 
CMPFieldIdentityExtractorAccessor(cmrAccessor, identityDefiner);
  +
  +                    int index = 0;
  +                    LinkedHashMap pkToFK = 
end.getAssociation().getJoinDefinition().getPKToFKMapping();
  +                    for (Iterator iter = pkToFK.entrySet().iterator(); 
iter.hasNext();) {
  +                        Map.Entry entry = (Map.Entry) iter.next();
  +                        FKAttribute fkAttribute = (FKAttribute) 
entry.getValue();
  +                        if (fkAttribute.getName().equals(columnName)) {
  +                            accessor = new 
CMPFieldNestedRowAccessor(accessor, index);
  +                            break;
  +                        }
  +                        index++;
                       }
  -                    index++;
  +                    
  +                    accessor = new ReadOnlyCMPFieldAccessor(accessor, 
attribute.getName());
  +                } else {
  +                    IdentityTransform transform = 
identityDefinerBuilder.getPrimaryKeyTransform(relatedEntity);
  +                    accessor = new CMPMappedToCMRAccessor(cmrAccessor, 
accessor, transform);
                   }
  -                
  -                accessor = new ReadOnlyCMPFieldAccessor(accessor, 
attribute.getName());
               }  else {
                   IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb);
                   QueryCommand command = 
queryBuilder.buildLoadAttribute(ejb.getName(), name, true);
                   FieldTransform attAccessor = 
command.getQuery().getResultAccessors()[0];
                   EmptySlotLoader[] loaders = new EmptySlotLoader[] {new 
EmptySlotLoader(i, attAccessor)};
                   FaultHandler faultHandler = new QueryFaultHandler(command, 
identityDefiner, loaders);
  -                accessor = new CMPFieldAccessor(new CacheRowAccessor(i, 
attribute.getType()), name);
                   accessor = new CMPFieldFaultTransform(accessor, 
faultHandler, new int[]{i});
               }
  +            // TODO: this breaks the CMP1 bridge.
  +//            if (attribute.isIdentity()) {
  +//                accessor = new PKFieldAccessCheck(accessor);
  +//            }
               
               cmpFieldAccessors.put(name, accessor);
           }
  @@ -388,8 +399,6 @@
               FaultHandler faultHandler = buildFaultHandler(queryBuilder, ejb, 
field, i, prefetch);
               accessor = new CMPFieldFaultTransform(accessor, faultHandler, 
new int[]{i});
   
  -            cmrFaultAccessors.put(name, accessor);
  -            
               int relatedIndex = relatedEJB.getAttributes().size() + 
relatedEJB.getAssociationEnds().indexOf(relatedField);
               FaultHandler relatedFaultHandler = 
buildFaultHandler(queryBuilder, relatedEJB, relatedField, relatedIndex, 
prefetch);
               CMPFieldTransform relatedAccessor = new CMPFieldAccessor(new 
CacheRowAccessor(relatedIndex, null), name);
  @@ -405,6 +414,8 @@
                   boolean isRight = 
association.getRightJoinDefinition().getPKEntity() == ejb;
                   accessor = new ManyToManyCMR(accessor, relatedAccessor, 
relatedIdentityDefiner, mtm, isRight);
               }
  +
  +            cmrFaultAccessors.put(name, accessor);
   
               IdentityTransform relatedIdentityTransform = 
identityDefinerBuilder.getPrimaryKeyTransform(relatedEJB);
               if ( association.isOneToOne() || association.isManyToOne(field) 
) {
  
  
  

Reply via email to