View Javadoc

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.agile.db.util;
17  
18  import org.javagen.agile.core.model.Model;
19  import org.javagen.agile.db.model.Cardinality;
20  import org.javagen.agile.db.model.Column;
21  import org.javagen.agile.db.model.ColumnReference;
22  import org.javagen.agile.db.model.FkConstraint;
23  import org.javagen.agile.db.model.FkEnum;
24  import org.javagen.agile.db.model.PkColumn;
25  import org.javagen.agile.db.model.Table;
26  
27  /***
28   * Create table attributes - mostly for ease of unit testing.
29   * <p>
30   * This should ideally go in the test directory, but its left here for reuse by other modules.
31   *
32   * @author Richard Easterling
33   */
34  public class DbUtil {
35  	
36  	public static FkConstraint createReverse(FkConstraint fkConstraint, boolean wireItUp) {
37  		if (fkConstraint.getReverseFkConstraint()==null) {
38              FkEnum revFkType = FkEnum.IMPORTED.equals(fkConstraint.getFkType()) ? FkEnum.EXPORTED : FkEnum.IMPORTED;
39              boolean selfReferential = (fkConstraint.getParentTable() == fkConstraint.getTargetTable());
40              //special handling needed to avoid name collision with self-referential relationships
41              String revFkName = selfReferential ? fkConstraint.getName()+"_"+revFkType.toString() : fkConstraint.getName();
42  //            if (selfReferential) 
43  //                System.out.println("self referential relationship found: "+revFkName);
44  			FkConstraint revFkColumn = fkConstraint.getTargetTable().lookupFkColumn(revFkName);
45              if (revFkColumn==null) {
46                  revFkColumn = fkConstraint.getTargetTable().createFkColumn();
47              }
48  			revFkColumn.setFkType(revFkType);
49  			revFkColumn.setTargetTable(fkConstraint.getParentTable());
50  			revFkColumn.setName(revFkName);
51  			if (fkConstraint.getCardinality()!=null)
52  				revFkColumn.setCardinality(fkConstraint.getCardinality().getReverse());
53              for(Model child : fkConstraint.getChildModels()) {
54                  ColumnReference ref = (ColumnReference)child;
55  				ColumnReference revRef = revFkColumn.createColumnReference();
56  				revRef.setForeignColumn(ref.getLocalColumn());
57  				revRef.setLocalColumn(ref.getForeignColumn());
58  				if (ref.getSequenceNumber()!=null)
59  					revRef.setSequenceNumber(ref.getSequenceNumber());
60  				revFkColumn.addColumnReference(revRef);
61  			}
62  			revFkColumn.setReverseFkColumn(fkConstraint);
63  			if (wireItUp) {
64  				fkConstraint.setReverseFkColumn(revFkColumn);
65  				fkConstraint.getTargetTable().addFkColumn(revFkColumn);
66  			}
67  			return revFkColumn;
68  		} else {
69  			return fkConstraint.getReverseFkConstraint();
70  		}
71  	}
72  
73      /*** 
74       * This is a convienence method for creating test data. It creates both the local column (pk or fk) 
75       * and the FK constraints (both imported and exported) 
76       */
77      public static FkConstraint addFkColumn(Table localTable, String fkName, boolean isFkPk, PkColumn pkColumn, Boolean notNull, Cardinality cardinality) {
78          Column local = isFkPk ? localTable.createPkColumn() : localTable.createColumn();
79          local.setName(fkName);
80          local.setDbType(pkColumn.getDbType());
81          local.setDefaultValue(null); //doesn't make sense in this context
82          local.setNotNull(notNull);
83          local.setColumnSize(pkColumn.getColumnSize());
84          local.setScale(pkColumn.getScale());
85          //column.setUnique(pkColumn.get);
86          localTable.addColumn(local);
87          FkConstraint fkConstraint = localTable.createFkColumn();
88          fkConstraint.setName(localTable.getName()+"_"+pkColumn.getParentTable().getName()+"_RELATION");
89          fkConstraint.setFkType(FkEnum.IMPORTED);
90          fkConstraint.setTargetTable(pkColumn.getParentTable());
91          fkConstraint.setCardinality(cardinality);
92          localTable.addFkColumn(fkConstraint);
93          ColumnReference colRef = fkConstraint.addColumnReference(local, pkColumn);
94          local.put(ColumnReference.DEFAULT_MODEL_TYPE, colRef); //this identifies column as a FK
95          DbUtil.createReverse(fkConstraint, true);
96          return fkConstraint;
97      }
98  
99  
100 }