1 /* 2 * The SmartWeb Framework 3 * Copyright (C) 2004-2006 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 * 19 * For further informations on the SmartWeb Framework please visit 20 * 21 * http://smartweb.sourceforge.net 22 */ 23 package net.smartlab.web; 24 25 import java.io.Serializable; 26 import java.sql.PreparedStatement; 27 import java.sql.ResultSet; 28 import java.sql.SQLException; 29 import java.sql.Types; 30 31 import org.hibernate.Hibernate; 32 import org.hibernate.HibernateException; 33 import org.hibernate.usertype.UserType; 34 35 /** 36 * Represents a meta type used to constraint a property to accept only 37 * pre-defined admitted values. Whenever a property needs some sort of 38 * constraint on assignable values, like person gender or process status, a 39 * subclass of <code>Enumeration</code> can be used to enumerate all possible 40 * values. 41 * 42 * @author rlogiacco 43 */ 44 public abstract class Enumeration implements UserType, Serializable { 45 46 private final static long serialVersionUID = 8849967605617496075L; 47 48 /** 49 * Type of the persisted field reference. 50 */ 51 private final static int[] TYPES = new int[] {Types.SMALLINT}; 52 53 /** 54 * The unique identifier used to represent the choice onto the persisted 55 * field. 56 * 57 * @uml.property name="id" 58 */ 59 private final int id; 60 61 /** 62 * A brief, human understandable, description of the choice. 63 * 64 * @uml.property name="display" 65 */ 66 private final String display; 67 68 69 /** 70 * Default constructor used for internal purposes only. 71 */ 72 protected Enumeration() { 73 // Default constructor 74 this.id = -1; 75 this.display = null; 76 } 77 78 /** 79 * Constructs an available choice on a unique identifier and a brief, human 80 * understandable, description. 81 * 82 * @param id the unique identifier for this choice. 83 * @param display a short, human understandable, description of the choice. 84 */ 85 protected Enumeration(int id, String display) { 86 this.id = id; 87 this.display = display; 88 } 89 90 /** 91 * Returns the unique identifier for the choice. 92 * 93 * @return the unique identifier for the choice. 94 * @uml.property name="id" 95 */ 96 public int getId() { 97 return id; 98 } 99 100 /** 101 * Returns the brief description of the choice. 102 * 103 * @return the brief description of the choice. 104 * @uml.property name="display" 105 */ 106 public String getDisplay() { 107 return display; 108 } 109 110 /** 111 * Decodes a unique identifier into an instance of this class. This method 112 * <b>can not</b> return <code>null</code> values, instead it should define 113 * a <i>default</i> value. 114 * 115 * @param id the identifier to decode. 116 * @return an instance of this class. 117 */ 118 public abstract Enumeration decode(int id); 119 120 /** 121 * @see java.lang.Object#equals(java.lang.Object) 122 */ 123 public boolean equals(Object other) { 124 if (other != null && this.getClass().equals(other.getClass())) { 125 if (((Enumeration)other).id == id) { 126 return true; 127 } 128 } 129 return false; 130 } 131 132 /** 133 * @see java.lang.Object#hashCode() 134 */ 135 public int hashCode() { 136 return id; 137 } 138 139 /** 140 * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object) 141 */ 142 public Object deepCopy(Object value) throws HibernateException { 143 return value; 144 } 145 146 /** 147 * @see org.hibernate.usertype.UserType#equals(java.lang.Object, 148 * java.lang.Object) 149 */ 150 public boolean equals(Object src, Object dst) throws HibernateException { 151 if (src == dst) { 152 return true; 153 } 154 if (src == null || dst == null) { 155 return false; 156 } 157 return Hibernate.INTEGER.isEqual(src, dst); 158 } 159 160 /** 161 * @see org.hibernate.usertype.UserType#isMutable() 162 */ 163 public boolean isMutable() { 164 return false; 165 } 166 167 /** 168 * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, 169 * java.lang.String[], java.lang.Object) 170 */ 171 public Object nullSafeGet(ResultSet rows, String[] names, Object owner) throws HibernateException, SQLException { 172 try { 173 int id = ((Integer)Hibernate.INTEGER.nullSafeGet(rows, names[0])).intValue(); 174 return this.decode(id); 175 } catch (NullPointerException npe) { 176 return null; 177 } 178 } 179 180 /** 181 * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, 182 * java.lang.Object, int) 183 */ 184 public void nullSafeSet(PreparedStatement statement, Object value, int index) throws HibernateException, 185 SQLException { 186 if (value == null) { 187 statement.setNull(index, TYPES[0]); 188 } else if (value instanceof String) { 189 statement.setString(index, (String)value); 190 } else if (value instanceof Number) { 191 statement.setInt(index, ((Number)value).intValue()); 192 } else { 193 try { 194 statement.setInt(index, ((Enumeration)value).getId()); 195 } catch (ClassCastException cce) { 196 throw new HibernateException(cce); 197 } 198 } 199 } 200 201 /** 202 * @see org.hibernate.usertype.UserType#returnedClass() 203 */ 204 public Class returnedClass() { 205 return this.getClass(); 206 } 207 208 /** 209 * @see org.hibernate.usertype.UserType#sqlTypes() 210 */ 211 public int[] sqlTypes() { 212 return TYPES; 213 } 214 215 /** 216 * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, 217 * java.lang.Object) 218 */ 219 public Object assemble(Serializable arg0, Object arg1) throws HibernateException { 220 return null; 221 // FIXME: may be an HibernateException is better 222 } 223 224 /** 225 * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object) 226 */ 227 public Serializable disassemble(Object arg0) throws HibernateException { 228 return null; 229 // FIXME: may be an HibernateException is better 230 } 231 232 /** 233 * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object) 234 */ 235 public int hashCode(Object obj) throws HibernateException { 236 return ((Enumeration)obj).getId(); 237 } 238 239 /** 240 * @see org.hibernate.usertype.UserType#replace(java.lang.Object, 241 * java.lang.Object, java.lang.Object) 242 */ 243 public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException { 244 return null; 245 // FIXME: may be an HibernateException is better 246 } 247 }