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.Enumeration;
49  import org.melati.poem.util.StringUtils;
50  
51  /**
52   * A data type that is a reference to a {@link Persistent} object.
53   */
54  public class ReferencePoemType extends IndexPoemType implements PersistentReferencePoemType {
55  
56    private Table<?> targetTable;
57  
58    /**
59     * Constructor.
60     * 
61     * @param targetTable the Table the type refers to 
62     * @param nullable whether this type may contain null values
63     */
64    public ReferencePoemType(Table<?> targetTable, boolean nullable) {
65      super(nullable);
66      if (targetTable == null)
67        throw new NullPointerException();
68      this.targetTable = targetTable;
69    }
70  
71    /**
72     * @see org.melati.poem.PersistentReferencePoemType#targetTable()
73     */
74    @Override
75    public Table<?> targetTable() {
76      return targetTable;
77    }
78  
79    /**
80     * Returns an <code>Enumeration</code> of the possible raw values.
81     * <p>
82     * In this case the troids of rows in the referenced table.
83     */
84    protected Enumeration<Integer> _possibleRaws() {
85      return targetTable.troidSelection(null, null, false);
86    }
87  
88    protected void _assertValidCooked(Object cooked)
89        throws ValidationPoemException {
90      if (!(cooked instanceof Persistent))
91        throw new TypeMismatchPoemException(cooked, this);
92  
93      Persistent persistent = (Persistent)cooked;
94  
95      if (persistent.getTable() != targetTable)
96        throw new ValidationPoemException(
97            this, persistent,
98            new TableMismatchPoemException(persistent, targetTable));
99    }
100 
101   protected Object _cookedOfRaw(Object raw) throws NoSuchRowPoemException {
102     return targetTable.getObject((Integer)raw);
103   }
104 
105   protected Integer _rawOfCooked(Object cooked) {
106     return ((Persistent)cooked).troid();
107   }
108 
109   protected String _stringOfCooked(Object cooked, 
110                                    PoemLocale locale, int style)
111       throws PoemException {
112     return ((Persistent)cooked).displayString(locale, style);
113   }
114 
115   protected boolean _canRepresent(SQLPoemType<?> other) {
116     return
117         other instanceof PersistentReferencePoemType &&
118         ((PersistentReferencePoemType)other).targetTable() == targetTable();
119   }
120 
121   protected void _saveColumnInfo(ColumnInfo columnInfo)
122       throws AccessPoemException {
123     columnInfo.setTypefactoryCode(targetTable.tableInfoID());
124   }
125 
126   /**
127    * {@inheritDoc}
128    * @see org.melati.poem.BasePoemType#toString()
129    */
130   public String toString() {
131     return
132         "reference to " + targetTable.getName() + 
133         " (" + super.toString() + ")";
134   }
135 
136   /**
137    * {@inheritDoc}
138    * @see org.melati.poem.PoemType#toDsdType()
139    */
140   public String toDsdType() {
141     return StringUtils.capitalised(targetTable.getName());
142   }
143 }