1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
38 protected Boolean linkTable;
39
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
57
58
59
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
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
145
146
147
148 public void addColumn(Column column) {
149 addChildModel(column);
150 }
151
152
153
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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286 }