View Javadoc
1   /*
2    * $Source$
3    * $Revision$
4    *
5    * Copyright (C) 2000 William Chesters
6    *
7    * Part of Melati (http://melati.org), a framework for the rapid
8    * development of clean, maintainable web applications.
9    *
10   * Melati is free software; Permission is granted to copy, distribute
11   * and/or modify this software under the terms either:
12   *
13   * a) the GNU General Public License as published by the Free Software
14   *    Foundation; either version 2 of the License, or (at your option)
15   *    any later version,
16   *
17   *    or
18   *
19   * b) any version of the Melati Software License, as published
20   *    at http://melati.org
21   *
22   * You should have received a copy of the GNU General Public License and
23   * the Melati Software License along with this program;
24   * if not, write to the Free Software Foundation, Inc.,
25   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
26   * GNU General Public License and visit http://melati.org to obtain the
27   * Melati Software License.
28   *
29   * Feel free to contact the Developers of Melati (http://melati.org),
30   * if you would like to work out a different arrangement than the options
31   * outlined here.  It is our intention to allow Melati to be used by as
32   * wide an audience as possible.
33   *
34   * This program is distributed in the hope that it will be useful,
35   * but WITHOUT ANY WARRANTY; without even the implied warranty of
36   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37   * GNU General Public License for more details.
38   *
39   * Contact details for copyright holder:
40   *
41   *     William Chesters <williamc At paneris.org>
42   *     http://paneris.org/~williamc
43   *     Obrechtstraat 114, 2517VX Den Haag, The Netherlands
44   */
45  
46  package org.melati.poem;
47  
48  import java.util.Vector;
49  import java.util.Enumeration;
50  import org.melati.poem.generated.ColumnInfoBase;
51  
52  /**
53   * All the data defining a {@link Column}; actually a {@link Persistent} 
54   * from the {@link ColumnInfoTable}.
55   * 
56   * Melati POEM generated, programmer modifiable stub 
57   * for a <code>Persistent</code> <code>ColumnInfo</code> object.
58   * 
59   * <p> 
60   * Description: 
61   *   Configuration information about a column in the database. 
62   * </p>
63   * 
64   * <table> 
65   * <caption>
66   * Field summary for SQL table <code>ColumnInfo</code>
67   * </caption>
68   * <tr><th>Name</th><th>Type</th><th>Description</th></tr>
69   * <tr><td> id </td><td> Integer </td><td> &nbsp; </td></tr> 
70   * <tr><td> tableinfo </td><td> TableInfo </td><td> The table to which the 
71   * field belongs </td></tr> 
72   * <tr><td> name </td><td> String </td><td> A code-name for the field 
73   * </td></tr> 
74   * <tr><td> displayorder </td><td> Integer </td><td> A rank determining where 
75   * the field appears in lists </td></tr> 
76   * <tr><td> usercreateable </td><td> Boolean </td><td> Whether it makes sense 
77   * for the user to initialise the field's value </td></tr> 
78   * <tr><td> displaylevel </td><td> DisplayLevel </td><td> A category 
79   * determining what granularity of report the field appears in </td></tr> 
80   * <tr><td> searchability </td><td> Searchability </td><td> A category 
81   * determining what level of searching this field supports </td></tr> 
82   * <tr><td> displayorderpriority </td><td> Integer </td><td> If present, the 
83   * level at which lists of records are sorted by the field </td></tr> 
84   * <tr><td> sortdescending </td><td> Boolean </td><td> Whether when sorting 
85   * by this column, the sort order should be reversed </td></tr> 
86   * <tr><td> indexed </td><td> Boolean </td><td> Whether the field is indexed 
87   * (ignored if the field is marked `unique') </td></tr> 
88   * <tr><td> unique </td><td> Boolean </td><td> Whether the field is unique 
89   * (implies that it's `indexed') </td></tr> 
90   * <tr><td> integrityfix </td><td> StandardIntegrityFix </td><td> How 
91   * referential integrity is maintained, what to do when the object referred 
92   * to is deleted </td></tr> 
93   * </table> 
94   * 
95   * See org.melati.poem.prepro.TableDef#generateMainJava 
96   */
97  public class ColumnInfo extends ColumnInfoBase {
98  
99    /**
100    * Allow reading by not throwing an exception.
101    * {@inheritDoc}
102    * @see org.melati.poem.Persistent#assertCanRead(org.melati.poem.AccessToken)
103    */
104   public void assertCanRead(AccessToken token) {
105   }
106 
107   private Column<?> _column = null;
108 
109   /**
110    * @return the column
111    */
112   Column<?> column() {
113     // I have not fathomed how this circumstance arrives, but 
114     // it can.
115     if (_column == null && troid() != null)
116       _column = getDatabase().columnWithColumnInfoID(troid().intValue());
117     return _column;
118   }
119 
120   void setColumn(Column<?> column) {
121     _column = column;
122   }
123 
124  /**
125   * Set the name if it is not set.
126   * 
127   * @param name the name to set
128   */
129   public void setName(String name) {
130     String current = getName();
131     if (current != null && !current.equals(name))
132       throw new ColumnRenamePoemException(name);
133     super.setName(name);
134   }
135 
136  /**
137   * Set the TableInfo reference.
138   * 
139   * @param raw the troid value to set
140   */
141   public void setTableinfoTroid(Integer raw) throws AccessPoemException {
142     Integer ti = super.getTableinfoTroid();
143     if (ti != null && !ti.equals(raw))
144       throw new IllegalArgumentException();
145     super.setTableinfoTroid(raw);
146   }
147 
148  /**
149   * Set the DisplaylevelIndex value.
150   * 
151   * @param index the DisplaylevelIndex value to set
152   */
153   public void setDisplaylevelIndex(Integer index) {
154     super.setDisplaylevelIndex(index);
155     Column<?> column = column();
156     if (column != null) {
157       Table<?> table = column.getTable();
158       Column<?> previous = table.displayColumn();
159       if (previous != null && previous != column) {
160         if (index.equals(DisplayLevel.primary.getIndex())) {
161           previous.setDisplayLevel(DisplayLevel.summary);
162           table.setDisplayColumn(column);
163         } else { 
164           table.clearColumnInfoCaches();
165         }
166       }
167     }
168   }
169 
170   /**
171    * Only those fields which are relevant to this column 
172    * and legal as a field qualifier in the DSD.
173    * Used in org.melati.admin.DSD.wm.
174    * 
175    * @return an Enumeration of {@link Field}s 
176    */
177   public Enumeration<Field<?>> getDsdQualifiers() {
178     Vector<Field<?>> v = new Vector<Field<?>>();
179     Enumeration<Field<?>> allFields = getFields();
180     while (allFields.hasMoreElements()) {
181       Field<?> f = allFields.nextElement();
182       String n = f.getName();
183       if (!(f.getType() instanceof TroidPoemType)  // The id of this columnInfo record, not the target 
184           && !n.equals("name")  // Name is not a qualifier
185           && !n.equals("typefactory")   
186           && !n.equals("tableinfo") // The tableInfo of this columnInfo, not the target
187           && !(n.equals("size") && !(column().getType() instanceof SizedAtomPoemType))
188           && !(n.equals("integrityfix") && !(column().getType() instanceof PersistentReferencePoemType)) 
189           && !(n.equals("precision")    && !(column().getType() instanceof FixedPointAtomPoemType))
190           && !(n.equals("scale")        && !(column().getType() instanceof FixedPointAtomPoemType)))
191         v.addElement(f);
192     }
193     return v.elements();
194   }
195 }