1 /**
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Intalio, Inc. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Intalio, Inc. Exolab is a registered
23 * trademark of Intalio, Inc.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 1999-2005 (C) Intalio, Inc. All Rights Reserved.
42 *
43 * $Id$
44 */
45
46 package org.exolab.castor.mapping.handlers;
47
48 import org.exolab.castor.mapping.FieldHandler;
49 import org.exolab.castor.mapping.GeneralizedFieldHandler;
50
51 import java.lang.reflect.Method;
52 import java.lang.reflect.Modifier;
53
54 /**
55 * A specialized FieldHandler for the type-safe enum
56 * style classes.
57 *
58 * Adapted from org.exolab.castor.xml.handlers.EnumFieldHandler
59 * which is used for the generated source code.
60 *
61 *
62 * @author <a href="kvisco-at-intalio.com">Keith Visco</a>
63 * @version $Revision$ $Date: 2006-04-13 06:47:36 -0600 (Thu, 13 Apr 2006) $
64 */
65 public class EnumFieldHandler extends GeneralizedFieldHandler {
66
67
68 /**
69 * Class type for the type-safe enum
70 */
71 private Class _enumType = null;
72
73 /**
74 * The create method (eg: #valueOf(String))
75 */
76 private Method _createMethod = null;
77
78 /**
79 * The underlying FieldHandler
80 */
81 private FieldHandler _handler = null;
82
83
84 /**
85 * Creates a new EnumFieldHandler with the given type and
86 * FieldHandler
87 *
88 * @param enumType the Class type of the described field
89 * @param handler the FieldHandler to delegate to
90 */
91 public EnumFieldHandler(Class enumType, FieldHandler handler, Method createMethod) {
92
93 if (enumType == null) {
94 String err = "The argument 'enumType' must not be null.";
95 throw new IllegalArgumentException(err);
96 }
97
98 if (handler == null) {
99 String err = "The argument 'handler' must not be null.";
100 throw new IllegalArgumentException(err);
101 }
102
103 if (createMethod == null) {
104 String err = "The argument 'createMethod' must not be null.";
105 throw new IllegalArgumentException(err);
106 }
107
108 _handler = handler;
109
110 //-- pass handler to superclass
111 setFieldHandler(handler);
112
113 _enumType = enumType;
114 _createMethod = createMethod;
115
116 int mods = createMethod.getModifiers();
117
118 if (!Modifier.isStatic(mods)) {
119 String err = "The factory create method specified for " + enumType.getName()
120 + " must be static";
121 throw new IllegalArgumentException(err);
122 }
123
124 } //-- EnumFieldHandler
125
126 /**
127 * @see org.exolab.castor.mapping.GeneralizedFieldHandler#convertUponGet(java.lang.Object)
128 */
129 public Object convertUponGet(Object value)
130 {
131 //-- no conversion for getter
132 return value;
133
134 } //-- getValue
135
136 /**
137 * @see org.exolab.castor.mapping.GeneralizedFieldHandler#convertUponSet(java.lang.Object)
138 */
139 public Object convertUponSet(Object value)
140 throws java.lang.IllegalStateException
141 {
142 Object obj = null;
143 if (value != null) {
144 Object[] args = new String[1];
145 args[0] = value.toString();
146 try {
147 obj = _createMethod.invoke(null, args);
148 }
149 catch(java.lang.reflect.InvocationTargetException ite) {
150 Throwable toss = ite.getTargetException();
151 throw new IllegalStateException(toss.toString());
152 }
153 catch(java.lang.IllegalAccessException iae) {
154 throw new IllegalStateException(iae.toString());
155 }
156 }
157 return obj;
158
159 } //-- setValue
160
161
162 /**
163 * @see org.exolab.castor.mapping.GeneralizedFieldHandler#getFieldType()
164 */
165 public Class getFieldType() {
166 return _enumType;
167 }
168
169
170 /**
171 * @see org.exolab.castor.mapping.FieldHandler#newInstance(java.lang.Object)
172 */
173 public Object newInstance( Object parent )
174 throws IllegalStateException
175 {
176 return "";
177 } //-- newInstance
178
179 /**
180 * @see org.exolab.castor.mapping.ExtendedFieldHandler#newInstance(java.lang.Object,
181 * java.lang.Object[])
182 */
183 public Object newInstance( Object parent, Object[] args )
184 throws IllegalStateException
185 {
186 return "";
187 }
188
189
190 /**
191 * Returns true if the given object is an XMLFieldHandler that
192 * is equivalent to the delegated handler. An equivalent XMLFieldHandler
193 * is an XMLFieldHandler that is an instances of the same class.
194 *
195 * @return true if the given object is an XMLFieldHandler that
196 * is equivalent to this one.
197 **/
198 public boolean equals(Object obj) {
199 if (obj == null) return false;
200 if (obj == this) return true;
201 if (!(obj instanceof FieldHandler)) return false;
202 return (_handler.getClass().isInstance(obj) ||
203 getClass().isInstance(obj));
204 } //-- equals
205
206 } //-- EnumFieldHandler
207
208
209