1+ /**
2+ * Jsonix is a JavaScript library which allows you to convert between XML
3+ * and JavaScript object structures.
4+ *
5+ * Copyright (c) 2010 - 2014, Alexey Valikov, Highsource.org
6+ * All rights reserved.
7+ *
8+ * Redistribution and use in source and binary forms, with or without modification,
9+ * are permitted provided that the following conditions are met:
10+ *
11+ * * Redistributions of source code must retain the above copyright notice, this
12+ * list of conditions and the following disclaimer.
13+ *
14+ * * Redistributions in binary form must reproduce the above copyright notice, this
15+ * list of conditions and the following disclaimer in the documentation and/or
16+ * other materials provided with the distribution.
17+ *
18+ * * Neither the name of the copyright holder nor the names of its
19+ * contributors may be used to endorse or promote products derived from
20+ * this software without specific prior written permission.
21+ *
22+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
26+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+ */
33+
34+ package org .hisrc .jsonix .compilation .mapping ;
35+
36+ import java .util .HashMap ;
37+ import java .util .LinkedList ;
38+ import java .util .List ;
39+ import java .util .Map ;
40+
41+ import javax .xml .namespace .QName ;
42+
43+ import org .apache .commons .lang3 .Validate ;
44+ import org .hisrc .jsonix .compilation .typeinfo .BuiltinLeafInfoCompiler ;
45+ import org .hisrc .jsonix .compilation .typeinfo .EnumLeafInfoCompiler ;
46+ import org .hisrc .jsonix .compilation .typeinfo .ListCompiler ;
47+ import org .hisrc .jsonix .compilation .typeinfo .PackagedTypeInfoCompiler ;
48+ import org .hisrc .jsonix .compilation .typeinfo .TypeInfoCompiler ;
49+ import org .hisrc .jsonix .compilation .typeinfo .builtin .Base64BinaryTypeInfoCompiler ;
50+ import org .hisrc .jsonix .compilation .typeinfo .builtin .BooleanTypeInfoCompiler ;
51+ import org .hisrc .jsonix .compilation .typeinfo .builtin .DecimalTypeInfoCompiler ;
52+ import org .hisrc .jsonix .compilation .typeinfo .builtin .DurationTypeInfoCompiler ;
53+ import org .hisrc .jsonix .compilation .typeinfo .builtin .HexBinaryTypeInfoCompiler ;
54+ import org .hisrc .jsonix .compilation .typeinfo .builtin .IntegerTypeInfoCompiler ;
55+ import org .hisrc .jsonix .compilation .typeinfo .builtin .QNameTypeInfoCompiler ;
56+ import org .hisrc .jsonix .compilation .typeinfo .builtin .StringTypeInfoCompiler ;
57+ import org .hisrc .jsonix .compilation .typeinfo .builtin .XMLGregorianCalendarTypeInfoCompiler ;
58+ import org .hisrc .jsonix .xml .xsom .CollectEnumerationValuesVisitor ;
59+ import org .hisrc .jsonix .xml .xsom .CollectSimpleTypeNamesVisitor ;
60+ import org .hisrc .xml .xsom .SchemaComponentAware ;
61+ import org .jvnet .jaxb2_commons .xml .bind .model .MBuiltinLeafInfo ;
62+ import org .jvnet .jaxb2_commons .xml .bind .model .MClassInfo ;
63+ import org .jvnet .jaxb2_commons .xml .bind .model .MClassRef ;
64+ import org .jvnet .jaxb2_commons .xml .bind .model .MEnumLeafInfo ;
65+ import org .jvnet .jaxb2_commons .xml .bind .model .MID ;
66+ import org .jvnet .jaxb2_commons .xml .bind .model .MIDREF ;
67+ import org .jvnet .jaxb2_commons .xml .bind .model .MIDREFS ;
68+ import org .jvnet .jaxb2_commons .xml .bind .model .MList ;
69+ import org .jvnet .jaxb2_commons .xml .bind .model .MTypeInfoVisitor ;
70+ import org .jvnet .jaxb2_commons .xml .bind .model .MWildcardTypeInfo ;
71+ import org .jvnet .jaxb2_commons .xml .bind .model .origin .MOriginated ;
72+ import org .jvnet .jaxb2_commons .xmlschema .XmlSchemaConstants ;
73+
74+ import com .sun .xml .xsom .XSComponent ;
75+ import com .sun .xml .xsom .XmlString ;
76+
77+ public class CreateTypeInfoCompilerTypeInfoVisitor <T , C extends T , O >
78+ implements MTypeInfoVisitor <T , C , TypeInfoCompiler <T , C >> {
79+
80+ private static final String IDREFS_TYPE_INFO_NAME = "IDREFS" ;
81+ private static final String IDREF_TYPE_INFO_NAME = "IDREF" ;
82+ private static final String ID_TYPE_INFO_NAME = "ID" ;
83+
84+ private Map <QName , TypeInfoCompiler <T , C >> XSD_TYPE_MAPPING = new HashMap <QName , TypeInfoCompiler <T , C >>();
85+ {
86+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ANYTYPE , new BuiltinLeafInfoCompiler <T , C , O >("AnyType" ));
87+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ANYSIMPLETYPE , new BuiltinLeafInfoCompiler <T , C , O >("AnySimpleType" ));
88+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .STRING , new StringTypeInfoCompiler <T , C , O >("String" ));
89+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NORMALIZEDSTRING ,
90+ new StringTypeInfoCompiler <T , C , O >("NormalizedString" ));
91+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .TOKEN , new StringTypeInfoCompiler <T , C , O >("Token" ));
92+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .LANGUAGE , new StringTypeInfoCompiler <T , C , O >("Language" ));
93+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NAME , new StringTypeInfoCompiler <T , C , O >("Name" ));
94+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NCNAME , new StringTypeInfoCompiler <T , C , O >("NCName" ));
95+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ID , new StringTypeInfoCompiler <T , C , O >("ID" ));
96+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ID , new StringTypeInfoCompiler <T , C , O >("String" ));
97+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .IDREF , new StringTypeInfoCompiler <T , C , O >("IDREF" ));
98+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .IDREF , new StringTypeInfoCompiler <T , C , O >("String" ));
99+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .IDREFS , new StringTypeInfoCompiler <T , C , O >("IDREFS" ));
100+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .IDREFS , new StringTypeInfoCompiler <T , C , O >("Strings" ));
101+ // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ENTITY, new
102+ // BuiltinLeafInfoCompiler<T, C, O>("Entity"));
103+ // XSD_TYPE_MAPPING.put(XmlSchemaConstants.ENTITIES, new
104+ // BuiltinLeafInfoCompiler<T, C, O>("Entities"));
105+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NMTOKEN , new StringTypeInfoCompiler <T , C , O >("NMToken" ));
106+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NMTOKENS , new StringTypeInfoCompiler <T , C , O >("NMTokens" ));
107+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .BOOLEAN , new BooleanTypeInfoCompiler <T , C , O >());
108+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .BASE64BINARY , new Base64BinaryTypeInfoCompiler <T , C , O >());
109+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .HEXBINARY , new HexBinaryTypeInfoCompiler <T , C , O >());
110+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .FLOAT , new DecimalTypeInfoCompiler <T , C , O >("Float" ));
111+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .DECIMAL , new DecimalTypeInfoCompiler <T , C , O >("Decimal" ));
112+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .INTEGER , new IntegerTypeInfoCompiler <T , C , O >("Integer" ));
113+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NONPOSITIVEINTEGER ,
114+ new IntegerTypeInfoCompiler <T , C , O >("NonPositiveInteger" ));
115+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NEGATIVEINTEGER ,
116+ new IntegerTypeInfoCompiler <T , C , O >("NegativeInteger" ));
117+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .LONG , new IntegerTypeInfoCompiler <T , C , O >("Long" ));
118+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .INT , new IntegerTypeInfoCompiler <T , C , O >("Int" ));
119+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .SHORT , new IntegerTypeInfoCompiler <T , C , O >("Short" ));
120+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .BYTE , new IntegerTypeInfoCompiler <T , C , O >("Byte" ));
121+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .NONNEGATIVEINTEGER ,
122+ new IntegerTypeInfoCompiler <T , C , O >("NonNegativeInteger" ));
123+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .UNSIGNEDLONG , new IntegerTypeInfoCompiler <T , C , O >("UnsignedLong" ));
124+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .UNSIGNEDINT , new IntegerTypeInfoCompiler <T , C , O >("UnsignedInt" ));
125+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .UNSIGNEDSHORT , new IntegerTypeInfoCompiler <T , C , O >("UnsignedShort" ));
126+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .UNSIGNEDBYTE , new IntegerTypeInfoCompiler <T , C , O >("UnsignedByte" ));
127+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .POSITIVEINTEGER ,
128+ new IntegerTypeInfoCompiler <T , C , O >("PositiveInteger" ));
129+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .DOUBLE , new DecimalTypeInfoCompiler <T , C , O >("Double" ));
130+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ANYURI , new StringTypeInfoCompiler <T , C , O >("AnyURI" ));
131+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .ANYURI , new StringTypeInfoCompiler <T , C , O >("String" ));
132+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .QNAME , new QNameTypeInfoCompiler <T , C , O >());
133+ // XSD_TYPE_MAPPING.put(XmlSchemaConstants.NOTATION, new
134+ // BuiltinLeafInfoCompiler<T, C, O>("Notation"));
135+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .DURATION , new DurationTypeInfoCompiler <T , C , O >());
136+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .DATETIME ,
137+ new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("DateTime" ));
138+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .TIME , new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("Time" ));
139+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .DATE , new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("Date" ));
140+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .GYEARMONTH ,
141+ new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("GYearMonth" ));
142+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .GYEAR , new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("GYear" ));
143+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .GMONTHDAY ,
144+ new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("GMonthDay" ));
145+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .GDAY , new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("GDay" ));
146+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .GMONTH , new XMLGregorianCalendarTypeInfoCompiler <T , C , O >("GMonth" ));
147+ XSD_TYPE_MAPPING .put (XmlSchemaConstants .CALENDAR , new BuiltinLeafInfoCompiler <T , C , O >("Calendar" ));
148+ // XSD_TYPE_MAPPING.put(XmlSchemaConstants.CALENDAR, new
149+ // BuiltinLeafInfoCompiler<T, C, O>("String"));
150+ }
151+
152+ private final MOriginated <O > originated ;
153+
154+ public CreateTypeInfoCompilerTypeInfoVisitor (MOriginated <O > originated ) {
155+ Validate .notNull (originated );
156+ this .originated = originated ;
157+ }
158+
159+ public TypeInfoCompiler <T , C > visitEnumLeafInfo (MEnumLeafInfo <T , C > info ) {
160+ return new EnumLeafInfoCompiler <T , C >(info , info .getBaseTypeInfo ().acceptTypeInfoVisitor (this ));
161+ }
162+
163+ public TypeInfoCompiler <T , C > visitClassInfo (MClassInfo <T , C > info ) {
164+ return new PackagedTypeInfoCompiler <T , C >(info );
165+ }
166+
167+ @ Override
168+ public TypeInfoCompiler <T , C > visitClassRef (MClassRef <T , C > info ) {
169+ return new PackagedTypeInfoCompiler <T , C >(info );
170+ }
171+
172+ public TypeInfoCompiler <T , C > visitList (MList <T , C > info ) {
173+ return new ListCompiler <T , C >(info , info .getItemTypeInfo ().acceptTypeInfoVisitor (this ));
174+ }
175+
176+ public TypeInfoCompiler <T , C > visitBuiltinLeafInfo (MBuiltinLeafInfo <T , C > info ) {
177+
178+ final O origin = this .originated .getOrigin ();
179+
180+ final List <QName > simpleTypeNames = new LinkedList <QName >();
181+ final List <XmlString > enumerationValues = new LinkedList <XmlString >();
182+ if (origin instanceof SchemaComponentAware ) {
183+ final XSComponent component = ((SchemaComponentAware ) origin ).getSchemaComponent ();
184+ if (component != null ) {
185+ final CollectSimpleTypeNamesVisitor visitor = new CollectSimpleTypeNamesVisitor ();
186+ component .visit (visitor );
187+ simpleTypeNames .addAll (visitor .getTypeNames ());
188+
189+ final CollectEnumerationValuesVisitor collectEnumerationValuesVisitor = new CollectEnumerationValuesVisitor ();
190+ component .visit (collectEnumerationValuesVisitor );
191+ enumerationValues .addAll (collectEnumerationValuesVisitor .getValues ());
192+ if (!enumerationValues .isEmpty ()) {
193+ System .out .println (enumerationValues );
194+ }
195+ }
196+ }
197+
198+ simpleTypeNames .add (info .getTypeName ());
199+
200+ for (QName candidateName : simpleTypeNames ) {
201+ final TypeInfoCompiler <T , C > typeInfoCompiler = XSD_TYPE_MAPPING .get (candidateName );
202+ if (typeInfoCompiler != null ) {
203+ return typeInfoCompiler ;
204+ }
205+ }
206+ return null ;
207+ }
208+
209+ public TypeInfoCompiler <T , C > visitWildcardTypeInfo (MWildcardTypeInfo <T , C > info ) {
210+ // TODO ????
211+ return null ;
212+ }
213+
214+ @ Override
215+ public TypeInfoCompiler <T , C > visitID (MID <T , C > info ) {
216+ return new BuiltinLeafInfoCompiler <T , C , O >(ID_TYPE_INFO_NAME );
217+ }
218+
219+ @ Override
220+ public TypeInfoCompiler <T , C > visitIDREF (MIDREF <T , C > info ) {
221+ return new BuiltinLeafInfoCompiler <T , C , O >(IDREF_TYPE_INFO_NAME );
222+ }
223+
224+ @ Override
225+ public TypeInfoCompiler <T , C > visitIDREFS (MIDREFS <T , C > info ) {
226+ return new BuiltinLeafInfoCompiler <T , C , O >(IDREFS_TYPE_INFO_NAME );
227+ }
228+ }
0 commit comments