src/share/jaxws_classes/com/sun/tools/internal/xjc/model/CEnumLeafInfo.java

changeset 0
373ffda63c9a
equal deleted inserted replaced
-1:000000000000 0:373ffda63c9a
1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.tools.internal.xjc.model;
27
28 import java.util.Collection;
29
30 import javax.activation.MimeType;
31 import javax.xml.namespace.QName;
32
33 import com.sun.codemodel.internal.JClass;
34 import com.sun.codemodel.internal.JExpression;
35 import com.sun.tools.internal.xjc.model.nav.NClass;
36 import com.sun.tools.internal.xjc.model.nav.NType;
37 import com.sun.tools.internal.xjc.outline.Aspect;
38 import com.sun.tools.internal.xjc.outline.Outline;
39 import com.sun.xml.internal.bind.v2.model.annotation.Locatable;
40 import com.sun.xml.internal.bind.v2.model.core.EnumLeafInfo;
41 import com.sun.xml.internal.bind.v2.model.core.ID;
42 import com.sun.xml.internal.bind.v2.model.core.NonElement;
43 import com.sun.xml.internal.bind.v2.model.core.Element;
44 import com.sun.xml.internal.bind.v2.runtime.Location;
45 import com.sun.xml.internal.xsom.XSComponent;
46 import com.sun.xml.internal.xsom.XmlString;
47
48 import org.xml.sax.Locator;
49
50 /**
51 * Transducer that converts a string into an "enumeration class."
52 *
53 * The structure of the generated class needs to precisely
54 * follow the JAXB spec.
55 *
56 * @author
57 * <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
58 */
59 public final class CEnumLeafInfo implements EnumLeafInfo<NType,NClass>, NClass, CNonElement
60 {
61 /**
62 * The {@link Model} object to which this bean belongs.
63 */
64 public final Model model;
65
66 /**
67 * The parent into which the enum class should be generated.
68 */
69 public final CClassInfoParent parent;
70
71 /**
72 * Short name of the generated type-safe enum.
73 */
74 public final String shortName;
75
76 private final QName typeName;
77
78 private final XSComponent source;
79
80 /**
81 * Represents the underlying type of this enumeration
82 * and its conversion.
83 *
84 * <p>
85 * To parse XML into a constant, we use the base type
86 * to do lexical -> value, then use a map to pick up the right one.
87 *
88 * <p>
89 * Hence this also represents the type of the Java value.
90 * For example, if this is an enumeration of xs:int,
91 * then this field will be Java int.
92 */
93 public final CNonElement base;
94
95
96 /**
97 * List of enum members.
98 */
99 public final Collection<CEnumConstant> members;
100
101 private final CCustomizations customizations;
102
103 /**
104 * @see #getLocator()
105 */
106 private final Locator sourceLocator;
107
108 public String javadoc;
109
110 public CEnumLeafInfo(Model model,
111 QName typeName,
112 CClassInfoParent container,
113 String shortName,
114 CNonElement base,
115 Collection<CEnumConstant> _members,
116 XSComponent source,
117 CCustomizations customizations,
118 Locator _sourceLocator) {
119 this.model = model;
120 this.parent = container;
121 this.shortName = model.allocator.assignClassName(parent,shortName);
122 this.base = base;
123 this.members = _members;
124 this.source = source;
125 if(customizations==null)
126 customizations = CCustomizations.EMPTY;
127 this.customizations = customizations;
128 this.sourceLocator = _sourceLocator;
129 this.typeName = typeName;
130
131 for( CEnumConstant mem : members )
132 mem.setParent(this);
133
134 model.add(this);
135
136 // TODO: can we take advantage of the fact that enum can be XmlRootElement?
137 }
138
139 /**
140 * Source line information that points to the place
141 * where this type-safe enum is defined.
142 * Used to report error messages.
143 */
144 public Locator getLocator() {
145 return sourceLocator;
146 }
147
148 public QName getTypeName() {
149 return typeName;
150 }
151
152 public NType getType() {
153 return this;
154 }
155
156 /**
157 * @deprecated
158 * why are you calling the method whose return value is known?
159 */
160 public boolean canBeReferencedByIDREF() {
161 return false;
162 }
163
164 public boolean isElement() {
165 return false;
166 }
167
168 public QName getElementName() {
169 return null;
170 }
171
172 public Element<NType,NClass> asElement() {
173 return null;
174 }
175
176 public NClass getClazz() {
177 return this;
178 }
179
180 public XSComponent getSchemaComponent() {
181 return source;
182 }
183
184 public JClass toType(Outline o, Aspect aspect) {
185 return o.getEnum(this).clazz;
186 }
187
188 public boolean isAbstract() {
189 return false;
190 }
191
192 public boolean isBoxedType() {
193 return false;
194 }
195
196 public String fullName() {
197 return parent.fullName()+'.'+shortName;
198 }
199
200 public boolean isPrimitive() {
201 return false;
202 }
203
204 public boolean isSimpleType() {
205 return true;
206 }
207
208
209 /**
210 * The spec says the value field in the enum class will be generated
211 * only under certain circumstances.
212 *
213 * @return
214 * true if the generated enum class should have the value field.
215 */
216 public boolean needsValueField() {
217 for (CEnumConstant cec : members) {
218 if(!cec.getName().equals(cec.getLexicalValue()))
219 return true;
220 }
221 return false;
222 }
223
224 public JExpression createConstant(Outline outline, XmlString literal) {
225 // correctly identifying which constant it maps to is hard, so
226 // here I'm cheating
227 JClass type = toType(outline,Aspect.EXPOSED);
228 for (CEnumConstant mem : members) {
229 if(mem.getLexicalValue().equals(literal.value))
230 return type.staticRef(mem.getName());
231 }
232 return null;
233 }
234
235 @Deprecated
236 public boolean isCollection() {
237 return false;
238 }
239
240 @Deprecated
241 public CAdapter getAdapterUse() {
242 return null;
243 }
244
245 @Deprecated
246 public CNonElement getInfo() {
247 return this;
248 }
249
250 public ID idUse() {
251 return ID.NONE;
252 }
253
254 public MimeType getExpectedMimeType() {
255 return null;
256 }
257
258 public Collection<CEnumConstant> getConstants() {
259 return members;
260 }
261
262 public NonElement<NType,NClass> getBaseType() {
263 return base;
264 }
265
266 public CCustomizations getCustomizations() {
267 return customizations;
268 }
269
270 public Locatable getUpstream() {
271 throw new UnsupportedOperationException();
272 }
273
274 public Location getLocation() {
275 throw new UnsupportedOperationException();
276 }
277 }

mercurial