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
00114
00115 manager = new JormManager();
00116 manager.setLogger(logger);
00117 manager.init();
00118 manager.addMappingFactory("rdb", new RdbMappingFactory());
00119
00120 try {
00121
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
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
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
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
00189
00190 NameDef nds = myejb.createNameDef();
00191 if (bean.hasSimplePkField()) {
00192
00193 nds.setFieldName(bean.getSimplePkField().getName());
00194 } else {
00195
00196
00197
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
00206 NameRef nrs = nds.createNameRef(cn);
00207
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
00236 if (role1.isTargetMultiple())
00237 createJormRoleMIMulti(role1, role2);
00238 else
00239 createJormRoleMIOne(role1, role2);
00240
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
00260 EntityJdbcCmp2Desc sEntity = (EntityJdbcCmp2Desc) sRole.getSourceBean();
00261 String sAsn = sEntity.getJormClassName();
00262 Class sClass = manager.getClass(sAsn);
00263
00264
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
00275
00276 String sCmr = sRole.getCmrFieldName();
00277
00278
00279 if (tClass == sClass && sClass.getTypedElement(sCmr) != null) {
00280 logger.log(BasicLevel.DEBUG, "Nothing to do, same CMR field.");
00281 return;
00282 }
00283
00284
00285
00286 if (tClass != sClass) {
00287 classmapping.addDependency(tClass.getFQName());
00288 }
00289
00290
00291 ClassRef cr = sClass.createClassRef(sCmr, tClass);
00292 NameDef rndf = cr.createRefNameDef();
00293
00294 if (sRole.hasJdbcMapping() || tClass == sClass) {
00295
00296
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
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
00311 pe = getPrimitiveElementByColumn(classmapping, cmrmappingname);
00312 }
00313 if (pe == null) {
00314
00315 pe = sClass.createHiddenField(clafn,
00316 JormType.getPType(fd.getFieldType(), fd.isPrimaryKey()),
00317 PType.NOSIZE, PType.NOSIZE);
00318 } else {
00319 peHasMapping = true;
00320 }
00321
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
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
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
00346 pe = getPrimitiveElementByColumn(classmapping, cmrmappingname);
00347 }
00348 if (pe == null) {
00349
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
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
00373
00374 classmapping.createReferenceMapping("multi-table", rndf);
00375 RdbExternalTable table2 = classmapping.createRdbExternalTable(tEntity.getJdbcTableName());
00376 table2.setColocated(true);
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
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
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
00439 EntityJdbcCmp2Desc sEntity = (EntityJdbcCmp2Desc) sRole.getSourceBean();
00440 String sAsn = sEntity.getJormClassName();
00441 Class sClass = manager.getClass(sAsn);
00442
00443
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
00453
00454 String sCmr = sRole.getCmrFieldName();
00455
00456
00457 if (tClass == sClass && sClass.getTypedElement(sCmr) != null) {
00458 logger.log(BasicLevel.DEBUG, "Nothing to do, same CMR field.");
00459 return;
00460 }
00461
00462
00463
00464 if (tClass != sClass) {
00465 classmapping.addDependency(tClass.getFQName());
00466 }
00467
00468
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
00477 gcm = rdbmapping.createGenClassMapping("embedded-target-references", gcr);
00478
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
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
00493
00494
00495 classmapping.createReferenceMapping("embedded-target-reference", ndsg);
00496 if (sEntity.hasSimplePkField()) {
00497
00498 FieldJdbcDesc fd = (FieldJdbcDesc) sEntity.getSimplePkField();
00499 ndsg.setFieldName(fd.getName());
00500 } else {
00501
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
00507 cpk.addProjection(fd.getName(), fd.getName());
00508 }
00509 }
00510 }
00511
00512
00513
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
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
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
00553
00554
00555 if (sClass == tClass) {
00556 fieldsuffix = (tRole.isSlave() ? "2" : "1");
00557 } else {
00558 fieldsuffix = "";
00559 }
00560
00561 NameDef ndr2 = gcr.createClassRef(tClass).createRefNameDef();
00562 gcm.createReferenceMapping("embedded-target-object", ndr2);
00563
00564 if (tEntity.hasSimplePkField()) {
00565
00566 FieldJdbcDesc fd = (FieldJdbcDesc) tEntity.getSimplePkField();
00567 String fkname;
00568 if (sRole.isSourceMultiple()) {
00569
00570 fkname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00571 } else {
00572
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
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
00594 fkname = sRole.getForeignKeyJdbcName(fd.getJdbcFieldName());
00595 } else {
00596
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 }