RdbMappingBuilder.java

00001 
00027 package org.objectweb.jonas_ejb.lib;
00028 
00029 import java.util.Iterator;
00030 import org.objectweb.jonas.common.Log;
00031 import org.objectweb.jonas_ejb.deployment.api.BeanDesc;
00032 import org.objectweb.jonas_ejb.deployment.api.DeploymentDescEjb2;
00033 import org.objectweb.jonas_ejb.deployment.api.EjbRelationDesc;
00034 import org.objectweb.jonas_ejb.deployment.api.EjbRelationshipRoleDesc;
00035 import org.objectweb.jonas_ejb.deployment.api.EntityJdbcCmp2Desc;
00036 import org.objectweb.jonas_ejb.deployment.api.FieldJdbcDesc;
00037 import org.objectweb.jonas_lib.deployment.api.DeploymentDescException;
00038 import org.objectweb.jorm.api.PException;
00039 import org.objectweb.jorm.metainfo.api.Class;
00040 import org.objectweb.jorm.metainfo.api.ClassProject;
00041 import org.objectweb.jorm.metainfo.api.ClassRef;
00042 import org.objectweb.jorm.metainfo.api.CompositeName;
00043 import org.objectweb.jorm.metainfo.api.GenClassRef;
00044 import org.objectweb.jorm.metainfo.api.Manager;
00045 import org.objectweb.jorm.metainfo.api.NameDef;
00046 import org.objectweb.jorm.metainfo.api.NameRef;
00047 import org.objectweb.jorm.metainfo.api.PrimitiveElement;
00048 import org.objectweb.jorm.metainfo.api.ScalarField;
00049 import org.objectweb.jorm.metainfo.api.PrimitiveElementMapping;
00050 import org.objectweb.jorm.metainfo.lib.JormManager;
00051 import org.objectweb.jorm.metainfo.lib.MetaInfoPrinter;
00052 import org.objectweb.jorm.type.api.PType;
00053 import org.objectweb.jorm.mapper.rdb.metainfo.RdbMappingPrinter;
00054 import org.objectweb.jorm.mapper.rdb.metainfo.RdbMappingFactory;
00055 import org.objectweb.jorm.mapper.rdb.metainfo.RdbMapping;
00056 import org.objectweb.jorm.mapper.rdb.metainfo.RdbClassMultiMapping;
00057 import org.objectweb.jorm.mapper.rdb.metainfo.RdbTable;
00058 import org.objectweb.jorm.mapper.rdb.metainfo.RdbGenClassMapping;
00059 import org.objectweb.jorm.mapper.rdb.metainfo.RdbExternalTable;
00060 import org.objectweb.jorm.mapper.rdb.metainfo.RdbJoin;
00061 import org.objectweb.util.monolog.api.Logger;
00062 import org.objectweb.util.monolog.api.BasicLevel;
00063 import org.objectweb.util.monolog.wrapper.printwriter.PrintStreamImpl;
00064 
00070 public class RdbMappingBuilder {
00071 
00075     private Logger logger = null;
00076 
00077 
00081     private JormManager manager = null;
00082 
00088     public static final String MAPPER_NAME = "rdb";
00089 
00093     public static final String PROJECT_NAME = "jonas";
00094 
00098     private PrintStreamImpl pstream;
00099     private MetaInfoPrinter mip;
00100 
00107     public RdbMappingBuilder(DeploymentDescEjb2 dd, Logger logger) throws DeploymentDescException {
00108         this.logger = Log.getLogger("org.objectweb.jonas_ejb.mijorm");
00109         pstream = new PrintStreamImpl(this.logger);
00110         mip = new MetaInfoPrinter();
00111         mip.addMappingPrinter(new RdbMappingPrinter());
00112 
00113         // Init a Jorm manager mapped on Rdb. Rdb is the only mapping
00114         // supported by JOnAS today.
00115         manager = new JormManager();
00116         manager.setLogger(logger);
00117         manager.init();
00118         manager.addMappingFactory("rdb", new RdbMappingFactory());
00119 
00120         try {
00121             // Create the jorm meta information for entity beans CMP2
00122             for (Iterator i = dd.getBeanDescIterator(); i.hasNext(); ) {
00123                 BeanDesc bd = (BeanDesc) i.next();
00124                 if (bd instanceof EntityJdbcCmp2Desc) {
00125                     createJormEntityMI((EntityJdbcCmp2Desc) bd);
00126                 }
00127             }
00128 
00129             // Create the jorm meta information for Relations
00130             for (Iterator i = dd.getEjbRelationDescIterator(); i.hasNext(); ) {
00131                 EjbRelationDesc relation = (EjbRelationDesc) i.next();
00132                 createJormRelationMI(relation);
00133             }
00134         } catch (PException e) {
00135             logger.log(BasicLevel.ERROR, "Jorm Exception raised: " + e);
00136             throw new DeploymentDescException(e);
00137         }
00138     }
00139 
00143     public Manager getJormMIManager() {
00144         return manager;
00145     }
00146 
00150     public static String getProjectName() {
00151         return PROJECT_NAME;
00152     }
00153 
00159     private void createJormEntityMI(EntityJdbcCmp2Desc bean) throws PException {
00160 
00161         String asn = bean.getJormClassName();
00162         logger.log(BasicLevel.DEBUG, "Create Jorm MI for the bean: " + asn);
00163 
00164         // --------------------------------------------------------------------
00165         // create persistent class and add it to the list for Jorm Compiler
00166         // --------------------------------------------------------------------
00167         Class myejb = manager.createClass(asn);
00168         bean.addToJormList(myejb);
00169         ClassProject acp = myejb.createClassProject(PROJECT_NAME);
00170         RdbMapping mapping = (RdbMapping) acp.createMapping(MAPPER_NAME);
00171         RdbClassMultiMapping classmapping = mapping.createClassMultiMapping("to-table");
00172         String tablename = bean.getJdbcTableName();
00173         RdbTable mytable = classmapping.createRdbTable(tablename);
00174 
00175         // --------------------------------------------------------------------
00176         // CMP fields
00177         // --------------------------------------------------------------------
00178         for (Iterator i = bean.getCmpFieldDescIterator(); i.hasNext();) {
00179             FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00180             String fieldname = fd.getName();
00181             logger.log(BasicLevel.DEBUG, "Create PrimitiveElement for the CMP field: " + fieldname);
00182             PType pt = JormType.getPType(fd.getFieldType(), fd.isPrimaryKey());
00183             PrimitiveElement pe = myejb.createPrimitiveElement(fieldname, pt, PType.NOSIZE, PType.NOSIZE);
00184             mytable.createPrimitiveElementMapping(pe, fd.getJdbcFieldName(), fd.getSqlType(), fd.isPrimaryKey());
00185         }
00186 
00187         // --------------------------------------------------------------------
00188         // Primary Key
00189         // --------------------------------------------------------------------
00190         NameDef nds = myejb.createNameDef();
00191         if (bean.hasSimplePkField()) {
00192             // PK is a single field
00193             nds.setFieldName(bean.getSimplePkField().getName());
00194         } else {
00195             // Define a Composite Name (name = PK Class Name) and a NameRef
00196             // Sometimes, the CompositeName already exists, for example if 2 beans
00197             // have the same PK Class.
00198             boolean newcn = false;
00199             CompositeName cn = manager.getCompositeName(bean.getJormPKClassName());
00200             if (cn == null) {
00201                 cn = manager.createCompositeName(bean.getJormPKClassName());
00202                 bean.addToJormList(cn);
00203                 newcn = true;
00204             }
00205             // Use the CompositeName into the NameDef
00206             NameRef nrs = nds.createNameRef(cn);
00207             // fill the composite name with pk fields and link these fields to the class fields
00208             for (Iterator it = bean.getCmpFieldDescIterator(); it.hasNext();) {
00209                 FieldJdbcDesc fd = (FieldJdbcDesc) it.next();
00210                 if (fd.isPrimaryKey()) {
00211                     String fieldName = fd.getName();
00212                     if (newcn) {
00213                         cn.createCompositeNameField(fieldName, JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00214                                                     PType.NOSIZE, PType.NOSIZE);
00215                     }
00216                     nrs.addProjection(fieldName, fieldName);
00217                 }
00218             }
00219         }
00220         classmapping.createIdentifierMapping(nds);
00221 
00222         mip.print("Jorm MI for " + asn + ": ", myejb, pstream);
00223         mip.print("JORM MI Mapping for " + asn + ": ", classmapping, pstream);
00224     }
00225 
00231     private void createJormRelationMI(EjbRelationDesc relation) throws PException {
00232         logger.log(BasicLevel.DEBUG, "Create Jorm MI for the relation: " + relation.getName());
00233         EjbRelationshipRoleDesc role1 = relation.getRelationshipRole1();
00234         EjbRelationshipRoleDesc role2 = relation.getRelationshipRole2();
00235         // role1
00236         if (role1.isTargetMultiple()) 
00237             createJormRoleMIMulti(role1, role2);
00238         else
00239             createJormRoleMIOne(role1, role2);
00240         // role2
00241         if (role2.isTargetMultiple())
00242             createJormRoleMIMulti(role2, role1);
00243         else
00244             createJormRoleMIOne(role2, role1);
00245     }
00246 
00254     private void createJormRoleMIOne(EjbRelationshipRoleDesc sRole, EjbRelationshipRoleDesc tRole)
00255         throws PException {
00256 
00257         logger.log(BasicLevel.DEBUG, sRole.getName());
00258 
00259         // source bean in the relation
00260         EntityJdbcCmp2Desc sEntity = (EntityJdbcCmp2Desc) sRole.getSourceBean();
00261         String sAsn = sEntity.getJormClassName();
00262         Class sClass = manager.getClass(sAsn);
00263 
00264         // target bean in the relation.
00265         EntityJdbcCmp2Desc tEntity = (EntityJdbcCmp2Desc) sRole.getTargetBean();
00266         String tAsn = tEntity.getJormClassName();
00267         Class tClass = manager.getClass(tAsn);
00268 
00269         ClassProject cpro = sClass.getClassProject(PROJECT_NAME);
00270         RdbMapping rdbmapping = (RdbMapping) cpro.getMapping(MAPPER_NAME);
00271         RdbClassMultiMapping classmapping = (RdbClassMultiMapping) rdbmapping.getClassMapping();
00272         RdbTable rdbtable = classmapping.getRdbTable();
00273 
00274         // There is always a cmr-field, sometimes added by JOnAS, because we
00275         // only deal with bidirectional relations.
00276         String sCmr = sRole.getCmrFieldName();
00277 
00278         // In case we have the same cmr field used in both roles, nothing to do
00279         if (tClass == sClass && sClass.getTypedElement(sCmr) != null) {
00280             logger.log(BasicLevel.DEBUG, "Nothing to do, same CMR field.");
00281             return;
00282         }
00283 
00284         // add Dependencies between beans (= same cluster of beans)
00285         // avoids dropping tables at each loading of beans in the same cluster.
00286         if (tClass != sClass) {
00287             classmapping.addDependency(tClass.getFQName());
00288         }
00289 
00290         // Mono-value cmr: create the Class Ref. and its NameDef
00291         ClassRef cr = sClass.createClassRef(sCmr, tClass);
00292         NameDef rndf = cr.createRefNameDef();
00293 
00294         if (sRole.hasJdbcMapping() || tClass == sClass) {
00295             // source bean has a JDBC mapping for its CMR field.
00296             // 1 <-> N case (N side), or 1 <-> 1 case (Jdbc side)
00297             classmapping.createReferenceMapping("embedded-target-reference", rndf);
00298             if (tClass != sClass) {
00299                 rdbtable.setColocated(true);
00300                 rdbtable.setColocatedMaster(true);
00301             }
00302             if (tEntity.hasSimplePkField()) {
00303                 // target bean has a Simple PK.
00304                 FieldJdbcDesc fd = (FieldJdbcDesc) tEntity.getSimplePkField();
00305                 String cmrmappingname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00306                 PrimitiveElement pe = null;
00307                 String clafn = sCmr + "_" + fd.getName();
00308                 boolean peHasMapping = false;
00309                 if (cmrmappingname != null) {
00310                     //check if the CMR is mapper over a CMP
00311                     pe = getPrimitiveElementByColumn(classmapping, cmrmappingname);
00312                 }
00313                 if (pe == null) {
00314                     //No CMP has been found ==> create an hidden field
00315                     pe = sClass.createHiddenField(clafn,
00316                                                   JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00317                                                   PType.NOSIZE, PType.NOSIZE);
00318                 } else {
00319                     peHasMapping = true;
00320                 }
00321                 //Register the field into the namedef
00322                 rndf.setFieldName(pe.getName());
00323                 if (cmrmappingname != null) { // ???
00324                     if (!peHasMapping) {
00325                         rdbtable.createPrimitiveElementMapping(pe, cmrmappingname, fd.getSqlType(), false);
00326                     }
00327                 } else if (tClass == sClass) {
00328                     // tClass == sClass : unidirectional cmr on same bean
00329                     cmrmappingname = tRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00330                     PrimitiveElementMapping pem = classmapping.getPrimitiveElementMapping(tRole.getCmrFieldName() + "_" + fd.getName());
00331                     classmapping.addPrimitiveElementMapping(clafn, pem);
00332                 }
00333                 logger.log(BasicLevel.DEBUG, "CMR " + sCmr + " is mapped over the field: " + clafn + " / columname: " + cmrmappingname);
00334             } else {
00335                 // target bean has a Composite PK.
00336                 NameRef cpk = rndf.createNameRef(tClass.getNameDef("").getNameRef().getCompositeName());
00337                 for (Iterator i = tEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00338                     FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00339                     if (fd.isPrimaryKey()) {
00340                         String cmrmappingname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00341                         PrimitiveElement pe = null;
00342                         String clafn = sCmr + "_" + fd.getName();
00343                         boolean peHasMapping = false;
00344                         if (cmrmappingname != null) {
00345                             //check if the CMR is mapper over a CMP
00346                             pe = getPrimitiveElementByColumn(classmapping, cmrmappingname);
00347                         }
00348                         if (pe == null) {
00349                             //No CMP has been found ==> create an hidden field
00350                             pe = sClass.createHiddenField(clafn,
00351                                                           JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00352                                                           PType.NOSIZE, PType.NOSIZE);
00353                         } else {
00354                             peHasMapping = true;
00355                         }
00356                         cpk.addProjection(fd.getName(), pe.getName());
00357                         if (cmrmappingname != null) {
00358                             if (!peHasMapping) {
00359                                 rdbtable.createPrimitiveElementMapping(pe, cmrmappingname, fd.getSqlType(), false);
00360                             }
00361                         } else if (tClass == sClass) {
00362                             // tClass == sClass : unidirectional cmr on same bean (???)
00363                             cmrmappingname = tRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00364                             PrimitiveElementMapping pem = classmapping.getPrimitiveElementMapping(tRole.getCmrFieldName() + "_" + fd.getName());
00365                             classmapping.addPrimitiveElementMapping(clafn, pem);
00366                         }
00367                         logger.log(BasicLevel.DEBUG, "CMR " + sCmr + " is mapped over the field: " + clafn + " / columname: " + cmrmappingname);
00368                     }
00369                 }
00370             }
00371         } else {
00372             // The JDBC mapping for the source CMR field is done on the target bean.
00373             // 1 <-> 1 case (non-jdbc side)
00374             classmapping.createReferenceMapping("multi-table", rndf);
00375             RdbExternalTable table2 = classmapping.createRdbExternalTable(tEntity.getJdbcTableName());
00376             table2.setColocated(true); // Table used by 2 beans => update before insert
00377             table2.setColocatedMaster(false);
00378             table2.setReadOnly(true);
00379             RdbJoin joinTo2 = table2.createRdbJoin(sCmr);
00380             logger.log(BasicLevel.DEBUG, "CMR " + sCmr + " is mapped over the external table: " + tEntity.getJdbcTableName());
00381             // source pk fields compose the join
00382             if (sEntity.hasSimplePkField()) {
00383                 FieldJdbcDesc spk = (FieldJdbcDesc) sEntity.getSimplePkField();
00384                 String cmrmappingname = tRole.getForeignKeyJdbcName(spk.getJdbcFieldName());
00385                 joinTo2.addJoinColumnNames(spk.getJdbcFieldName(), cmrmappingname);
00386                 logger.log(BasicLevel.DEBUG, "CMR " + sCmr + ": join: " + spk.getJdbcFieldName() + " = " + cmrmappingname);
00387             } else {
00388                 for (Iterator i = sEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00389                     FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00390                     if (fd.isPrimaryKey()) {
00391                         String cmrmappingname = tRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00392                         joinTo2.addJoinColumnNames(fd.getJdbcFieldName(), cmrmappingname);
00393                         logger.log(BasicLevel.DEBUG, "CMR " + sCmr + ": join: " + fd.getJdbcFieldName() + " = " + cmrmappingname);
00394                     }
00395                 }
00396             }
00397             // target pk fields compose the name def of reference
00398             if (tEntity.hasSimplePkField()) {
00399                 FieldJdbcDesc tpk = (FieldJdbcDesc) tEntity.getSimplePkField();
00400                 String clafn = sCmr + "_" + tpk.getName();
00401                 rndf.setFieldName(clafn);
00402                 ScalarField sf = sClass.createHiddenField(clafn,
00403                                                           JormType.getPType(tpk.getFieldType(), tpk.isPrimaryKey()),
00404                                                           PType.NOSIZE, PType.NOSIZE);
00405                 table2.createPrimitiveElementMapping(sf, tpk.getJdbcFieldName(), tpk.getSqlType(), false, joinTo2);
00406                 logger.log(BasicLevel.DEBUG, "CMR " + sCmr + ": mapped over the field : " + clafn + " column: " + tpk.getJdbcFieldName());
00407             } else {
00408                 NameRef cpk = rndf.createNameRef(tClass.getNameDef("").getNameRef().getCompositeName());
00409                 for (Iterator i = tEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00410                     FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00411                     if (fd.isPrimaryKey()) {
00412                         String clafn = sCmr + "_" + fd.getName();
00413                         ScalarField sf = sClass.createHiddenField(clafn,
00414                                                                   JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00415                                                                   PType.NOSIZE, PType.NOSIZE);
00416                         table2.createPrimitiveElementMapping(sf, fd.getJdbcFieldName(), fd.getSqlType(), false, joinTo2);
00417                         cpk.addProjection(fd.getName(), sf.getName());
00418                         logger.log(BasicLevel.DEBUG, "CMR " + sCmr + ": mapped over the field : " + clafn + " column: " + fd.getJdbcFieldName());
00419                     }
00420                 }
00421             }
00422         }
00423         mip.print("JORM MI for " + sAsn + ": ", sClass, pstream);
00424         mip.print("JORM MI Mapping for " + sAsn + ": ", classmapping, pstream);
00425     }
00426 
00433     private void createJormRoleMIMulti(EjbRelationshipRoleDesc sRole, EjbRelationshipRoleDesc tRole)
00434         throws PException {
00435 
00436         logger.log(BasicLevel.DEBUG, sRole.getName());
00437 
00438         // source bean in the relation
00439         EntityJdbcCmp2Desc sEntity = (EntityJdbcCmp2Desc) sRole.getSourceBean();
00440         String sAsn = sEntity.getJormClassName();
00441         Class sClass = manager.getClass(sAsn);
00442 
00443         // target bean in the relation.
00444         EntityJdbcCmp2Desc tEntity = (EntityJdbcCmp2Desc) sRole.getTargetBean();
00445         String tAsn = tEntity.getJormClassName();
00446         Class tClass = manager.getClass(tAsn);
00447 
00448         ClassProject cpro = sClass.getClassProject(PROJECT_NAME);
00449         RdbMapping rdbmapping = (RdbMapping) cpro.getMapping(MAPPER_NAME);
00450         RdbClassMultiMapping classmapping = (RdbClassMultiMapping) rdbmapping.getClassMapping();
00451 
00452         // There is always a cmr-field, sometimes added by JOnAS, because we
00453         // only deal with bidirectional relations.
00454         String sCmr = sRole.getCmrFieldName();
00455 
00456         // In case we have the same cmr field used in both roles, nothing to do
00457         if (tClass == sClass && sClass.getTypedElement(sCmr) != null) {
00458             logger.log(BasicLevel.DEBUG, "Nothing to do, same CMR field.");
00459             return;
00460         }
00461 
00462         // add Dependencies between beans (= same cluster of beans)
00463         // avoids dropping tables at each loading of beans in the same cluster.
00464         if (tClass != sClass) {
00465             classmapping.addDependency(tClass.getFQName());
00466         }
00467 
00468         // Multi-value cmr: create the gen class and its Reference NameDef.
00469         GenClassRef gcr = sClass.createGenClassRef(sCmr, sRole.getCmrFieldType().getName());
00470         NameDef ndsg = gcr.createRefNameDef();
00471 
00472         RdbGenClassMapping gcm = null;
00473         RdbTable tableGC = null;
00474         if (sRole.isSourceMultiple()) {
00475             logger.log(BasicLevel.DEBUG, "Create GenClassReference for the CMR field (Many-Many): " + sCmr);
00476             // M <-> N case
00477             gcm = rdbmapping.createGenClassMapping("embedded-target-references", gcr);
00478             // We need a jointure table in that case.
00479             tableGC = gcm.createRdbTable(sRole.getRelation().getJdbcTableName());
00480             if (sRole.isSlave()) {
00481                 tableGC.setReadOnly(true);
00482             }
00483         } else {
00484             logger.log(BasicLevel.DEBUG, "Create GenClassReference for the CMR field (One-Many): " + sCmr);
00485             // 1 <-> N case (1 side) : store CMR on N side.
00486             gcm = rdbmapping.createGenClassMapping("embedded-target-objects", gcr);
00487             tableGC = gcm.createRdbTable(tEntity.getJdbcTableName());
00488             tableGC.setReadOnly(true);
00489             tableGC.setColocated(true);
00490         }
00491 
00492         // How the current bean references the gen class
00493         // = the identifier of the source class
00494         // no mapping, because already done for the bean pk.
00495         classmapping.createReferenceMapping("embedded-target-reference", ndsg);
00496         if (sEntity.hasSimplePkField()) {
00497             // source bean has a Simple PK.
00498             FieldJdbcDesc fd = (FieldJdbcDesc) sEntity.getSimplePkField();
00499             ndsg.setFieldName(fd.getName());
00500         } else {
00501             // source bean has a Composite PK.
00502             NameRef cpk = ndsg.createNameRef(sClass.getNameDef("").getNameRef().getCompositeName());
00503             for (Iterator i = sEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00504                 FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00505                 if (fd.isPrimaryKey()) {
00506                     // field names in the Composite are field names of the bean.
00507                     cpk.addProjection(fd.getName(), fd.getName());
00508                 }
00509             }
00510         }
00511 
00512         // How the gen class is identified (the gen class name)
00513         // = the identifier of the source class
00514         String fieldsuffix;
00515         if (sClass == tClass) {
00516             fieldsuffix = (sRole.isSlave() ? "2" : "1");
00517         } else {
00518             fieldsuffix = "";
00519         }
00520         NameDef ndid = gcr.createIdNameDef();
00521         if (sEntity.hasSimplePkField()) {
00522             // source bean has a Simple PK.
00523             FieldJdbcDesc fd = (FieldJdbcDesc) sEntity.getSimplePkField();
00524             String clafn = sAsn + "_" + fd.getName() + fieldsuffix;
00525             ndid.setFieldName(clafn);
00526             ScalarField pe = gcr.createHiddenField(clafn,
00527                                                    JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00528                                                    PType.NOSIZE, PType.NOSIZE);
00529 
00530             String fkname = tRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00531             tableGC.createPrimitiveElementMapping(pe, fkname, fd.getSqlType(), false);
00532             logger.log(BasicLevel.DEBUG, "GC id is mapped over the field: " + clafn + " / column:" + fkname);
00533         } else {
00534             // source bean has a Composite PK.
00535             NameRef cpk = ndid.createNameRef(sClass.getNameDef("").getNameRef().getCompositeName());
00536             for (Iterator i = sEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00537                 FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00538                 if (fd.isPrimaryKey()) {
00539                     String clafn = sAsn + "_" + fd.getName() + fieldsuffix;
00540                     ScalarField sf = gcr.createHiddenField(clafn,
00541                                                            JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00542                                                            PType.NOSIZE, PType.NOSIZE);
00543                     cpk.addProjection(fd.getName(), sf.getName());
00544                     String fkname = tRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00545                     tableGC.createPrimitiveElementMapping(sf, fkname, fd.getSqlType(), false);
00546                     logger.log(BasicLevel.DEBUG, "GC id is mapped over the field: " + clafn + " / column:" + fkname);
00547                 }
00548             }
00549         }
00550         gcm.createIdentifierMapping(ndid);
00551 
00552         // How the referenced class is referenced from the gen class.
00553         // Describes an Element of the GenClass.
00554         // = pk of the target bean
00555         if (sClass == tClass) {
00556             fieldsuffix = (tRole.isSlave() ? "2" : "1");
00557         } else {
00558             fieldsuffix = "";
00559         }
00560         // Create the ClassRef and its NameDef.
00561         NameDef ndr2 = gcr.createClassRef(tClass).createRefNameDef();
00562         gcm.createReferenceMapping("embedded-target-object", ndr2);
00563 
00564         if (tEntity.hasSimplePkField()) {
00565             // target bean has a Simple PK.
00566             FieldJdbcDesc fd = (FieldJdbcDesc) tEntity.getSimplePkField();
00567             String fkname;
00568             if (sRole.isSourceMultiple()) {
00569                 // M <-> N case
00570                 fkname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00571             } else {
00572                 // 1 <-> N case
00573                 fkname = fd.getJdbcFieldName();
00574             }
00575             ScalarField pe = getPrimitiveElementByColumn(gcm, fkname);
00576             if (pe == null) {
00577                 String clafn = tAsn + "_" + fd.getName() + fieldsuffix;
00578                 pe = gcr.createHiddenField(clafn,
00579                                            JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00580                                            PType.NOSIZE, PType.NOSIZE);
00581                 tableGC.createPrimitiveElementMapping(pe, fkname, fd.getSqlType(), false);
00582             }
00583             ndr2.setFieldName(pe.getName());
00584             logger.log(BasicLevel.DEBUG, "GC elem is mapped over the field: " + pe.getName() + " / column:" + fkname);
00585         } else {
00586             // target Bean has a Composite PK.
00587             NameRef cpk = ndr2.createNameRef(tClass.getNameDef("").getNameRef().getCompositeName());
00588             for (Iterator i = tEntity.getCmpFieldDescIterator(); i.hasNext(); ) {
00589                 FieldJdbcDesc fd = (FieldJdbcDesc) i.next();
00590                 if (fd.isPrimaryKey()) {
00591                     String fkname;
00592                     if (sRole.isSourceMultiple()) {
00593                         // M <-> N case
00594                         fkname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00595                     } else {
00596                         // 1 <-> N case
00597                         fkname = fd.getJdbcFieldName();
00598                     }
00599                     ScalarField pe = getPrimitiveElementByColumn(gcm, fkname);
00600                     if (pe == null) {
00601                         String clafn = tAsn + "_" + fd.getName() + fieldsuffix;
00602                         pe = gcr.createHiddenField(clafn,
00603                                                    JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00604                                                    PType.NOSIZE, PType.NOSIZE);
00605                         tableGC.createPrimitiveElementMapping(pe, fkname, fd.getSqlType(), false);
00606                     }
00607                     cpk.addProjection(fd.getName(), pe.getName());
00608                     logger.log(BasicLevel.DEBUG, "GC elem is mapped over the field: " + pe.getName() + " / column:" + fkname);
00609                 }
00610             }
00611         }
00612         mip.print("JORM MI for " + sAsn + ": ", sClass, pstream);
00613         mip.print("JORM MI Mapping for " + sAsn + ": ", classmapping, pstream);
00614     }
00615 
00616     private PrimitiveElement getPrimitiveElementByColumn(RdbClassMultiMapping cm, String col) {
00617         PrimitiveElementMapping pem = cm.getRdbTable().getPrimitiveElementMappingByCol(col);
00618         if (pem == null) {
00619             logger.log(BasicLevel.DEBUG, "no " + col);
00620             return null;
00621         }
00622         logger.log(BasicLevel.DEBUG, "yes " + col);
00623         return (PrimitiveElement) pem.getLinkedMO();
00624     }
00625 
00626     private ScalarField getPrimitiveElementByColumn(RdbGenClassMapping cm, String col) {
00627         PrimitiveElementMapping pem = cm.getRdbTable().getPrimitiveElementMappingByCol(col);
00628         if (pem == null) {
00629             logger.log(BasicLevel.DEBUG, "no " + col);
00630             return null;
00631         }
00632         logger.log(BasicLevel.DEBUG, "yes " + col);
00633         return (ScalarField) pem.getLinkedMO();
00634     }
00635 }

Generated on Tue Feb 15 15:05:49 2005 for JOnAS by  doxygen 1.3.9.1