diff --git a/li.strolch.model/src/main/java/li/strolch/model/Order.java b/li.strolch.model/src/main/java/li/strolch/model/Order.java index 8281f06cc..95861a627 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/Order.java +++ b/li.strolch.model/src/main/java/li/strolch/model/Order.java @@ -24,6 +24,7 @@ import li.strolch.model.Locator.LocatorBuilder; import li.strolch.model.policy.PolicyDef; import li.strolch.model.policy.PolicyDefs; import li.strolch.model.visitor.StrolchElementVisitor; +import li.strolch.model.xml.StrolchXmlHelper; import li.strolch.utils.dbc.DBC; import li.strolch.utils.iso8601.ISO8601; @@ -31,7 +32,7 @@ import li.strolch.utils.iso8601.ISO8601; * The Order is an object used in the EDF to transfer data from one range to another. Orders are not to be thought of as * Resources. Resources are supposed to be thought of as things i.e. a table, a machine and so forth, where a order is * to be thought of as an object for doing something. - * + *

* In this sense, orders do not need to be verified, so all verifier chracteristics are disabled and the * getVerifier()-method will return the null reference * @@ -318,7 +319,31 @@ public class Order extends AbstractStrolchRootElement implements StrolchRootElem return getId().compareTo(o.getId()); } + /** + * Creates a {@link Locator} for orders of the given type and id + * + * @param type + * the type of order + * @param id + * the id of the order + * + * @return the locator + */ public static Locator locatorFor(String type, String id) { return Locator.valueOf(Tags.ORDER, type, id); } + + /** + * Parses the given XML and returns the order with the given ID + * + * @param xml + * the xml to parse + * @param id + * the id of the order to return from the parsed elements + * + * @return the order, or null if it does not exist + */ + public static Resource parse(String xml, String id) { + return StrolchXmlHelper.parseAndReturnResource(xml, id); + } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/Resource.java b/li.strolch.model/src/main/java/li/strolch/model/Resource.java index baa04bde1..0c66ba5a2 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/Resource.java +++ b/li.strolch.model/src/main/java/li/strolch/model/Resource.java @@ -30,6 +30,7 @@ import li.strolch.model.policy.PolicyDefs; import li.strolch.model.timedstate.StrolchTimedState; import li.strolch.model.timevalue.IValue; import li.strolch.model.visitor.StrolchElementVisitor; +import li.strolch.model.xml.StrolchXmlHelper; import li.strolch.utils.dbc.DBC; /** @@ -197,7 +198,8 @@ public class Resource extends AbstractStrolchRootElement implements StrolchRootE if (this.timedStateMap == null || this.timedStateMap.isEmpty()) return Stream.empty(); - return this.timedStateMap.values().stream() + return this.timedStateMap.values() + .stream() .filter(s -> s.getInterpretation().equals(interpretation) && s.getUom().equals(uom)); } @@ -399,7 +401,31 @@ public class Resource extends AbstractStrolchRootElement implements StrolchRootE return getId().compareTo(o.getId()); } + /** + * Creates a {@link Locator} for resources of the given type and id + * + * @param type + * the type of resource + * @param id + * the id of the resource + * + * @return the locator + */ public static Locator locatorFor(String type, String id) { return Locator.valueOf(Tags.RESOURCE, type, id); } + + /** + * Parses the given XML and returns the resource with the given ID + * + * @param xml + * the xml to parse + * @param id + * the id of the resource to return from the parsed elements + * + * @return the resource, or null if it does not exist + */ + public static Resource parse(String xml, String id) { + return StrolchXmlHelper.parseAndReturnResource(xml, id); + } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/activity/Activity.java b/li.strolch.model/src/main/java/li/strolch/model/activity/Activity.java index 57b2e9a6e..800db8586 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/activity/Activity.java +++ b/li.strolch.model/src/main/java/li/strolch/model/activity/Activity.java @@ -36,6 +36,7 @@ import li.strolch.model.parameter.Parameter; import li.strolch.model.policy.PolicyDef; import li.strolch.model.policy.PolicyDefs; import li.strolch.model.visitor.StrolchElementVisitor; +import li.strolch.model.xml.StrolchXmlHelper; import li.strolch.utils.dbc.DBC; /** @@ -836,7 +837,31 @@ public class Activity extends AbstractStrolchRootElement this.parent = activity; } + /** + * Creates a {@link Locator} for activities of the given type and id + * + * @param type + * the type of activity + * @param id + * the id of the activity + * + * @return the locator + */ public static Locator locatorFor(String type, String id) { return Locator.valueOf(Tags.ACTIVITY, type, id); } + + /** + * Parses the given XML and returns the activity with the given ID + * + * @param xml + * the xml to parse + * @param id + * the id of the activity to return from the parsed elements + * + * @return the activity, or null if it does not exist + */ + public static Resource parse(String xml, String id) { + return StrolchXmlHelper.parseAndReturnResource(xml, id); + } } 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 3d0665e3a..868be7239 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 @@ -1,16 +1,16 @@ package li.strolch.model.xml; +import static java.nio.charset.StandardCharsets.UTF_8; import static li.strolch.model.StrolchModelConstants.DEFAULT_ENCODING; import static li.strolch.model.StrolchModelConstants.DEFAULT_XML_VERSION; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; -import java.io.File; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Writer; +import java.io.*; import java.nio.file.Files; import java.util.Collection; import java.util.List; @@ -32,22 +32,20 @@ public class StrolchXmlHelper { private static final Logger logger = LoggerFactory.getLogger(StrolchXmlHelper.class); + public static Resource parseAndReturnResource(String xml, String id) { + return parse(xml).getResource(id); + } + public static Resource parseAndReturnResource(File file, String id) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); - new XmlModelSaxFileReader(elementListener, file, false).parseFile(); - return elementListener.getResource(id); + return parse(file).getResource(id); } public static Order parseAndReturnOrder(File file, String id) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); - new XmlModelSaxFileReader(elementListener, file, false).parseFile(); - return elementListener.getOrder(id); + return parse(file).getOrder(id); } public static Activity parseAndReturnActivity(File file, String id) { - SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); - new XmlModelSaxFileReader(elementListener, file, false).parseFile(); - return elementListener.getActivity(id); + return parse(file).getActivity(id); } public static Map parseToMap(File file) { @@ -58,6 +56,23 @@ public class StrolchXmlHelper { return parseStream(stream, encoding).stream().collect(Collectors.toMap(StrolchRootElement::getId, e -> e)); } + public static SimpleStrolchElementListener parse(File file) { + SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + new XmlModelSaxFileReader(elementListener, file, false).parseFile(); + return elementListener; + } + + private static SimpleStrolchElementListener parse(String xml) { + try { + SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); + SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); + sp.parse(new ByteArrayInputStream(xml.getBytes(UTF_8)), new XmlModelSaxReader(elementListener)); + return elementListener; + } catch (Exception e) { + throw new IllegalStateException("Failed to parse XML", e); + } + } + public static List parseFile(File file) { SimpleStrolchElementListener elementListener = new SimpleStrolchElementListener(); new XmlModelSaxFileReader(elementListener, file, false).parseFile();