package org.simantics.xml.sax; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import org.simantics.utils.datastructures.BijectionMap; import org.simantics.utils.datastructures.Pair; import org.simantics.xml.sax.configuration.AttributeComposition; import org.simantics.xml.sax.configuration.Configuration; import org.simantics.xml.sax.configuration.IDProvider; import org.simantics.xml.sax.configuration.IDReference; import org.simantics.xml.sax.configuration.UnrecognizedChildElement; import org.w3._2001.xmlschema.Annotated; import org.w3._2001.xmlschema.Attribute; import org.w3._2001.xmlschema.AttributeGroup; import org.w3._2001.xmlschema.AttributeGroupRef; import org.w3._2001.xmlschema.ComplexType; import org.w3._2001.xmlschema.Element; import org.w3._2001.xmlschema.LocalComplexType; import org.w3._2001.xmlschema.LocalSimpleType; import org.w3._2001.xmlschema.NamedAttributeGroup; import org.w3._2001.xmlschema.OpenAttrs; import org.w3._2001.xmlschema.Restriction; import org.w3._2001.xmlschema.Schema; import org.w3._2001.xmlschema.SimpleType; import org.w3._2001.xmlschema.TopLevelAttribute; public class ImporterGenerator extends SchemaConversionBase{ public ImporterGenerator(Configuration configuration) { super(configuration); } String commentTag = "//"; Schema schema; String ontologyClassName; SchemaConverter converter; List ruleClassNames = new ArrayList(); String ontShort = "ONT"; File importParserDir; String elementPackageName; public void createParser(Schema schema,String className, SchemaConverter converter) throws IOException { this.schema = schema; this.ontologyClassName = className; this.converter = converter; String packageParts[] = className.split("\\."); String name = packageParts[packageParts.length-1]; ontShort = name.substring(0, 3).toUpperCase(); ontShort +="."; String parserPackagePostfix = "_elem"; String importerClassPostfix = "Importer"; elementPackageName = name+parserPackagePostfix; importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName); if (!importParserDir.exists()) importParserDir.mkdirs(); handle(schema); File importParserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java"); PrintWriter mainWriter = createFile(importParserFile); mainWriter.println("package " + converter.getPluginName() +";"); mainWriter.println(); mainWriter.println("import java.io.File;"); mainWriter.println("import org.simantics.db.Session;"); mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;"); mainWriter.println("import org.simantics.xml.sax.base.XMLParser;"); mainWriter.println(); mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {"); mainWriter.println(); mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {"); mainWriter.println(" super(session,file);"); mainWriter.println(" }"); mainWriter.println(); mainWriter.println(" @Override"); mainWriter.println(" public void configure(XMLParser parser) {"); for (String s : ruleClassNames) { mainWriter.println(" parser.add(new "+s+"());"); } mainWriter.println(" }"); mainWriter.println("}"); mainWriter.println(); mainWriter.flush(); mainWriter.close(); } protected PrintWriter createFile(File file) throws IOException { if (!file.exists()) file.createNewFile(); PrintWriter writer = new PrintWriter(file); for (String s : converter.getHeader()) { writer.println(commentTag + " " + s); } writer.println(); return writer; } // protected String getValueGetter(String binding,String name) { // if (binding == null) // return name+".getValue()"; // if ("STRING".equals(binding)) // return name+".getValue()"; // if ("BOOLEAN".equals(binding)) // return "Boolean.parseBoolean("+name+".getValue())"; // if ("INTEGER".equals(binding)) // return "Integer.parseInt("+name+".getValue())"; // if ("DOUBLE".equals(binding)) // return "Double.parseDouble("+name+".getValue())"; // if ("FLOAT".equals(binding)) // return "Float.parseFloat("+name+".getValue())"; // return name+".getValue()"; // } // protected String getValueGetter(String binding) { // if (binding == null) // return "value"; // if ("STRING".equals(binding)) // return "value"; // if ("BOOLEAN".equals(binding)) // return "Boolean.parseBoolean(value)"; // if ("INTEGER".equals(binding)) // return "Integer.parseInt(value)"; // if ("DOUBLE".equals(binding)) // return "Double.parseDouble(value)"; // if ("FLOAT".equals(binding)) // return "Float.parseFloat(value)"; // return "value"; // } protected String getValueGetter(TypeEntry binding,String name) { if (binding == null) return name+".getValue()"; return binding.getValueGetter(name); } protected String getValueGetter(TypeEntry binding) { if (binding == null) return "value"; return binding.getValueGetter(); } protected void handle(TopLevelAttribute topLevelAttribute) { } public static String getComplexTypePrefix() { return "ComplexTypes_"; } public static String getAttributeGroupPrefix() { return "AttributeGroups_"; } private Map writers = new HashMap(); @Override protected void handleComplexType(SchemaObject complexTypeObj) { ComplexType topLevelComplexType = complexTypeObj.getComplexType(); String name = getName(complexTypeObj);//topLevelComplexType.getName(); String className = name;//"_"+name; FileWriter fw = new FileWriter(); try { fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); } catch (IOException e) { throw new RuntimeException(e); } writers.put(complexTypeObj, fw); boolean isList = false; String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; boolean inherited = false; QName type = getComplexTypeBase(topLevelComplexType); if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) { baseClass = getName(complexTypeName.get(type.getLocalPart())); inherited = true; } provider = getIDProvider(topLevelComplexType); List references = getIDReferences(topLevelComplexType); UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType); List intrerfaces = new ArrayList(); if (references.size() > 0) intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); if (unknownChildElement != null) intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); createClassHeader(fw.writer, isList); writeClass(fw.writer,true, null, className, baseClass, intrerfaces); writeIDProvider(fw.writer); fw.writer.println(" @Override"); fw.writer.println(" public Resource create(WriteGraph graph, Element element) throws DatabaseException{"); fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); fw.writer.println(" "+getOntologyImport()); if (!isList) { fw.writer.println(" Resource res = graph.newResource();"); fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); } else { fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);"); } fw.writer.println(" return res;"); fw.writer.println(" }"); fw.writer.println(); fw.writer.println(" @Override"); fw.writer.println(" public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{"); fw.writer.println(" "+getOntologyImport()); fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());"); fw.writer.println(" return true;"); fw.writer.println(" }"); fw.writer.println(); StringWriter stringWriter = new StringWriter(); fw.delayedWriter = new PrintWriter(stringWriter); StringWriter stringWriter2 = new StringWriter(); fw.delayedWriter2 = new PrintWriter(stringWriter2); fw.writer.println(" public " + className + "() {"); fw.writer.println(" super();"); handleComplexTypeExtension(complexTypeObj); fw.writer.println(" }"); fw.writer.println(" @Override"); fw.writer.println(" public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{"); fw.writer.println(" "+getOntologyImport()); if (stringWriter.getBuffer().length() > 0) { fw.writer.write(stringWriter.toString()); } fw.writer.println(" return false;"); fw.writer.println(" }"); fw.writer.println(); if (stringWriter2.getBuffer().length() > 0) { fw.writer.write(stringWriter2.toString()); } stringWriter = null; fw.delayedWriter.close(); fw.delayedWriter=null; stringWriter2 = null; fw.delayedWriter2.close(); fw.delayedWriter2 = null; fw.writer.println(" @Override"); fw.writer.println(" public void configure(WriteGraph graph, Deque parents, Element element) throws DatabaseException {"); if (inherited) { fw.writer.println(" super.configure(graph,parents,element);"); } fw.writer.println(" "+getOntologyImport()); handleComplexTypeAttributes(complexTypeObj); handleExtensionAttributes(complexTypeObj); fw.writer.println(" }"); writeIDReferences(fw.writer,name, references); writeUnknownChild(fw.writer,name,unknownChildElement); fw.writer.println("}"); fw.writer.println(); fw.writer.flush(); fw.writer.close(); fw.writer = null; writers.remove(complexTypeObj); provider = null; } @Override protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { for (SchemaElement e : elements) { handle(parent, indicator, e); } } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) { String name = getChoiceName(elements); for (SchemaElement e : elements) { Element localElement = e.getElement(); if (localElement.getName() != null) { QName refType = localElement.getType(); if (refType != null) handleIndicator(parent, indicator, e, false, name, refType); } else if (localElement.getRef() != null) { QName refType = localElement.getRef(); handleIndicator(parent, indicator, e, true, name, refType); } } } } @Override protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String ref, QName refType) { FileWriter fw = getWriter(parent); String binding = getBindingFromPrimitiveType(refType); if (binding == null) { SchemaObject refElement = elementName.get(refType.getLocalPart()); SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart()); // String className = refType.getLocalPart(); // if (!isElementRef(refType.getLocalPart())) { // className = "_"+className; // } // // String refClassName = refType.getLocalPart(); // if (isComplexTypeRef(refClassName)) { // refClassName = "_"+refClassName; // } String className = null; String refClassName = null; if (refElement != null) className = getName(refElement); else className = getName(refComplexType); if (refComplexType != null) { refClassName = getName(refComplexType); } else { refClassName = getName(refElement); } if (!reference) fw.writer.println(" addParser(\""+ ref +"\", "+className+".class);"); else fw.writer.println(" addParser("+className+".class);"); if (!className.equals(refClassName)) fw.writer.println(" addParser("+refClassName+".class);"); fw.delayedWriter.println(" if (child.getParser() instanceof "+refClassName+"){"); fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());"); if (useElementList(parent, indicator,element, reference, ref, refType)) { // element type specific list fw.delayedWriter.println(" {"); fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);"); fw.delayedWriter.println(" if (list == null) {"); fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);"); fw.delayedWriter.println(" } else {"); fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); fw.delayedWriter.println(" }"); fw.delayedWriter.println(" }"); } if (useOriginalList(parent, indicator,element, reference, ref, refType)) { // generic list fw.delayedWriter.println(" {"); //fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);"); fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);"); fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);"); fw.delayedWriter.println(" if (list == null) {"); fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); //fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);"); fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);"); fw.delayedWriter.println(" } else {"); fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); fw.delayedWriter.println(" }"); fw.delayedWriter.println(" }"); } fw.delayedWriter.println(" return true;"); fw.delayedWriter.println(" }"); } else { //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " getParser(java.util.Map parsers, Element element, Element child) {"); fw.delayedWriter2.println(" Class parserClass = super.getParser(parsers, element, child);"); fw.delayedWriter2.println(" if (parserClass != null) return parserClass;"); fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());"); fw.delayedWriter2.println(" if (parser != null) return parser.getClass();"); fw.delayedWriter2.println(" return null;"); fw.delayedWriter2.println(" }"); } private FileWriter getWriter(SchemaObject obj) { SchemaObject s = obj; while (s != null) { FileWriter fw = writers.get(s); if (fw != null) return fw; s = s.getParent(); } return null; } @Override protected void handle(SchemaObject parent, Attribute attribute) { String name = attribute.getName(); QName primitiveType = attribute.getType(); SimpleType simpleType = attribute.getSimpleType(); QName ref = attribute.getRef(); String relationName; String attrName; if (name != null) { attrName = name; relationName = ontShort+"has"+name; if (parent != null) relationName = ontShort+getName(parent)+"_has"+name; } else if (ref != null && parent != null) { attrName = ref.getLocalPart(); relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart(); Attribute referred = getRefAttribute(ref); if (referred != null) { primitiveType = referred.getType(); simpleType = referred.getSimpleType(); } } else { throw new RuntimeException(); } boolean isReference = false; if (provider!= null && provider.getAttribute().getName().equals(attrName)) isReference = true; FileWriter fw = getWriter(parent); if (primitiveType != null) { //String binding = getBindingFromPrimitiveType(primitiveType); TypeEntry binding = getTypeEntry(primitiveType); if (binding != null) { writeAttribute(fw, attrName, relationName, binding, isReference); return; } else { if (simpleType == null) { SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart()); if (simpleTypeObj != null) simpleType = simpleTypeObj.getSimpleType(); } } } if (simpleType != null) { Restriction restriction = simpleType.getRestriction(); if (restriction == null) throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset"); QName base = restriction.getBase(); //String binding = getBindingFromPrimitiveType(base); TypeEntry binding = getTypeEntry(base); writeAttribute(fw, attrName, relationName, binding, isReference); } else { // TODO : using default String attribute should be configured with rules. //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()); fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String"); //writeAttribute(fw, attrName, relationName, "STRING", isReference); writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference); } } //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) { private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) { fw.writer.println(" {"); fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");"); fw.writer.println(" if (a != null) {"); fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetter(binding,"a")+", "+binding.binding+");"); if (isReference) fw.writer.println(" idProviderValue = a.getValue();"); fw.writer.println(" }"); fw.writer.println(" }"); } @Override protected void handleAttributes(SchemaObject simpleTypeObj) { SchemaObject parent = simpleTypeObj.getParent(); FileWriter fw = getWriter(parent); SimpleType simpleType = simpleTypeObj.getSimpleType(); Restriction restriction = simpleType.getRestriction(); if (restriction == null) throw new RuntimeException("Cannot resolve type for Element " + getName(parent)); QName base = restriction.getBase(); //String binding = getBindingFromPrimitiveType(base); TypeEntry binding = getTypeEntry(base); fw.writer.println(" @Override"); fw.writer.println(" public void configure(WriteGraph graph, Element element, java.lang.String value) throws DatabaseException {"); //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");"); fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");"); fw.writer.println(" }"); } @Override protected void handle(SchemaObject parent, AttributeGroup attribute) { if (parent != null) { FileWriter fw = getWriter(parent); NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart()); fw.writer.println(commentTag+" AttributeGroup " + group.getName()); SchemaObject obj = new SchemaObject(parent,attribute); for (Annotated annotated : group.getAttributeOrAttributeGroup()) { if (annotated instanceof Attribute) { //handle("AttributeGroups_"+group.getName(),(Attribute)annotated); handle(obj,(Attribute)annotated); } else if (annotated instanceof AttributeGroup) { //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated); handle(obj,(AttributeGroup)annotated); } } fw.writer.println(commentTag+" End of AttributeGroup " + group.getName()); } } @Override protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap attributes) { FileWriter fw = getWriter(parent); QName type = new QName(CONVERSION_NS, composition.getType()); String arrayBinding = getBindingFromPrimitiveType(type); String javaType = getJavaTypeFromPrimitiveType(type); String name = composition.getName(); String relationName; if (name != null) { relationName = ontShort+"has"+name; if (parent != null) relationName = ontShort+getName(parent)+"_has"+name; } else { throw new RuntimeException(); } fw.writer.println(" {"); int i = 0; for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");"); fw.writer.print (" "+javaType + " value = new "+javaType+"{"); i = 0; // FIXME : handle optional attributes properly. for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) { Attribute attribute = ((Attribute)attributes.getRight(a)); //QName atype = getBaseType(attribute); QName atype = getPrimitiveType(attribute); String defaultValue = attribute.getDefault(); if (defaultValue == null) defaultValue = getDefaultValue(atype); //String binding = getBindingFromPrimitiveType(atype); TypeEntry binding = getTypeEntry(atype); if (i > 0) fw.writer.print(","); if (defaultValue != null) fw.writer.print("a"+(i)+"!= null ? "+ getValueGetter(binding,"a"+(i++)) + " : " +defaultValue); else fw.writer.print(getValueGetter(binding,"a"+(i++))); } fw.writer.println("};"); fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");"); fw.writer.println(" }"); } protected String getDefaultValue(QName atype) { Map types = typeMap.get(atype.getNamespaceURI()); if (types == null) return null; TypeEntry entry = types.get(atype.getLocalPart()); if (entry == null) return null; return entry.defaultValue; } @Override protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) { } IDProvider provider; @Override protected void handleElement(SchemaObject elementObj) { Element element = elementObj.getElement(); String name = getName(elementObj);//topLevelElement.getName(); String className = name; FileWriter fw = new FileWriter(); try { fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); } catch (IOException e) { throw new RuntimeException(e); } writers.put(elementObj, fw); boolean isList = false; Pair inhertiance = getElementInheritance(elementObj); boolean inherited = inhertiance.second; String baseClass = inhertiance.first;//"org.simantics.xml.sax.base.XMLElementParserBase"; provider = getIDProvider(element); List references = getIDReferences(element); UnrecognizedChildElement unknownChildElement = getUnknown(element); List intrerfaces = new ArrayList(); if (references.size() > 0) intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); if (unknownChildElement != null) intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); createClassHeader(fw.writer, isList); writeClass(fw.writer,false, element.getName(), className, baseClass, intrerfaces); writeIDProvider(fw.writer); fw.writer.println(" @Override"); fw.writer.println(" public Resource create(WriteGraph graph, Element element) throws DatabaseException{"); fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); fw.writer.println(" "+getOntologyImport()); if (!isList) { fw.writer.println(" Resource res = graph.newResource();"); fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); } else { fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);"); } fw.writer.println(" return res;"); fw.writer.println(" }"); fw.writer.println(); fw.writer.println(" @Override"); fw.writer.println(" public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{"); fw.writer.println(" "+getOntologyImport()); fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());"); fw.writer.println(" return true;"); fw.writer.println(" }"); fw.writer.println(); fw.writer.println(" @Override"); fw.writer.println(" public void configure(WriteGraph graph, Deque parents, Element element) throws DatabaseException {"); if (inherited) { fw.writer.println(" super.configure(graph,parents,element);"); } fw.writer.println(" "+getOntologyImport()); LocalComplexType complexType = element.getComplexType(); LocalSimpleType simpleType = element.getSimpleType(); if (complexType != null) { SchemaObject obj = complexTypes.get(complexType); handleElementComplexTypeAttributes(obj); } fw.writer.println(" }"); if (simpleType != null) { SchemaObject obj = simpleTypes.get(simpleType); handleElementSimpleTypeAttributes(obj); } StringWriter stringWriter = new StringWriter(); fw.delayedWriter = new PrintWriter(stringWriter); StringWriter stringWriter2 = new StringWriter(); fw.delayedWriter2 = new PrintWriter(stringWriter2); fw.writer.println(" public " + className + "() {"); fw.writer.println(" super();"); if (complexType != null) { SchemaObject obj = complexTypes.get(complexType); handleComplexTypeExtension(obj); } else if (simpleType != null) { } fw.writer.println(" }"); fw.writer.println(" @Override"); fw.writer.println(" public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{"); fw.writer.println(" "+getOntologyImport()); if (stringWriter.getBuffer().length() > 0) { fw.writer.write(stringWriter.toString()); } if (inherited) { fw.writer.println(" return super.connectChild(graph,element,child);"); } else { fw.writer.println(" return false;"); } fw.writer.println(" }"); fw.writer.println(); if (stringWriter2.getBuffer().length() > 0) { fw.writer.write(stringWriter2.toString()); } stringWriter = null; fw.delayedWriter.close(); fw.delayedWriter = null; stringWriter2 = null; fw.delayedWriter2.close(); fw.delayedWriter2 = null; writeIDReferences(fw.writer,name, references); writeUnknownChild(fw.writer,name,unknownChildElement); fw.writer.println("}"); fw.writer.println(); fw.writer.flush(); fw.writer.close(); fw.writer = null; writers.remove(elementObj); provider = null; ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name); } private Pair getElementInheritance(SchemaObject topLevelElementObj) { Element topLevelElement = topLevelElementObj.getElement(); String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; boolean inherited = false; if (topLevelElement.getType() != null) { QName type = topLevelElement.getType(); if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = complexTypeName.get(type.getLocalPart()); baseClass = getName(obj); inherited = true; } } if (!inherited) { QName type = getElementBase(topLevelElement); if (type != null) { if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); baseClass = getName(obj); inherited = true; } } } if (!inherited) { QName type = topLevelElement.getSubstitutionGroup(); if (type != null) { if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); baseClass = getName(obj); inherited = true; } } } return new Pair(baseClass, inherited); } private void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List interfaces) { writer.println("@SuppressWarnings(\"unused\")"); writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass); if (interfaces.size() > 0) { writer.print(" implements "); for (int i = 0; i < interfaces.size(); i++) { writer.print(interfaces.get(i)); if (i < interfaces.size() -1 ) writer.print(","); } } writer.println("{"); writer.println(); writer.println(" @Override"); writer.println(" public java.lang.String getElementId() {"); if (name != null) writer.println(" return \""+name+"\";"); else // complex types cannot be parsed directly with name/id reference. writer.println(" return null;"); writer.println(" }"); writer.println(); } private void writeIDProvider(PrintWriter writer) { if (provider != null) { writer.println(" java.lang.String idProviderValue = null;"); writer.println(); writer.println(" @Override"); writer.println(" public java.lang.String getID() {"); writer.println(" java.lang.String s = idProviderValue;"); writer.println(" idProviderValue = null;"); writer.println(" return s;"); writer.println(" }"); writer.println(); if (provider.getPriority() != null) { writer.println(" @Override"); writer.println(" public int idPriority() {"); writer.println(" return " + provider.getPriority().intValue()+";"); writer.println(" }"); } } } private void writeIDReferences(PrintWriter writer,String name, List references) { if (references.size() > 0) { writer.println(" @Override"); writer.println(" public boolean connectReferences(WriteGraph graph, Element element, java.util.Map map) throws DatabaseException {"); writer.println(" "+getOntologyImport()); writer.println(" boolean result = true;"); for (IDReference ref : references) { writer.println(" {"); writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");"); writer.println(" if (a != null) {"); writer.println(" Element refEle = map.get(a.value);"); writer.println(" if (refEle != null) {"); writer.println(" Resource ref = refEle.getData();"); writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);"); writer.println(" } else {"); writer.println(" result = false;"); writer.println(" }"); writer.println(" }"); writer.println(" }"); } writer.println(" return result;"); writer.println(" }"); writer.println(); } } private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) { if (unknownChildElement == null) return; writer.println(" @Override"); writer.println(" public void configureChild(WriteGraph graph, Deque parents, Element element, Element child) throws DatabaseException {"); writer.println(" " + unknownChildElement.getJavaMethod()); writer.println(" }"); writer.println(); } protected void createClassHeader(PrintWriter writer, boolean isList) { writer.println("package " + converter.getPluginName() +"."+elementPackageName+";"); writer.println(); writer.println("import java.util.Deque;"); writer.println("import org.simantics.databoard.Bindings;"); writer.println("import org.simantics.db.Resource;"); writer.println("import org.simantics.db.WriteGraph;"); writer.println("import org.simantics.db.exception.DatabaseException;"); writer.println("import org.simantics.xml.sax.base.Attribute;"); writer.println("import org.simantics.xml.sax.base.Element;"); writer.println("import org.simantics.xml.sax.ontology.XMLResource;"); if (!isList) { writer.println("import org.simantics.layer0.Layer0;"); } else { writer.println("import java.util.Collections;"); writer.println("import org.simantics.db.common.utils.ListUtils;"); } writer.println(); } private String getOntologyImport() { return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);"; } private static class FileWriter { public PrintWriter writer; public PrintWriter delayedWriter; public PrintWriter delayedWriter2; } public static String getName(SchemaObject obj) { if (obj.getParent() == null) { switch (obj.getType()) { case COMPLEX_TYPE: return getComplexTypePrefix()+obj.getName(); case ELEMENT: return obj.getName(); case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+obj.getName(); case SIMPLE_TYPE: return obj.getName(); } } else { SchemaObject o = obj; SchemaObject prev = null; String name = ""; while (o != null){ if (o.getName() != null) name = o.getName()+"_"+name; prev = o; o = o.getParent(); if (prev.getObj() instanceof AttributeGroupRef) o = null; } name = name.substring(0, name.length()-1); switch (prev.getType()) { case COMPLEX_TYPE: return getComplexTypePrefix()+name; case ELEMENT: return name; case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+name; case SIMPLE_TYPE: return name; } } throw new RuntimeException(); } public static String getName(SchemaObject obj, String rel) { if (obj.getParent() == null) { switch (obj.getType()) { case COMPLEX_TYPE: return getComplexTypePrefix()+rel+obj.getName(); case ELEMENT: return rel+obj.getName(); case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+rel+obj.getName(); case SIMPLE_TYPE: return rel+obj.getName(); } } else { SchemaObject o = obj; SchemaObject prev = null; String name = ""; while (o != null){ if (o.getName() != null) name = o.getName()+"_"+name; prev = o; o = o.getParent(); } name = name.substring(0, name.length()-1); switch (prev.getType()) { case COMPLEX_TYPE: return getComplexTypePrefix()+rel+name; case ELEMENT: return rel+name; case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+rel+name; case SIMPLE_TYPE: return rel+name; } } throw new RuntimeException(); } }