/** * This file is part of Archiv-Editor. * * The software Archiv-Editor serves as a client user interface for working with * the Person Data Repository. See: pdr.bbaw.de * * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy * of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin. * www.bbaw.de * * Copyright (C) 2010-2013 Berlin-Brandenburg Academy * of Sciences and Humanities * * The software Archiv-Editor was developed by @author: Christoph Plutte. * * Archiv-Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Archiv-Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Archiv-Editor. * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>. */ package org.bbaw.pdr.ae.config.core; import java.io.ByteArrayOutputStream; import java.util.HashMap; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.StartDocument; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.bbaw.pdr.ae.config.model.AspectConfigTemplate; import org.bbaw.pdr.ae.config.model.ComplexSemanticTemplate; import org.bbaw.pdr.ae.config.model.ConfigData; import org.bbaw.pdr.ae.config.model.ConfigItem; import org.bbaw.pdr.ae.config.model.DataType; import org.bbaw.pdr.ae.config.model.DatatypeDesc; import org.bbaw.pdr.ae.config.model.IdentifierConfig; import org.bbaw.pdr.ae.config.model.SemanticTemplate; /** * The Class ConfigXMLProcessor. * * @author Christoph Plutte */ public class ConfigXMLProcessor { /** dtdl prefix.*/ private static final String PREFIX = "dtdl"; /** namespace uri.*/ private static final String URI = "http://pdr.bbaw.de/namespaces/dtdl/"; /** * Creates the node. * * @param eventWriter * the event writer * @param name * the name * @param configData * the config data * @throws XMLStreamException * the xML stream exception */ private void createNode(final XMLEventWriter eventWriter, final String name, final ConfigData configData) throws XMLStreamException { ConfigItem i = (ConfigItem) configData; XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createCharacters("\n"); XMLEvent tab = eventFactory.createCharacters("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement(PREFIX, URI, name); eventWriter.add(tab); eventWriter.add(sElement); if (i.getPos() != null) { eventWriter.add(eventFactory.createAttribute("pos", i.getPos())); } if (i.getValue() != null) { eventWriter.add(eventFactory.createAttribute("value", i.getValue())); } if (i.getLabel() != null) { eventWriter.add(eventFactory.createAttribute("label", i.getLabel())); } eventWriter.add(eventFactory.createAttribute("ignore", new Boolean(i.isIgnore()).toString())); eventWriter.add(eventFactory.createAttribute("mandatory", new Boolean(i.isMandatory()).toString())); eventWriter.add(eventFactory.createAttribute("priority", String.format("%03d", i.getPriority()))); eventWriter.add(end); if (i.getDocumentation() != null) { createNode(eventWriter, "documentation", i.getDocumentation(), PREFIX, URI); } if (i.getChildren() != null) { for (String str2 : i.getChildren().keySet()) { createNode(eventWriter, "item", i.getChildren().get(str2)); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, name)); eventWriter.add(end); } /** * Creates the node. * * @param eventWriter * the event writer * @param name * the name * @param d * the d * @param string2 * the string2 * @param string3 * the string3 * @throws XMLStreamException * the xML stream exception */ private void createNode(final XMLEventWriter eventWriter, final String name, final HashMap<String, String> d, final String string2, final String string3) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createCharacters("\n"); XMLEvent tab = eventFactory.createCharacters("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement(string2, string3, name); eventWriter.add(tab); eventWriter.add(sElement); // FIXME nullpointer abfangen!!1 eventWriter.add(end); for (String str : d.keySet()) { createNode(eventWriter, "docPart", d.get(str), str, PREFIX, URI); } if (d.isEmpty()) { createNode(eventWriter, "docPart", "", "de", PREFIX, URI); } eventWriter.add(eventFactory.createEndElement(string2, string3, name)); eventWriter.add(end); } /** * Creates the node. * * @param eventWriter * the event writer * @param name * the name * @param textNode * the text node * @param prefix * the prefix * @param namespace * the namespace * @throws XMLStreamException * the xML stream exception */ private void createNode(final XMLEventWriter eventWriter, final String name, final String textNode, final String prefix, final String namespace) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createCharacters("\n"); XMLEvent tab = eventFactory.createCharacters("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement(PREFIX, URI, name); eventWriter.add(tab); eventWriter.add(sElement); eventWriter.add(end); if (textNode.trim().length() > 0) { Characters characters = eventFactory.createCharacters(textNode.trim()); eventWriter.add(characters); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, name)); eventWriter.add(end); } /** * Creates the node. * * @param eventWriter * the event writer * @param name * the name * @param value * the value * @param lang * the lang * @param string2 * the string2 * @param string3 * the string3 * @throws XMLStreamException * the xML stream exception */ private void createNode(final XMLEventWriter eventWriter, final String name, final String value, final String lang, final String string2, final String string3) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createCharacters("\n"); XMLEvent tab = eventFactory.createCharacters("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement(string2, string3, name); eventWriter.add(tab); eventWriter.add(sElement); eventWriter.add(eventFactory.createAttribute("xml:lang", lang)); eventWriter.add(end); if (value.trim().length() > 0) { Characters characters = eventFactory.createCharacters(value.trim()); eventWriter.add(characters); } eventWriter.add(eventFactory.createEndElement(string2, string3, name)); eventWriter.add(end); } /** * Write to xml. * * @param d * the d * @return the string * @throws XMLStreamException * the xML stream exception */ public final String writeToXML(final DatatypeDesc d) throws XMLStreamException { // Create a XMLOutputFactory XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // Create XMLEventWriter ByteArrayOutputStream bout = new ByteArrayOutputStream(); XMLEventWriter eventWriter = outputFactory .createXMLEventWriter(bout); // Create a EventFactory XMLEventFactory eventFactory = XMLEventFactory.newInstance(); // end = eventFactory.createDTD("\n"); XMLEvent end = eventFactory.createCharacters("\n"); // XMLEvent tab = eventFactory.createCharacters("\t"); // Create and write Start Tag StartDocument startDocument = eventFactory.createStartDocument(); eventWriter.add(startDocument); // Create config open tag StartElement startElement = eventFactory.createStartElement(PREFIX, URI, "datatypeDesc"); eventWriter.add(startElement); eventWriter.add(eventFactory.createNamespace(PREFIX, URI)); // TODO namespace und schema einkommentieren // eventWriter.add(eventFactory.createAttribute("xmlns:xsi", // "http://www.w3.org/2001/XMLSchema-instance")); // eventWriter.add(eventFactory.createAttribute("xsi:schemaLocation", // "http://pdr.bbaw.de/namespaces/dtdl/ http://pdr.bbaw.de/schema/dtdl.xsd")); eventWriter.add(eventFactory.createAttribute("provider", d.getProvider())); eventWriter.add(end); // Write the different nodes if (d.getDocumentation() != null) { createNode(eventWriter, "documentation", d.getDocumentation(), PREFIX, URI); } if (d.getUsage() != null) { startElement = eventFactory.createStartElement(PREFIX, URI, "usage"); eventWriter.add(startElement); eventWriter.add(end); if (d.getUsage().getDocumentation() != null) { createNode(eventWriter, "documentation", d.getUsage().getDocumentation(), PREFIX, URI); } if (d.getUsage().getUsageDisplay() != null) { startElement = eventFactory.createStartElement(PREFIX, URI, "display"); eventWriter.add(startElement); eventWriter.add(end); if (d.getUsage().getUsageDisplay().getDocumentation() != null) { createNode(eventWriter, "documentation", d.getUsage().getUsageDisplay().getDocumentation(), PREFIX, URI); } if (d.getUsage().getUsageDisplay().getPersonNameTag() != null) { for (String s : d.getUsage().getUsageDisplay().getPersonNameTag()) { createNode(eventWriter, "nameTag", s, PREFIX, URI); } } if (d.getUsage().getUsageDisplay().getPersonNormNameTag() != null) { for (String s : d.getUsage().getUsageDisplay().getPersonNormNameTag()) { createNode(eventWriter, "displayNameTag", s, PREFIX, URI); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "display")); eventWriter.add(end); } if (d.getUsage().getTemplates() != null) { startElement = eventFactory.createStartElement(PREFIX, URI, "templates"); eventWriter.add(startElement); eventWriter.add(end); if (d.getUsage().getTemplates() != null && !d.getUsage().getTemplates().getChildren().isEmpty() ) { for (String key : d.getUsage().getTemplates().getChildren().keySet()) { ConfigData cd = d.getUsage().getTemplates().getChildren().get(key); // aspectTemplates startElement = eventFactory.createStartElement(PREFIX, URI, key); eventWriter.add(startElement); eventWriter.add(end); if (cd.getChildren() != null) { for (String key2 : cd.getChildren().keySet()) { ConfigData cd2 = cd.getChildren().get(key2); startElement = eventFactory.createStartElement(PREFIX, URI, key2); // semanticTemplates // and // complexTemplates eventWriter.add(startElement); eventWriter.add(eventFactory.createAttribute("ignore", new Boolean(cd2.isIgnore()).toString())); eventWriter.add(end); if (cd2.getChildren() != null) { for (String key3 : cd2.getChildren().keySet()) { ConfigData cd3 = cd2.getChildren().get( key3); if (cd3 instanceof SemanticTemplate) { SemanticTemplate semanticTemplate = (SemanticTemplate) cd3; createNode(eventWriter, semanticTemplate); } else { if (cd3 instanceof ComplexSemanticTemplate) // complexTemplate { ComplexSemanticTemplate complexTemplate = (ComplexSemanticTemplate) cd3; startElement = eventFactory.createStartElement(PREFIX, URI, "complexTemplate"); // semanticTemplates eventWriter.add(startElement); eventWriter.add(eventFactory.createAttribute("value", complexTemplate.getValue())); eventWriter.add(eventFactory.createAttribute("label", complexTemplate.getLabel())); eventWriter.add(eventFactory.createAttribute("priority", new Integer(complexTemplate.getPriority()).toString())); eventWriter.add(end); if (cd3.getChildren() != null) { for (String key4 : cd3.getChildren().keySet()) { ConfigData cd4 = cd3.getChildren().get(key4); if (cd4 instanceof SemanticTemplate) { SemanticTemplate semanticTemplate = (SemanticTemplate) cd4; createNode(eventWriter, semanticTemplate); } else { } } } if (complexTemplate.getDocumentation() != null) { createNode(eventWriter, "documentation", complexTemplate.getDocumentation(), PREFIX, URI); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "complexTemplate")); eventWriter.add(end); } else { startElement = eventFactory.createStartElement(PREFIX, URI, key3); // semanticTemplates eventWriter.add(startElement); eventWriter.add(end); if (cd3.getChildren() != null) { for (String key4 : cd3.getChildren().keySet()) { ConfigData cd4 = cd3.getChildren().get(key4); if (cd4 instanceof SemanticTemplate) { SemanticTemplate semanticTemplate = (SemanticTemplate) cd4; createNode(eventWriter, semanticTemplate); } else { } } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, key3)); eventWriter.add(end); } } } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, key2)); eventWriter.add(end); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, key)); eventWriter.add(end); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "templates")); eventWriter.add(end); } if (d.getUsage().getIdentifiers() != null && d.getUsage().getIdentifiers().getChildren().size() > 0) { startElement = eventFactory.createStartElement(PREFIX, URI, "personIdentifiers"); // "personIdentifiers" eventWriter.add(startElement); eventWriter.add(end); for (String key : d.getUsage().getIdentifiers().getChildren().keySet()) { ConfigData ci = (ConfigData) d.getUsage().getIdentifiers().getChildren().get(key); if (ci != null && ci instanceof IdentifierConfig) { IdentifierConfig ic = (IdentifierConfig) ci; startElement = eventFactory.createStartElement(PREFIX, URI, "identifier"); // "identifier" eventWriter.add(startElement); if (ic.getValue() != null) { eventWriter.add(eventFactory.createAttribute("value", ic.getValue())); } if (ic.getLabel() != null) { eventWriter.add(eventFactory.createAttribute("label", ic.getLabel())); } eventWriter.add(eventFactory.createAttribute("ignore", new Boolean(ic.isIgnore()).toString())); eventWriter.add(eventFactory.createAttribute("mandatory", new Boolean(ic.isMandatory()).toString())); eventWriter.add(eventFactory.createAttribute("priority", String.format("%03d", ic.getPriority()))); if (ic.getUrl() != null) { eventWriter.add(eventFactory.createAttribute("url", ic.getUrl())); } if (ic.getPrefix() != null) { eventWriter.add(eventFactory.createAttribute("prefix", ic.getPrefix())); } if (ic.getSuffix() != null) { eventWriter.add(eventFactory.createAttribute("suffix", ic.getSuffix())); } if (ic.getRegex() != null) { eventWriter.add(eventFactory.createAttribute("regex", ic.getRegex())); } eventWriter.add(end); if (ic.getDocumentation() != null) { createNode(eventWriter, "documentation", ic.getDocumentation(), PREFIX, URI); } if (ic.getChildren() != null) { for (String str2 : ic.getChildren().keySet()) { createNode(eventWriter, "item", ic.getChildren().get(str2)); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "identifier")); eventWriter.add(end); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "personIdentifiers")); eventWriter.add(end); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "usage")); eventWriter.add(end); } if (d.getChildren() != null) { for (String str : d.getChildren().keySet()) { DataType dt = (DataType) d.getChildren().get(str); startElement = eventFactory.createStartElement(PREFIX, URI, "datatype"); eventWriter.add(startElement); eventWriter.add(eventFactory.createAttribute("element", dt.getValue())); if (dt.getLabel() != null) { eventWriter.add(eventFactory.createAttribute("label", dt.getLabel())); } // if (d.getChildren().get(str).isMyHaveChildren()) // { if (dt.getPos() != null) { eventWriter.add(eventFactory.createAttribute("type", dt.getPos())); } else { // System.out.println("dt pos = null " + dt.getValue()); } // } // else // { // eventWriter.add(eventFactory.createAttribute("type", "list")); // } eventWriter.add(end); if (dt.getDocumentation() != null) { createNode(eventWriter, "documentation", dt.getDocumentation(), PREFIX, URI); } if (dt.getChildren() != null) { for (String str2 : dt.getChildren().keySet()) { createNode(eventWriter, "item", dt.getChildren().get(str2)); } } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "datatype")); eventWriter.add(end); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "datatypeDesc")); eventWriter.add(end); eventWriter.add(eventFactory.createEndDocument()); eventWriter.close(); } // System.out.println(bout.toString()); return bout.toString(); } private void createNode(XMLEventWriter eventWriter, SemanticTemplate semTemplate) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createCharacters("\n"); // Create Start node StartElement startElement = eventFactory.createStartElement(PREFIX, URI, "semanticTemplate"); eventWriter.add(startElement); eventWriter.add(eventFactory.createAttribute("semantic", semTemplate.getValue())); if (semTemplate.getLabel() != null) { eventWriter.add(eventFactory.createAttribute("label", semTemplate.getLabel())); } eventWriter.add(eventFactory.createAttribute("priority", String.format("%03d", semTemplate.getPriority()))); if (semTemplate.isAllowMultiple()) { eventWriter.add(eventFactory.createAttribute("allowMultiple", "true")); } else { eventWriter.add(eventFactory.createAttribute("allowMultiple", "false")); } eventWriter.add(end); if (!semTemplate.getChildren().isEmpty()) { startElement = eventFactory.createStartElement(PREFIX, URI, "markupTemplates"); eventWriter.add(startElement); if (semTemplate.isIgnore()) { eventWriter.add(eventFactory.createAttribute("ignore", "true")); } else { eventWriter.add(eventFactory.createAttribute("ignore", "false")); } eventWriter.add(end); for (String key : semTemplate.getChildren().keySet()) { AspectConfigTemplate markupTemplate = (AspectConfigTemplate) semTemplate.getChildren().get(key); startElement = eventFactory.createStartElement(PREFIX, URI, "markupTemplate"); eventWriter.add(startElement); eventWriter.add(eventFactory.createAttribute("widgetType", new Integer(markupTemplate.getWidgetType()).toString())); eventWriter.add(eventFactory.createAttribute("priority", new Integer(markupTemplate.getPriority()).toString())); if (markupTemplate.isRequired()) { eventWriter.add(eventFactory.createAttribute("requiered", "true")); } else { eventWriter.add(eventFactory.createAttribute("requiered", "false")); } if (markupTemplate.isIgnore()) { eventWriter.add(eventFactory.createAttribute("ignore", "true")); } else { eventWriter.add(eventFactory.createAttribute("ignore", "false")); } if (markupTemplate.getElement() != null) { eventWriter.add(eventFactory.createAttribute("element", markupTemplate.getElement())); } if (markupTemplate.getType() != null) { eventWriter.add(eventFactory.createAttribute("type", markupTemplate.getType())); } if (markupTemplate.getSubtype() != null) { eventWriter.add(eventFactory.createAttribute("subtype", markupTemplate.getSubtype())); } if (markupTemplate.getRole() != null) { eventWriter.add(eventFactory.createAttribute("role", markupTemplate.getRole())); } if (markupTemplate.getDate1() != null) { eventWriter.add(eventFactory.createAttribute("date1", markupTemplate.getDate1())); } if (markupTemplate.getDate2() != null) { eventWriter.add(eventFactory.createAttribute("date2", markupTemplate.getDate2())); } if (markupTemplate.getPos() != null) { eventWriter.add(eventFactory.createAttribute("pos", markupTemplate.getPos())); } eventWriter.add(eventFactory.createAttribute("levelSpan", new Integer(markupTemplate.getLevelSpan()).toString())); if (markupTemplate.isAllowMultiple()) { eventWriter.add(eventFactory.createAttribute("allowMultiple", "true")); } else { eventWriter.add(eventFactory.createAttribute("allowMultiple", "false")); } if (markupTemplate.getLabel() != null) { eventWriter.add(eventFactory.createAttribute("label", markupTemplate.getLabel())); } if (markupTemplate.getPrefix() != null) { eventWriter.add(eventFactory.createAttribute("prefix", markupTemplate.getPrefix())); } if (markupTemplate.getSuffix() != null) { eventWriter.add(eventFactory.createAttribute("suffix", markupTemplate.getSuffix())); } eventWriter.add(eventFactory.createAttribute("horizontalSpan", new Integer(markupTemplate.getHorizontalSpan()).toString())); if (markupTemplate.getDocumentation() != null) { createNode(eventWriter, "documentation", markupTemplate.getDocumentation(), PREFIX, URI); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "markupTemplate")); eventWriter.add(end); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "markupTemplates")); eventWriter.add(end); } if (semTemplate.getTemplateText() != null) { startElement = eventFactory.createStartElement(PREFIX, URI, "templateText"); eventWriter.add(startElement); if (semTemplate.isIgnoreTemplateText()) { eventWriter.add(eventFactory.createAttribute("ignore", "true")); } else { eventWriter.add(eventFactory.createAttribute("ignore", "false")); } eventWriter.add(end); Characters characters = eventFactory.createCharacters(semTemplate.getTemplateText()); eventWriter.add(characters); eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "templateText")); eventWriter.add(end); } if (semTemplate.getDocumentation() != null) { createNode(eventWriter, "documentation", semTemplate.getDocumentation(), PREFIX, URI); } eventWriter.add(eventFactory.createEndElement(PREFIX, URI, "semanticTemplate")); eventWriter.add(end); } }