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  
49  /**
50   * A {@link Column} which exists in the dbms but is not defined in the 
51   * DSD.
52   */
53  public class ExtraColumn<T> extends Column<T> {
54    private final int extrasIndex;
55  
56    /**
57     * Constructor.
58     */
59    public <P extends Persistent> ExtraColumn(Table<P> table, String name, SQLPoemType<T> type,
60                       DefinitionSource definitionSource,
61                       int extrasIndex) {
62      super(table, name, type, definitionSource);
63      this.extrasIndex = extrasIndex;
64    }
65  
66    /**
67     * {@inheritDoc}
68     * @see org.melati.poem.Column#getRaw(org.melati.poem.Persistent)
69     */
70    public T getRaw(Persistent g) throws AccessPoemException {
71      ((JdbcPersistent)g).readLock();
72      return getRaw_unsafe(g);
73    }
74  
75    /**
76     * {@inheritDoc}
77     * @see org.melati.poem.Column#getRaw_unsafe(org.melati.poem.Persistent)
78     */
79    @SuppressWarnings("unchecked")
80    public T getRaw_unsafe(Persistent g) {
81      return (T)((JdbcPersistent)g).extras()[extrasIndex];
82    }
83  
84    /**
85     * {@inheritDoc}
86     * @see org.melati.poem.Column#setRaw(org.melati.poem.Persistent, java.lang.Object)
87     */
88    public void setRaw(Persistent g, Object raw)
89        throws AccessPoemException, ValidationPoemException {
90      getType().assertValidRaw(raw);
91      ((JdbcPersistent)g).writeLock();
92      setRaw_unsafe(g, raw);
93    }
94  
95    /**
96     * {@inheritDoc}
97     * @see org.melati.poem.Column#setRaw_unsafe(org.melati.poem.Persistent, java.lang.Object)
98     */
99    public void setRaw_unsafe(Persistent g, Object raw) {
100     ((JdbcPersistent)g).extras()[extrasIndex] = raw;
101   }
102 
103   /**
104    * {@inheritDoc}
105    * @see org.melati.poem.Column#getCooked(org.melati.poem.Persistent)
106    */
107   public Object getCooked(Persistent g)
108       throws AccessPoemException, PoemException {
109     // FIXME Revalidation  
110     return getType().cookedOfRaw(getRaw(g));
111   }
112 
113   /**
114    * {@inheritDoc}
115    * @see org.melati.poem.Column#setCooked(org.melati.poem.Persistent, java.lang.Object)
116    */
117   public void setCooked(Persistent g, Object cooked)
118       throws AccessPoemException, ValidationPoemException {
119     // FIXME Revalidation
120     getType().assertValidCooked(cooked);
121     setRaw(g, getType().rawOfCooked(cooked));
122   }
123 
124   /**
125    * {@inheritDoc}
126    * @see org.melati.poem.Column#asField(org.melati.poem.Persistent)
127    */
128   public Field<T> asField(Persistent g) {
129     try {
130       return new Field<T>((T)getRaw(g), this);
131     }
132     catch (AccessPoemException accessException) {
133       return new Field<T>(accessException, this);
134     }
135   }
136 
137   /**
138    * Static factory.
139    * @param table
140    * @param columnInfo
141    * @param extrasIndex
142    * @param source
143    * @return a new ExtraColumn 
144    */
145   @SuppressWarnings("unchecked")
146   public static <O,P extends Persistent>Column<O> from(Table<P> table, ColumnInfo columnInfo,
147                             int extrasIndex, DefinitionSource source) {
148     return new ExtraColumn<O>(
149         table, columnInfo.getName(), (SQLPoemType<O>)columnInfo.getType(), 
150         source, extrasIndex);
151   }
152 }