From 5f31f943324e2487d7b1b5b8325bd7632dbd339a Mon Sep 17 00:00:00 2001 From: ZhangJian He Date: Sun, 13 Oct 2024 19:34:01 +0800 Subject: [PATCH] feat: add mtconnect streams decode Signed-off-by: ZhangJian He --- .../protocol/mtconnect/api/Availability.java | 12 +++ .../protocol/mtconnect/api/AxesComponent.java | 4 +- .../mtconnect/api/ComponentStream.java | 28 ++++++ .../protocol/mtconnect/api/DeviceStream.java | 23 +++++ .../protocol/mtconnect/api/EmergencyStop.java | 12 +++ .../github/protocol/mtconnect/api/Event.java | 26 ++++++ .../protocol/mtconnect/api/Execution.java | 13 +++ .../github/protocol/mtconnect/api/Header.java | 9 ++ .../mtconnect/api/MTConnectStreams.java | 22 +++++ .../github/protocol/mtconnect/api/Normal.java | 22 +++++ .../server/MTConnectStreamsDecodeTest.java | 85 +++++++++++++++++++ 11 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Availability.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/ComponentStream.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/DeviceStream.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/EmergencyStop.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Event.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Execution.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/MTConnectStreams.java create mode 100644 mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Normal.java create mode 100644 mtconnect-server/src/test/java/io/github/protocol/mtconnect/server/MTConnectStreamsDecodeTest.java diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Availability.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Availability.java new file mode 100644 index 0000000..af0fd4c --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Availability.java @@ -0,0 +1,12 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Availability extends Event { + @JacksonXmlText + private String value; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/AxesComponent.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/AxesComponent.java index 958e143..401b8d7 100644 --- a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/AxesComponent.java +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/AxesComponent.java @@ -18,8 +18,8 @@ }) public class AxesComponent { @JacksonXmlProperty(isAttribute = true) - private String id; + protected String id; @JacksonXmlProperty(isAttribute = true) - private String name; + protected String name; } diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/ComponentStream.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/ComponentStream.java new file mode 100644 index 0000000..a968ab5 --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/ComponentStream.java @@ -0,0 +1,28 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class ComponentStream { + + @JacksonXmlProperty(isAttribute = true, localName = "component") + private String component; + + @JacksonXmlProperty(isAttribute = true, localName = "name") + private String name; + + @JacksonXmlProperty(isAttribute = true, localName = "componentId") + private String componentId; + + @JacksonXmlElementWrapper(localName = "Events") + private List events; + + @JacksonXmlElementWrapper(localName = "Condition") + private List normals; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/DeviceStream.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/DeviceStream.java new file mode 100644 index 0000000..b55532d --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/DeviceStream.java @@ -0,0 +1,23 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class DeviceStream { + + @JacksonXmlProperty(isAttribute = true, localName = "name") + private String name; + + @JacksonXmlProperty(isAttribute = true, localName = "uuid") + private String uuid; + + @JacksonXmlElementWrapper(localName = "ComponentStream", useWrapping = false) + @JacksonXmlProperty(localName = "ComponentStream") + private List componentStreams; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/EmergencyStop.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/EmergencyStop.java new file mode 100644 index 0000000..d0b7a22 --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/EmergencyStop.java @@ -0,0 +1,12 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class EmergencyStop extends Event { + @JacksonXmlText + private String value; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Event.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Event.java new file mode 100644 index 0000000..5eb4f63 --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Event.java @@ -0,0 +1,26 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "dataItemId") +@JsonSubTypes({ + @JsonSubTypes.Type(value = Availability.class, name = "avail"), + @JsonSubTypes.Type(value = EmergencyStop.class, name = "estop"), + @JsonSubTypes.Type(value = Execution.class, name = "execution"), +}) +public class Event { + @JacksonXmlProperty(isAttribute = true) + protected String dataItemId; + + @JacksonXmlProperty(isAttribute = true) + protected long sequence; + + @JacksonXmlProperty(isAttribute = true) + protected String timestamp; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Execution.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Execution.java new file mode 100644 index 0000000..ac46644 --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Execution.java @@ -0,0 +1,13 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Execution extends Event { + + @JacksonXmlText + private String value; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Header.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Header.java index b4d8b8a..2af4b18 100644 --- a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Header.java +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Header.java @@ -21,4 +21,13 @@ public class Header { @JacksonXmlProperty(isAttribute = true) private String version; + + @JacksonXmlProperty(isAttribute = true) + private long nextSequence; + + @JacksonXmlProperty(isAttribute = true) + private long firstSequence; + + @JacksonXmlProperty(isAttribute = true) + private long lastSequence; } diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/MTConnectStreams.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/MTConnectStreams.java new file mode 100644 index 0000000..7068145 --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/MTConnectStreams.java @@ -0,0 +1,22 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class MTConnectStreams { + + @JacksonXmlProperty(isAttribute = true, localName = "schemaLocation") + private String schemaLocation; + + @JacksonXmlProperty(localName = "Header") + private Header header; + + @JacksonXmlElementWrapper(localName = "Streams") + private List deviceStreams; +} diff --git a/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Normal.java b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Normal.java new file mode 100644 index 0000000..6652f5d --- /dev/null +++ b/mtconnect-api/src/main/java/io/github/protocol/mtconnect/api/Normal.java @@ -0,0 +1,22 @@ +package io.github.protocol.mtconnect.api; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Normal { + + @JacksonXmlProperty(isAttribute = true, localName = "dataItemId") + private String dataItemId; + + @JacksonXmlProperty(isAttribute = true, localName = "sequence") + private String sequence; + + @JacksonXmlProperty(isAttribute = true, localName = "timestamp") + private String timestamp; + + @JacksonXmlProperty(isAttribute = true, localName = "type") + private String type; +} diff --git a/mtconnect-server/src/test/java/io/github/protocol/mtconnect/server/MTConnectStreamsDecodeTest.java b/mtconnect-server/src/test/java/io/github/protocol/mtconnect/server/MTConnectStreamsDecodeTest.java new file mode 100644 index 0000000..5014520 --- /dev/null +++ b/mtconnect-server/src/test/java/io/github/protocol/mtconnect/server/MTConnectStreamsDecodeTest.java @@ -0,0 +1,85 @@ +package io.github.protocol.mtconnect.server; + +import io.github.protocol.mtconnect.api.MTConnectStreams; +import io.github.protocol.mtconnect.common.XmlUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class MTConnectStreamsDecodeTest { + + @Test + void testMTConnectStreamsParsing() throws Exception { + String xml = """ + + + +
+ + + + + + AVAILABLE + + + + + + RESET + + + + + + + + + ACTIVE + + + + + + """; + + MTConnectStreams mtConnectStreams = XmlUtil.fromXml(xml, MTConnectStreams.class); + + // Validate MTConnectStreams object + Assertions.assertNotNull(mtConnectStreams); + Assertions.assertEquals("urn:mtconnect.org:MTConnectStreams:1.1 http://www.mtconnect.org/schemas/MTConnectStreams_1.1.xsd", mtConnectStreams.getSchemaLocation()); + + // Validate Header + Assertions.assertNotNull(mtConnectStreams.getHeader()); + Assertions.assertEquals("2010-04-06T06:53:34+00:00", mtConnectStreams.getHeader().getCreationTime()); + Assertions.assertEquals("localhost", mtConnectStreams.getHeader().getSender()); + Assertions.assertEquals("1270534765", mtConnectStreams.getHeader().getInstanceId()); + Assertions.assertEquals(16, mtConnectStreams.getHeader().getBufferSize()); + Assertions.assertEquals("1.1", mtConnectStreams.getHeader().getVersion()); + Assertions.assertEquals(19, mtConnectStreams.getHeader().getNextSequence()); + Assertions.assertEquals(3, mtConnectStreams.getHeader().getFirstSequence()); + Assertions.assertEquals(18, mtConnectStreams.getHeader().getLastSequence()); + + // Validate DeviceStream + Assertions.assertNotNull(mtConnectStreams.getDeviceStreams()); + Assertions.assertEquals(1, mtConnectStreams.getDeviceStreams().size()); + + // Validate ComponentStream + var deviceStream = mtConnectStreams.getDeviceStreams().get(0); + Assertions.assertEquals("minimal", deviceStream.getName()); + Assertions.assertEquals("1", deviceStream.getUuid()); + + var componentStream = deviceStream.getComponentStreams().get(0); + Assertions.assertEquals("Device", componentStream.getComponent()); + Assertions.assertEquals("minimal", componentStream.getName()); + Assertions.assertEquals("d", componentStream.getComponentId()); + + // Validate Events and Condition + Assertions.assertNotNull(componentStream.getEvents()); + Assertions.assertEquals(1, componentStream.getEvents().size()); + } +}