diff --git a/models/CustomerManagement.Json b/models/CustomerManagement.Json index eb7377e..aa6b0ce 100644 --- a/models/CustomerManagement.Json +++ b/models/CustomerManagement.Json @@ -1,10 +1,15 @@ { - "relations": [], - "transfer": { - "src": "Companies.{company}", - "dst": "customers.{customer}", - "data": {"type": "String", "name": "address"}, - "style": "PULL", - "multiplicity": "1:*" - } + "name" : "CustomerManagement", + "contexts" : [ + { + "relations": [], + "transfer": { + "src": "Companies.{company}", + "dst": "customers.{customer}", + "data": {"type": "String", "name": "address"}, + "style": "PULL", + "multiplicity": "1:*" + } + } + ] } \ No newline at end of file diff --git a/models/Memento.Json b/models/Memento.Json new file mode 100644 index 0000000..d521a4d --- /dev/null +++ b/models/Memento.Json @@ -0,0 +1,25 @@ +{ + "name" : "Memento", + "contexts" : [ + { + "relations": [], + "transfer": { + "src": "Main.Star", + "dst": "Main.States", + "data": {"type": "Memento", "name": "memento"}, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main.States", + "dst": "Main.Star", + "data": {"type": "Memento", "name": "memento"}, + "style": "PUSH", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java index f23b9fa..e05cac9 100644 --- a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java +++ b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java @@ -3,27 +3,42 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.MediatorInsertion; +import parser.*; +import parser.exceptions.ExpectedJsonValue; + import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * The final data transfer designs containing delta algebra and dependency injection. - * + * * @author Nitta - * + * */ public class DataTransferDesign { - private DataTransferContext transferContext; + private List transferContexts; private DeltaComplex deltaComplex; private List dependencyInversions = new ArrayList<>(); private List mediatorInsertions = new ArrayList<>(); public DataTransferDesign(DataTransferContext transferContext) throws IllegalRelationException { - this.transferContext = transferContext; + this.transferContexts = new ArrayList<>(); + this.transferContexts.add(transferContext); this.deltaComplex = createDefaultDeltaComlex(transferContext); } + public DataTransferDesign(JsonValue jsonValue) throws IllegalRelationException { + this.transferContexts = new ArrayList<>(); + for (StringValue keyValue : jsonValue.getJson().keySet()) { + String key = keyValue.getStringValue(); + if (key.equals("contexts")) { + ArrayValue arrayValue = (ArrayValue) jsonValue.getValue(keyValue); + setTransferContexts(arrayValue); + } + } + } + public void addDependencyInversion(DependencyInversion dependencyInversion) { dependencyInversions.add(dependencyInversion); } @@ -244,12 +259,34 @@ } return prevReference; } - + + private void setTransferContexts(ArrayValue arrayValue) throws IllegalRelationException { + List values = arrayValue.getValues(); + for (int i = 0; i getTransferContexts() { + return transferContexts; } } diff --git a/src/main/java/models/objectOrientedTransfer/Delta.java b/src/main/java/models/objectOrientedTransfer/Delta.java index 1a8a80d..d5ed3db 100644 --- a/src/main/java/models/objectOrientedTransfer/Delta.java +++ b/src/main/java/models/objectOrientedTransfer/Delta.java @@ -43,10 +43,10 @@ /** * binding composition - * (this + delta) + * (this * delta) * * @param delta - * @return this + delta + * @return this * delta */ public Delta combine(PrimitiveDelta delta) { return new Delta(delta, this); @@ -54,10 +54,10 @@ /** * binding composition - * (this + delta) + * (this * delta) * * @param delta - * @return this + delta + * @return this * delta */ public Delta combine(Delta delta) { Delta preDelta = this.copy(); @@ -68,7 +68,7 @@ } /** - * if this = d1 + d2 + ... + dn + * if this = d1 * d2 * ... * dn * * @return [d1, d2, ..., dn] */ diff --git a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java index f301548..81ce625 100644 --- a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java +++ b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java @@ -32,6 +32,17 @@ this.subComplex = this.copy(); this.frontierDelta = delta; } + + /** + * if this = d1 | d2 | ... | dn + * and deltaComplex = c1 | c2 | ... | cm, + * this = c1 | c2 | ... | cm | d1 | d2 | ... | dn + */ + public void mergeFront(DeltaComplex deltaComplex) { + for (Delta delta: deltaComplex.split().reversed()) { + attach(delta); + } + } /** * if this = d1 | d2 | ... | dn @@ -48,7 +59,12 @@ deltaSequence.add(0, frontierDelta); return deltaSequence; } - + + /** + * if this = (d11 * d12 * ... * d1m1) | (d21 * d22 * ... * d2m2) | ... | (dn1 * dn2 * ... * dnmn) + * + * @return d11 | d12 | ... | d1m1 | d21 | d22 | ... | d2m2 | ... | dn1 | dn2 | ... | dnmn + **/ public DeltaComplex flatten() { DeltaComplex flattenComplex = subComplex; if (flattenComplex != null) { @@ -59,7 +75,12 @@ } return flattenComplex; } - + + /** + * if this = d1 | d2 | ... | dn + * + * @return d1 * d2 * ... * dn + */ public Delta collapse() { Delta allDelta = null; for (Delta delta: this.split()) { diff --git a/src/test/java/generator/TestMultipleContexts.java b/src/test/java/generator/TestMultipleContexts.java new file mode 100644 index 0000000..a2de08c --- /dev/null +++ b/src/test/java/generator/TestMultipleContexts.java @@ -0,0 +1,44 @@ +package generator; + +import generators.ASTGenerator; +import models.objectOrientedTransfer.*; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class TestMultipleContexts { + @Test + public void testMultipleContexts() { + try { + List srcEdges = new ArrayList<>(); + List dstEdges = new ArrayList<>(); + ObjectNode main = new ObjectNode("Main"); + ObjectNode star = new ObjectNode("Star"); + ObjectNode states = new ObjectNode("States"); + ObjectNode memento = new ObjectNode("Memento"); + ReferenceEdge srcEdge = new ReferenceEdge(main, star, "star"); + srcEdges.add(srcEdge); + ReferenceEdge dstEdge = new ReferenceEdge(main, states, "states"); + dstEdges.add(dstEdge); + List relations = new ArrayList<>(); + Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); + DataTransferContext context = new DataTransferContext(relations, transferRelation, memento, "memento", PushPullValue.PULL); + DataTransferDesign design = new DataTransferDesign(context); + + List srcEdges2 = new ArrayList<>(); + List dstEdges2 = new ArrayList<>(); + ReferenceEdge srcEdge2 = new ReferenceEdge(main, states, "states"); + srcEdges2.add(srcEdge2); + ReferenceEdge dstEdge2 = new ReferenceEdge(main, star, "star"); + dstEdges2.add(dstEdge2); + Relation transferRelation2 = new Relation(srcEdges2, dstEdges2, MultiplicityValue.OneToOne); + DataTransferContext context2 = new DataTransferContext(relations, transferRelation2, memento, "memento", PushPullValue.PUSH); + design.addTransferContext(context2); + + System.out.println(ASTGenerator.generate(design)); + } catch (IllegalRelationException e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/java/parser/TestParser.java b/src/test/java/parser/TestParser.java index 517daea..3c51bc3 100644 --- a/src/test/java/parser/TestParser.java +++ b/src/test/java/parser/TestParser.java @@ -24,10 +24,9 @@ try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); Value jsonValue = parser.getValue(); - DataTransferContext context = new DataTransferContext(jsonValue); DataTransferDesign design; try { - design = new DataTransferDesign(context); + design = new DataTransferDesign((JsonValue) jsonValue); System.out.println(ASTGenerator.generate(design)); } catch (IllegalRelationException e) { e.printStackTrace();