diff --git a/src/main/java/org/openmuc/openiec61850/ClientAssociation.java b/src/main/java/org/openmuc/openiec61850/ClientAssociation.java index 975489f..18cc4c7 100644 --- a/src/main/java/org/openmuc/openiec61850/ClientAssociation.java +++ b/src/main/java/org/openmuc/openiec61850/ClientAssociation.java @@ -692,22 +692,13 @@ public final class ClientAssociation { } /** - * Parses the given SCL File and returns the server model that is described by it. This function can be used instead - * of retrieveModel in order to get the server model that is needed to call the other ACSI services. - * - * @param sclFilePath - * the path to the SCL file that is to be parsed. - * @return The ServerNode that is the root node of the complete server model. - * @throws SclParseException - * if any kind of fatal error occurs in the parsing process. + * Set the server model instead of retrieving it from the server device. + * + * @param model + * the server model */ - public ServerModel getModelFromSclFile(String sclFilePath) throws SclParseException { - List serverSaps = ServerSap.getSapsFromSclFile(sclFilePath); - if (serverSaps == null || serverSaps.size() == 0) { - throw new SclParseException("No AccessPoint found in SCL file."); - } - serverModel = serverSaps.get(0).serverModel; - return serverModel; + public void setServerModel(ServerModel model) { + this.serverModel = model; } /** @@ -2010,6 +2001,10 @@ public final class ClientAssociation { setDataValues(oper); } + public boolean isOpen() { + return !closed; + } + /** * Will close the connection simply by closing the TCP socket. */ diff --git a/src/main/java/org/openmuc/openiec61850/LogicalNode.java b/src/main/java/org/openmuc/openiec61850/LogicalNode.java index 9b819bf..5f00394 100644 --- a/src/main/java/org/openmuc/openiec61850/LogicalNode.java +++ b/src/main/java/org/openmuc/openiec61850/LogicalNode.java @@ -114,6 +114,12 @@ public final class LogicalNode extends ModelNode { if (fc != null) { return fcDataObjects.get(fc).get(childName); } + for (Map map : fcDataObjects.values()) { + FcDataObject fcDataObject = map.get(childName); + if (fcDataObject != null) { + return fcDataObject; + } + } return null; } diff --git a/src/main/java/org/openmuc/openiec61850/SclParser.java b/src/main/java/org/openmuc/openiec61850/SclParser.java index 3dd6249..5d066b6 100644 --- a/src/main/java/org/openmuc/openiec61850/SclParser.java +++ b/src/main/java/org/openmuc/openiec61850/SclParser.java @@ -45,31 +45,36 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -final class SclParser { +public class SclParser { private TypeDefinitions typeDefinitions; private final Map dataSetsMap = new HashMap<>(); private Document doc; private String iedName; - private List serverSaps = null; + private List serverModels = null; private boolean useResvTmsAttributes = false; private final List dataSetDefs = new ArrayList<>(); - public List getServerSaps() { - return serverSaps; + public static List parse(InputStream is) throws SclParseException { + SclParser sclParser = new SclParser(); + sclParser.parseStream(is); + return sclParser.serverModels; } - public void parse(String icdFile) throws SclParseException { + public static List parse(String sclFilePath) throws SclParseException { try { - parse(new FileInputStream(icdFile)); + return parse(new FileInputStream(sclFilePath)); } catch (FileNotFoundException e) { throw new SclParseException(e); } } - public void parse(InputStream icdFileStream) throws SclParseException { + private SclParser() { + } + + private void parseStream(InputStream icdFileStream) throws SclParseException { typeDefinitions = new TypeDefinitions(); @@ -104,12 +109,12 @@ final class SclParser { NodeList iedElements = iedList.item(0).getChildNodes(); - serverSaps = new ArrayList<>(iedElements.getLength()); + serverModels = new ArrayList<>(iedElements.getLength()); for (int i = 0; i < iedElements.getLength(); i++) { Node element = iedElements.item(i); String nodeName = element.getNodeName(); if ("AccessPoint".equals(nodeName)) { - serverSaps.add(createAccessPoint(element)); + serverModels.add(createAccessPoint(element).serverModel); } else if ("Services".equals(nodeName)) { NodeList servicesElements = element.getChildNodes(); @@ -174,7 +179,7 @@ final class SclParser { throw new SclParseException("AccessPoint has no name attribute!"); } String name = namedItem.getNodeValue(); - serverSap = new ServerSap(102, 0, null, server, name, null); + serverSap = new ServerSap(102, 0, null, server, null); break; } diff --git a/src/main/java/org/openmuc/openiec61850/ServerSap.java b/src/main/java/org/openmuc/openiec61850/ServerSap.java index cc33027..512c58f 100644 --- a/src/main/java/org/openmuc/openiec61850/ServerSap.java +++ b/src/main/java/org/openmuc/openiec61850/ServerSap.java @@ -17,7 +17,6 @@ package org.openmuc.openiec61850; import java.io.IOException; -import java.io.InputStream; import java.net.InetAddress; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -53,7 +52,6 @@ public final class ServerSap { ServerEventListener serverEventListener; private ServerAcseSap acseSap; - private final String name; private int port = 102; private int backlog = 0; private InetAddress bindAddr = null; @@ -66,18 +64,6 @@ public final class ServerSap { final ServerModel serverModel; - public static List getSapsFromSclFile(String sclFilePath) throws SclParseException { - SclParser sclParserObject = new SclParser(); - sclParserObject.parse(sclFilePath); - return sclParserObject.getServerSaps(); - } - - public static List getSapsFromSclFile(InputStream sclFileStream) throws SclParseException { - SclParser sclParserObject = new SclParser(); - sclParserObject.parse(sclFileStream); - return sclParserObject.getServerSaps(); - } - /** * Creates a ServerSap. * @@ -94,13 +80,12 @@ public final class ServerSap { * default * */ - ServerSap(int port, int backlog, InetAddress bindAddr, ServerModel serverModel, String name, + public ServerSap(int port, int backlog, InetAddress bindAddr, ServerModel serverModel, ServerSocketFactory serverSocketFactory) { this.port = port; this.backlog = backlog; this.bindAddr = bindAddr; this.serverSocketFactory = serverSocketFactory; - this.name = name; this.serverModel = serverModel; } @@ -148,15 +133,6 @@ public final class ServerSap { return bindAddr; } - /** - * Returns the name of the ServerSap / AccessPoint as specified in the SCL file. - * - * @return the name. - */ - public String getName() { - return name; - } - /** * Sets the factory class to generate the ServerSocket. The ServerSocketFactory could be used to create * SSLServerSockets. Set to null to use ServerSocketFactory.getDefault(). diff --git a/src/main/java/org/openmuc/openiec61850/app/ConsoleClient.java b/src/main/java/org/openmuc/openiec61850/app/ConsoleClient.java index ef76f32..697aae4 100644 --- a/src/main/java/org/openmuc/openiec61850/app/ConsoleClient.java +++ b/src/main/java/org/openmuc/openiec61850/app/ConsoleClient.java @@ -17,6 +17,7 @@ import org.openmuc.openiec61850.FcModelNode; import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.SclParseException; +import org.openmuc.openiec61850.SclParser; import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServiceError; import org.openmuc.openiec61850.Urcb; @@ -374,12 +375,14 @@ public class ConsoleClient { System.out.println("reading model from file..."); try { - serverModel = association.getModelFromSclFile(modelFileParam.getValue()); + serverModel = SclParser.parse(modelFileParam.getValue()).get(0); } catch (SclParseException e1) { System.out.println("Error parsing SCL file: " + e1.getMessage()); return; } + association.setServerModel(serverModel); + System.out.println("successfully read model"); } diff --git a/src/main/java/org/openmuc/openiec61850/app/ConsoleServer.java b/src/main/java/org/openmuc/openiec61850/app/ConsoleServer.java index fb73c9a..8afe5e5 100644 --- a/src/main/java/org/openmuc/openiec61850/app/ConsoleServer.java +++ b/src/main/java/org/openmuc/openiec61850/app/ConsoleServer.java @@ -17,6 +17,7 @@ import org.openmuc.openiec61850.BdaInt8U; import org.openmuc.openiec61850.Fc; import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.SclParseException; +import org.openmuc.openiec61850.SclParser; import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerSap; @@ -212,15 +213,15 @@ public class ConsoleServer { System.exit(1); } - List serverSaps = null; + List serverModels = null; try { - serverSaps = ServerSap.getSapsFromSclFile(modelFileParam.getValue()); + serverModels = SclParser.parse(modelFileParam.getValue()); } catch (SclParseException e) { System.out.println("Error parsing SCL/ICD file: " + e.getMessage()); return; } - serverSap = serverSaps.get(0); + serverSap = new ServerSap(102, 0, null, serverModels.get(0), null); serverSap.setPort(portParam.getValue()); Runtime.getRuntime().addShutdownHook(new Thread() { diff --git a/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest.java b/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest.java index fd0e505..66c0f88 100644 --- a/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest.java +++ b/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest.java @@ -31,6 +31,7 @@ import org.openmuc.openiec61850.FcModelNode; import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.SclParseException; +import org.openmuc.openiec61850.SclParser; import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerSap; @@ -77,7 +78,8 @@ public class ClientServerITest extends Thread implements ServerEventListener, Cl clientAssociation = clientSap.associate(InetAddress.getByName(host), port, null, this); // ServerModel serverModel = clientAssociation.retrieveModel(); - ServerModel serverModel = clientAssociation.getModelFromSclFile("src/test/resources/openiec61850sample01.icd"); + ServerModel serverModel = SclParser.parse("src/test/resources/openiec61850sample01.icd").get(0); + clientAssociation.setServerModel(serverModel); getAllBdas(serverModel); @@ -366,10 +368,7 @@ public class ClientServerITest extends Thread implements ServerEventListener, Cl private void runServer(String sclFilePath, int port) throws SclParseException, IOException { - List serverSaps = null; - serverSaps = ServerSap.getSapsFromSclFile(sclFilePath); - - serverSap = serverSaps.get(0); + serverSap = new ServerSap(port, 0, null, SclParser.parse(sclFilePath).get(0), null); serverSap.setPort(port); serverSap.startListening(this); serversServerModel = serverSap.getModelCopy(); diff --git a/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest2.java b/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest2.java index 5887d0c..7686f09 100644 --- a/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest2.java +++ b/src/test/java/org/openmuc/openiec61850/integrationtests/ClientServerITest2.java @@ -20,6 +20,7 @@ import org.openmuc.openiec61850.FcModelNode; import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.SclParseException; +import org.openmuc.openiec61850.SclParser; import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerSap; @@ -60,8 +61,8 @@ public class ClientServerITest2 extends Thread implements ServerEventListener, C clientAssociation = clientSap.associate(InetAddress.getByName(host), port, null, this); - ServerModel serverModel = clientAssociation.getModelFromSclFile("src/test/resources/testModel2.icd"); - // ServerModel serverModel = clientAssociation.retrieveModel(); + ServerModel serverModel = SclParser.parse("src/test/resources/testModel2.icd").get(0); + clientAssociation.setServerModel(serverModel); getAllBdas(serverModel); @@ -86,10 +87,8 @@ public class ClientServerITest2 extends Thread implements ServerEventListener, C private void runServer(String sclFilePath, int port) throws SclParseException, IOException { - List serverSaps = null; - serverSaps = ServerSap.getSapsFromSclFile(sclFilePath); + serverSap = new ServerSap(port, 0, null, SclParser.parse(sclFilePath).get(0), null); - serverSap = serverSaps.get(0); serverSap.setPort(port); serverSap.startListening(this); serversServerModel = serverSap.getModelCopy(); diff --git a/src/test/java/org/openmuc/openiec61850/integrationtests/ReportingTest.java b/src/test/java/org/openmuc/openiec61850/integrationtests/ReportingTest.java index 94246ce..5f9150c 100644 --- a/src/test/java/org/openmuc/openiec61850/integrationtests/ReportingTest.java +++ b/src/test/java/org/openmuc/openiec61850/integrationtests/ReportingTest.java @@ -22,6 +22,7 @@ import org.openmuc.openiec61850.Fc; import org.openmuc.openiec61850.FcModelNode; import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.SclParseException; +import org.openmuc.openiec61850.SclParser; import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerSap; @@ -57,14 +58,8 @@ public class ReportingTest implements ClientEventListener { } private void startServer() throws SclParseException, IOException { - final List sapsFromSclFile = ServerSap.getSapsFromSclFile(ICD_FILE); - if (sapsFromSclFile.isEmpty()) { - throw new IllegalArgumentException("Could not create server sap from '" + ICD_FILE + "'."); - } - - this.serverSap = sapsFromSclFile.get(0); - this.serverSap.setPort(PORT); + serverSap = new ServerSap(PORT, 0, null, SclParser.parse(ICD_FILE).get(0), null); this.serverSap.startListening(new ServerEventListener() { diff --git a/src/test/java/org/openmuc/openiec61850/integrationtests/SclTests.java b/src/test/java/org/openmuc/openiec61850/integrationtests/SclTests.java index e7fb7ad..6fcb773 100644 --- a/src/test/java/org/openmuc/openiec61850/integrationtests/SclTests.java +++ b/src/test/java/org/openmuc/openiec61850/integrationtests/SclTests.java @@ -2,7 +2,7 @@ package org.openmuc.openiec61850.integrationtests; import org.junit.Test; import org.openmuc.openiec61850.SclParseException; -import org.openmuc.openiec61850.ServerSap; +import org.openmuc.openiec61850.SclParser; public class SclTests { @@ -12,8 +12,8 @@ public class SclTests { @Test public void testClientServerCom() throws SclParseException { - ServerSap.getSapsFromSclFile(SCL_FILE_PATH_1); - ServerSap.getSapsFromSclFile(SCL_FILE_PATH_2); + SclParser.parse(SCL_FILE_PATH_1); + SclParser.parse(SCL_FILE_PATH_2); } }