diff --git a/model/src/main/java/li/strolch/model/xml/StrolchElementListenerToListListener.java b/model/src/main/java/li/strolch/model/xml/StrolchElementListenerToListListener.java new file mode 100644 index 000000000..b6ad27daa --- /dev/null +++ b/model/src/main/java/li/strolch/model/xml/StrolchElementListenerToListListener.java @@ -0,0 +1,42 @@ +package li.strolch.model.xml; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import li.strolch.model.Order; +import li.strolch.model.Resource; +import li.strolch.model.StrolchRootElement; +import li.strolch.model.activity.Activity; + +public class StrolchElementListenerToListListener implements StrolchElementListener { + + private final List elements; + + public StrolchElementListenerToListListener() { + this.elements = new ArrayList<>(); + } + + @Override + public void notifyResource(Resource resource) { + this.elements.add(resource); + } + + @Override + public void notifyOrder(Order order) { + this.elements.add(order); + } + + @Override + public void notifyActivity(Activity activity) { + this.elements.add(activity); + } + + public Stream streamElements() { + return elements.stream(); + } + + public List getElements() { + return elements; + } +} diff --git a/model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java b/model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java index 868be7239..92100587e 100644 --- a/model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java +++ b/model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java @@ -31,6 +31,10 @@ import org.slf4j.LoggerFactory; public class StrolchXmlHelper { private static final Logger logger = LoggerFactory.getLogger(StrolchXmlHelper.class); + public static final String W3C_XSD_URI = "http://www.w3.org/2001/XMLSchema-instance"; + public static final String STROLCH_MODEL_NS_URI = "https://strolch.li/xsd/StrolchModel-2.0.xsd"; + public static final String STROLCH_MODEL_NS = "https://strolch.li/schema/StrolchModel.xsd"; + public static final String STROLCH_MODEL_XSD_LOCATION = STROLCH_MODEL_NS + " " + STROLCH_MODEL_NS_URI; public static Resource parseAndReturnResource(String xml, String id) { return parse(xml).getResource(id); @@ -74,19 +78,19 @@ public class StrolchXmlHelper { } public static List parseFile(File file) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + StrolchElementListenerToListListener elementListener = new StrolchElementListenerToListListener(); new XmlModelSaxFileReader(elementListener, file, false).parseFile(); return elementListener.getElements(); } public static Stream parseFileAsStream(File file) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + StrolchElementListenerToListListener elementListener = new StrolchElementListenerToListListener(); new XmlModelSaxFileReader(elementListener, file, false).parseFile(); return elementListener.streamElements(); } public static List parseStream(InputStream stream, String encoding) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + StrolchElementListenerToListListener elementListener = new StrolchElementListenerToListListener(); new XmlModelSaxStreamReader(elementListener, stream, encoding).parseStream(); return elementListener.getElements(); } @@ -102,9 +106,13 @@ public class StrolchXmlHelper { } public static void writeToFile(File file, Stream elements) { + writeToFile(file, elements, false); + } + + public static void writeToFile(File file, Stream elements, boolean withNamespace) { int size; try (OutputStream out = Files.newOutputStream(file.toPath())) { - size = writeToStream(out, elements); + size = writeToStream(out, elements, withNamespace); } catch (Exception e) { throw new RuntimeException("Failed to write elements to " + file, e); } @@ -135,7 +143,12 @@ public class StrolchXmlHelper { } public static int writeToStream(OutputStream out, Stream elements) throws Exception { - XMLStreamWriter writer = prepareXmlStreamWriter(out); + return writeToStream(out, elements, false); + } + + public static int writeToStream(OutputStream out, Stream elements, + boolean withNamespace) throws Exception { + XMLStreamWriter writer = prepareXmlStreamWriter(out, withNamespace); AtomicInteger size = new AtomicInteger(); elements.peek(e -> size.incrementAndGet()).forEach(e -> e.accept(new StrolchElementToSaxWriterVisitor(writer))); writer.writeEndDocument(); @@ -153,20 +166,40 @@ public class StrolchXmlHelper { public static XMLStreamWriter prepareXmlStreamWriter(OutputStream out) throws FactoryConfigurationError, XMLStreamException { + return prepareXmlStreamWriter(out, false); + } + + public static XMLStreamWriter prepareXmlStreamWriter(OutputStream out, boolean withNamespace) + throws FactoryConfigurationError, XMLStreamException { XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter writer = factory.createXMLStreamWriter(out, DEFAULT_ENCODING); - return prepareXmlStreamWriter(writer); + if (withNamespace) + writer.setDefaultNamespace(STROLCH_MODEL_NS); + + return prepareXmlStreamWriter(writer, withNamespace); } public static XMLStreamWriter prepareXmlStreamWriter(XMLStreamWriter writer) throws FactoryConfigurationError, XMLStreamException { + return prepareXmlStreamWriter(writer, false); + } + + public static XMLStreamWriter prepareXmlStreamWriter(XMLStreamWriter writer, boolean withNamespace) + throws FactoryConfigurationError, XMLStreamException { writer = new IndentingXMLStreamWriter(writer); writer.writeStartDocument(DEFAULT_ENCODING, DEFAULT_XML_VERSION); writer.writeStartElement(Tags.STROLCH_MODEL); + + if (withNamespace) { + writer.writeAttribute(STROLCH_MODEL_NS, "xmlns:xsi", W3C_XSD_URI); + writer.writeAttribute(STROLCH_MODEL_NS, "xmlns", STROLCH_MODEL_NS); + writer.writeAttribute(STROLCH_MODEL_NS, "xsi:schemaLocation", STROLCH_MODEL_XSD_LOCATION); + } + return writer; } }