Coverage Report - org.javagen.revgen.visitor.DbTransformerPass2
 
Classes in this File Line Coverage Branch Coverage Complexity
DbTransformerPass2
10% 
0% 
0
 
 1  
 /*
 2  
  * Copyright 2006 Outsource Cafe, Inc.
 3  
  *
 4  
  * Licensed under the Apache License, Version 2.0 (the 'License')
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  *    http://www.apache.org/licenses/LICENSE-2.0
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an 'AS IS' BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 package org.javagen.revgen.visitor;
 17  
 
 18  
 import org.javagen.agile.db.model.Cardinality;
 19  
 import org.javagen.agile.db.model.Column;
 20  
 import org.javagen.agile.db.model.FkConstraint;
 21  
 import org.javagen.agile.db.model.Table;
 22  
 import org.javagen.agile.oo.model.Class;
 23  
 import org.javagen.agile.oo.model.Reference;
 24  
 import org.javagen.revgen.context.Keys;
 25  
 
 26  
 /**
 27  
  * Traverses the database model in two steps and generates an entity model.
 28  
  * <ol>
 29  
  * <li>The first pass generates classes and properties from tables and columns.</li>
 30  
  * <li>The second pass generates references from foreign key constraints.</li>
 31  
  * </ol>
 32  
  * Having two passes allows the model to be more easily manipulated between passes 
 33  
  * before data (ie names) are duplicated.
 34  
  * 
 35  
  * @author Richard Easterling
 36  
  */
 37  1
 public class DbTransformerPass2 extends DbTransformerPass1 {
 38  
 
 39  1
     private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(DbTransformerPass2.class);
 40  
         
 41  
         // /////////////////////////////////////////////////////////////////////////
 42  
         // DatabaseModelVisitor interface methods:
 43  
         // /////////////////////////////////////////////////////////////////////////
 44  
 
 45  1
     public DbTransformerPass2() {
 46  1
         this.setItinerary(new String[] {FkConstraint.DEFAULT_MODEL_TYPE});
 47  1
     }
 48  
 
 49  
     /** 
 50  
      * Convert foreign key constraint into class reference.
 51  
      */
 52  
         public void visit(FkConstraint fkConstraint) { 
 53  0
         assert fkConstraint.getParentTable() != null;
 54  0
                 if (fkConstraint.getChildModels() != null) {
 55  0
             if ( ! Boolean.TRUE.equals(fkConstraint.getParentTable().isLinkTable()) ) {
 56  0
                 currentClass = (Class)fkConstraint.getParentTable().get(Keys.ENTITY.toString());
 57  0
                 if (currentClass != null) {
 58  0
                     contextLoader.pushAll(stack, fkConstraint);
 59  
                     try {
 60  0
                         Cardinality cardinality = fkConstraint.getCardinality();
 61  0
                         if (cardinality==null) {
 62  0
                             fkConstraint.setCardinality( getDb2OOMapper().determineCardinality(fkConstraint) );
 63  
                         }
 64  0
                         boolean toMany = getDb2OOMapper().isManyCardinality(fkConstraint);
 65  0
                         Reference reference = new Reference();
 66  0
                         String name = uniquePropertyName(currentClass, getDb2OOMapper().referenceName(fkConstraint) );
 67  0
                         reference.setName(name);
 68  0
                         Class type = getDb2OOMapper().referenceType(fkConstraint);
 69  0
                         reference.setTargetType(type);
 70  0
                         if (toMany) {
 71  0
                             String collectionType = getDb2OOMapper().containerType(fkConstraint);
 72  0
                             reference.setCollectionType(collectionType);
 73  
                         }
 74  0
                         reference.setNavigable(true);
 75  0
                         currentClass.addChildModel(reference);
 76  0
                         reference.put(Keys.FK_CONSTRAINT.toString(), fkConstraint);
 77  0
                         fkConstraint.put(Keys.REFERENCE.toString(), reference);
 78  0
                         trySettingReverseReferences(fkConstraint, reference);
 79  0
                         if (log.isDebugEnabled())
 80  0
                             log.debug("created reference: "+reference);
 81  
                     } finally {
 82  0
                         contextLoader.popAll(stack, fkConstraint);
 83  0
                     }
 84  
                 }
 85  
             }
 86  
                 }
 87  0
         }
 88  
 
 89  0
     public void visit(Table table) { throw new java.lang.IllegalStateException("visit(Table) BAD - not supposed to be here"); }
 90  
 
 91  0
     public void visit(Column column) { throw new java.lang.IllegalStateException("visit(Table) BAD - not supposed to be here"); }
 92  
 
 93  
         // /////////////////////////////////////////////////////////////////////////
 94  
         // helper methods:
 95  
         // /////////////////////////////////////////////////////////////////////////
 96  
 
 97  
    /** 
 98  
      * create links to reverse references on 2nd reference creation
 99  
      */
 100  
         private void trySettingReverseReferences(FkConstraint fkConstraint, Reference reference) {
 101  0
         boolean isLinkTable = Boolean.TRUE.equals(fkConstraint.getTargetTable().isLinkTable());
 102  0
         Reference reverse = null;
 103  0
         FkConstraint reverseFkColumn = fkConstraint.getReverseFkConstraint();
 104  0
         if (isLinkTable) {
 105  0
             for(FkConstraint linkFkColumn : fkConstraint.getTargetTable().getFkColumns()) 
 106  0
                 if (fkConstraint.getParentTable() != linkFkColumn.getTargetTable())
 107  0
                     reverseFkColumn = linkFkColumn.getReverseFkConstraint();
 108  
         }
 109  0
         reverse = (Reference)reverseFkColumn.get(Keys.REFERENCE.toString());
 110  0
         if (reverse!=null && reverse.getReverse()==null) {
 111  0
             if (isLinkTable || fkConstraint.getReverseFkConstraint().getReverseFkConstraint()==fkConstraint) {
 112  0
                 reverse.setReverse(reference);
 113  0
                 reference.setReverse(reverse);
 114  0
             } else {
 115  0
                 log.warn("Reverse reference not set for "+reference+" - foreign key may have multiple constraints.");
 116  
             }
 117  
         }
 118  0
         }
 119  
     
 120  
 }