Merge branch 'develop'

pull/11/head
Stefan Feuerhahn 7 years ago
commit 0645fc994e

@ -1,7 +1,7 @@
project.ext { project.ext {
cfgVersion = "1.6.1-SNAPSHOT" cfgVersion = "1.6.2-SNAPSHOT"
cfgGroup = "org.openmuc" cfgGroup = "org.openmuc"
@ -83,7 +83,7 @@ def projectName = 'OpenIEC61850'
dependencies { dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'org.openmuc', name: 'jasn1', version: '1.10.0' compile group: 'org.openmuc', name: 'jasn1-iec61850mod', version: '1.10.0'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
compile group: 'com.toedter', name: 'jcalendar', version: '1.4' compile group: 'com.toedter', name: 'jcalendar', version: '1.4'
} }

@ -16,6 +16,8 @@
*/ */
package org.openmuc.jositransport; package org.openmuc.jositransport;
import org.openmuc.openiec61850.internal.NamedDefaultThreadFactory;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
@ -88,7 +90,7 @@ final class ServerThread extends Thread {
@Override @Override
public void run() { public void run() {
ExecutorService executor = Executors.newCachedThreadPool(); ExecutorService executor = Executors.newCachedThreadPool(new NamedDefaultThreadFactory("openiec61850-osi-server"));
try { try {
Socket clientSocket = null; Socket clientSocket = null;

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.TypeDescription;
abstract public class BdaBitString extends BasicDataAttribute { abstract public class BdaBitString extends BasicDataAttribute {
byte[] value; volatile byte[] value;
final int maxNumBits; final int maxNumBits;
public BdaBitString(ObjectReference objectReference, Fc fc, String sAddr, int maxNumBits, boolean dchg, public BdaBitString(ObjectReference objectReference, Fc fc, String sAddr, int maxNumBits, boolean dchg,

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.TypeDescription;
public final class BdaBoolean extends BasicDataAttribute { public final class BdaBoolean extends BasicDataAttribute {
private boolean value; volatile private boolean value;
public BdaBoolean(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaBoolean(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -30,7 +30,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.TypeDescription;
*/ */
public final class BdaEntryTime extends BasicDataAttribute { public final class BdaEntryTime extends BasicDataAttribute {
private byte[] value; volatile private byte[] value;
public BdaEntryTime(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaEntryTime(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -25,7 +25,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaFloat32 extends BasicDataAttribute { public final class BdaFloat32 extends BasicDataAttribute {
private byte[] value; volatile private byte[] value;
public BdaFloat32(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaFloat32(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -25,7 +25,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaFloat64 extends BasicDataAttribute { public final class BdaFloat64 extends BasicDataAttribute {
private byte[] value = new byte[] { 11, 0, 0, 0, 0, 0, 0, 0, 0 }; volatile private byte[] value = new byte[] { 11, 0, 0, 0, 0, 0, 0, 0, 0 };
public BdaFloat64(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaFloat64(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt128 extends BasicDataAttribute { public final class BdaInt128 extends BasicDataAttribute {
private long value; volatile private long value;
public BdaInt128(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt128(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt16 extends BasicDataAttribute { public final class BdaInt16 extends BasicDataAttribute {
private short value; volatile private short value;
public BdaInt16(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt16(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt16U extends BasicDataAttribute { public final class BdaInt16U extends BasicDataAttribute {
private int value; volatile private int value;
public BdaInt16U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt16U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt32 extends BasicDataAttribute { public final class BdaInt32 extends BasicDataAttribute {
private int value; volatile private int value;
public BdaInt32(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt32(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt32U extends BasicDataAttribute { public final class BdaInt32U extends BasicDataAttribute {
private long value; volatile private long value;
public BdaInt32U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt32U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt64 extends BasicDataAttribute { public final class BdaInt64 extends BasicDataAttribute {
private long value; volatile private long value;
public BdaInt64(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt64(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt8 extends BasicDataAttribute { public final class BdaInt8 extends BasicDataAttribute {
private byte value; volatile private byte value;
public BdaInt8(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt8(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -23,7 +23,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.Unsigned8;
public final class BdaInt8U extends BasicDataAttribute { public final class BdaInt8U extends BasicDataAttribute {
private short value; volatile private short value;
public BdaInt8U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaInt8U(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -25,7 +25,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.TypeDescription;
public final class BdaOctetString extends BasicDataAttribute { public final class BdaOctetString extends BasicDataAttribute {
private byte[] value; volatile private byte[] value;
private final int maxLength; private final int maxLength;
public BdaOctetString(ObjectReference objectReference, Fc fc, String sAddr, int maxLength, boolean dchg, public BdaOctetString(ObjectReference objectReference, Fc fc, String sAddr, int maxLength, boolean dchg,

@ -26,7 +26,7 @@ import org.openmuc.openiec61850.internal.mms.asn1.UtcTime;
public final class BdaTimestamp extends BasicDataAttribute { public final class BdaTimestamp extends BasicDataAttribute {
private byte[] value; volatile private byte[] value;
public BdaTimestamp(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) { public BdaTimestamp(ObjectReference objectReference, Fc fc, String sAddr, boolean dchg, boolean dupd) {
super(objectReference, fc, sAddr, dchg, dupd); super(objectReference, fc, sAddr, dchg, dupd);

@ -568,7 +568,7 @@ public final class ClientAssociation {
if (decodedResponsePdu.getConfirmedRequestPDU() != null) { if (decodedResponsePdu.getConfirmedRequestPDU() != null) {
incomingResponses.add(decodedResponsePdu); incomingResponses.add(decodedResponsePdu);
throw clientReceiver.getLastIOException(); throw new IOException("connection was closed", clientReceiver.getLastIOException());
} }
testForInitiateErrorResponse(decodedResponsePdu); testForInitiateErrorResponse(decodedResponsePdu);
@ -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 * Set the server model instead of retrieving it from the server device.
* of <code>retrieveModel</code> in order to get the server model that is needed to call the other ACSI services. *
* * @param model
* @param sclFilePath * the server model
* 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.
*/ */
public ServerModel getModelFromSclFile(String sclFilePath) throws SclParseException { public void setServerModel(ServerModel model) {
List<ServerSap> serverSaps = ServerSap.getSapsFromSclFile(sclFilePath); this.serverModel = model;
if (serverSaps == null || serverSaps.size() == 0) {
throw new SclParseException("No AccessPoint found in SCL file.");
}
serverModel = serverSaps.get(0).serverModel;
return serverModel;
} }
/** /**
@ -2010,6 +2001,10 @@ public final class ClientAssociation {
setDataValues(oper); setDataValues(oper);
} }
public boolean isOpen() {
return !closed;
}
/** /**
* Will close the connection simply by closing the TCP socket. * Will close the connection simply by closing the TCP socket.
*/ */

@ -114,6 +114,12 @@ public final class LogicalNode extends ModelNode {
if (fc != null) { if (fc != null) {
return fcDataObjects.get(fc).get(childName); return fcDataObjects.get(fc).get(childName);
} }
for (Map<String, FcDataObject> map : fcDataObjects.values()) {
FcDataObject fcDataObject = map.get(childName);
if (fcDataObject != null) {
return fcDataObject;
}
}
return null; return null;
} }

@ -45,31 +45,36 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
final class SclParser { public class SclParser {
private TypeDefinitions typeDefinitions; private TypeDefinitions typeDefinitions;
private final Map<String, DataSet> dataSetsMap = new HashMap<>(); private final Map<String, DataSet> dataSetsMap = new HashMap<>();
private Document doc; private Document doc;
private String iedName; private String iedName;
private List<ServerSap> serverSaps = null; private List<ServerModel> serverModels = new ArrayList<>();
private boolean useResvTmsAttributes = false; private boolean useResvTmsAttributes = false;
private final List<LnSubDef> dataSetDefs = new ArrayList<>(); private final List<LnSubDef> dataSetDefs = new ArrayList<>();
public List<ServerSap> getServerSaps() { public static List<ServerModel> parse(InputStream is) throws SclParseException {
return serverSaps; SclParser sclParser = new SclParser();
sclParser.parseStream(is);
return sclParser.serverModels;
} }
public void parse(String icdFile) throws SclParseException { public static List<ServerModel> parse(String sclFilePath) throws SclParseException {
try { try {
parse(new FileInputStream(icdFile)); return parse(new FileInputStream(sclFilePath));
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new SclParseException(e); throw new SclParseException(e);
} }
} }
public void parse(InputStream icdFileStream) throws SclParseException { private SclParser() {
}
private void parseStream(InputStream icdFileStream) throws SclParseException {
typeDefinitions = new TypeDefinitions(); typeDefinitions = new TypeDefinitions();
@ -95,29 +100,37 @@ final class SclParser {
throw new SclParseException("No IED section found!"); throw new SclParseException("No IED section found!");
} }
Node nameAttribute = iedList.item(0).getAttributes().getNamedItem("name"); for (int z = 0; z < iedList.getLength(); z++) {
Node iedNode = iedList.item(z);
iedName = nameAttribute.getNodeValue(); useResvTmsAttributes = false;
if ((iedName == null) || (iedName.length() == 0)) {
throw new SclParseException("IED must have a name!");
}
NodeList iedElements = iedList.item(0).getChildNodes(); Node nameAttribute = iedNode.getAttributes().getNamedItem("name");
serverSaps = new ArrayList<>(iedElements.getLength()); iedName = nameAttribute.getNodeValue();
for (int i = 0; i < iedElements.getLength(); i++) { if ((iedName == null) || (iedName.length() == 0)) {
Node element = iedElements.item(i); throw new SclParseException("IED must have a name!");
String nodeName = element.getNodeName();
if ("AccessPoint".equals(nodeName)) {
serverSaps.add(createAccessPoint(element));
} }
else if ("Services".equals(nodeName)) {
NodeList servicesElements = element.getChildNodes(); NodeList iedElements = iedNode.getChildNodes();
for (int j = 0; j < servicesElements.getLength(); j++) {
if ("ReportSettings".equals(servicesElements.item(j).getNodeName())) { for (int i = 0; i < iedElements.getLength(); i++) {
Node resvTmsAttribute = servicesElements.item(j).getAttributes().getNamedItem("resvTms"); Node element = iedElements.item(i);
if (resvTmsAttribute != null) { String nodeName = element.getNodeName();
useResvTmsAttributes = resvTmsAttribute.getNodeValue().equalsIgnoreCase("true"); if ("AccessPoint".equals(nodeName)) {
ServerSap serverSap = createAccessPoint(element);
if (serverSap != null) {
serverModels.add(serverSap.serverModel);
}
}
else if ("Services".equals(nodeName)) {
NodeList servicesElements = element.getChildNodes();
for (int j = 0; j < servicesElements.getLength(); j++) {
if ("ReportSettings".equals(servicesElements.item(j).getNodeName())) {
Node resvTmsAttribute = servicesElements.item(j).getAttributes().getNamedItem("resvTms");
if (resvTmsAttribute != null) {
useResvTmsAttributes = resvTmsAttribute.getNodeValue().equalsIgnoreCase("true");
}
} }
} }
} }
@ -174,16 +187,12 @@ final class SclParser {
throw new SclParseException("AccessPoint has no name attribute!"); throw new SclParseException("AccessPoint has no name attribute!");
} }
String name = namedItem.getNodeValue(); String name = namedItem.getNodeValue();
serverSap = new ServerSap(102, 0, null, server, name, null); serverSap = new ServerSap(102, 0, null, server, null);
break; break;
} }
} }
if (serverSap == null) {
throw new SclParseException("AccessPoint has no server!");
}
return serverSap; return serverSap;
} }

@ -40,6 +40,7 @@ import org.openmuc.jasn1.ber.types.string.BerVisibleString;
import org.openmuc.josistack.AcseAssociation; import org.openmuc.josistack.AcseAssociation;
import org.openmuc.josistack.ByteBufferInputStream; import org.openmuc.josistack.ByteBufferInputStream;
import org.openmuc.josistack.DecodingException; import org.openmuc.josistack.DecodingException;
import org.openmuc.openiec61850.internal.NamedDefaultThreadFactory;
import org.openmuc.openiec61850.internal.mms.asn1.AccessResult; import org.openmuc.openiec61850.internal.mms.asn1.AccessResult;
import org.openmuc.openiec61850.internal.mms.asn1.ConfirmedErrorPDU; import org.openmuc.openiec61850.internal.mms.asn1.ConfirmedErrorPDU;
import org.openmuc.openiec61850.internal.mms.asn1.ConfirmedRequestPDU; import org.openmuc.openiec61850.internal.mms.asn1.ConfirmedRequestPDU;
@ -118,7 +119,7 @@ final class ServerAssociation {
public ServerAssociation(ServerSap serverSap) { public ServerAssociation(ServerSap serverSap) {
this.serverSap = serverSap; this.serverSap = serverSap;
serverModel = serverSap.serverModel; serverModel = serverSap.serverModel;
executor = Executors.newScheduledThreadPool(2); executor = Executors.newScheduledThreadPool(2, new NamedDefaultThreadFactory("openiec61850-server-connection"));
} }
public void handleNewAssociation(AcseAssociation acseAssociation, ByteBuffer associationRequest) { public void handleNewAssociation(AcseAssociation acseAssociation, ByteBuffer associationRequest) {
@ -1635,6 +1636,7 @@ final class ServerAssociation {
void close() { void close() {
cleanUpConnection(); cleanUpConnection();
executor.shutdown();
if (acseAssociation != null) { if (acseAssociation != null) {
acseAssociation.disconnect(); acseAssociation.disconnect();
} }

@ -17,7 +17,6 @@
package org.openmuc.openiec61850; package org.openmuc.openiec61850;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress; import java.net.InetAddress;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
@ -53,7 +52,6 @@ public final class ServerSap {
ServerEventListener serverEventListener; ServerEventListener serverEventListener;
private ServerAcseSap acseSap; private ServerAcseSap acseSap;
private final String name;
private int port = 102; private int port = 102;
private int backlog = 0; private int backlog = 0;
private InetAddress bindAddr = null; private InetAddress bindAddr = null;
@ -66,18 +64,6 @@ public final class ServerSap {
final ServerModel serverModel; final ServerModel serverModel;
public static List<ServerSap> getSapsFromSclFile(String sclFilePath) throws SclParseException {
SclParser sclParserObject = new SclParser();
sclParserObject.parse(sclFilePath);
return sclParserObject.getServerSaps();
}
public static List<ServerSap> getSapsFromSclFile(InputStream sclFileStream) throws SclParseException {
SclParser sclParserObject = new SclParser();
sclParserObject.parse(sclFileStream);
return sclParserObject.getServerSaps();
}
/** /**
* Creates a ServerSap. * Creates a ServerSap.
* *
@ -94,13 +80,12 @@ public final class ServerSap {
* default * default
* *
*/ */
ServerSap(int port, int backlog, InetAddress bindAddr, ServerModel serverModel, String name, public ServerSap(int port, int backlog, InetAddress bindAddr, ServerModel serverModel,
ServerSocketFactory serverSocketFactory) { ServerSocketFactory serverSocketFactory) {
this.port = port; this.port = port;
this.backlog = backlog; this.backlog = backlog;
this.bindAddr = bindAddr; this.bindAddr = bindAddr;
this.serverSocketFactory = serverSocketFactory; this.serverSocketFactory = serverSocketFactory;
this.name = name;
this.serverModel = serverModel; this.serverModel = serverModel;
} }
@ -148,15 +133,6 @@ public final class ServerSap {
return bindAddr; 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 * Sets the factory class to generate the ServerSocket. The ServerSocketFactory could be used to create
* SSLServerSockets. Set to <code>null</code> to use <code>ServerSocketFactory.getDefault()</code>. * SSLServerSockets. Set to <code>null</code> to use <code>ServerSocketFactory.getDefault()</code>.

@ -17,6 +17,7 @@ import org.openmuc.openiec61850.FcModelNode;
import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.Report;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.SclParser;
import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServiceError; import org.openmuc.openiec61850.ServiceError;
import org.openmuc.openiec61850.Urcb; import org.openmuc.openiec61850.Urcb;
@ -374,12 +375,14 @@ public class ConsoleClient {
System.out.println("reading model from file..."); System.out.println("reading model from file...");
try { try {
serverModel = association.getModelFromSclFile(modelFileParam.getValue()); serverModel = SclParser.parse(modelFileParam.getValue()).get(0);
} catch (SclParseException e1) { } catch (SclParseException e1) {
System.out.println("Error parsing SCL file: " + e1.getMessage()); System.out.println("Error parsing SCL file: " + e1.getMessage());
return; return;
} }
association.setServerModel(serverModel);
System.out.println("successfully read model"); System.out.println("successfully read model");
} }

@ -5,6 +5,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.openmuc.openiec61850.BasicDataAttribute; import org.openmuc.openiec61850.BasicDataAttribute;
import org.openmuc.openiec61850.BdaBoolean;
import org.openmuc.openiec61850.BdaFloat32; import org.openmuc.openiec61850.BdaFloat32;
import org.openmuc.openiec61850.BdaFloat64; import org.openmuc.openiec61850.BdaFloat64;
import org.openmuc.openiec61850.BdaInt16; import org.openmuc.openiec61850.BdaInt16;
@ -17,6 +18,7 @@ import org.openmuc.openiec61850.BdaInt8U;
import org.openmuc.openiec61850.Fc; import org.openmuc.openiec61850.Fc;
import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.SclParser;
import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap; import org.openmuc.openiec61850.ServerSap;
@ -88,9 +90,7 @@ public class ConsoleServer {
break; break;
case WRITE_VALUE_KEY: case WRITE_VALUE_KEY:
System.out.println("** Reading model from file."); System.out.println("Enter reference to write (e.g. myld/MYLN0.do.da.bda): ");
System.out.println("Enter reference to read (e.g. myld/MYLN0.do.da.bda): ");
String reference = actionProcessor.getReader().readLine(); String reference = actionProcessor.getReader().readLine();
System.out.println("Enter functional constraint of referenced node: "); System.out.println("Enter functional constraint of referenced node: ");
String fcString = actionProcessor.getReader().readLine(); String fcString = actionProcessor.getReader().readLine();
@ -181,6 +181,10 @@ public class ConsoleServer {
long value = Long.parseLong(valueString); long value = Long.parseLong(valueString);
((BdaInt64) bda).setValue(value); ((BdaInt64) bda).setValue(value);
} }
else if (bda instanceof BdaBoolean) {
boolean value = Boolean.parseBoolean(valueString);
((BdaBoolean) bda).setValue(value);
}
else { else {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
@ -212,15 +216,15 @@ public class ConsoleServer {
System.exit(1); System.exit(1);
} }
List<ServerSap> serverSaps = null; List<ServerModel> serverModels = null;
try { try {
serverSaps = ServerSap.getSapsFromSclFile(modelFileParam.getValue()); serverModels = SclParser.parse(modelFileParam.getValue());
} catch (SclParseException e) { } catch (SclParseException e) {
System.out.println("Error parsing SCL/ICD file: " + e.getMessage()); System.out.println("Error parsing SCL/ICD file: " + e.getMessage());
return; return;
} }
serverSap = serverSaps.get(0); serverSap = new ServerSap(102, 0, null, serverModels.get(0), null);
serverSap.setPort(portParam.getValue()); serverSap.setPort(portParam.getValue());
Runtime.getRuntime().addShutdownHook(new Thread() { Runtime.getRuntime().addShutdownHook(new Thread() {

@ -0,0 +1,30 @@
package org.openmuc.openiec61850.internal;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class NamedDefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger factoryCounter = new AtomicInteger(1);
private final AtomicInteger threadCounter = new AtomicInteger(1);
private final String namePrefix;
private ThreadFactory backingDefaultThreadFactory = Executors.defaultThreadFactory();
public NamedDefaultThreadFactory(String namePrefix) {
this.namePrefix = namePrefix;
}
@Override
public Thread newThread(Runnable r) {
Thread thread = backingDefaultThreadFactory.newThread(r);
String threadName =
namePrefix
+ "-"
+ factoryCounter.getAndIncrement()
+ "-thread-"
+ threadCounter.getAndIncrement();
thread.setName(threadName);
return thread;
}
}

@ -31,6 +31,7 @@ import org.openmuc.openiec61850.FcModelNode;
import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.Report;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.SclParser;
import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap; 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); clientAssociation = clientSap.associate(InetAddress.getByName(host), port, null, this);
// ServerModel serverModel = clientAssociation.retrieveModel(); // 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); getAllBdas(serverModel);
@ -366,10 +368,7 @@ public class ClientServerITest extends Thread implements ServerEventListener, Cl
private void runServer(String sclFilePath, int port) throws SclParseException, IOException { private void runServer(String sclFilePath, int port) throws SclParseException, IOException {
List<ServerSap> serverSaps = null; serverSap = new ServerSap(port, 0, null, SclParser.parse(sclFilePath).get(0), null);
serverSaps = ServerSap.getSapsFromSclFile(sclFilePath);
serverSap = serverSaps.get(0);
serverSap.setPort(port); serverSap.setPort(port);
serverSap.startListening(this); serverSap.startListening(this);
serversServerModel = serverSap.getModelCopy(); serversServerModel = serverSap.getModelCopy();

@ -20,6 +20,7 @@ import org.openmuc.openiec61850.FcModelNode;
import org.openmuc.openiec61850.ModelNode; import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.Report;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.SclParser;
import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap; 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); clientAssociation = clientSap.associate(InetAddress.getByName(host), port, null, this);
ServerModel serverModel = clientAssociation.getModelFromSclFile("src/test/resources/testModel2.icd"); ServerModel serverModel = SclParser.parse("src/test/resources/testModel2.icd").get(0);
// ServerModel serverModel = clientAssociation.retrieveModel(); clientAssociation.setServerModel(serverModel);
getAllBdas(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 { private void runServer(String sclFilePath, int port) throws SclParseException, IOException {
List<ServerSap> serverSaps = null; serverSap = new ServerSap(port, 0, null, SclParser.parse(sclFilePath).get(0), null);
serverSaps = ServerSap.getSapsFromSclFile(sclFilePath);
serverSap = serverSaps.get(0);
serverSap.setPort(port); serverSap.setPort(port);
serverSap.startListening(this); serverSap.startListening(this);
serversServerModel = serverSap.getModelCopy(); serversServerModel = serverSap.getModelCopy();

@ -22,6 +22,7 @@ import org.openmuc.openiec61850.Fc;
import org.openmuc.openiec61850.FcModelNode; import org.openmuc.openiec61850.FcModelNode;
import org.openmuc.openiec61850.Report; import org.openmuc.openiec61850.Report;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.SclParser;
import org.openmuc.openiec61850.ServerEventListener; import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel; import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap; import org.openmuc.openiec61850.ServerSap;
@ -57,14 +58,8 @@ public class ReportingTest implements ClientEventListener {
} }
private void startServer() throws SclParseException, IOException { private void startServer() throws SclParseException, IOException {
final List<ServerSap> 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() { this.serverSap.startListening(new ServerEventListener() {

@ -2,7 +2,7 @@ package org.openmuc.openiec61850.integrationtests;
import org.junit.Test; import org.junit.Test;
import org.openmuc.openiec61850.SclParseException; import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.ServerSap; import org.openmuc.openiec61850.SclParser;
public class SclTests { public class SclTests {
@ -12,8 +12,8 @@ public class SclTests {
@Test @Test
public void testClientServerCom() throws SclParseException { public void testClientServerCom() throws SclParseException {
ServerSap.getSapsFromSclFile(SCL_FILE_PATH_1); SclParser.parse(SCL_FILE_PATH_1);
ServerSap.getSapsFromSclFile(SCL_FILE_PATH_2); SclParser.parse(SCL_FILE_PATH_2);
} }
} }

Loading…
Cancel
Save