diff --git a/tools/model_generator/modelviewer.jar b/tools/model_generator/modelviewer.jar new file mode 100644 index 00000000..27a0c016 Binary files /dev/null and b/tools/model_generator/modelviewer.jar differ diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java b/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java index 44193d78..8362d86e 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataAttribute.java @@ -87,6 +87,8 @@ public class DataAttribute implements DataModelNode { if (!(this.sclType instanceof EnumerationType)) throw new SclParserException("Wrong type definition for enumerated data attribute"); + + this.sclType.setUsed(true); } private void createConstructedAttribute(DataAttributeDefinition daDefinition, TypeDeclarations typeDeclarations) @@ -98,6 +100,8 @@ public class DataAttribute implements DataModelNode { if (!(this.sclType instanceof DataAttributeType)) throw new SclParserException("Wrong type definition for constructed data attribute"); + + this.sclType.setUsed(true); DataAttributeType dataAttributeType = (DataAttributeType) this.sclType; diff --git a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java index 818bfadd..c7fae5e0 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/DataObject.java @@ -55,6 +55,9 @@ public class DataObject implements DataModelNode { if (sclType == null) throw new SclParserException("type declaration missing for data object."); + + /* mark type as used */ + sclType.setUsed(true); createDataAttributes(typeDeclarations, sclType); diff --git a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java index 6033732f..021dfc80 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/LogicalNode.java @@ -82,6 +82,9 @@ public class LogicalNode implements DataModelNode { dataObjects = new LinkedList(); LogicalNodeType type = (LogicalNodeType) sclType; + + /* mark type as used */ + type.setUsed(true); List doDefinitions = type.getDataObjectDefinitions(); diff --git a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java index f6edac4a..fab834bb 100644 --- a/tools/model_generator/src/com/libiec61850/scl/types/SclType.java +++ b/tools/model_generator/src/com/libiec61850/scl/types/SclType.java @@ -30,6 +30,7 @@ public abstract class SclType { private String id = null; private String description; + private boolean isUsed = false; public SclType(Node xmlNode) throws SclParserException { this.id = ParserUtils.parseAttribute(xmlNode, "id"); @@ -51,4 +52,12 @@ public abstract class SclType { public String getDesc() { return description; } + + public void setUsed(boolean isUsed) { + this.isUsed = isUsed; + } + + public boolean isUsed() { + return this.isUsed; + } } diff --git a/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java index d364959f..b1059043 100644 --- a/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java +++ b/tools/model_generator/src/com/libiec61850/tools/ModelViewer.java @@ -26,7 +26,7 @@ import com.libiec61850.scl.types.TypeDeclarations; public class ModelViewer { - private static void showTypes(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) + private static void showTypes(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName, boolean unusedOnly) throws SclParserException { SclParser sclParser = new SclParser(stream, false); @@ -34,6 +34,12 @@ public class ModelViewer { TypeDeclarations typeDecl = sclParser.getTypeDeclarations(); for (SclType type : typeDecl.getTypeDeclarations()) { + + if (unusedOnly) { + if (type.isUsed() == true) + continue; + } + output.print(type.getId()); if (type.getClass() == LogicalNodeType.class) @@ -45,6 +51,10 @@ public class ModelViewer { else if (type.getClass() == EnumerationType.class) output.print(" : Enumeration"); + if (!unusedOnly) + if (type.isUsed() == false) + System.out.print(" UNUSED TYPE!"); + output.println(); } } @@ -175,6 +185,7 @@ public class ModelViewer { System.out.println(" -ied select IED"); System.out.println(" -ap select AP"); System.out.println(" -t print type list"); + System.out.println(" -u print list of unused types"); System.out.println(" -s print IED device model structure"); System.out.println(" -a print list of data attributes (object references)"); System.exit(1); @@ -188,6 +199,7 @@ public class ModelViewer { String iedName = null; boolean printTypeList = false; + boolean printUnusedTypes = false; boolean printModelStructure = false; boolean printDataAttribtues = false; @@ -225,6 +237,12 @@ public class ModelViewer { i++; + } + else if (args[i].equals("-u")) { + printUnusedTypes = true; + + i++; + } else { outputStream = new PrintStream(new FileOutputStream(new File(args[i]))); @@ -237,7 +255,10 @@ public class ModelViewer { try { if (printTypeList) - showTypes(stream, icdFile, outputStream, iedName, accessPointName); + showTypes(stream, icdFile, outputStream, iedName, accessPointName, false); + + if (printUnusedTypes) + showTypes(stream, icdFile, outputStream, iedName, accessPointName, true); if (printModelStructure) printModelStructure(stream, icdFile, outputStream, iedName, accessPointName);