]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionBase.java
Handling ComplexTypes inheriting AtomicType
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / SchemaConversionBase.java
1 package org.simantics.xml.sax;\r
2 \r
3 import java.util.ArrayDeque;\r
4 import java.util.ArrayList;\r
5 import java.util.Deque;\r
6 import java.util.HashMap;\r
7 import java.util.HashSet;\r
8 import java.util.List;\r
9 import java.util.Map;\r
10 import java.util.Set;\r
11 \r
12 import javax.xml.bind.JAXBElement;\r
13 import javax.xml.namespace.QName;\r
14 \r
15 import org.simantics.utils.datastructures.BijectionMap;\r
16 import org.simantics.xml.sax.SchemaElement.ElementType;\r
17 import org.simantics.xml.sax.SchemaObject.ObjectType;\r
18 import org.simantics.xml.sax.configuration.AttributeComposition;\r
19 import org.simantics.xml.sax.configuration.Configuration;\r
20 import org.simantics.xml.sax.configuration.IDProvider;\r
21 import org.simantics.xml.sax.configuration.IDReference;\r
22 import org.simantics.xml.sax.configuration.OrderedChild;\r
23 import org.simantics.xml.sax.configuration.Rename;\r
24 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
25 import org.w3._2001.xmlschema.All;\r
26 import org.w3._2001.xmlschema.Annotated;\r
27 import org.w3._2001.xmlschema.Any;\r
28 import org.w3._2001.xmlschema.Attribute;\r
29 import org.w3._2001.xmlschema.AttributeGroup;\r
30 import org.w3._2001.xmlschema.ComplexContent;\r
31 import org.w3._2001.xmlschema.ComplexType;\r
32 import org.w3._2001.xmlschema.Element;\r
33 import org.w3._2001.xmlschema.ExplicitGroup;\r
34 import org.w3._2001.xmlschema.ExtensionType;\r
35 import org.w3._2001.xmlschema.LocalComplexType;\r
36 import org.w3._2001.xmlschema.LocalElement;\r
37 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
38 import org.w3._2001.xmlschema.OpenAttrs;\r
39 import org.w3._2001.xmlschema.Restriction;\r
40 import org.w3._2001.xmlschema.Schema;\r
41 import org.w3._2001.xmlschema.SimpleContent;\r
42 import org.w3._2001.xmlschema.SimpleType;\r
43 import org.w3._2001.xmlschema.TopLevelAttribute;\r
44 import org.w3._2001.xmlschema.TopLevelComplexType;\r
45 import org.w3._2001.xmlschema.TopLevelElement;\r
46 import org.w3._2001.xmlschema.TopLevelSimpleType;\r
47 \r
48 public abstract class SchemaConversionBase {\r
49         \r
50         protected Schema schema;\r
51         protected Configuration configuration;\r
52         \r
53         protected static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";\r
54         protected static final String CONVERSION_NS = "http://www.simantics.org/Layer0";\r
55         \r
56         protected Map<String,Map<String,TypeEntry>> typeMap;\r
57         \r
58         public SchemaConversionBase(Configuration configuration) {\r
59                 this.configuration = configuration;\r
60                 typeMap = new HashMap<String, Map<String,TypeEntry>>();\r
61                 \r
62                 Map<String,TypeEntry> schemaTypes = new HashMap<String, SchemaConversionBase.TypeEntry>();\r
63                 typeMap.put(SCHEMA_NS, schemaTypes);\r
64                 Map<String,TypeEntry> l0Types = new HashMap<String, SchemaConversionBase.TypeEntry>();\r
65                 typeMap.put(CONVERSION_NS, l0Types);\r
66                 \r
67                 schemaTypes.put("string",               new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
68                 schemaTypes.put("NMTOKEN",              new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
69                 schemaTypes.put("token",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
70                 schemaTypes.put("ID",                   new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","","",true));\r
71                 schemaTypes.put("IDREF",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
72                 schemaTypes.put("date",                 new TypeEntry("XML.Date",                       "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")","(",").toString()"));\r
73                 schemaTypes.put("time",                 new TypeEntry("XML.Time",                       "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")","(",").toString()"));\r
74                 schemaTypes.put("dateTime",             new TypeEntry("XML.DateTime",           "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")","(",").toString()"));\r
75                 schemaTypes.put("anyURI",               new TypeEntry("L0.URI",                         "Bindings.STRING", "java.lang.String", "","","","",""));\r
76                 schemaTypes.put("double",               new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")"));\r
77                 schemaTypes.put("float",                new TypeEntry("L0.Float",                       "Bindings.FLOAT",  "float",  "java.lang.Float.NaN","java.lang.Float.parseFloat(",")","java.lang.Float.toString(",")"));\r
78                 schemaTypes.put("decimal",              new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")"));\r
79                 schemaTypes.put("boolean",              new TypeEntry("L0.Boolean",                     "Bindings.BOOLEAN", "boolean", "false","java.lang.Boolean.parseBoolean(",")","java.lang.Boolean.toString(",")"));\r
80                 schemaTypes.put("integer",              new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
81                 schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
82                 schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
83                 schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
84                 schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
85                 schemaTypes.put("unsignedInt",  new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
86                 schemaTypes.put("int",                  new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
87                 schemaTypes.put("short",                new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
88                 schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
89                 schemaTypes.put("byte",                 new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")"));\r
90                 schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")"));\r
91                 schemaTypes.put("long",                 new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")"));\r
92                 schemaTypes.put("unsignedLong", new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")"));\r
93                 schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray",           "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)","new java.lang.String(",", org.simantics.databoard.util.binary.UTF8.CHARSET)"));\r
94                 \r
95                 \r
96                 \r
97                 l0Types.put("doubleArray",              new TypeEntry("L0.DoubleArray",  "Bindings.DOUBLE_ARRAY", "double[]", null,null,null,"java.lang.Double.toString(",")"));\r
98                 l0Types.put("stringArray",              new TypeEntry("L0.StringArray",  "Bindings.STRING_ARRAY", "string[]", null,null,null,"",""));\r
99         }\r
100         \r
101         \r
102         protected TypeEntry getTypeEntry(QName type) {\r
103                 Map<String,TypeEntry> types = typeMap.get(type.getNamespaceURI());\r
104                 if (types == null)\r
105                         return null;\r
106                 TypeEntry entry = types.get(type.getLocalPart());\r
107                 return entry;\r
108         }\r
109         protected TypeEntry getTypeEntry(String type) {\r
110                 for (Map<String,TypeEntry> types : typeMap.values()) {\r
111                         TypeEntry entry = types.get(type);\r
112                         if (entry != null)\r
113                                 return entry;\r
114                 }\r
115                 return null;\r
116         }\r
117         \r
118         protected String getL0TypeFromPrimitiveType(QName primitiveType) {\r
119                 TypeEntry entry = getTypeEntry(primitiveType);\r
120                 if (entry == null)\r
121                         return null;\r
122                 return entry.l0Type;\r
123         }\r
124         \r
125         protected String getL0Type(QName primitiveType) {\r
126                 String type = getL0TypeFromPrimitiveType(primitiveType);\r
127                 if (type != null)\r
128                         return type;\r
129                 SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
130                 if (simpleTypeObj == null)\r
131                         return null;\r
132                 SimpleType simpleType = simpleTypeObj.getSimpleType();\r
133                 while (simpleType != null) {\r
134                         QName base = simpleType.getRestriction().getBase();\r
135                         if (base != null)\r
136                                 return getL0Type(base);\r
137                         simpleType = simpleType.getRestriction().getSimpleType();\r
138                 }\r
139                 return null;\r
140         }\r
141         \r
142         protected String getBindingFromPrimitiveType(QName primitiveType) {\r
143                 TypeEntry entry = getTypeEntry(primitiveType);\r
144                 if (entry == null)\r
145                         return null;\r
146                 return entry.binding;\r
147         }\r
148         \r
149         protected String getJavaTypeFromPrimitiveType(QName primitiveType) {\r
150                 TypeEntry entry = getTypeEntry(primitiveType);\r
151                 if (entry == null)\r
152                         return null;\r
153                 return entry.javaType;\r
154         }\r
155         \r
156         \r
157         protected void handle(Schema schema) {  \r
158                 this.schema = schema;\r
159                 preload();\r
160                 \r
161                 for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
162                         if (attrs instanceof TopLevelAttribute) {\r
163                                 handle((TopLevelAttribute)attrs);\r
164                                 \r
165                         } else if (attrs instanceof TopLevelComplexType) {\r
166                                 handleComplexType(complexTypes.get(attrs));\r
167                         } else if (attrs instanceof TopLevelElement) {\r
168                                 handleElement(elements.get(attrs));\r
169                         } else if (attrs instanceof TopLevelSimpleType) {\r
170                                 handleSimpleType(simpleTypes.get(attrs));\r
171                         } else if (attrs instanceof NamedAttributeGroup) {\r
172                                 handle((NamedAttributeGroup)attrs);\r
173                         } else {\r
174                                 System.out.println(attrs.getClass().getName());\r
175                         }\r
176                 }\r
177         }\r
178         \r
179         protected Map<String,SchemaObject> elementName = new HashMap<String, SchemaObject>();\r
180         protected Map<String,SchemaObject> complexTypeName = new HashMap<String, SchemaObject>();\r
181         protected Map<String,SchemaObject> simpleTypeName = new HashMap<String, SchemaObject>();\r
182         protected Map<Element,SchemaObject> elements = new HashMap<Element, SchemaObject>();\r
183         protected Map<ComplexType,SchemaObject> complexTypes = new HashMap<ComplexType, SchemaObject>();\r
184         protected Map<SimpleType,SchemaObject> simpleTypes = new HashMap<SimpleType, SchemaObject>();\r
185         \r
186         \r
187         protected SchemaObject getWithName(SchemaObject referrer, String name) {\r
188                 SchemaObject obj = elementName.get(name);\r
189                 if (obj == null)\r
190                         obj = complexTypeName.get(name);\r
191                 if (obj == null)\r
192                         obj = simpleTypeName.get(name);\r
193                 if (obj == null) {\r
194                         throw new RuntimeException("Cannot locate referred type " + name + " when handling " + referrer.getName());\r
195                 }\r
196                 return obj;\r
197         }\r
198         \r
199         protected SchemaObject getWithObj(SchemaObject referrer, OpenAttrs attrs) {\r
200                 SchemaObject obj = null;\r
201                 if (attrs instanceof Element)\r
202                         obj = elements.get(attrs);\r
203                 else if (attrs instanceof ComplexType)\r
204                         obj = complexTypes.get(attrs);\r
205                 else if (attrs instanceof SimpleType) \r
206                         obj = simpleTypes.get(attrs);\r
207                 if (obj == null){\r
208                         throw new RuntimeException("Cannot locate referred object " + attrs + " when handling " + referrer.getName());\r
209                 }\r
210                 return obj;\r
211         }\r
212         \r
213         private void preload() {\r
214                 Deque<SchemaObject> stack = new ArrayDeque<SchemaObject>();\r
215                 //stack.addAll(schema.getSimpleTypeOrComplexTypeOrGroup());\r
216                 for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
217                         if (attrs instanceof Element) {\r
218                                 Element element = (Element)attrs;\r
219                                 SchemaObject obj = new SchemaObject(element);\r
220                                 obj.setRename(getRename(element));\r
221                                 stack.push(obj);\r
222                         } else if (attrs instanceof ComplexType) {\r
223                                 ComplexType complexType = (ComplexType)attrs;\r
224                                 SchemaObject obj = new SchemaObject(complexType);\r
225                                 obj.setRename(getRename(complexType));\r
226                                 stack.push(obj);\r
227                         } else if (attrs instanceof SimpleType) {\r
228                                 SimpleType simpleType = (SimpleType)attrs;\r
229                                 SchemaObject obj = new SchemaObject(simpleType);\r
230                                 stack.push(obj);\r
231                         }\r
232                 }\r
233                 \r
234                 while (!stack.isEmpty()) {\r
235                         SchemaObject object = stack.pop();\r
236                         if (object.getType() == ObjectType.COMPLEX_TYPE) {\r
237                                 ComplexType ct = object.getComplexType();\r
238                                 if (ct.getName() != null && ct.getName().length() > 0 && ct instanceof TopLevelComplexType)\r
239                                         complexTypeName.put(ct.getName(), object);\r
240                                 complexTypes.put(ct, object);\r
241                                 if (ct.getChoice() != null) {\r
242                                         preload(object,ct.getChoice(), stack);\r
243                                 }\r
244                                 if (ct.getSequence() != null) {\r
245                                         preload(object,ct.getSequence(), stack);\r
246                                 }\r
247                                 if (ct.getAll() != null) {\r
248                                         preload(object,ct.getAll(), stack);\r
249                                 }\r
250                                 if (ct.getGroup() != null)\r
251                                         throw new RuntimeException("Groups not supported");\r
252                                 if (ct.getComplexContent() != null) {\r
253                                         ComplexContent cc = ct.getComplexContent();\r
254                                         ExtensionType extensionType = cc.getExtension();\r
255                                         if (extensionType != null) {\r
256                                                 if (extensionType.getChoice() != null) {\r
257                                                         preload(object,extensionType.getChoice(), stack);\r
258                                                 }\r
259                                                 if (extensionType.getSequence()!= null) {\r
260                                                         preload(object,extensionType.getSequence(), stack);\r
261                                                 }\r
262                                                 if (extensionType.getAll()!= null) {\r
263                                                         preload(object,extensionType.getAll(), stack);\r
264                                                 }\r
265                                                 if (extensionType.getGroup() != null)\r
266                                                         throw new RuntimeException("Groups not supported");\r
267                                         }\r
268                                 }\r
269                                 if (ct.getSimpleContent() != null) {\r
270                                         SimpleContent cc = ct.getSimpleContent();\r
271                                         ExtensionType extensionType = cc.getExtension();\r
272                                         if (extensionType != null) {\r
273                                                 if (extensionType.getChoice() != null) {\r
274                                                         preload(object,extensionType.getChoice(), stack);\r
275                                                 }\r
276                                                 if (extensionType.getSequence()!= null) {\r
277                                                         preload(object,extensionType.getSequence(), stack);\r
278                                                 }\r
279                                                 if (extensionType.getAll()!= null) {\r
280                                                         preload(object,extensionType.getAll(), stack);\r
281                                                 }\r
282                                                 if (extensionType.getGroup() != null)\r
283                                                         throw new RuntimeException("Groups not supported");\r
284                                         }\r
285                                 }\r
286                         } else if (object.getType() == ObjectType.ELEMENT) {\r
287                                 Element e = object.getElement();\r
288                                 if (e instanceof TopLevelElement)\r
289                                         elementName.put(e.getName(), object);\r
290                                 elements.put(e, object);\r
291                                 if (e.getComplexType() != null)\r
292                                         stack.push(new SchemaObject(object,e.getComplexType()));\r
293                                 if (e.getSimpleType() != null)\r
294                                         stack.push(new SchemaObject(object,e.getSimpleType()));\r
295                         } else if (object.getType() == ObjectType.SIMPLE_TYPE) {\r
296                                 SimpleType e = object.getSimpleType();\r
297                                 if (e instanceof TopLevelSimpleType)\r
298                                         simpleTypeName.put(e.getName(), object);\r
299                                 simpleTypes.put(e, object);\r
300                         }\r
301                 }\r
302         }\r
303         \r
304         private void preload(SchemaObject parent,ExplicitGroup eg, Deque<SchemaObject> stack) {\r
305                 for (Object o : eg.getParticle()) {\r
306                         if (o instanceof JAXBElement<?>) {\r
307                                 JAXBElement<?> element = (JAXBElement<?>)o;\r
308                                 Object elemValue = element.getValue();\r
309                                 if (elemValue instanceof Element) {\r
310                                         SchemaObject obj = new SchemaObject(parent,(Element)elemValue);\r
311                                         obj.setRename(getRename((Element)elemValue));\r
312                                         stack.add(obj);\r
313                                 } else if (elemValue instanceof All) {\r
314                                         preload(parent,(All)elemValue, stack);\r
315                                 } else if (elemValue instanceof ExplicitGroup) {\r
316                                         preload(parent,(ExplicitGroup)elemValue, stack);\r
317                                 } else {\r
318                                         throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName());\r
319                                 }\r
320                         } else if (o instanceof Any){\r
321                                 \r
322                         } else {\r
323                                 throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName());\r
324                         }\r
325                 }\r
326         }\r
327         \r
328         protected void handle(TopLevelAttribute topLevelAttribute) {\r
329                 handle(null, topLevelAttribute);\r
330         }\r
331         \r
332         protected void handleSimpleType(SchemaObject topLevelSimpleType) {\r
333                 handleSimpleType(null,topLevelSimpleType);\r
334         }\r
335         \r
336         protected void handle(NamedAttributeGroup namedAttributeGroup){\r
337                 handle(null, namedAttributeGroup);\r
338         }\r
339         \r
340         protected QName getComplexTypeBase(ComplexType complexType) {\r
341                 if (complexType == null)\r
342                         return null;\r
343                 ComplexContent complexContent = complexType.getComplexContent();\r
344                 if (complexContent != null) {\r
345                         ExtensionType extensionType = complexContent.getExtension();\r
346                         if (extensionType != null) {\r
347                                 QName type = extensionType.getBase();\r
348                                 return type;\r
349                         }\r
350                 }\r
351                 return null;\r
352         }\r
353         \r
354         protected QName getSimpleTypeBase(SimpleType simpleType) {\r
355                 if (simpleType == null)\r
356                         return null;\r
357                 return simpleType.getRestriction().getBase();\r
358         }\r
359         \r
360         protected QName getElementBase(Element element) {\r
361                 ComplexType complexType = element.getComplexType();\r
362                 SimpleType simpleType = element.getSimpleType();\r
363                 if (complexType != null)\r
364                         return getComplexTypeBase(complexType);\r
365                 if (simpleType != null) {\r
366                         return getSimpleTypeBase(simpleType);\r
367                 }\r
368                 return null;\r
369         }\r
370         \r
371 \r
372         \r
373         \r
374         \r
375         \r
376         \r
377         \r
378         private void handleAttributes(SchemaObject complexType, List<Annotated> attributeOrAttributeGroup) {\r
379                 //name = getComplexTypePrefix()+complexType.getName()\r
380                 \r
381                 Set<Annotated> handled = handleAttributeCompositions(complexType,attributeOrAttributeGroup);\r
382                 for (Annotated annotated : attributeOrAttributeGroup) {\r
383                         if (handled.contains(annotated))\r
384                                 continue;\r
385                         if (annotated instanceof Attribute) {\r
386                                 handle(complexType,(Attribute)annotated);\r
387                         } else if (annotated instanceof AttributeGroup){\r
388                                 handle(complexType,(AttributeGroup)annotated);\r
389                                 //comment("AttributeGroup " + ((AttributeGroup)annotated).getRef().getLocalPart());\r
390                         } else {\r
391                                 throw new RuntimeException();\r
392                         }\r
393                 }\r
394         }\r
395         \r
396         protected abstract void handleAttributes(SchemaObject simpleTypeObj);\r
397         \r
398         protected void handleExtensionAttributes(SchemaObject complexType) {\r
399                 ComplexContent complexContent = complexType.getComplexType().getComplexContent();\r
400                 if (complexContent != null) {\r
401                         ExtensionType extensionType = complexContent.getExtension();\r
402                         if (extensionType != null) {\r
403                                 handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup());\r
404                         }\r
405                 }\r
406                 SimpleContent simpleContent = complexType.getComplexType().getSimpleContent();\r
407                 if (simpleContent != null) {\r
408                         ExtensionType extensionType = simpleContent.getExtension();\r
409                         if (extensionType != null) {\r
410                                 handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup());\r
411                         }\r
412                 }\r
413         }\r
414         \r
415         \r
416         \r
417         protected void handleComplexTypeAttributes(SchemaObject complexType) {          \r
418                 handleAttributes(complexType,complexType.getComplexType().getAttributeOrAttributeGroup());\r
419         }\r
420         \r
421         protected void handleElementComplexTypeAttributes(SchemaObject complexType) {\r
422                 if (complexType != null) {\r
423                         handleComplexTypeAttributes(complexType);\r
424                         handleExtensionAttributes(complexType);\r
425                 }\r
426         }\r
427         \r
428         protected void handleElementSimpleTypeAttributes(SchemaObject simpleType) {\r
429                 if (simpleType != null) {\r
430                         handleAttributes(simpleType);\r
431                 }\r
432         }\r
433         \r
434         protected Set<Annotated> handleAttributeCompositions(SchemaObject obj, List<Annotated> attributeOrAttributeGroup) {\r
435                 \r
436                 Set<Annotated> handled = new HashSet<Annotated>();\r
437                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
438                         if (e.getValue() instanceof AttributeComposition) {\r
439                                 AttributeComposition composition = (AttributeComposition)e.getValue();\r
440                                 if (composition.getAttribute().size() < 2)\r
441                                         throw new RuntimeException("Attribute Composition is not valid");\r
442                                 BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> map = new BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated>();\r
443                                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {\r
444                                         for (Annotated annotated : attributeOrAttributeGroup) {\r
445                                                 if (annotated instanceof Attribute) {\r
446                                                         Attribute attribute = (Attribute)annotated;\r
447                                                         QName type = getBaseType(attribute);\r
448                                                         if (a.getName().equals(attribute.getName()) && type != null && a.getType().equals(type.getLocalPart())) {\r
449                                                                 map.map(a, attribute);\r
450                                                         }\r
451                                                 }\r
452                                         }\r
453                                 }\r
454                                 if (composition.getAttribute().size() == map.size()) {\r
455                                         handled.addAll(map.getRightSet());\r
456                                         handleAttributeComposition(obj, composition, map);      \r
457                                 }\r
458                         }\r
459                 }\r
460                 return handled;\r
461         }\r
462         \r
463         protected QName getBaseType(Attribute attribute) {\r
464                 if (attribute.getType() != null)\r
465                         return attribute.getType();\r
466                 if (attribute.getRef() != null)\r
467                         return attribute.getRef();\r
468                 SimpleType simpleType = attribute.getSimpleType();\r
469                 if (simpleType != null) {\r
470                         Restriction restriction = simpleType.getRestriction();\r
471                         if (restriction != null)\r
472                                 if (restriction.getBase() != null)\r
473                                         return restriction.getBase();\r
474                 }\r
475                 return null;\r
476         }\r
477         \r
478         protected QName getPrimitiveType(Attribute attribute) {\r
479                 QName type = getBaseType(attribute);\r
480                 String b = getBindingFromPrimitiveType(type);\r
481                 while (b==null && type != null) {\r
482                         SchemaObject baseType = simpleTypeName.get(type.getLocalPart());\r
483                         if (baseType != null) {\r
484                                 Restriction restriction = baseType.getSimpleType().getRestriction();\r
485                                 if (restriction != null)\r
486                                         if (restriction.getBase() != null) {\r
487                                                 type = restriction.getBase();\r
488                                                 b = getBindingFromPrimitiveType(type);\r
489                                         }\r
490                         }\r
491                 }\r
492                 return type;\r
493         }\r
494         \r
495         protected Attribute getRefAttribute(QName ref) {\r
496                 for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
497                         if (attrs instanceof TopLevelAttribute) {\r
498                                 TopLevelAttribute attribute = (TopLevelAttribute)attrs;\r
499                                 if (attribute.getName().equals(ref.getLocalPart()))\r
500                                         return attribute;\r
501                         }\r
502                 }\r
503                 return null;\r
504         }\r
505         \r
506         protected abstract void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes);\r
507         \r
508         \r
509         \r
510         \r
511         protected void handleComplexType(SchemaObject complexType) {\r
512                 handleComplexTypeAttributes(complexType);\r
513                 handleComplexTypeExtension(complexType);\r
514                 handleExtensionAttributes(complexType);\r
515         }\r
516         \r
517         protected enum RefType{Element,Reference,Type};\r
518         \r
519         protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType);\r
520         protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any);\r
521         protected abstract void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements);\r
522         \r
523         protected void handle(SchemaObject parent, ExplicitGroup eg, SchemaElement.ElementType indicator) {\r
524                 handle(parent, new SchemaElement(eg, indicator));\r
525         }\r
526         \r
527         protected void handle(SchemaObject parent, SchemaElement indicator) {\r
528                 \r
529                 \r
530                 List<SchemaElement> elements = new ArrayList<SchemaElement>();\r
531                 List<SchemaElement> choices = new ArrayList<SchemaElement>();\r
532                 List<SchemaElement> sequences = new ArrayList<SchemaElement>();\r
533                 List<SchemaElement> alls = new ArrayList<SchemaElement>();\r
534                 List<SchemaElement> anys = new ArrayList<SchemaElement>();\r
535                 \r
536                 for (Object o : indicator.getGroup().getParticle()) {\r
537                         if (o instanceof JAXBElement<?>) {\r
538                                 JAXBElement<?> element = (JAXBElement<?>)o;\r
539                                 Object elemValue = element.getValue();\r
540                                 if (elemValue instanceof LocalElement) {\r
541                                         LocalElement localElement = (LocalElement)elemValue;\r
542                                         elements.add(new SchemaElement(indicator,localElement, ElementType.ELEMENT));\r
543                                 } else if (elemValue instanceof All) {\r
544                                         alls.add(new SchemaElement(indicator,(All)elemValue, ElementType.ALL));\r
545                                 } else if (elemValue instanceof ExplicitGroup) {\r
546                                         QName qname = element.getName();\r
547                                         if ("choice".equals(qname.getLocalPart())) {\r
548                                                 choices.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.CHOICE));\r
549                                         } else if ("sequence".equals(qname.getLocalPart())) {\r
550                                                 sequences.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.SEQUENCE));\r
551                                         }\r
552                                 } else {\r
553                                         throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName());\r
554                                 }\r
555                         } else if (o instanceof Any){\r
556                                 anys.add(new SchemaElement(indicator,(Any)o, ElementType.ANY));\r
557                         } else {\r
558                                 throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName());\r
559                         }\r
560                 }\r
561                 \r
562                 if (elements.size() == 0 && choices.size() == 0 && sequences.size() == 0 && alls.size() == 0 && anys.size() == 0) {\r
563                         return;\r
564                 }\r
565                 \r
566                 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE) {\r
567                         if (indicator.getRestriction().single()) {\r
568                                 if (elements.size() > 0) {\r
569                                         for (SchemaElement e : sequences) {\r
570                                                 handle(parent, e);\r
571                                         }\r
572                                         for (SchemaElement c : choices) {\r
573                                                 handle(parent, c);\r
574                                         }\r
575                                         \r
576                                         for (SchemaElement c : alls) {\r
577                                                 handle(parent, c);\r
578                                         }\r
579                                         handle(parent, indicator, elements);\r
580                                         for (SchemaElement a : anys) {\r
581                                                 handleIndicator(parent, indicator, a);\r
582                                         }\r
583                                 } else {\r
584                                         if (sequences.size() > 0) {\r
585                                                 throw new RuntimeException("Cannot handle Sequence with inner Sequences");\r
586                                         }\r
587                                         for (SchemaElement c : choices) {\r
588                                                 handle(parent, c);\r
589                                         }\r
590                                         for (SchemaElement a : anys) {\r
591                                                 handleIndicator(parent, indicator, a);\r
592                                         }\r
593                                 }\r
594                         } else {\r
595                                 if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0) {\r
596                                         throw new RuntimeException("Cannot handle Sequence with inner ExplicitGroups");\r
597                                 }\r
598                                 handle(parent, indicator, elements);\r
599                                 for (SchemaElement a : anys) {\r
600                                         handleIndicator(parent, indicator, a);\r
601                                 }\r
602                         }\r
603                 \r
604                 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE){\r
605                         if (indicator.getRestriction().single()) {\r
606                                 if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0) {\r
607                                         throw new RuntimeException("Cannot handle Choice that contains something else than Elements");\r
608                                 }\r
609                                 handle(parent, indicator, elements);\r
610                                 \r
611                         } else {\r
612                                 if (sequences.size() > 0 || choices.size() > 0) {\r
613                                         throw new RuntimeException("Cannot handle Choice with inner ExplicitGroups");\r
614                                 }\r
615                                 handle(parent, indicator,  elements);\r
616                                 for (SchemaElement a : anys) {\r
617                                         handleIndicator(parent, indicator, a);\r
618                                 }\r
619                         }\r
620                 } else if (indicator.getType() == ElementType.ALL) {\r
621                         if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0) {\r
622                                 throw new RuntimeException("Cannot handle All that contains something else than Elements");\r
623                         }\r
624                         if (!indicator.getRestriction().single()) {\r
625                                 throw new RuntimeException("All indicator must have maxOccurs=1");\r
626                         }\r
627                         handle(parent, indicator, elements);\r
628                 }\r
629         }\r
630         \r
631         \r
632         protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) {\r
633                 Element localElement = element.getElement();\r
634                 if (localElement.getName() != null) {\r
635                         SchemaObject eObj = elements.get(localElement); \r
636                         QName refType = localElement.getType();\r
637                         if (refType != null)\r
638                                 handleIndicator(parent, indicator, element, null, RefType.Type);\r
639                         else {\r
640                                 handleElement(eObj);\r
641                                 handleIndicator(parent, indicator, element, null, RefType.Element);\r
642                         }\r
643                 } else if (localElement.getRef() != null) {\r
644                         handleIndicator(parent, indicator,element, null, RefType.Reference);\r
645                 }\r
646         }\r
647         \r
648         protected String getElementName(Element localElement) {\r
649                 if (localElement.getName() != null) {\r
650                         String refName = localElement.getName();\r
651                         QName refType = localElement.getType();\r
652                         if (refType != null)\r
653                                 return refName;\r
654                 } else if (localElement.getRef() != null) {\r
655                         QName refType = localElement.getRef();\r
656                         if (refType != null)\r
657                                 return refType.getLocalPart();\r
658                 }\r
659                 return null;\r
660         }\r
661         \r
662         protected String getChoiceName(List<SchemaElement> elements) {\r
663                 if (elements.size() == 1) {\r
664                         return getElementName(elements.get(0).getElement());\r
665                 }\r
666                 List<String> names = new ArrayList<String>();\r
667                 for (SchemaElement e : elements) {\r
668                         String name = getElementName(e.getElement());\r
669                         if (name != null)\r
670                                 names.add(name);\r
671                 }\r
672                 String name = "";\r
673                 for (int i = 0; i < names.size(); i++) {\r
674                         if (i == 0)\r
675                                 name = names.get(i);\r
676                         else\r
677                                 name += "Or"+names.get(i);\r
678                 }\r
679                 return name;\r
680         }\r
681         \r
682         \r
683         protected abstract void handle(SchemaObject parent, Attribute attribute) ;\r
684         protected abstract void handle(SchemaObject parent, AttributeGroup attribute) ;\r
685         \r
686         protected abstract void handleSimpleType(SchemaObject parent, SchemaObject simpleType);\r
687         \r
688         \r
689         \r
690         protected void handleComplexTypeExtension(SchemaObject complexTypeObj) {\r
691                 ComplexType complexType = complexTypeObj.getComplexType();\r
692                 if (complexType != null) {\r
693                         if (complexType.getChoice() != null)\r
694                                 handle(complexTypeObj, complexType.getChoice(), SchemaElement.ElementType.CHOICE);\r
695                         if (complexType.getSequence() != null)\r
696                                 handle(complexTypeObj, complexType.getSequence(), SchemaElement.ElementType.SEQUENCE);\r
697                         if (complexType.getAll() != null)\r
698                                 handle(complexTypeObj, complexType.getAll(), SchemaElement.ElementType.ALL);\r
699                         if (complexType.getGroup() != null)\r
700                                 throw new RuntimeException("Groups not supported");\r
701                         ComplexContent complexContent = complexType.getComplexContent();\r
702                         if (complexContent != null) {\r
703                                 ExtensionType extensionType = complexContent.getExtension();\r
704                                 if (extensionType != null) {\r
705                                         if (extensionType.getChoice() != null) {\r
706                                                 handle(complexTypeObj, extensionType.getChoice(), SchemaElement.ElementType.CHOICE);\r
707                                         }\r
708                                         if (extensionType.getSequence()!= null) {\r
709                                                 handle(complexTypeObj, extensionType.getSequence(), SchemaElement.ElementType.SEQUENCE);\r
710                                         }\r
711                                         if (extensionType.getAll()!= null) {\r
712                                                 handle(complexTypeObj, extensionType.getAll(), SchemaElement.ElementType.ALL);\r
713                                         }\r
714                                         if (extensionType.getGroup() != null) {\r
715                                                 throw new RuntimeException("Groups not supported");\r
716                                         }\r
717                                 }\r
718                         }\r
719 //                      SimpleContent simpleContent = complexType.getSimpleContent();\r
720 //                      if (simpleContent != null) {\r
721 //                              ExtensionType extensionType = simpleContent.getExtension();\r
722 //                      }\r
723                 }\r
724         }\r
725         \r
726         protected void handleElement(SchemaObject topLevelElement) {\r
727                 LocalComplexType complexType = topLevelElement.getElement().getComplexType();\r
728                 \r
729                 if (complexType != null) {\r
730                         SchemaObject complextTypeObj = complexTypes.get(complexType);\r
731                         handleElementComplexTypeAttributes(complextTypeObj);\r
732                         handleComplexTypeExtension(complextTypeObj);\r
733                 }\r
734                 \r
735                 \r
736         }\r
737         \r
738         \r
739         protected boolean isElementRef(String ref) {\r
740                 return elementName.containsKey(ref);\r
741         }\r
742         \r
743         protected boolean isComplexTypeRef(String ref) {\r
744                 return complexTypeName.containsKey(ref);\r
745         }\r
746         \r
747         protected boolean isSimpleTypeRef(String ref) {\r
748                 return simpleTypeName.containsKey(ref);\r
749         }\r
750         \r
751         protected NamedAttributeGroup getAttributeGroup(String name) {\r
752                 for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
753                         if (attrs instanceof NamedAttributeGroup) {\r
754                                 NamedAttributeGroup group = (NamedAttributeGroup)attrs;\r
755                                 if (group.getName().equals(name))\r
756                                         return group;\r
757                         }\r
758                 }\r
759                 return null;\r
760         }\r
761         \r
762         protected IDProvider getIDProvider(Element element) {\r
763                 List<IDProvider> idProviders = new ArrayList<IDProvider>(2);\r
764                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
765                         if (e.getValue() instanceof IDProvider) {\r
766                                 IDProvider ref = (IDProvider)e.getValue();\r
767                                 org.simantics.xml.sax.configuration.Element element2 = ref.getElement();\r
768                                 if (element2 != null) {\r
769                                         if (element.getName().equals(element2.getName()))\r
770                                                 idProviders.add(ref);\r
771                                 }\r
772                                 \r
773                         }\r
774                 }\r
775                 if (idProviders.size() == 0)\r
776                         return null;\r
777                 if (idProviders.size() > 1)\r
778                         throw new RuntimeException("Element " + element.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed.");\r
779                 return idProviders.get(0);\r
780         }\r
781         \r
782         protected IDProvider getIDProvider(ComplexType complexType) {\r
783                 List<IDProvider> idProviders = new ArrayList<IDProvider>(2);\r
784                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
785                         if (e.getValue() instanceof IDProvider) {\r
786                                 IDProvider ref = (IDProvider)e.getValue();\r
787                                 org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType();\r
788                                 if (complexType2 != null) {\r
789                                         if (complexType.getName().equals(complexType2.getName()))\r
790                                                 idProviders.add(ref);\r
791                                 }\r
792 \r
793                         }\r
794                 }\r
795                 if (idProviders.size() == 0)\r
796                         return null;\r
797                 if (idProviders.size() > 1)\r
798                         throw new RuntimeException("Element " + complexType.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed.");\r
799                 return idProviders.get(0);\r
800         }\r
801         \r
802         protected List<IDReference> getIDReferences(Element element) {\r
803                 List<IDReference> idReferences = new ArrayList<IDReference>(2);\r
804                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
805                         if (e.getValue() instanceof IDReference) {\r
806                                 IDReference ref = (IDReference)e.getValue();\r
807                                 org.simantics.xml.sax.configuration.Element element2 = ref.getElement();\r
808                                 if (element2 != null) {\r
809                                         if (element.getName().equals(element2.getName()))\r
810                                                 idReferences.add(ref);\r
811                                 }\r
812                         }\r
813                 }\r
814                 return idReferences;\r
815         }\r
816         \r
817         protected List<IDReference> getIDReferences(ComplexType complexType) {\r
818                 List<IDReference> idReferences = new ArrayList<IDReference>(2);\r
819                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
820                         if (e.getValue() instanceof IDReference) {\r
821                                 IDReference ref = (IDReference)e.getValue();\r
822                                 org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType();\r
823                                 if (complexType2 != null) {\r
824                                         if (complexType.getName().equals(complexType2.getName()))\r
825                                                 idReferences.add(ref);\r
826                                 }\r
827                         }\r
828                 }\r
829                 return idReferences;\r
830         }\r
831         \r
832         public UnrecognizedChildElement getUnknown(ComplexType complexType) {\r
833                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
834                         if (e.getValue() instanceof UnrecognizedChildElement) {\r
835                                 UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue();\r
836                                 org.simantics.xml.sax.configuration.ComplexType complexType2 = rule.getComplexType();\r
837                                 if (complexType2 != null) {\r
838                                         if (complexType.getName().equals(complexType2.getName()))\r
839                                                 return rule;\r
840                                 }\r
841                         }\r
842                 }\r
843                 return null;\r
844         }\r
845         \r
846         public UnrecognizedChildElement getUnknown(Element element) {\r
847                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
848                         if (e.getValue() instanceof UnrecognizedChildElement) {\r
849                                 UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue();\r
850                                 org.simantics.xml.sax.configuration.Element element2 = rule.getElement();\r
851                                 if (element2 != null) {\r
852                                         if (element.getName().equals(element2.getName()))\r
853                                                 return rule;\r
854                                 }\r
855                         }\r
856                 }\r
857                 return null;\r
858         }\r
859         \r
860         public Rename getRename(Attribute element) {\r
861                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
862                         if (e.getValue() instanceof Rename) {\r
863                                 Rename rule = (Rename)e.getValue();\r
864                                 Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
865                                 if (!(ref instanceof org.simantics.xml.sax.configuration.Attribute))\r
866                                         continue;\r
867                                 org.simantics.xml.sax.configuration.Attribute element2 = (org.simantics.xml.sax.configuration.Attribute)ref;\r
868                                 if (element2.getName().equals(element.getName())) {\r
869                                         return rule;\r
870                                 }\r
871                         }\r
872                 }\r
873                 return null;\r
874         }\r
875         \r
876         public Rename getRename(ComplexType element) {\r
877                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
878                         if (e.getValue() instanceof Rename) {\r
879                                 Rename rule = (Rename)e.getValue();\r
880                                 Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
881                                 if (!(ref instanceof org.simantics.xml.sax.configuration.ComplexType))\r
882                                         continue;\r
883                                 org.simantics.xml.sax.configuration.ComplexType element2 = (org.simantics.xml.sax.configuration.ComplexType)ref;\r
884                                 if (element2.getName().equals(element.getName())) {\r
885                                         return rule;\r
886                                 }\r
887                         }\r
888                 }\r
889                 return null;\r
890         }\r
891         \r
892         public Rename getRename(Element element) {\r
893                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
894                         if (e.getValue() instanceof Rename) {\r
895                                 Rename rule = (Rename)e.getValue();\r
896                                 Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
897                                 if (!(ref instanceof org.simantics.xml.sax.configuration.Element))\r
898                                         continue;\r
899                                 org.simantics.xml.sax.configuration.Element element2 = (org.simantics.xml.sax.configuration.Element)ref;\r
900                                 if (element2.getName().equals(element.getName())) {\r
901                                         return rule;\r
902                                 }\r
903                         }\r
904                 }\r
905                 return null;\r
906         }\r
907          \r
908         \r
909         public boolean useOriginalList(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, QName refType) {\r
910                 if (parent.getName() == null)\r
911                         parent = parent.getParent();\r
912                 if (parent.getName().contains("PipingNetworkSegment"))\r
913                         System.out.println();\r
914                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
915                         if (e.getValue() instanceof OrderedChild) {\r
916                                 OrderedChild oc = (OrderedChild)e.getValue();\r
917                                 org.simantics.xml.sax.configuration.Element element2 = oc.getElement();\r
918                                 org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType();\r
919                                 org.simantics.xml.sax.configuration.Element child = oc.getChild();\r
920                                 if (!oc.getType().equals("original"))\r
921                                         continue;\r
922                                 boolean match = false;\r
923                                 if (element2 != null) {\r
924                                         if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) {\r
925                                                 match = true;\r
926                                         }\r
927                                 } else if (complexType != null) {\r
928                                         if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) {\r
929                                                 match = true;\r
930                                         }\r
931                                         \r
932                                 }\r
933                                 if (match) {\r
934                                         if (child != null) {\r
935                                                 if (matchChild(child, ref, refType)) {\r
936                                                         if (oc.getValue().equals("disable"))\r
937                                                                 return false;\r
938                                                         else return true;\r
939                                                 }\r
940                                         } else { \r
941                                                 if (oc.getValue().equals("disable"))\r
942                                                         return false;\r
943                                                 return true;\r
944                                         }\r
945                                         \r
946                                 }\r
947                         }\r
948                 }\r
949                 return indicator.order();\r
950         }\r
951         \r
952         public boolean useElementList(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String refName, QName refType) {\r
953                 if (parent.getName() == null)\r
954                         parent = parent.getParent();\r
955                 if (parent.getName() == "PipingNetworkSegment")\r
956                         System.out.println();\r
957                 for (JAXBElement<?> e : configuration.getConversionRule()) {\r
958                         if (e.getValue() instanceof OrderedChild) {\r
959                                 OrderedChild oc = (OrderedChild)e.getValue();\r
960                                 org.simantics.xml.sax.configuration.Element element2 = oc.getElement();\r
961                                 org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType();\r
962                                 org.simantics.xml.sax.configuration.Element child = oc.getChild();\r
963                                 if (!oc.getType().equals("child"))\r
964                                         continue;\r
965                                 boolean match = false;\r
966                                 if (element2 != null) {\r
967                                         if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) {\r
968                                                 match = true;\r
969                                         }\r
970                                 } else if (complexType != null) {\r
971                                         if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) {\r
972                                                 match = true;\r
973                                         }\r
974                                         \r
975                                 }\r
976                                 if (match) {\r
977                                         if (child != null) {\r
978                                                 if (matchChild(child, refName, refType)) {\r
979                                                         if (oc.getValue().equals("disable"))\r
980                                                                 return false;\r
981                                                         else return true;\r
982                                                 }\r
983                                         } else {\r
984                                                 if (oc.getValue().equals("disable"))\r
985                                                         return false;\r
986                                                 return true;\r
987                                         }\r
988                                         \r
989                                 }\r
990                         }\r
991                 }\r
992                 return element.many() && element.order();\r
993         }\r
994         \r
995         private boolean matchChild(org.simantics.xml.sax.configuration.Element child, String refName, QName refType) {\r
996                 if (refType != null && refType.getLocalPart().equals(child.getName()))\r
997                         return true;\r
998                 if (refName != null && refName.equals(child.getName()))\r
999                         return true;\r
1000                 return false;\r
1001         }\r
1002         \r
1003         public static class TypeEntry {\r
1004                 String l0Type;\r
1005                 String binding;\r
1006                 String javaType;\r
1007                 String defaultValue;\r
1008                 boolean id;\r
1009                 String getterPrefix;\r
1010                 String getterPostfix;\r
1011                 String stringPrefix;\r
1012                 String stringPostfix;\r
1013                 public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix) {\r
1014                         super();\r
1015                         this.l0Type = l0Type;\r
1016                         this.binding = binding;\r
1017                         this.javaType = javaType;\r
1018                         this.defaultValue = defaultValue;\r
1019                         this.id = false;\r
1020                         this.getterPrefix = getterPrefix;\r
1021                         this.getterPostfix = getterPostfix;\r
1022                         this.stringPrefix = stringPrefix;\r
1023                         this.stringPostfix = stringPostfix;\r
1024                 }\r
1025                 \r
1026                 public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix, boolean id) {\r
1027                         super();\r
1028                         this.l0Type = l0Type;\r
1029                         this.binding = binding;\r
1030                         this.javaType = javaType;\r
1031                         this.defaultValue = defaultValue;\r
1032                         this.id = id;\r
1033                         this.getterPrefix = getterPrefix;\r
1034                         this.getterPostfix = getterPostfix;\r
1035                         this.stringPrefix = stringPrefix;\r
1036                         this.stringPostfix = stringPostfix;\r
1037                 }\r
1038                 \r
1039                 public String getValueGetterMethod(String name) {\r
1040                         return getterPrefix + name + ".getValue()"+getterPostfix;\r
1041                 }\r
1042                 public String getValueGetter(String name) {\r
1043                         return getterPrefix + name+getterPostfix;\r
1044                 }\r
1045                 public String getValueGetter()\r
1046                 {\r
1047                         return getValueGetter("value");\r
1048                 }\r
1049                 \r
1050                 public String getToString(String name) {\r
1051                         return stringPrefix +"("+javaType+")"+name+stringPostfix;\r
1052                 }\r
1053                 \r
1054                 public String getElementToString(String name) {\r
1055                         return stringPrefix + name+stringPostfix;\r
1056                 }\r
1057                 \r
1058         }\r
1059         \r
1060         public enum InheritanceType{ComplexType,AtomicType,None};\r
1061         \r
1062         public static class Inheritance {\r
1063                 public String baseClass;\r
1064                 public InheritanceType type;\r
1065                 public TypeEntry atomicType;\r
1066                 \r
1067                 public Inheritance(String baseClass) {\r
1068                         this.baseClass = baseClass;\r
1069                         this.type = InheritanceType.None;\r
1070                 }\r
1071         }\r
1072         \r
1073         public abstract String getComplexTypePrefix();  \r
1074         \r
1075         public abstract String getAttributeGroupPrefix();\r
1076         \r
1077         public abstract String getName(SchemaObject obj);\r
1078         \r
1079         protected abstract String getBaseClass(ObjectType type);\r
1080         \r
1081         \r
1082         \r
1083         protected Inheritance getInheritance(SchemaObject topLevelObj) {\r
1084                 Inheritance inheritance = null;\r
1085                 if (topLevelObj.getType() == ObjectType.ELEMENT) {\r
1086                         Element topLevelElement = topLevelObj.getElement();\r
1087                         inheritance = new Inheritance(getBaseClass(ObjectType.ELEMENT));\r
1088                         if (topLevelElement.getType() != null) {\r
1089                                 QName type = topLevelElement.getType();\r
1090                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
1091                                         SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
1092         //                              if (obj == null)\r
1093         //                                      obj = simpleTypeName.get(type.getLocalPart());\r
1094                                         if (obj != null) {\r
1095                                                 inheritance.baseClass = getName(obj);\r
1096                                                 inheritance.type = InheritanceType.ComplexType;\r
1097                                         }\r
1098                                 } else {\r
1099                                         TypeEntry entry = getTypeEntry(type);\r
1100                                         if (entry != null) {\r
1101                                                 inheritance.type = InheritanceType.AtomicType;\r
1102                                                 inheritance.atomicType = entry;\r
1103                                         }\r
1104                                 }\r
1105                         }\r
1106                         if (inheritance.type == InheritanceType.None) {\r
1107                                 QName type = getElementBase(topLevelElement);\r
1108                                 if (type != null) {\r
1109                                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
1110                                                 SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
1111                                                 inheritance.baseClass = getName(obj);\r
1112                                                 inheritance.type = InheritanceType.ComplexType;\r
1113                                         } else {\r
1114                                                 TypeEntry entry = getTypeEntry(type);\r
1115                                                 if (entry != null) {\r
1116                                                         inheritance.type = InheritanceType.AtomicType;\r
1117                                                         inheritance.atomicType = entry;\r
1118                                                 }\r
1119                                         }\r
1120                                 }\r
1121                         }\r
1122                         if (inheritance.type == InheritanceType.None) {\r
1123                                 QName type = topLevelElement.getSubstitutionGroup();\r
1124                                 if (type != null) {\r
1125                                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
1126                                                 SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
1127                                                 inheritance.baseClass = getName(obj);\r
1128                                                 inheritance.type = InheritanceType.ComplexType;\r
1129                                         } else {\r
1130                                                 TypeEntry entry = getTypeEntry(type);\r
1131                                                 if (entry != null) {\r
1132                                                         inheritance.type = InheritanceType.AtomicType;\r
1133                                                         inheritance.atomicType = entry;\r
1134                                                 }\r
1135                                         }\r
1136                                 }\r
1137                         }\r
1138                 } else if (topLevelObj.getType() == ObjectType.COMPLEX_TYPE) {\r
1139                         ComplexType complexType = topLevelObj.getComplexType();\r
1140                         QName type = getComplexTypeBase(complexType);\r
1141                         inheritance = new Inheritance(getBaseClass(ObjectType.COMPLEX_TYPE));\r
1142                         if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {\r
1143                                 SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
1144                                 if (obj != null) {\r
1145                                         inheritance.baseClass = getName(obj);\r
1146                                         inheritance.type = InheritanceType.ComplexType;\r
1147                                 }\r
1148                         }\r
1149                         SimpleContent simpleContent = complexType.getSimpleContent();\r
1150                         if (simpleContent != null) {\r
1151                                 ExtensionType extensionType = simpleContent.getExtension();\r
1152                                 if (extensionType != null) {\r
1153                                         type = extensionType.getBase();\r
1154                                         getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
1155                                 }\r
1156                         }\r
1157                 }\r
1158                 \r
1159                 return inheritance;\r
1160         }       \r
1161         /**\r
1162          * Goes through chain of SimpleTypes until locates Atomic Type (type defined in XML schema). \r
1163          * @param type\r
1164          * @param topLevelObj\r
1165          * @param inheritance\r
1166          */\r
1167         protected void getAtomicTypeInheritance(QName type, SchemaObject topLevelObj, Inheritance inheritance) {\r
1168                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
1169                         SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
1170                         if (obj.getType() != ObjectType.SIMPLE_TYPE)\r
1171                                 throw new RuntimeException("SimpleContent does not use SimpleType definition");\r
1172                         SimpleType simpleType = obj.getSimpleType();\r
1173                         type = getSimpleTypeBase(simpleType);\r
1174                         getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
1175                 } else {\r
1176                         TypeEntry entry = getTypeEntry(type);\r
1177                         if (entry != null) {\r
1178                                 inheritance.type = InheritanceType.AtomicType;\r
1179                                 inheritance.atomicType = entry;\r
1180                         }\r
1181                 }\r
1182         }\r
1183 \r
1184 }\r