1 package org.apache.torque.map;
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.io.Serializable;
23 import java.util.Collections;
24 import java.util.Iterator;
25 import java.util.LinkedHashMap;
26 import java.util.Map;
27
28 import org.apache.torque.Column;
29
30 /**
31 * ColumnMap is used to model a column of a table in a database.
32 * <p>
33 * Note that this information should be set via the <Table>MapBuilder class and
34 * not changed by applications. The set methods are only public because this
35 * class needs them.
36 *
37 * @author <a href="mailto:jmcnally@collab.net">John D. McNally</a>
38 * @author <a href="mailto:greg.monroe@dukece.com">Greg Monroe</a>
39 * @version $Id: ColumnMap.java 1374908 2012-08-20 03:35:49Z tfischer $
40 */
41 public class ColumnMap implements Column, Serializable
42 {
43 /**
44 * Serial version.
45 */
46 private static final long serialVersionUID = 1L;
47
48 /** A sample object having the same java Type as the column. */
49 private Object type = null;
50
51 /** The name of the Torque Type of the column. */
52 private String torqueType = null;
53
54 /** Should object type be converted to primitive. */
55 private boolean usePrimitive = true;
56
57 /** Size of the column. */
58 private int size = 0;
59
60 /** Scale of the column */
61 private int scale = 0;
62
63 /** Is it a primary key? */
64 private boolean pk = false;
65
66 /** Is null value allowed ? */
67 private boolean notNull = false;
68
69 /** The TableMap for this column. */
70 private final TableMap table;
71
72 /** The name of the column. */
73 private final String columnName;
74
75 /**
76 * The Java Name of this column as defined in XML or created by the
77 * generator code.
78 */
79 private String javaName;
80
81 /** Is this column an autoincrement column ? */
82 private boolean autoIncrement = false;
83
84 /** Column description info (if any). */
85 private String description = "";
86
87 /** is Column protected ? */
88 private boolean isProtected = false;
89
90 /**
91 * String representing the default value defined for field. Note that
92 * default is a keyword, so defaultValue is used to store the value for the
93 * get/setDefault() methods.
94 */
95 private String defaultValue = null;
96
97 /** Inheritance type used. */
98 private String inheritance = "false";
99
100 /**
101 * Does column uses Inheritance subclasses? Note that this is tied to the
102 * TableMap useInheritance thru the set function.
103 */
104 private boolean useInheritance;
105
106 /** Associated of inheritance maps. */
107 private final Map<String, InheritanceMap> inheritanceMaps
108 = Collections.synchronizedMap(
109 new LinkedHashMap<String, InheritanceMap>());
110
111 /** Java naming method the generator used. */
112 private String javaNamingMethod;
113
114 /** Java type string specified in XML. */
115 private String javaType;
116
117 /** Column position in the table (one based). */
118 private int position = -1;
119
120 /** Associated of inheritance maps. */
121 private final Map<String, String> optionsMap = Collections
122 .synchronizedMap(new LinkedHashMap<String, String>());
123
124 /**
125 * Constructor.
126 *
127 * @param name The name of the column.
128 * @param containingTable TableMap of the table this column is in.
129 */
130 public ColumnMap(String name, TableMap containingTable)
131 {
132 table = containingTable;
133 this.columnName = normalizeName(name);
134 }
135
136 /**
137 * Makes sure that the column names don't include table prefixes. E.g.,
138 * SCARAB_PROJECT.PROJECT_ID should be PROJECT_ID.
139 *
140 * @param name The name to check
141 * @return The corrected name if needed or the same name if not.
142 */
143 protected String normalizeName(String name)
144 {
145 if (name.indexOf('.') > 0)
146 {
147 return name.substring(name.lastIndexOf('.') + 1);
148 }
149 return name;
150 }
151
152 /**
153 * Get the name of a column.
154 *
155 * @return A String with the column name.
156 */
157 public String getColumnName()
158 {
159 return columnName;
160 }
161
162 /**
163 * Get the table name + column name.
164 *
165 * @return A String with the full column name.
166 *
167 * @deprecated use getSqlExpression() instead.
168 */
169 @Deprecated
170 public String getFullyQualifiedName()
171 {
172 return table.getName() + "." + columnName;
173 }
174
175 /**
176 * Get the name of the table this column is in.
177 *
178 * @return A String with the table name.
179 */
180 public String getTableName()
181 {
182 return table.getName();
183 }
184
185 /**
186 * Get the name of the table this column is in.
187 *
188 * @return A String with the table name.
189 */
190 public String getFullTableName()
191 {
192 String schema = table.getSchemaName();
193 if (schema != null)
194 {
195 return schema + '.' + table.getName();
196 }
197 return table.getName();
198 }
199
200 /**
201 * Get the name of the schema of the table this column is in.
202 *
203 * @return A String with the schema name, or null if no schema is given.
204 */
205 public String getSchemaName()
206 {
207 return table.getSchemaName();
208 }
209
210 /**
211 * Set the type of this column.
212 *
213 * @param type An Object specifying the type.
214 */
215 public void setType(Object type)
216 {
217 this.type = type;
218 }
219
220 /**
221 * Set the Torque type of this column.
222 *
223 * @param torqueType the Torque type of the column.
224 */
225 public void setTorqueType(String torqueType)
226 {
227 this.torqueType = torqueType;
228 }
229
230 /**
231 * Set the size of this column.
232 *
233 * @param size An int specifying the size.
234 */
235 public void setSize(int size)
236 {
237 this.size = size;
238 }
239
240 /**
241 * Set if this column is a primary key or not.
242 *
243 * @param pk True if column is a primary key.
244 */
245 public void setPrimaryKey(boolean pk)
246 {
247 this.pk = pk;
248 }
249
250 /**
251 * Set if this column may be null.
252 *
253 * @param nn True if column may be null.
254 */
255 public void setNotNull(boolean nn)
256 {
257 this.notNull = nn;
258 }
259
260
261 /**
262 * Get the type of this column. Note that if usePrimitive is true, this may
263 * need to be converted.
264 *
265 * @return An Object specifying the type.
266 */
267 public Object getType()
268 {
269 return type;
270 }
271
272 /**
273 * Get the name of the Torque type of this column.
274 *
275 * @return The name of the Torque type of this column.
276 */
277 public String getTorqueType()
278 {
279 return torqueType;
280 }
281
282 /**
283 * The "precision" value from the XML
284 * size="<precision>[,<scale>]"
285 * attribute. Where [,<scale>] is optional.
286 *
287 * If the size attribute has not been set in the XML, it will return 0.
288 * <p>
289 *
290 * Note that the size="P,S" format should be replaced with size="P"
291 * scale="S".
292 *
293 * @return An int specifying the size.
294 */
295 public int getSize()
296 {
297 return size;
298 }
299
300 /**
301 * Is this column a primary key?
302 *
303 * @return True if column is a primary key.
304 */
305 public boolean isPrimaryKey()
306 {
307 return pk;
308 }
309
310 /**
311 * Is null value allowed ?
312 *
313 * @return True if column may be null.
314 */
315 public boolean isNotNull()
316 {
317 return (notNull || isPrimaryKey());
318 }
319
320 /**
321 * Gets the scale set for this column (if any) as set in the XML database
322 * definition. E.g., the value of the scale attribute or the scale portion
323 * of a size="P,S" attribute. (Note: size="P,S" format is being
324 * deprecated!).
325 *
326 * @return Returns the scale.
327 */
328 public int getScale()
329 {
330 return scale;
331 }
332
333 /**
334 * @param scale The scale to set.
335 */
336 public void setScale(int scale)
337 {
338 this.scale = scale;
339 }
340
341 /**
342 * Gets the Java Name for this column as defined in XML or created by
343 * generator code.
344 *
345 * @return the Java Name.
346 */
347 public String getJavaName()
348 {
349 return this.javaName;
350 }
351
352 /**
353 * Sets the Java Name for this column.
354 *
355 * @param name the Java Name.
356 */
357 public void setJavaName(String name)
358 {
359 this.javaName = name;
360 }
361
362 /**
363 * Returns whether this column is an autoincrement column.
364 *
365 * @return true if this column is an autoIncrement column, false otherwise.
366 */
367 public boolean isAutoIncrement()
368 {
369 return autoIncrement;
370 }
371
372 /**
373 * Sets whether this column is an autoincrement column.
374 *
375 * @param autoIncrement whether this colimn is an autoincrement column.
376 */
377 public void setAutoIncrement(boolean autoIncrement)
378 {
379 this.autoIncrement = autoIncrement;
380 }
381
382 /**
383 * A string representing the default value defined for this column.
384 *
385 * @return The default value of this column, if any.
386 */
387 public String getDefault()
388 {
389 return defaultValue;
390 }
391
392 /**
393 * Sets the default value for this column.
394 *
395 * @param defaultValue The defaultValue to set.
396 */
397 public void setDefault(String defaultValue)
398 {
399 this.defaultValue = defaultValue;
400 }
401
402 /**
403 * Returns the column description info.
404 *
405 * @return the description, if any.
406 */
407 public String getDescription()
408 {
409 return description;
410 }
411
412 /**
413 * Sets the description for this column.
414 *
415 * @param description The description to set.
416 */
417 public void setDescription(String description)
418 {
419 this.description = description;
420 }
421
422 /**
423 * Get the inheritance information associated with this column,
424 *
425 * @return Returns an array of associated inheritanceMap.
426 * The array is in XML order.
427 */
428 public InheritanceMap[] getInheritanceMaps()
429 {
430 InheritanceMap[] iMaps = new InheritanceMap[inheritanceMaps.size()];
431 synchronized (inheritanceMaps)
432 {
433 Iterator<InheritanceMap> it = inheritanceMaps.values().iterator();
434 int i = 0;
435 while (it.hasNext())
436 {
437 iMaps[i++] = it.next();
438 }
439 }
440 return iMaps;
441 }
442
443 /**
444 * Add an associated inheritance mapping.
445 *
446 * @param map The inheritanceMap to associate with this column.
447 */
448 public void addInheritanceMap(InheritanceMap map)
449 {
450 setUseInheritance(true);
451 this.inheritanceMaps.put(map.getKey(), map);
452 }
453
454 /**
455 * Gets the inheritance type used.
456 *
457 * @return the inheritance type used.
458 */
459 public String getInheritance()
460 {
461 return inheritance;
462 }
463
464 /**
465 * Sets the inheritance type.
466 *
467 * @param inheritanceType The inheritance type to set.
468 */
469 public void setInheritance(String inheritanceType)
470 {
471 this.inheritance = inheritanceType;
472 }
473
474 /**
475 * Returns whether getters and setters are generated with the
476 * access modifier "protected" rather than "public".
477 *
478 * @return whether the accessors should be protected rather than public.
479 */
480 public boolean isProtected()
481 {
482 return isProtected;
483 }
484
485 /**
486 * Sets whether getters and setters should be generated with the
487 * access modifier "protected" rather than "public".
488 *
489 * @param isProtected whether getters and setters for this column
490 * are protected.
491 */
492 public void setProtected(boolean isProtected)
493 {
494 this.isProtected = isProtected;
495 }
496
497 /**
498 * Returns whether this column is a primary key.
499 *
500 * @return whether this column is a primary key.
501 */
502 public boolean isPk()
503 {
504 return pk;
505 }
506
507 /**
508 * Sets whether this column is a primary key.
509 *
510 * @param pk whether this column is a primary key.
511 */
512 public void setPk(boolean pk)
513 {
514 this.pk = pk;
515 }
516
517 /**
518 * Returns whether this column uses inheritance subclasses.
519 *
520 * @return true if inheritance subclasses are used, false otherwise.
521 */
522 public boolean isUseInheritance()
523 {
524 return useInheritance;
525 }
526
527 /**
528 * Sets whether this column uses inheritance subclasses.
529 *
530 * @param useInheritance whether this column uses Inheritance subclasses.
531 */
532 public void setUseInheritance(boolean useInheritance)
533 {
534 this.useInheritance = useInheritance;
535 }
536
537 /**
538 * Get the inheritance map with the specified key.
539 *
540 * @param key the key of the inheritance map.
541 * @return the inheritance map with the specified key, or null if no
542 * inheritance map with the specified key exists in this column.
543 */
544 public InheritanceMap getInheritanceMap(String key)
545 {
546 return inheritanceMaps.get(key);
547 }
548
549 /**
550 * Returns whether this colum uses primitive values rather than objects.
551 *
552 * @return true if this colum uses primitive values, false if it uses
553 * objects.
554 */
555 public boolean isUsePrimitive()
556 {
557 return usePrimitive;
558 }
559
560 /**
561 * Sets whether this colum uses primitive values rather than objects.
562 *
563 * @param usePrimitive whether primitive objects are used
564 * rather than objects.
565 */
566 public void setUsePrimitive(boolean usePrimitive)
567 {
568 this.usePrimitive = usePrimitive;
569 }
570
571 /**
572 * Returns the Java naming method for this column.
573 *
574 * @return the javaNamingMethod for this column.
575 */
576 public String getJavaNamingMethod()
577 {
578 return javaNamingMethod;
579 }
580
581 /**
582 * Sets the java naming method for this column.
583 *
584 * @param javaNamingMethod The javaNamingMethod to set.
585 */
586 public void setJavaNamingMethod(String javaNamingMethod)
587 {
588 this.javaNamingMethod = javaNamingMethod;
589 }
590
591 /**
592 * Returns the map for the table this column belongs to.
593 *
594 * @return the table map for this column.
595 */
596 public TableMap getTable()
597 {
598 return table;
599 }
600
601 /**
602 * Returns the position (one based) of this column in the table.
603 * XML order is preserved.
604 *
605 * @return The position of this column, one-based.
606 */
607 public int getPosition()
608 {
609 return position;
610 }
611
612 /**
613 * Sets the position (one based) of this column in the table.
614 *
615 * @param position The position to set.
616 */
617 public void setPosition(int position)
618 {
619 this.position = position;
620 }
621
622 /**
623 * Returns the java type of this column.
624 *
625 * @return the javaType.
626 */
627 public String getJavaType()
628 {
629 return javaType;
630 }
631
632 /**
633 * Sets the java type of this column.
634 *
635 * @param javaType The javaType to set.
636 */
637 public void setJavaType(String javaType)
638 {
639 this.javaType = javaType;
640 }
641
642 /**
643 * Returns an unmodifiable map of all options.
644 *
645 * @return A map containing all options, not null.
646 */
647 public Map<String, String> getOptions()
648 {
649 return Collections.unmodifiableMap(optionsMap);
650 }
651
652 /**
653 * Sets an option.
654 *
655 * @param key the key of the option
656 * @param value the value of the option.
657 */
658 public void setOption(String key, String value)
659 {
660 optionsMap.put(key, value);
661 }
662
663 /**
664 * Returns the value of an option.
665 *
666 * @param key the key of the option.
667 *
668 * @return the value of the option, or null if not set.
669 */
670 public String getOption(String key)
671 {
672 return optionsMap.get(key);
673 }
674
675 /**
676 * Returns the SQL expression for the fully qualified column name.
677 * This is tableName.columnName if the database for this column has no
678 * schema and defaultSchema is null,
679 * or schemaName.tableName.columnName with a schema
680 * (the database schema overrides the default schema if both are given).
681 *
682 * @return the SQL expression for the column, not null.
683 */
684 public String getSqlExpression()
685 {
686 return table.getName() + '.' + columnName;
687 }
688
689 @Override
690 public String toString()
691 {
692 return getSqlExpression();
693 }
694 }