Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
ForeignKey |
|
| 1.1851851851851851;1.185 |
1 | package org.apache.torque.engine.database.model; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import java.util.ArrayList; | |
23 | import java.util.Collections; | |
24 | import java.util.Hashtable; | |
25 | import java.util.List; | |
26 | import java.util.Map; | |
27 | ||
28 | import org.apache.commons.collections.map.ListOrderedMap; | |
29 | import org.xml.sax.Attributes; | |
30 | ||
31 | /** | |
32 | * A class for information about foreign keys of a table. | |
33 | * | |
34 | * @author <a href="mailto:fedor.karpelevitch@home.com">Fedor</a> | |
35 | * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a> | |
36 | * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a> | |
37 | * @version $Id: ForeignKey.java,v 1.1 2007-10-21 07:57:27 abyrne Exp $ | |
38 | */ | |
39 | 0 | public class ForeignKey |
40 | { | |
41 | private String foreignTableName; | |
42 | private String name; | |
43 | private String onUpdate; | |
44 | private String onDelete; | |
45 | private Table parentTable; | |
46 | 0 | private List localColumns = new ArrayList(3); |
47 | 0 | private List foreignColumns = new ArrayList(3); |
48 | 0 | private Map options = Collections.synchronizedMap(new ListOrderedMap()); |
49 | ||
50 | ||
51 | // the uppercase equivalent of the onDelete/onUpdate values in the dtd | |
52 | private static final String NONE = "NONE"; | |
53 | private static final String SETNULL = "SETNULL"; | |
54 | ||
55 | /** | |
56 | * Imports foreign key from an XML specification | |
57 | * | |
58 | * @param attrib the xml attributes | |
59 | */ | |
60 | public void loadFromXML(Attributes attrib) | |
61 | { | |
62 | 0 | foreignTableName = attrib.getValue("foreignTable"); |
63 | 0 | name = attrib.getValue("name"); |
64 | 0 | onUpdate = attrib.getValue("onUpdate"); |
65 | 0 | onDelete = attrib.getValue("onDelete"); |
66 | 0 | onUpdate = normalizeFKey(onUpdate); |
67 | 0 | onDelete = normalizeFKey(onDelete); |
68 | 0 | } |
69 | ||
70 | /** | |
71 | * Normalizes the input of onDelete, onUpdate attributes | |
72 | * | |
73 | * @param attrib the attribute to normalize | |
74 | * @return nomalized form | |
75 | */ | |
76 | private String normalizeFKey(String attrib) | |
77 | { | |
78 | 0 | if (attrib == null) |
79 | { | |
80 | 0 | attrib = NONE; |
81 | } | |
82 | ||
83 | 0 | attrib = attrib.toUpperCase(); |
84 | 0 | if (attrib.equals(SETNULL)) |
85 | { | |
86 | 0 | attrib = "SET NULL"; |
87 | } | |
88 | 0 | return attrib; |
89 | } | |
90 | ||
91 | /** | |
92 | * Returns whether or not the onUpdate attribute is set | |
93 | * | |
94 | * @return true if the onUpdate attribute is set | |
95 | */ | |
96 | public boolean hasOnUpdate() | |
97 | { | |
98 | 0 | return !onUpdate.equals(NONE); |
99 | } | |
100 | ||
101 | /** | |
102 | * Returns whether or not the onDelete attribute is set | |
103 | * | |
104 | * @return true if the onDelete attribute is set | |
105 | */ | |
106 | public boolean hasOnDelete() | |
107 | { | |
108 | 0 | return !onDelete.equals(NONE); |
109 | } | |
110 | ||
111 | /** | |
112 | * Returns the onUpdate attribute | |
113 | * | |
114 | * @return the onUpdate attribute | |
115 | */ | |
116 | public String getOnUpdate() | |
117 | { | |
118 | 0 | return onUpdate; |
119 | } | |
120 | ||
121 | /** | |
122 | * Returns the onDelete attribute | |
123 | * | |
124 | * @return the onDelete attribute | |
125 | */ | |
126 | public String getOnDelete() | |
127 | { | |
128 | 0 | return onDelete; |
129 | } | |
130 | ||
131 | /** | |
132 | * Sets the onDelete attribute | |
133 | * | |
134 | * @param value the onDelete attribute | |
135 | */ | |
136 | public void setOnDelete(String value) | |
137 | { | |
138 | 0 | onDelete = normalizeFKey(value); |
139 | 0 | } |
140 | ||
141 | /** | |
142 | * Sets the onUpdate attribute | |
143 | * | |
144 | * @param value the onUpdate attribute | |
145 | */ | |
146 | public void setOnUpdate(String value) | |
147 | { | |
148 | 0 | onUpdate = normalizeFKey(value); |
149 | 0 | } |
150 | ||
151 | /** | |
152 | * Returns the name attribute. | |
153 | * | |
154 | * @return the name | |
155 | */ | |
156 | public String getName() | |
157 | { | |
158 | 0 | return name; |
159 | } | |
160 | ||
161 | /** | |
162 | * Sets the name attribute. | |
163 | * | |
164 | * @param name the name | |
165 | */ | |
166 | public void setName(String name) | |
167 | { | |
168 | 0 | this.name = name; |
169 | 0 | } |
170 | ||
171 | /** | |
172 | * Get the foreignTableName of the FK | |
173 | * | |
174 | * @return the name of the foreign table | |
175 | */ | |
176 | public String getForeignTableName() | |
177 | { | |
178 | 0 | return foreignTableName; |
179 | } | |
180 | ||
181 | /** | |
182 | * Set the foreignTableName of the FK | |
183 | * | |
184 | * @param tableName the name of the foreign table | |
185 | */ | |
186 | public void setForeignTableName(String tableName) | |
187 | { | |
188 | 0 | foreignTableName = tableName; |
189 | 0 | } |
190 | ||
191 | /** | |
192 | * Set the parent Table of the foreign key | |
193 | * | |
194 | * @param parent the table | |
195 | */ | |
196 | public void setTable(Table parent) | |
197 | { | |
198 | 0 | parentTable = parent; |
199 | 0 | } |
200 | ||
201 | /** | |
202 | * Get the parent Table of the foreign key | |
203 | * | |
204 | * @return the parent table | |
205 | */ | |
206 | public Table getTable() | |
207 | { | |
208 | 0 | return parentTable; |
209 | } | |
210 | ||
211 | /** | |
212 | * Returns the name of the table the foreign key is in | |
213 | * | |
214 | * @return the name of the table | |
215 | */ | |
216 | public String getTableName() | |
217 | { | |
218 | 0 | return parentTable.getName(); |
219 | } | |
220 | ||
221 | /** | |
222 | * Adds a new reference entry to the foreign key | |
223 | * | |
224 | * @param attrib the xml attributes | |
225 | */ | |
226 | public void addReference(Attributes attrib) | |
227 | { | |
228 | 0 | addReference(attrib.getValue("local"), attrib.getValue("foreign")); |
229 | 0 | } |
230 | ||
231 | /** | |
232 | * Adds a new reference entry to the foreign key | |
233 | * | |
234 | * @param local name of the local column | |
235 | * @param foreign name of the foreign column | |
236 | */ | |
237 | public void addReference(String local, String foreign) | |
238 | { | |
239 | 0 | localColumns.add(local); |
240 | 0 | foreignColumns.add(foreign); |
241 | 0 | } |
242 | ||
243 | /** | |
244 | * Returns a comma delimited string of local column names | |
245 | * | |
246 | * @return the local column names | |
247 | */ | |
248 | public String getLocalColumnNames() | |
249 | { | |
250 | 0 | return Column.makeList(getLocalColumns()); |
251 | } | |
252 | ||
253 | /** | |
254 | * Returns a comma delimited string of foreign column names | |
255 | * | |
256 | * @return the foreign column names | |
257 | */ | |
258 | public String getForeignColumnNames() | |
259 | { | |
260 | 0 | return Column.makeList(getForeignColumns()); |
261 | } | |
262 | ||
263 | /** | |
264 | * Returns the list of local column names. You should not edit this List. | |
265 | * | |
266 | * @return the local columns | |
267 | */ | |
268 | public List getLocalColumns() | |
269 | { | |
270 | 0 | return localColumns; |
271 | } | |
272 | ||
273 | /** | |
274 | * Utility method to get local column names to foreign column names | |
275 | * mapping for this foreign key. | |
276 | * | |
277 | * @return table mapping foreign names to local names | |
278 | */ | |
279 | public Hashtable getLocalForeignMapping() | |
280 | { | |
281 | 0 | Hashtable h = new Hashtable(); |
282 | ||
283 | 0 | for (int i = 0; i < localColumns.size(); i++) |
284 | { | |
285 | 0 | h.put(localColumns.get(i), foreignColumns.get(i)); |
286 | } | |
287 | ||
288 | 0 | return h; |
289 | } | |
290 | ||
291 | /** | |
292 | * Returns the list of foreign column names. You should not edit this List. | |
293 | * | |
294 | * @return the foreign columns | |
295 | */ | |
296 | public List getForeignColumns() | |
297 | { | |
298 | 0 | return foreignColumns; |
299 | } | |
300 | ||
301 | /** | |
302 | * Utility method to get foreign column names to local column names | |
303 | * mapping for this foreign key. | |
304 | * | |
305 | * @return table mapping local names to foreign names | |
306 | */ | |
307 | public Hashtable getForeignLocalMapping() | |
308 | { | |
309 | 0 | Hashtable h = new Hashtable(); |
310 | ||
311 | 0 | for (int i = 0; i < localColumns.size(); i++) |
312 | { | |
313 | 0 | h.put(foreignColumns.get(i), localColumns.get(i)); |
314 | } | |
315 | ||
316 | 0 | return h; |
317 | } | |
318 | ||
319 | /** | |
320 | * String representation of the foreign key. This is an xml representation. | |
321 | * | |
322 | * @return string representation in xml | |
323 | */ | |
324 | public String toString() | |
325 | { | |
326 | 0 | StringBuffer result = new StringBuffer(); |
327 | 0 | result.append(" <foreign-key foreignTable=\"") |
328 | .append(getForeignTableName()) | |
329 | .append("\" name=\"") | |
330 | .append(getName()) | |
331 | .append("\">\n"); | |
332 | ||
333 | 0 | for (int i = 0; i < localColumns.size(); i++) |
334 | { | |
335 | 0 | result.append(" <reference local=\"") |
336 | .append(localColumns.get(i)) | |
337 | .append("\" foreign=\"") | |
338 | .append(foreignColumns.get(i)) | |
339 | .append("\"/>\n"); | |
340 | } | |
341 | 0 | result.append(" </foreign-key>\n"); |
342 | 0 | return result.toString(); |
343 | } | |
344 | ||
345 | /** | |
346 | * Add an XML Specified option key/value pair to this element's option set. | |
347 | * | |
348 | * @param key the key of the option. | |
349 | * @param value the value of the option. | |
350 | */ | |
351 | public void addOption(String key, String value) | |
352 | { | |
353 | 0 | options.put(key, value); |
354 | 0 | } |
355 | ||
356 | /** | |
357 | * Get the value that was associated with this key in an XML option | |
358 | * element. | |
359 | * | |
360 | * @param key the key of the option. | |
361 | * @return The value for the key or a null. | |
362 | */ | |
363 | public String getOption(String key) | |
364 | { | |
365 | 0 | return (String) options.get(key); |
366 | } | |
367 | ||
368 | /** | |
369 | * Gets the full ordered hashtable array of items specified by XML option | |
370 | * statements under this element.<p> | |
371 | * | |
372 | * Note, this is not thread save but since it's only used for | |
373 | * generation which is single threaded, there should be minimum | |
374 | * danger using this in Velocity. | |
375 | * | |
376 | * @return An Map of all options. Will not be null but may be empty. | |
377 | */ | |
378 | public Map getOptions() | |
379 | { | |
380 | 0 | return options; |
381 | } | |
382 | } |