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