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.model;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  
21  import javax.xml.bind.annotation.XmlAnyElement;
22  import javax.xml.bind.annotation.XmlAttribute;
23  import javax.xml.bind.annotation.XmlRootElement;
24  import javax.xml.bind.annotation.XmlTransient;
25  
26  import org.javagen.agile.core.annotation.DefaultValue;
27  import org.javagen.agile.core.model.AbstractModel;
28  import org.javagen.agile.core.model.Model;
29  
30  @XmlRootElement
31  public class Table extends AbstractModel {
32  	
33      public static final String DEFAULT_MODEL_TYPE = "TABLE";
34  
35      transient protected List<PkColumn> primaryKeys;
36      protected List<FkConstraint> fkConstraints;
37      //protected List<UniqueConstraint> uniqueConstraints;
38  	protected Boolean linkTable;
39      //private static List<FkColumn> EMPTY_FK_COLUMNS = new ArrayList<FkColumn>();
40  
41  	public Table() {
42          super();
43          this.setModelType(DEFAULT_MODEL_TYPE);
44  	}
45  	
46      public Table(Database parentDatabase) {
47          this();
48          this.setParentDatabase(parentDatabase);
49      }
50      
51      public Table(String name) {
52          this();
53          this.setName(name);
54      }
55      
56  //	public Model getParentModel() { return this.getParentDatabase(); }
57  //	
58  //	public void setParentModel(Model parentDatabase) {
59  //		this.setParentDatabase( (Database)parentDatabase );
60  //	}
61  //
62      @XmlTransient
63  	public Database getParentDatabase() {
64  		return (Database)getParentModel();
65  	}
66  
67  	public void setParentDatabase(Database parentDatabase) {
68  		this.setParentModel(parentDatabase);
69  	}
70  
71      @Override
72      public void copyTo(Model targetModel) {
73          Table target = (Table)targetModel;
74          super.copyTo(target);
75          if (this.isLinkTable()!=null)
76              target.setLinkTable(this.isLinkTable());
77      }
78  
79      public List<Model> allOwnedModels() {
80          int size = getChildModels().size() + this.getFkColumns().size();
81          List<Model> all = new ArrayList<Model>(size);
82          all.addAll(getChildModels());
83          all.addAll(getFkColumns());
84          return all;
85      }
86      
87  	////////////////////////////////////////////////////////////////////////////
88  	// Column handling:
89  	////////////////////////////////////////////////////////////////////////////
90  
91  	public Column createColumn() {
92  		return new Column(this);
93  	}
94  	
95  	public Column addColumn(String name, DbType dbType, Object defaultValue, Boolean notNull, Boolean unique, Integer columnSize, Integer scale) {
96  		Column column = createColumn();
97  		column.setName(name);
98  		column.setDbType(dbType);
99  		column.setDefaultValue(defaultValue);
100 		column.setNotNull(notNull);
101 		column.setColumnSize(columnSize);
102 		column.setScale(scale);
103 		column.setUnique(unique);
104 		this.addColumn(column);
105 		return column;
106 	}
107 	
108 	public PkColumn createPkColumn() {
109 		return new PkColumn(this);
110 	}
111 	
112 	public PkColumn addPkColumn(String name, DbType dbType, Object defaultValue, Boolean autoIncrement, Integer columnSize, Integer scale) {
113 		PkColumn column = createPkColumn();
114 		column.setName(name);
115 		column.setDbType(dbType);
116 		column.setDefaultValue(defaultValue);
117 		column.setNotNull(Boolean.TRUE);
118 		column.setColumnSize(columnSize);
119 		column.setScale(scale);
120 		column.setUnique(Boolean.TRUE);
121 		column.setAutoIncrement(autoIncrement);
122 		this.addColumn(column);
123 		return column;
124 	}
125 	
126 	public Column lookupColumn(String name) {
127 		if (this.getColumns()==null)
128 			return null;
129 		for(Column column : this.getColumns()) {
130 			if (column.getName().equalsIgnoreCase(name))
131 				return column;
132 		}
133 		return null;
134 	}
135 	
136     @XmlTransient
137 	public List<Column> getColumns() {
138         List<Column> list = new ArrayList<Column>(getChildModels().size());
139         for(Model child : getChildModels())
140             list.add((Column)child);
141         return list;
142 	}
143 
144 //	public void setColumns(List<Column> columns) {
145 //		this.setChildModels(columns);
146 //	}
147 //
148 	public void addColumn(Column column) {
149         addChildModel(column);
150 	}
151 
152 	////////////////////////////////////////////////////////////////////////////
153 	// FkColumn handling:
154 	////////////////////////////////////////////////////////////////////////////
155 
156 	public FkConstraint createFkColumn() {
157 		return new FkConstraint(this);
158 	}
159 	
160     public void addFkColumn(FkConstraint fkConstraint) {
161         if (fkConstraints==null) {
162             fkConstraints = new ArrayList<FkConstraint>();
163         }
164         fkConstraints.add(fkConstraint);
165         fkConstraint.setParentTable(this);
166     }
167 
168 	public FkConstraint lookupFkColumn(String name) {
169 		if (this.getFkColumns()==null)
170 			return null;
171 		for(FkConstraint fkConstraint : this.getFkColumns()) {
172 			if (fkConstraint.getName().equalsIgnoreCase(name))
173 				return fkConstraint;
174 		}
175 		return null;
176 	}
177 	
178     @XmlAnyElement
179 	public List<FkConstraint> getFkColumns() {
180 		if (fkConstraints==null)
181             fkConstraints = new ArrayList<FkConstraint>();
182         return fkConstraints;
183 	}
184 
185 	public void setFkColumns(List<FkConstraint> fkConstraints) {
186 		this.fkConstraints = fkConstraints;
187         if (this.fkConstraints!=null) {
188             for(FkConstraint child : this.fkConstraints)
189                 child.setParentModel(this);
190         }
191 	}
192 
193     /***
194      * Default value if not set is false.
195      */
196     @XmlAttribute
197     @DefaultValue("false")
198 	public Boolean isLinkTable() {
199 		return linkTable;
200 	}
201 
202 	public void setLinkTable(Boolean linkTable) {
203 		this.linkTable = linkTable;
204 	}
205 
206 	public boolean hasCompositeKey() {
207 		List<PkColumn> pks = getPrimaryKeys();
208 		return (pks!=null && pks.size()>1);
209 	}
210 	
211     @XmlTransient
212 	public List<PkColumn> getPrimaryKeys() {
213 		if (primaryKeys==null && getColumns()!=null) {
214 			primaryKeys = new ArrayList<PkColumn>();
215 			for(Column column : this.getColumns()) {
216 				if (column instanceof PkColumn)
217 					primaryKeys.add( (PkColumn)column );
218 			}
219 		}
220 		return primaryKeys;
221 	}
222 
223     @Override
224     public int hashCode() {
225         final int PRIME = 31;
226         int result = 1;
227         result = PRIME * result + ((fkConstraints == null) ? 0 : fkConstraints.hashCode());
228         result = PRIME * result + ((linkTable == null) ? 0 : linkTable.hashCode());
229         result = PRIME * result + ((primaryKeys == null) ? 0 : primaryKeys.hashCode());
230         return result;
231     }
232 
233     @Override
234     public boolean equals(Object obj) {
235         if (this == obj)
236             return true;
237         if (!super.equals(obj))
238             return false;
239         if (getClass() != obj.getClass())
240             return false;
241         final Table other = (Table) obj;
242         if (fkConstraints == null) {
243             if (other.fkConstraints != null)
244                 return false;
245         } else if (!fkConstraints.equals(other.fkConstraints))
246             return false;
247         if (linkTable == null) {
248             if (other.linkTable != null)
249                 return false;
250         } else if (!linkTable.equals(other.linkTable))
251             return false;
252         if (primaryKeys == null) {
253             if (other.primaryKeys != null)
254                 return false;
255         } else if (!primaryKeys.equals(other.primaryKeys))
256             return false;
257         return true;
258     }
259 
260     
261 //    Oct 06 - problems with XML serialization
262 //   
263 //    @XmlTransient
264 //    public List<UniqueConstraint> getUniqueConstraints() {
265 //        return uniqueConstraints;
266 //    }
267 //
268 //    public void setUniqueConstraints(List<UniqueConstraint> uniqueConstraints) {
269 //        this.uniqueConstraints = uniqueConstraints;
270 //    }
271 //
272 //    public void addUniqueConstraint(UniqueConstraint uniqueConstraint) {
273 //        if (uniqueConstraints==null)
274 //            uniqueConstraints = new ArrayList<UniqueConstraint>();
275 //        uniqueConstraints.add(uniqueConstraint);
276 //    }
277 //
278 //    public UniqueConstraint lookupUniqueConstraint(String constraintName) {
279 //        if (uniqueConstraints!=null)
280 //            for(UniqueConstraint uniqueConstraint : uniqueConstraints)
281 //                if (uniqueConstraint.getName().equalsIgnoreCase(constraintName))
282 //                    return uniqueConstraint;
283 //        return null;
284 //    }
285 
286 }