From 6432c12630fa3f80ec19bf23229844abd42105e3 Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Tue, 18 Jun 2019 10:17:48 +0200 Subject: [PATCH] Added file version and closed resource leak Component json files are now created with the version in the first line. Removed a superfluous FileWriter in JsonHandler. --- net.mograsim.logic.ui/FullAdder.json | 1 + net.mograsim.logic.ui/HalfAdder.json | 1 + net.mograsim.logic.ui/Test.json | 1 + .../logic/ui/examples/JsonExample.java | 5 +- .../ui/model/components/GUIComponent.java | 1 - .../components/GUICustomComponentCreator.java | 18 ++--- .../SimpleRectangularSubmodelComponent.java | 1 - .../model/components/SubmodelComponent.java | 11 ++- .../{params => }/SubmodelComponentParams.java | 28 ++++++-- .../params/ComponentCompositionParams.java | 18 ----- .../params => util}/JsonHandler.java | 9 ++- .../net/mograsim/logic/ui/util/Version.java | 69 +++++++++++++++++++ 12 files changed, 117 insertions(+), 46 deletions(-) rename net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/{params => }/SubmodelComponentParams.java (68%) delete mode 100644 net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/ComponentCompositionParams.java rename net.mograsim.logic.ui/src/net/mograsim/logic/ui/{model/components/params => util}/JsonHandler.java (63%) create mode 100644 net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/Version.java diff --git a/net.mograsim.logic.ui/FullAdder.json b/net.mograsim.logic.ui/FullAdder.json index 4740f057..782652d5 100644 --- a/net.mograsim.logic.ui/FullAdder.json +++ b/net.mograsim.logic.ui/FullAdder.json @@ -1,3 +1,4 @@ +mograsim version: 0.1.0 { "type": "SimpleRectangularSubmodelComponent", "width": 35.0, diff --git a/net.mograsim.logic.ui/HalfAdder.json b/net.mograsim.logic.ui/HalfAdder.json index 99fd0f4b..802ba0d1 100644 --- a/net.mograsim.logic.ui/HalfAdder.json +++ b/net.mograsim.logic.ui/HalfAdder.json @@ -1,3 +1,4 @@ +mograsim version: 0.1.0 { "type": "SimpleRectangularSubmodelComponent", "width": 35.0, diff --git a/net.mograsim.logic.ui/Test.json b/net.mograsim.logic.ui/Test.json index 4e376db1..36e1ca9d 100644 --- a/net.mograsim.logic.ui/Test.json +++ b/net.mograsim.logic.ui/Test.json @@ -1,3 +1,4 @@ +mograsim version: 0.1.0 { "type": "SimpleRectangularSubmodelComponent", "width": 35.0, diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/JsonExample.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/JsonExample.java index 82b2c8c4..9cc65b32 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/JsonExample.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/JsonExample.java @@ -9,9 +9,9 @@ import net.mograsim.logic.ui.model.components.GUICustomComponentCreator; import net.mograsim.logic.ui.model.components.GUIManualSwitch; import net.mograsim.logic.ui.model.components.SimpleRectangularSubmodelComponent; import net.mograsim.logic.ui.model.components.SubmodelComponent; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams; import net.mograsim.logic.ui.model.components.mi.nandbased.GUIfulladder; import net.mograsim.logic.ui.model.components.mi.nandbased.GUIhalfadder; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams; import net.mograsim.logic.ui.model.wires.GUIWire; public class JsonExample @@ -76,7 +76,8 @@ public class JsonExample e.printStackTrace(); } - SimpleRectangularSubmodelComponent adder = new GUIfulladder(model); + SimpleRectangularSubmodelComponent adder = (SimpleRectangularSubmodelComponent) GUICustomComponentCreator.create(model, + "FullAdder.json"); GUIManualSwitch swA = new GUIManualSwitch(model); swA.moveTo(0, 0); diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java index 89c532e4..7254d8bd 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java @@ -9,7 +9,6 @@ import java.util.function.Supplier; import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams; import net.mograsim.logic.ui.model.wires.Pin; public abstract class GUIComponent diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUICustomComponentCreator.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUICustomComponentCreator.java index c1503978..ea45b61a 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUICustomComponentCreator.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUICustomComponentCreator.java @@ -6,11 +6,10 @@ import java.lang.reflect.InvocationTargetException; import java.util.Map; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.params.ComponentCompositionParams; -import net.mograsim.logic.ui.model.components.params.ComponentCompositionParams.InnerComponentParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InnerWireParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InterfacePinParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams.InnerComponentParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerWireParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InterfacePinParams; import net.mograsim.logic.ui.model.wires.GUIWire; /** @@ -21,8 +20,9 @@ public final class GUICustomComponentCreator private static final String rectC = SimpleRectangularSubmodelComponent.class.getSimpleName(); /** - * Creates a {@link SubmodelComponent} from the {@link SubmodelComponentParams}, specified at the given path. The returned SubmodelComponent - * can also be e.g. a {@link SimpleRectangularSubmodelComponent}, depending on what the {@link SubmodelComponentParams} describe. + * Creates a {@link SubmodelComponent} from the {@link SubmodelComponentParams}, specified at the given path. The returned + * SubmodelComponent can also be e.g. a {@link SimpleRectangularSubmodelComponent}, depending on what the + * {@link SubmodelComponentParams} describe. * * @param path The path of the file describing the {@link SubmodelComponentParams}, which define the new {@link SubmodelComponent} * @return A new SubmodelComponent, as described in the file located at the given path @@ -44,8 +44,8 @@ public final class GUICustomComponentCreator } /** - * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams}. The returned SubmodelComponent can also be e.g. a - * {@link SimpleRectangularSubmodelComponent}, depending on what the {@link SubmodelComponentParams} describe. + * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams}. The returned SubmodelComponent can also be + * e.g. a {@link SimpleRectangularSubmodelComponent}, depending on what the {@link SubmodelComponentParams} describe. * * @param params The parameters describing the {@link SubmodelComponent} * @param path This value is used when the new {@link SubmodelComponent} is an inner component to a different SubmodelComponent, which diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java index da8bd485..51e5b28f 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java @@ -11,7 +11,6 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Font; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams; import net.mograsim.logic.ui.model.wires.Pin; public class SimpleRectangularSubmodelComponent extends SubmodelComponent diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java index f82c3773..16c8c2ad 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java @@ -15,14 +15,13 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.ui.LogicUIRenderer; import net.mograsim.logic.ui.model.ViewModel; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.params.ComponentCompositionParams; -import net.mograsim.logic.ui.model.components.params.ComponentCompositionParams.InnerComponentParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InterfacePinParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams.InnerComponentParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerPinParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerWireParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InterfacePinParams; import net.mograsim.logic.ui.model.wires.GUIWire; import net.mograsim.logic.ui.model.wires.Pin; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InnerPinParams; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InnerWireParams; public abstract class SubmodelComponent extends GUIComponent { diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/SubmodelComponentParams.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponentParams.java similarity index 68% rename from net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/SubmodelComponentParams.java rename to net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponentParams.java index e0205c0f..5fd7ab5e 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/SubmodelComponentParams.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponentParams.java @@ -1,21 +1,21 @@ -package net.mograsim.logic.ui.model.components.params; +package net.mograsim.logic.ui.model.components; import java.io.IOException; import java.util.Map; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.ui.model.components.SubmodelComponent; +import net.mograsim.logic.ui.util.JsonHandler; /** * This class contains all the information necessary to create a new {@link SubmodelComponent} */ public class SubmodelComponentParams { - public String type; - public double width, height; - public InterfacePinParams[] interfacePins; - public ComponentCompositionParams composition; - public Map specialized; + String type; + double width, height; + InterfacePinParams[] interfacePins; + ComponentCompositionParams composition; + Map specialized; public static class InterfacePinParams { @@ -34,6 +34,20 @@ public class SubmodelComponentParams public int compId, pinIndex; } + public static class ComponentCompositionParams + { + double innerScale; + InnerComponentParams[] subComps; + InnerWireParams[] innerWires; + + public static class InnerComponentParams + { + public Point pos; + public String type; + public int logicWidth; + } + } + public static SubmodelComponentParams readJson(String path) throws IOException { return JsonHandler.readJson(path, SubmodelComponentParams.class); diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/ComponentCompositionParams.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/ComponentCompositionParams.java deleted file mode 100644 index 67cbdfec..00000000 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/ComponentCompositionParams.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.mograsim.logic.ui.model.components.params; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams.InnerWireParams; - -public class ComponentCompositionParams -{ - public double innerScale; - public InnerComponentParams[] subComps; - public InnerWireParams[] innerWires; - - public static class InnerComponentParams - { - public Point pos; - public String type; - public int logicWidth; - } -} diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/JsonHandler.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/JsonHandler.java similarity index 63% rename from net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/JsonHandler.java rename to net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/JsonHandler.java index c80aba71..94231a3d 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/params/JsonHandler.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/JsonHandler.java @@ -1,5 +1,6 @@ -package net.mograsim.logic.ui.model.components.params; +package net.mograsim.logic.ui.util; +import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -15,7 +16,10 @@ public class JsonHandler public static T readJson(String path, Class type) throws IOException { FileReader reader = new FileReader(path); - T params = parser.fromJson(new FileReader(path), type); + BufferedReader bf = new BufferedReader(reader); + bf.readLine(); // Skip version + String json = bf.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').reduce("", (x, y) -> x.concat(y)); + T params = parser.fromJson(json, type); reader.close(); return params; } @@ -24,6 +28,7 @@ public class JsonHandler { @SuppressWarnings("resource") FileWriter writer = new FileWriter(path); + writer.write(String.format("mograsim version: %s\n", Version.current.toString())); writer.write(parser.toJson(o)); writer.close(); // TODO: Insure that writer is closed } diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/Version.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/Version.java new file mode 100644 index 00000000..cfd168e4 --- /dev/null +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/util/Version.java @@ -0,0 +1,69 @@ +package net.mograsim.logic.ui.util; + +public final class Version +{ + public final static Version current = new Version(0, 1, 0); + public final int major, minor, patch; + + public Version(int major, int minor, int patch) + { + super(); + this.major = major; + this.minor = minor; + this.patch = patch; + } + + public int[] getVersionNumbers() + { + return new int[] { major, minor, patch }; + } + + @Override + public String toString() + { + return major + "." + minor + "." + patch; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + major; + result = prime * result + minor; + result = prime * result + patch; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof Version)) + return false; + Version other = (Version) obj; + if (major != other.major) + return false; + if (minor != other.minor) + return false; + if (patch != other.patch) + return false; + return true; + } + + public boolean is(int major) + { + return major != this.major; + } + + public boolean is(int major, int minor) + { + return is(major) && this.minor == minor; + } + + public boolean is(int major, int minor, int patch) + { + return is(major, minor) && this.patch == patch; + } +} \ No newline at end of file -- 2.17.1