diff --git a/li.strolch.model/src/main/java/li/strolch/model/xml/SimpleStrolchElementListener.java b/li.strolch.model/src/main/java/li/strolch/model/xml/SimpleStrolchElementListener.java index b676756af..b460bcd1d 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/xml/SimpleStrolchElementListener.java +++ b/li.strolch.model/src/main/java/li/strolch/model/xml/SimpleStrolchElementListener.java @@ -15,7 +15,11 @@ */ package li.strolch.model.xml; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; import li.strolch.model.Order; import li.strolch.model.Resource; @@ -30,31 +34,22 @@ import li.strolch.model.activity.Activity; */ public class SimpleStrolchElementListener implements StrolchElementListener { - private Map resources; - private Map orders; - private Map activities; + private final Map resources = new HashMap<>(); + private final Map orders = new HashMap<>(); + private final Map activities = new HashMap<>(); @Override public void notifyResource(Resource resource) { - if (this.resources == null) { - this.resources = new HashMap<>(); - } this.resources.put(resource.getId(), resource); } @Override public void notifyOrder(Order order) { - if (this.orders == null) { - this.orders = new HashMap<>(); - } this.orders.put(order.getId(), order); } @Override public void notifyActivity(Activity activity) { - if (this.activities == null) { - this.activities = new HashMap<>(); - } this.activities.put(activity.getId(), activity); } @@ -71,20 +66,14 @@ public class SimpleStrolchElementListener implements StrolchElementListener { } public List getResources() { - if (this.resources == null) - return Collections.emptyList(); return new ArrayList<>(this.resources.values()); } public List getOrders() { - if (this.orders == null) - return Collections.emptyList(); return new ArrayList<>(this.orders.values()); } public List getActivities() { - if (this.activities == null) - return Collections.emptyList(); return new ArrayList<>(this.activities.values()); } @@ -95,4 +84,9 @@ public class SimpleStrolchElementListener implements StrolchElementListener { elements.addAll(getActivities()); return elements; } + + public Stream streamElements() { + return Stream.concat(this.resources.values().stream(), + Stream.concat(this.orders.values().stream(), this.activities.values().stream())); + } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java b/li.strolch.model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java index ae148cf81..3d0665e3a 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java +++ b/li.strolch.model/src/main/java/li/strolch/model/xml/StrolchXmlHelper.java @@ -15,7 +15,9 @@ import java.nio.file.Files; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import java.util.stream.Stream; import javanet.staxutils.IndentingXMLStreamWriter; import li.strolch.model.Order; @@ -62,6 +64,12 @@ public class StrolchXmlHelper { return elementListener.getElements(); } + public static Stream parseFileAsStream(File file) { + SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + new XmlModelSaxFileReader(elementListener, file, false).parseFile(); + return elementListener.streamElements(); + } + public static List parseStream(InputStream stream, String encoding) { SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); new XmlModelSaxStreamReader(elementListener, stream, encoding).parseStream(); @@ -78,6 +86,17 @@ public class StrolchXmlHelper { logger.info("Wrote " + elements.size() + " elements to file " + file); } + public static void writeToFile(File file, Stream elements) { + int size; + try (OutputStream out = Files.newOutputStream(file.toPath())) { + size = writeToStream(out, elements); + } catch (Exception e) { + throw new RuntimeException("Failed to write elements to " + file, e); + } + + logger.info("Wrote " + size + " elements to file " + file); + } + public static void writeToWriter(Writer writer, Collection elements) { try { XMLStreamWriter xmlStreamWriter = prepareXmlStreamWriter(writer); @@ -95,16 +114,19 @@ public class StrolchXmlHelper { public static void writeToStream(OutputStream out, Collection elements) throws Exception { - XMLStreamWriter writer = prepareXmlStreamWriter(out); - - for (StrolchRootElement element : elements) { - element.accept(new StrolchElementToSaxWriterVisitor(writer)); - } - + elements.forEach(element -> element.accept(new StrolchElementToSaxWriterVisitor(writer))); writer.writeEndDocument(); } + public static int writeToStream(OutputStream out, Stream elements) throws Exception { + XMLStreamWriter writer = prepareXmlStreamWriter(out); + AtomicInteger size = new AtomicInteger(); + elements.peek(e -> size.incrementAndGet()).forEach(e -> e.accept(new StrolchElementToSaxWriterVisitor(writer))); + writer.writeEndDocument(); + return size.get(); + } + public static XMLStreamWriter prepareXmlStreamWriter(Writer writer) throws FactoryConfigurationError, XMLStreamException {