m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2019-11-03 16:39:58 +0100
committerMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2019-11-03 16:39:58 +0100
commit362310157373eef80f49ea6023b1666b3883f4b1 (patch)
treed8a62dae2dd8d86b07586db2fdc191eb3a8ae92d /src
parent9812ed30bd15324d2a337c8d838786a93f9df69f (diff)
Implement ZMI serialization
Diffstat (limited to 'src')
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/Attribute.java5
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueBoolean.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueContact.java7
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDouble.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDuration.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueInt.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueList.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSet.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSimple.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueString.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueTime.java4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ZMI.java20
-rw-r--r--src/test/java/pl/edu/mimuw/cloudatlas/model/ValueDurationTest.java (renamed from src/test/java/pl/edu/mimuw/cloudatlas/ValueDurationTest.java)0
-rw-r--r--src/test/java/pl/edu/mimuw/cloudatlas/model/ZMITest.java72
14 files changed, 140 insertions, 0 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/Attribute.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/Attribute.java
index 46ffab3..aa0cb64 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/Attribute.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/Attribute.java
@@ -48,6 +48,11 @@ public class Attribute {
this.name = name;
}
+ /* Kryo needs a no-args constructor */
+ private Attribute() {
+ this.name = "";
+ }
+
/**
* Indicates whether an <code>attribute</code> represents a query. This is true if and only if the attribute's name starts with an ampersand.
*
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueBoolean.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueBoolean.java
index 57078c2..6ad3500 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueBoolean.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueBoolean.java
@@ -40,6 +40,10 @@ public class ValueBoolean extends ValueSimple<Boolean> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueBoolean() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.BOOLEAN;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueContact.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueContact.java
index 670a025..c554777 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueContact.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueContact.java
@@ -25,6 +25,7 @@
package pl.edu.mimuw.cloudatlas.model;
import java.net.InetAddress;
+import java.net.UnknownHostException;
import pl.edu.mimuw.cloudatlas.model.Value;
import pl.edu.mimuw.cloudatlas.model.ValueContact;
@@ -50,6 +51,12 @@ public class ValueContact extends Value {
this.address = address;
}
+ /* Kryo needs a no-args constructor */
+ private ValueContact() throws UnknownHostException {
+ name = new PathName("");
+ address = InetAddress.getByAddress(new byte[] {0, 0, 0, 0});
+ }
+
@Override
public Value getDefaultValue() {
return new ValueContact(null, null);
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDouble.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDouble.java
index 920a8ef..7d331c9 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDouble.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDouble.java
@@ -40,6 +40,10 @@ public class ValueDouble extends ValueSimple<Double> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueDouble() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.DOUBLE;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDuration.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDuration.java
index 444ce78..7022bbd 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDuration.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueDuration.java
@@ -55,6 +55,10 @@ public class ValueDuration extends ValueSimple<Long> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueDuration() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.DURATION;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueInt.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueInt.java
index 8811d57..c5aa1c6 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueInt.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueInt.java
@@ -41,6 +41,10 @@ public class ValueInt extends ValueSimple<Long> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueInt() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.INTEGER;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueList.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueList.java
index 76d59ff..8414cc4 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueList.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueList.java
@@ -60,6 +60,10 @@ public class ValueList extends ValueSimple<List<Value>> implements List<Value> {
setValue(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueList() {
+ }
+
/**
* Creates an empty list.
*
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSet.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSet.java
index 9843cd4..91524af 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSet.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSet.java
@@ -59,6 +59,10 @@ public class ValueSet extends ValueSimple<Set<Value>> implements Set<Value> {
setValue(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueSet() {
+ }
+
/**
* Creates an empty set.
*
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSimple.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSimple.java
index 803510f..a320e43 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSimple.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueSimple.java
@@ -43,6 +43,10 @@ abstract class ValueSimple<T> extends Value {
setValue(value);
}
+ /* Kryo needs a no-args constructor */
+ protected ValueSimple() {
+ }
+
/**
* Returns a hash code value for this object. This is a hash code of underlying wrapped object.
*
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueString.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueString.java
index 314c602..20a083f 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueString.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueString.java
@@ -47,6 +47,10 @@ public class ValueString extends ValueSimple<String> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueString() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.STRING;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueTime.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueTime.java
index 8dd04fc..0b9a843 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueTime.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueTime.java
@@ -49,6 +49,10 @@ public class ValueTime extends ValueSimple<Long> {
super(value);
}
+ /* Kryo needs a no-args constructor */
+ private ValueTime() {
+ }
+
@Override
public Type getType() {
return TypePrimitive.TIME;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ZMI.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ZMI.java
index a6b78da..5a560ae 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ZMI.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ZMI.java
@@ -24,12 +24,18 @@
package pl.edu.mimuw.cloudatlas.model;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
/**
* A zone management information object. This object is a single node in a zone hierarchy. It stores zone attributes as well as
* references to its father and sons in the tree.
@@ -163,4 +169,18 @@ public class ZMI implements Cloneable {
public String toString() {
return attributes.toString();
}
+
+ public static ZMI deserialize(InputStream in) {
+ Kryo kryo = new Kryo();
+ Input kryoInput = new Input(in);
+ ZMI zmi = kryo.readObject(kryoInput, ZMI.class);
+ return zmi;
+ }
+
+ public void serialize(OutputStream out) {
+ Kryo kryo = new Kryo();
+ Output kryoOut = new Output(out);
+ kryo.writeObject(kryoOut, this);
+ kryoOut.flush();
+ }
}
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/ValueDurationTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/model/ValueDurationTest.java
index 9db36eb..9db36eb 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/ValueDurationTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/model/ValueDurationTest.java
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/model/ZMITest.java b/src/test/java/pl/edu/mimuw/cloudatlas/model/ZMITest.java
new file mode 100644
index 0000000..fa419f5
--- /dev/null
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/model/ZMITest.java
@@ -0,0 +1,72 @@
+package pl.edu.mimuw.cloudatlas.model;
+
+import java.io.OutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class ZMITest {
+ @Test
+ public void testSimpleSerialization1() {
+ ZMI zmi = new ZMI();
+ AttributesMap attributes = zmi.getAttributes();
+ attributes.add("foo", new ValueInt(42l));
+ serializationTest(zmi);
+ }
+
+ @Test
+ public void testSimpleSerialization2() {
+ ZMI zmi = new ZMI();
+ AttributesMap attributes = zmi.getAttributes();
+ attributes.add("foo", new ValueInt(42l));
+ attributes.add("bar", new ValueDuration("+1 11:43:45.342"));
+ serializationTest(zmi);
+ }
+
+ @Test
+ public void testHierarchySerialization() {
+ ZMI root = new ZMI();
+
+ AttributesMap rootAttributes = root.getAttributes();
+ rootAttributes.add("foo", new ValueInt(42l));
+ rootAttributes.add("bar", new ValueDuration("+1 11:43:45.342"));
+
+ ZMI son1 = new ZMI(root);
+ root.addSon(son1);
+
+ AttributesMap son1Attributes = son1.getAttributes();
+ son1Attributes.add("foo", new ValueInt(43l));
+ son1Attributes.add("bar", new ValueDuration("+1 12:43:47.342"));
+
+ ZMI son2 = new ZMI(root);
+ root.addSon(son2);
+
+ AttributesMap son2Attributes = son2.getAttributes();
+ son2Attributes.add("foo", new ValueInt(47l));
+ son2Attributes.add("bar", new ValueDuration("+1 15:45:43.342"));
+
+ ZMI grandson1 = new ZMI(son1);
+ son1.addSon(grandson1);
+
+ AttributesMap grandson1Attributes = grandson1.getAttributes();
+ grandson1Attributes.add("foo", new ValueInt(52l));
+ grandson1Attributes.add("bar", new ValueDuration("-2 15:45:43.342"));
+
+ serializationTest(root);
+ serializationTest(son1);
+ serializationTest(grandson1);
+ }
+
+ private void serializationTest(ZMI zmi) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ zmi.serialize(out);
+
+ ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+ ZMI zmi2 = ZMI.deserialize(in);
+
+ assertEquals(zmi.toString(), zmi2.toString());
+ }
+}