diff --git a/models/CustomerManagement.Json b/models/CustomerManagement.Json index aa6b0ce..59e6c0e 100644 --- a/models/CustomerManagement.Json +++ b/models/CustomerManagement.Json @@ -4,9 +4,9 @@ { "relations": [], "transfer": { - "src": "Companies.{company}", - "dst": "customers.{customer}", - "data": {"type": "String", "name": "address"}, + "src": "Companies.{company}.String", + "dst": "customers.{customer}.String", + "data": {"name": "address"}, "style": "PULL", "multiplicity": "1:*" } diff --git a/models/Memento.Json b/models/Memento.Json index f86f548..ce8bc73 100644 --- a/models/Memento.Json +++ b/models/Memento.Json @@ -4,9 +4,9 @@ { "relations": [], "transfer": { - "src": "Star", - "dst": "States", - "data": {"type": "StarMementoInternal", "name": "memento"}, + "src": "Star.StarMementoInternal", + "dst": "States.StarMementoInternal", + "data": {"name": "memento"}, "style": "PUSH", "multiplicity": "1:1" } @@ -14,9 +14,9 @@ { "relations": [], "transfer": { - "src": "States", - "dst": "Star", - "data": {"type": "StarMementoInternal", "name": "memento"}, + "src": "States.StarMementoInternal", + "dst": "Star.StarMementoInternal", + "data": {"name": "memento"}, "style": "PUSH", "multiplicity": "1:1" } diff --git a/models/designPattern/AbstractFactory.Json b/models/designPattern/AbstractFactory.Json index 6007b64..356768e 100644 --- a/models/designPattern/AbstractFactory.Json +++ b/models/designPattern/AbstractFactory.Json @@ -1,9 +1,9 @@ { "relations": [], "transfer": { - "src": "ConcreteCastle", - "dst": "App", - "data": { "type": "String", "name": "description" }, + "src": "ConcreteCastle.String", + "dst": "App.String", + "data": { "name": "description" }, "style": "PULL", "multiplicity": "1:1" } diff --git a/models/designPattern/Adapter.Json b/models/designPattern/Adapter.Json index 54a16e8..efdb002 100644 --- a/models/designPattern/Adapter.Json +++ b/models/designPattern/Adapter.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "Captain", - "dst": "FishingBoat", + "src": "Captain.Data", + "dst": "FishingBoat.Data", "data": { - "type": "Data", "name": "data" }, "style": "PUSH", diff --git a/models/designPattern/Bridge.Json b/models/designPattern/Bridge.Json index c344808..c4b08af 100644 --- a/models/designPattern/Bridge.Json +++ b/models/designPattern/Bridge.Json @@ -1,9 +1,9 @@ { "relations": [], "transfer": { - "src": "Main.ConcreteWeapon", - "dst": "Main.ConcreteEnchantment", - "data": { "type": "Data", "name": "data" }, + "src": "Main.ConcreteWeapon.Data", + "dst": "Main.ConcreteEnchantment.Data", + "data": { "name": "data" }, "style": "PUSH", "multiplicity": "1:1" } diff --git a/models/designPattern/Builder.Json b/models/designPattern/Builder.Json index cda010b..b4f9572 100644 --- a/models/designPattern/Builder.Json +++ b/models/designPattern/Builder.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "Main.{Builder}", - "dst": "Main", + "src": "Main.{Builder}.Hero", + "dst": "Main.Hero", "data": { - "type": "Hero", "name": "hero" }, "style": "PULL", @@ -17,10 +16,9 @@ { "relations": [], "transfer": { - "src": "Main", - "dst": "Main.{Builder}", + "src": "Main.HairType", + "dst": "Main.{Builder}.HairType", "data": { - "type": "HairType", "name": "hairType" }, "style": "PUSH", @@ -30,10 +28,9 @@ { "relations": [], "transfer": { - "src": "Main", - "dst": "Main.{Builder}", + "src": "Main.HairColor", + "dst": "Main.{Builder}.HairColor", "data": { - "type": "HairColor", "name": "hairColor" }, "style": "PUSH", @@ -43,10 +40,9 @@ { "relations": [], "transfer": { - "src": "Main", - "dst": "Main.{Builder}", + "src": "Main.Armor", + "dst": "Main.{Builder}.Armor", "data": { - "type": "Armor", "name": "armor" }, "style": "PUSH", diff --git a/models/designPattern/Command.Json b/models/designPattern/Command.Json index 8e20601..2cc27d5 100644 --- a/models/designPattern/Command.Json +++ b/models/designPattern/Command.Json @@ -8,10 +8,9 @@ "multiplicity": "1:1" }], "transfer": { - "src": "main.wizard", - "dst": "main.{goblin}", + "src": "main.wizard.Data", + "dst": "main.{goblin}.Data", "data": { - "type": "Data", "name": "data" }, "style": "PUSH", diff --git a/models/designPattern/Decorator.Json b/models/designPattern/Decorator.Json index 1bde11c..628e3a9 100644 --- a/models/designPattern/Decorator.Json +++ b/models/designPattern/Decorator.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "SimpleTroll", - "dst": "Client", + "src": "SimpleTroll.String", + "dst": "Client.String", "data": { - "type": "String", "name": "data" }, "style": "PULL", diff --git a/models/designPattern/Facade.Json b/models/designPattern/Facade.Json index e7f5b1f..4966ec9 100644 --- a/models/designPattern/Facade.Json +++ b/models/designPattern/Facade.Json @@ -2,18 +2,11 @@ "name" : "Facade", "contexts" : [ { - "relations": [ - { - "src": "Main", - "dst": "Main.DwarvenGoldmineFacade.{ConcreteDwarvenDigger}", - "multiplicity": "1:1" - } - ], + "relations": [], "transfer": { - "src": "Main", - "dst": "Main.DwarvenGoldmineFacade.{ConcreteDwarvenDigger}", + "src": "Main.Data", + "dst": "Main.{ConcreteDwarvenDigger}.Data", "data": { - "type": "Data", "name": "data" }, "style": "PUSH", diff --git a/models/designPattern/Flyweight.Json b/models/designPattern/Flyweight.Json index bfa4d32..f049a7b 100644 --- a/models/designPattern/Flyweight.Json +++ b/models/designPattern/Flyweight.Json @@ -4,8 +4,8 @@ { "relations": [ { - "src": "Main.AlchemistShop", - "dst": "Main.AlchemistShop.TopShelf.{Potion}", + "src": "Main.AlchemistShop.PotionFactory.{Potion}", + "dst": "Main.AlchemistShop", "multiplicity": "1:1" } ], @@ -13,24 +13,22 @@ "src": "Main.AlchemistShop.PotionFactory.{Potion}", "dst": "Main.AlchemistShop.TopShelf.{Potion}", "data": { - "type": "Data", "name": "data" }, "style": "PULL", - "multiplicity": "*:1" + "multiplicity": "*:*" } }, { "relations": [], "transfer": { - "src": "Main", - "dst": "Main.AlchemistShop.TopShelf.{Potion}", + "src": "Main.AlchemistShop.TopShelf.{Potion}.Data", + "dst": "Main.Data", "data": { - "type": "Data", "name": "data" }, - "style": "PUSH", - "multiplicity": "1:*" + "style": "PULL", + "multiplicity": "*:1" } } ] diff --git a/models/designPattern/Iterator.Json b/models/designPattern/Iterator.Json index cd269e0..44a50e1 100644 --- a/models/designPattern/Iterator.Json +++ b/models/designPattern/Iterator.Json @@ -4,9 +4,9 @@ { "relations": [], "transfer": { - "src": "App.{Item}", - "dst": "App", - "data": { "type": "String", "name": "data" }, + "src": "App.{Item}.String", + "dst": "App.String", + "data": { "name": "data" }, "style": "PULL", "multiplicity": "1:1" } diff --git a/models/designPattern/Mediator2.Json b/models/designPattern/Mediator2.Json index ee80533..bb64029 100644 --- a/models/designPattern/Mediator2.Json +++ b/models/designPattern/Mediator2.Json @@ -4,9 +4,9 @@ { "relations": [], "transfer": { - "src": "Main", - "dst": "Main.PartyImpl.{ConcretePartyMember}", - "data": { "type": "Action", "name": "action" }, + "src": "Main.Action", + "dst": "Main.PartyImpl.{ConcretePartyMember}.Action", + "data": { "name": "action" }, "style": "PUSH", "multiplicity": "1:1" } @@ -15,9 +15,9 @@ "relations": [ ], "transfer": { - "src": "Main.PartyImpl.{ConcretePartyMember}", - "dst": "Main.PartyImpl.{ConcretePartyMember}", - "data": { "type": "Action", "name": "action" }, + "src": "Main.PartyImpl.{ConcretePartyMember}.Action", + "dst": "Main.PartyImpl.{ConcretePartyMember}.Action", + "data": { "name": "action" }, "style": "PUSH", "multiplicity": "1:*" } diff --git a/models/designPattern/MediatorInsertionTest.Json b/models/designPattern/MediatorInsertionTest.Json index 5313cbe..404698f 100644 --- a/models/designPattern/MediatorInsertionTest.Json +++ b/models/designPattern/MediatorInsertionTest.Json @@ -4,9 +4,9 @@ { "relations": [], "transfer": { - "src": "A", - "dst": "B", - "data": { "type": "String", "name": "string" }, + "src": "A.String", + "dst": "B.String", + "data": { "name": "string" }, "style": "PUSH", "multiplicity": "1:1" } diff --git a/models/designPattern/Proxy.Json b/models/designPattern/Proxy.Json index 229e379..b6ce349 100644 --- a/models/designPattern/Proxy.Json +++ b/models/designPattern/Proxy.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "Client", - "dst": "IvoryTower", + "src": "Client.Wizard", + "dst": "IvoryTower.Wizard", "data": { - "type": "Wizard", "name": "wizard" }, "style": "PUSH", diff --git a/models/designPattern/State.Json b/models/designPattern/State.Json index 85cf18f..7c26fb7 100644 --- a/models/designPattern/State.Json +++ b/models/designPattern/State.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "main.mammoth.{concreteState}", - "dst": "main.mammoth", + "src": "main.mammoth.{concreteState}.Data", + "dst": "main.mammoth.Data", "data": { - "type": "Data", "name": "data" }, "style": "PULL", diff --git a/models/designPattern/Strategy.Json b/models/designPattern/Strategy.Json index 7033955..a75601f 100644 --- a/models/designPattern/Strategy.Json +++ b/models/designPattern/Strategy.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "main.dragonSlayer", - "dst": "main.concreteStrategy", + "src": "main.dragonSlayer.Data", + "dst": "main.concreteStrategy.Data", "data": { - "type": "Data", "name": "data" }, "style": "PUSH", diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 00cba3d..7570aeb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -2,12 +2,12 @@ import java.util.List; import designPatternExtensions.*; -import designPatternExtensions.designPattern.Adapter; +import designPatternExtensions.designPattern.*; import generators.ASTGenerator; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.deltaAlgebra.ReferenceEdge; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; public class Main { @@ -18,26 +18,32 @@ ObjectNode company = new ObjectNode("Company"); ObjectNode customers = new ObjectNode("Customers"); ObjectNode customer = new ObjectNode("Customer"); - ObjectNode address = new ObjectNode("String"); + ObjectNode string = new ObjectNode("String"); ReferenceEdge srcEdge = new ReferenceEdge(companies, company, "company", "String"); - srcEdges.add(srcEdge); + ReferenceEdge srcEdge2 = new ReferenceEdge(company, string, "address"); + srcEdges.add(srcEdge); + srcEdges.add(srcEdge2); ReferenceEdge dstEdge = new ReferenceEdge(customers, customer, "customer", "String"); + ReferenceEdge dstEdge2 = new ReferenceEdge(customer, string, "address"); dstEdges.add(dstEdge); + dstEdges.add(dstEdge2); List relations = new ArrayList<>(); // Relation transferRelation = new Relation(company, customer, MultiplicityValue.OneToOne); Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToMany); - DataTransferContext context = new DataTransferContext(relations, transferRelation, address, "address", PushPullValue.PULL); + DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PUSH); - DataTransferDesign design; + DataSynchronizationDesign design; try { - design = new DataTransferDesign(context); + design = new DataSynchronizationDesign(context); - ObjectNode cm = new ObjectNode("CompanyMediator"); - MediatorInsertion mi = new MediatorInsertion(customer, company, cm, context); - design.addMediatorInsertion(mi); +// ObjectNode cm = new ObjectNode("CompanyMediator"); +// MediatorInsertion mi = new MediatorInsertion(customer, company, cm, context); +// design.addMediatorInsertion(mi); +// +// DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); +// design.addDependencyInversion(di); - DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); - design.addDependencyInversion(di); + design = new Flyweight().create(); System.out.println(design.getDeltaComplex()); System.out.println(ASTGenerator.generate(design)); diff --git a/src/main/java/designPatternExtensions/MediatorInsertion.java b/src/main/java/designPatternExtensions/MediatorInsertion.java index 5553184..d9ca498 100644 --- a/src/main/java/designPatternExtensions/MediatorInsertion.java +++ b/src/main/java/designPatternExtensions/MediatorInsertion.java @@ -1,8 +1,8 @@ package designPatternExtensions; -import models.objectOrientedTransfer.DataTransferContext; +import models.dataSynchronizationModel.DataSynchronizationContext; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.PushPullValue; +import models.dataSynchronizationModel.PushPullValue; public class MediatorInsertion { private ObjectNode src; @@ -12,7 +12,7 @@ private boolean removeDirectDependency = true; //全デザインパターンに適応出来たら不要になるメソッド - public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, DataTransferContext context) { + public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, DataSynchronizationContext context) { this.src = src; this.dst = dst; this.mediator = mediator; diff --git a/src/main/java/designPatternExtensions/ModelLoader.java b/src/main/java/designPatternExtensions/ModelLoader.java index 122b264..38715e8 100644 --- a/src/main/java/designPatternExtensions/ModelLoader.java +++ b/src/main/java/designPatternExtensions/ModelLoader.java @@ -1,8 +1,8 @@ package designPatternExtensions; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.DataSynchronizationContext; +import models.dataSynchronizationModel.DataSynchronizationDesign; +import models.dataSynchronizationModel.IllegalRelationException; import parser.JsonValue; import parser.Parser; import parser.Value; @@ -16,13 +16,13 @@ public class ModelLoader { - public static DataTransferDesign load(String path) { + public static DataSynchronizationDesign load(String path) { File file = new File(path); try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); Value jsonValue = parser.getValue(); - DataTransferDesign design; - return new DataTransferDesign((JsonValue) jsonValue); + DataSynchronizationDesign design; + return new DataSynchronizationDesign((JsonValue) jsonValue); } catch (java.io.FileNotFoundException | ExpectedArrayValue | ExpectedStringValue | ExpectedJsonValue e) { @@ -32,13 +32,13 @@ } } - public static DataTransferDesign load2(String path) { + public static DataSynchronizationDesign load2(String path) { File file = new File(path); try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); Value jsonValue = parser.getValue(); - DataTransferContext context = new DataTransferContext(jsonValue); - return new DataTransferDesign(context); + DataSynchronizationContext context = new DataSynchronizationContext(jsonValue); + return new DataSynchronizationDesign(context); } catch (java.io.FileNotFoundException | ExpectedArrayValue | ExpectedStringValue | ExpectedJsonValue e) { diff --git a/src/main/java/designPatternExtensions/PresenterInsertion.java b/src/main/java/designPatternExtensions/PresenterInsertion.java index 0aa147b..311518c 100644 --- a/src/main/java/designPatternExtensions/PresenterInsertion.java +++ b/src/main/java/designPatternExtensions/PresenterInsertion.java @@ -1,7 +1,7 @@ package designPatternExtensions; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.PushPullValue; +import models.dataSynchronizationModel.PushPullValue; public class PresenterInsertion { private ObjectNode src; diff --git a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java index 7c6d317..00d1d30 100644 --- a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java +++ b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java @@ -2,7 +2,7 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory @@ -10,11 +10,11 @@ public class AbstractFactory implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load2("models/designPattern/AbstractFactory.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode concreteCastle = dtc.getSrcFirstResource(); - ObjectNode app = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/AbstractFactory.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode concreteCastle = dtc.getSrcTopObject(); + ObjectNode app = dtc.getDstTopObject(); ObjectNode concreteKingdomFactory = new ObjectNode("ConcreteKingdomFactory"); MediatorInsertion mi = new MediatorInsertion(app, concreteCastle, concreteKingdomFactory, dtc); diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java index d867853..a24c366 100644 --- a/src/main/java/designPatternExtensions/designPattern/Adapter.java +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -2,15 +2,15 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; public class Adapter implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Adapter.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode captain = dtc.getSrcFirstResource(); - ObjectNode fishingBoat = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Adapter.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode captain = dtc.getSrcTopObject(); + ObjectNode fishingBoat = dtc.getDstTopObject(); ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, PushPullValue.PUSH); diff --git a/src/main/java/designPatternExtensions/designPattern/Bridge.java b/src/main/java/designPatternExtensions/designPattern/Bridge.java index d0edbf4..b653766 100644 --- a/src/main/java/designPatternExtensions/designPattern/Bridge.java +++ b/src/main/java/designPatternExtensions/designPattern/Bridge.java @@ -3,7 +3,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //メモ @@ -11,10 +11,10 @@ public class Bridge implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load2("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - ObjectNode concreteWeapon = (ObjectNode) design.getTransferContexts().getFirst().getSrcResource().getEdge(0).getDestination(); - ObjectNode concreteEnchant = (ObjectNode) design.getTransferContexts().getFirst().getDstResource().getEdge(0).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + ObjectNode concreteEnchant = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcObjectHierarchy().getEdge(0).getDestination(); + ObjectNode concreteWeapon = (ObjectNode) design.getSynchronizationContexts().getFirst().getDstObjectHierarchy().getEdge(0).getDestination(); DependencyInversion di1 = new DependencyInversion(concreteWeapon, new InterfaceNode(concreteWeapon, "Weapon")); design.addDependencyInversion(di1); diff --git a/src/main/java/designPatternExtensions/designPattern/Builder.java b/src/main/java/designPatternExtensions/designPattern/Builder.java index 2d5f4c4..3e6957b 100644 --- a/src/main/java/designPatternExtensions/designPattern/Builder.java +++ b/src/main/java/designPatternExtensions/designPattern/Builder.java @@ -1,7 +1,7 @@ package designPatternExtensions.designPattern; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //メモ @@ -12,11 +12,11 @@ public class Builder implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Builder.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode builder = dtc.getSrcFirstResource(); - ObjectNode hero = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Builder.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode builder = dtc.getSrcTopObject(); + ObjectNode hero = dtc.getDstTopObject(); // // MediatorInsertion mi = new MediatorInsertion(main, builder, new ObjectNode("Hero")); // design.addMediatorInsertion(mi); diff --git a/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java index 531d9d3..96e423c 100644 --- a/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java +++ b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java @@ -5,10 +5,7 @@ import designPatternExtensions.MediatorInsertion; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; -import models.objectOrientedTransfer.PushPullValue; +import models.dataSynchronizationModel.*; import javax.print.attribute.standard.Media; @@ -17,11 +14,11 @@ public class Chain_of_Responsibility implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Chain-of-responsibility.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstResource().getEdge(1).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Chain-of-responsibility.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode main = dtc.getSrcTopObject(); + ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); //ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstResource().getEdge(0).getDestination(); InterfaceNode requestHandler = new InterfaceNode(concreteOrcRequestHandler, "RequestHandler"); diff --git a/src/main/java/designPatternExtensions/designPattern/Command.java b/src/main/java/designPatternExtensions/designPattern/Command.java index e0b671d..8882594 100644 --- a/src/main/java/designPatternExtensions/designPattern/Command.java +++ b/src/main/java/designPatternExtensions/designPattern/Command.java @@ -1,8 +1,10 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; +import models.dataSynchronizationModel.DataSynchronizationDesign; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; +import designPatternExtensions.ModelLoader; //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/command @@ -26,11 +28,11 @@ public class Command implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Command2.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Command2.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); //ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode goblin = dtc.getDataType(); + ObjectNode goblin = dtc.getSrcObjectHierarchy().getBottom(); // MediatorInsertion mi = new MediatorInsertion(main, goblin, new ObjectNode("Wizard"), dtc.getTransferStyle(), false); // design.addMediatorInsertion(mi); diff --git a/src/main/java/designPatternExtensions/designPattern/Composite.java b/src/main/java/designPatternExtensions/designPattern/Composite.java index 7975f82..abe40bb 100644 --- a/src/main/java/designPatternExtensions/designPattern/Composite.java +++ b/src/main/java/designPatternExtensions/designPattern/Composite.java @@ -4,22 +4,20 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.*; //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/composite public class Composite implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode sentence = (ObjectNode) dtc.getSrcResource().getEdges().get(0).getDestination(); - ObjectNode main = dtc.getDstFirstResource(); - DataTransferContext dtc3 = design.getTransferContexts().get(3); - ObjectNode letter = dtc3.getSrcFirstResource(); - ObjectNode word = dtc3.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode sentence = (ObjectNode) dtc.getSrcObjectHierarchy().getEdges().get(0).getDestination(); + ObjectNode main = dtc.getDstTopObject(); + DataSynchronizationContext dtc3 = design.getSynchronizationContexts().get(3); + ObjectNode letter = dtc3.getSrcTopObject(); + ObjectNode word = dtc3.getDstTopObject(); InterfaceNode LetterComposite = new InterfaceNode(sentence, "LetterComposite"); DependencyInversion di = new DependencyInversion(sentence, LetterComposite, main); diff --git a/src/main/java/designPatternExtensions/designPattern/Decorator.java b/src/main/java/designPatternExtensions/designPattern/Decorator.java index dcf9fd1..25cb064 100644 --- a/src/main/java/designPatternExtensions/designPattern/Decorator.java +++ b/src/main/java/designPatternExtensions/designPattern/Decorator.java @@ -4,7 +4,7 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/decorator @@ -14,11 +14,11 @@ // this.simpleTroll = simpleTroll; } public class Decorator implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Decorator.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode simpleTroll = dtc.getSrcFirstResource(); - ObjectNode client = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Decorator.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode simpleTroll = dtc.getSrcTopObject(); + ObjectNode client = dtc.getDstTopObject(); ObjectNode clubbedTroll = new ObjectNode("ClubbedTroll"); MediatorInsertion mi = new MediatorInsertion(simpleTroll, client, clubbedTroll, dtc); diff --git a/src/main/java/designPatternExtensions/designPattern/DesignPattern.java b/src/main/java/designPatternExtensions/designPattern/DesignPattern.java index 99bca0e..2f3d970 100644 --- a/src/main/java/designPatternExtensions/designPattern/DesignPattern.java +++ b/src/main/java/designPatternExtensions/designPattern/DesignPattern.java @@ -1,8 +1,8 @@ package designPatternExtensions.designPattern; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.DataSynchronizationDesign; +import models.dataSynchronizationModel.IllegalRelationException; public interface DesignPattern { - DataTransferDesign create() throws IllegalRelationException; + DataSynchronizationDesign create() throws IllegalRelationException; } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Facade.java b/src/main/java/designPatternExtensions/designPattern/Facade.java index fd5600d..0562122 100644 --- a/src/main/java/designPatternExtensions/designPattern/Facade.java +++ b/src/main/java/designPatternExtensions/designPattern/Facade.java @@ -5,20 +5,22 @@ import designPatternExtensions.MediatorInsertion; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.*; //https://github.com/iluwatar/java-design-patterns/tree/master/facade public class Facade implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode concreteDwarvenDigger = (ObjectNode) dtc.getDstResource().getEdge(1).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode main = dtc.getSrcTopObject(); + ObjectNode facade = new ObjectNode("DwarvenGoldmineFacade"); + ObjectNode concreteDwarvenDigger = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); + + MediatorInsertion mi = new MediatorInsertion(main, concreteDwarvenDigger, facade, dtc.getTransferStyle()); + design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion(concreteDwarvenDigger, new InterfaceNode(concreteDwarvenDigger, "DwarvenMineWorker")); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/Factory_method.java b/src/main/java/designPatternExtensions/designPattern/Factory_method.java index 77e9773..072e3fd 100644 --- a/src/main/java/designPatternExtensions/designPattern/Factory_method.java +++ b/src/main/java/designPatternExtensions/designPattern/Factory_method.java @@ -4,19 +4,17 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.*; //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/prototype public class Factory_method implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Factory-method.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode concreteBlacksmith = dtc.getSrcFirstResource(); - ObjectNode main = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Factory-method.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode concreteBlacksmith = dtc.getSrcTopObject(); + ObjectNode main = dtc.getDstTopObject(); InterfaceNode blackSmith = new InterfaceNode(concreteBlacksmith, "Blacksmith"); DependencyInversion di = new DependencyInversion(concreteBlacksmith, blackSmith); diff --git a/src/main/java/designPatternExtensions/designPattern/Flyweight.java b/src/main/java/designPatternExtensions/designPattern/Flyweight.java index cdef3e4..f098c92 100644 --- a/src/main/java/designPatternExtensions/designPattern/Flyweight.java +++ b/src/main/java/designPatternExtensions/designPattern/Flyweight.java @@ -5,18 +5,16 @@ import designPatternExtensions.MediatorInsertion; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.*; //https://github.com/iluwatar/java-design-patterns/tree/master/facade public class Flyweight implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getLast(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getLast(); // ObjectNode potion = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); // ObjectNode alchemistShop = dtc.getDstFirstResource(); // diff --git a/src/main/java/designPatternExtensions/designPattern/Interpreter.java b/src/main/java/designPatternExtensions/designPattern/Interpreter.java index 2b317a3..b46f65e 100644 --- a/src/main/java/designPatternExtensions/designPattern/Interpreter.java +++ b/src/main/java/designPatternExtensions/designPattern/Interpreter.java @@ -4,19 +4,17 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.*; //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/prototype public class Interpreter implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Interpreter.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode concreteExpression = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Interpreter.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode main = dtc.getSrcTopObject(); + ObjectNode concreteExpression = dtc.getDstTopObject(); InterfaceNode expression = new InterfaceNode(concreteExpression, "Expression"); DependencyInversion di = new DependencyInversion(concreteExpression, expression); diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index b72574f..fe1a8aa 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -2,8 +2,10 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; +import models.dataSynchronizationModel.DataSynchronizationContext; +import models.dataSynchronizationModel.DataSynchronizationDesign; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //メモ //中身の構造を隠したまま、アイテムのタイプをifで回さなくても順番にデータを取り出す @@ -13,12 +15,12 @@ public class Iterator implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode item = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); - ObjectNode app = (ObjectNode) dtc.getDstFirstResource(); - ObjectNode client = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode item = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); + ObjectNode app = (ObjectNode) dtc.getDstTopObject(); + ObjectNode client = dtc.getDstTopObject(); MediatorInsertion mi = new MediatorInsertion(app, item, new ObjectNode("TreasureChest"), dtc); design.addMediatorInsertion(mi); diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator.java b/src/main/java/designPatternExtensions/designPattern/Mediator.java index f96da78..01a3697 100644 --- a/src/main/java/designPatternExtensions/designPattern/Mediator.java +++ b/src/main/java/designPatternExtensions/designPattern/Mediator.java @@ -2,23 +2,20 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; -import models.objectOrientedTransfer.PushPullValue; +import models.dataSynchronizationModel.*; //concretePartyMemberがActionをおこすと、PartyImplからほかのPartyMemberの処理を呼び出す //https://github.com/iluwatar/java-design-patterns/tree/master/mediator public class Mediator implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/" + this.getClass().getSimpleName() + ".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode partyImpl = dtc.getDstFirstResource(); - DataTransferContext dtc2 = design.getTransferContexts().getLast(); - ObjectNode concretePartyMember = (ObjectNode) dtc2.getDstResource().getEdge(0).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/" + this.getClass().getSimpleName() + ".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode main = dtc.getSrcTopObject(); + ObjectNode partyImpl = dtc.getDstTopObject(); + DataSynchronizationContext dtc2 = design.getSynchronizationContexts().getLast(); + ObjectNode concretePartyMember = (ObjectNode) dtc2.getDstObjectHierarchy().getEdge(0).getDestination(); InterfaceNode partyMemberBase = new InterfaceNode(concretePartyMember, "PartyMemberBase"); DependencyInversion di = new DependencyInversion(concretePartyMember, partyMemberBase); diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator2.java b/src/main/java/designPatternExtensions/designPattern/Mediator2.java index 8ea4c0b..28875a6 100644 --- a/src/main/java/designPatternExtensions/designPattern/Mediator2.java +++ b/src/main/java/designPatternExtensions/designPattern/Mediator2.java @@ -5,10 +5,7 @@ import designPatternExtensions.MediatorInsertion; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; -import models.objectOrientedTransfer.PushPullValue; +import models.dataSynchronizationModel.*; //concretePartyMemberがActionをおこすと、PartyImplからほかのPartyMemberの処理を呼び出す //https://github.com/iluwatar/java-design-patterns/tree/master/mediator @@ -19,12 +16,12 @@ public class Mediator2 implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/" + this.getClass().getSimpleName() + ".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode main = dtc.getSrcFirstResource(); - ObjectNode partyImpl = (ObjectNode) dtc.getDstResource().getEdge(0).getDestination(); - ObjectNode concretePartyMember = (ObjectNode) dtc.getDstResource().getEdge(1).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/" + this.getClass().getSimpleName() + ".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode main = dtc.getSrcTopObject(); + ObjectNode partyImpl = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); + ObjectNode concretePartyMember = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); // InterfaceNode partyMemberBase = new InterfaceNode(concretePartyMember, "PartyMemberBase"); // DependencyInversion di = new DependencyInversion(concretePartyMember, partyMemberBase); @@ -40,7 +37,7 @@ ObjectNode imp2 = new ObjectNode("PartyImpl2"); - MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, imp2, PushPullValue.PUSH); + MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, partyImpl, PushPullValue.PUSH); design.addMediatorInsertion(mi); // MediatorInsertion mi2 = new MediatorInsertion(main, concretePartyMember, partyImpl, PushPullValue.PUSH); diff --git a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java index d122ad5..aef2750 100644 --- a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java +++ b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java @@ -3,15 +3,15 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; - import models.objectOrientedTransfer.*; + import models.dataSynchronizationModel.*; public class MediatorInsertionTest implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/MediatorInsertionTest.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode a = dtc.getSrcFirstResource(); - ObjectNode b = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/MediatorInsertionTest.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode a = dtc.getSrcTopObject(); + ObjectNode b = dtc.getDstTopObject(); // ObjectNode me = new ObjectNode("Me"); // MediatorInsertion mi = new MediatorInsertion(a, b, me, dtc.getTransferStyle()); diff --git a/src/main/java/designPatternExtensions/designPattern/Memento.java b/src/main/java/designPatternExtensions/designPattern/Memento.java index cbeaf2b..48ba242 100644 --- a/src/main/java/designPatternExtensions/designPattern/Memento.java +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -2,25 +2,25 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; //https://github.com/iluwatar/java-design-patterns/tree/master/memento public class Memento implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/Memento.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode star = dtc.getSrcFirstResource(); - ObjectNode states = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/Memento.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode star = dtc.getSrcTopObject(); + ObjectNode states = dtc.getDstTopObject(); ObjectNode presenter = new ObjectNode("Main"); PresenterInsertion main = new PresenterInsertion(star, states, presenter, dtc.getTransferStyle(), true); design.addPresenterInsertion(main); - DataTransferContext dtc2 = design.getTransferContexts().getLast(); - ObjectNode states2 = dtc2.getSrcFirstResource(); - ObjectNode star2 = dtc2.getDstFirstResource(); + DataSynchronizationContext dtc2 = design.getSynchronizationContexts().getLast(); + ObjectNode states2 = dtc2.getSrcTopObject(); + ObjectNode star2 = dtc2.getDstTopObject(); PresenterInsertion main2 = new PresenterInsertion(states2, star2, presenter, dtc2.getTransferStyle(), true); diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index 8d8ac56..89d0c6d 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -4,7 +4,7 @@ import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import java.util.ArrayList; //https://github.com/iluwatar/java-design-patterns/tree/master/observer @@ -14,10 +14,10 @@ // public class Observer implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode concreteObserver = (ObjectNode) dtc.getDstResource().getEdge(1).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode concreteObserver = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); DependencyInversion di1 = new DependencyInversion(concreteObserver, new InterfaceNode(concreteObserver, "WeatherObserver")); design.addDependencyInversion(di1); diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java index 540cca5..10de1a5 100644 --- a/src/main/java/designPatternExtensions/designPattern/Prototype.java +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -5,7 +5,7 @@ import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import java.util.ArrayList; @@ -13,11 +13,11 @@ //https://github.com/iluwatar/java-design-patterns/tree/master/prototype public class Prototype implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode factoryImpl = dtc.getSrcFirstResource(); - ObjectNode orcConcreteHero = dtc.getDataType(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode factoryImpl = dtc.getSrcTopObject(); + ObjectNode orcConcreteHero = dtc.getSrcObjectHierarchy().getBottom(); //factoryImplとorcConcreteHeroの依存関係のみ逆転 InterfaceNode concreteHero = new InterfaceNode(orcConcreteHero, "ConcreteHero"); diff --git a/src/main/java/designPatternExtensions/designPattern/Proxy.java b/src/main/java/designPatternExtensions/designPattern/Proxy.java index d297f23..bd68ebc 100644 --- a/src/main/java/designPatternExtensions/designPattern/Proxy.java +++ b/src/main/java/designPatternExtensions/designPattern/Proxy.java @@ -4,18 +4,18 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/proxy public class Proxy implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Proxy.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode client = dtc.getSrcFirstResource(); - ObjectNode ivoryTower = dtc.getDstFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Proxy.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode client = dtc.getSrcTopObject(); + ObjectNode ivoryTower = dtc.getDstTopObject(); ObjectNode proxy = new ObjectNode("WizardTowerProxy"); MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy, dtc); diff --git a/src/main/java/designPatternExtensions/designPattern/Singleton.java b/src/main/java/designPatternExtensions/designPattern/Singleton.java index a6c4eb8..e5acb55 100644 --- a/src/main/java/designPatternExtensions/designPattern/Singleton.java +++ b/src/main/java/designPatternExtensions/designPattern/Singleton.java @@ -2,7 +2,7 @@ import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import java.util.ArrayList; @@ -10,16 +10,16 @@ //https://github.com/iluwatar/java-design-patterns/tree/master/singleton public class Singleton implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { + public DataSynchronizationDesign create() throws IllegalRelationException { ObjectNode client = new ObjectNode("Client"); ObjectNode enumIvoryTower = new ObjectNode("EnumIvoryTower"); ObjectNode data = new ObjectNode("data"); Relation transferRelation = new Relation(enumIvoryTower, client, MultiplicityValue.OneToOne); - DataTransferContext context = new DataTransferContext( - new ArrayList<>(), transferRelation, data, "data", PushPullValue.PULL + DataSynchronizationContext context = new DataSynchronizationContext( + new ArrayList<>(), transferRelation, "data", PushPullValue.PULL ); - return new DataTransferDesign(context); + return new DataSynchronizationDesign(context); } } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/State.java b/src/main/java/designPatternExtensions/designPattern/State.java index d700da6..6c14af4 100644 --- a/src/main/java/designPatternExtensions/designPattern/State.java +++ b/src/main/java/designPatternExtensions/designPattern/State.java @@ -2,7 +2,7 @@ import designPatternExtensions.*; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/state @@ -10,10 +10,10 @@ public class State implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/State.Json"); - ObjectNode main = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode concreteState = (ObjectNode) design.getTransferContexts().getFirst().getSrcResource().getEdge(1).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/State.Json"); + ObjectNode main = design.getSynchronizationContexts().getFirst().getSrcTopObject(); + ObjectNode concreteState = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcObjectHierarchy().getEdge(1).getDestination(); DependencyInversion di = new DependencyInversion( concreteState, new InterfaceNode(concreteState, "State")); diff --git a/src/main/java/designPatternExtensions/designPattern/Strategy.java b/src/main/java/designPatternExtensions/designPattern/Strategy.java index f1363d3..bae2d63 100644 --- a/src/main/java/designPatternExtensions/designPattern/Strategy.java +++ b/src/main/java/designPatternExtensions/designPattern/Strategy.java @@ -2,9 +2,8 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; -import designPatternExtensions.MediatorInsertion; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/strategy @@ -12,10 +11,10 @@ public class Strategy implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Strategy.Json"); - ObjectNode main = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode concreteStrategy = (ObjectNode) design.getTransferContexts().getFirst().getDstResource().getEdge(0).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Strategy.Json"); + ObjectNode main = design.getSynchronizationContexts().getFirst().getSrcTopObject(); + ObjectNode concreteStrategy = (ObjectNode) design.getSynchronizationContexts().getFirst().getDstObjectHierarchy().getEdge(0).getDestination(); DependencyInversion di = new DependencyInversion( concreteStrategy, new InterfaceNode(concreteStrategy, "DragonSlayingStrategy")); diff --git a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java index cae3a1a..a4f77f2 100644 --- a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java +++ b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java @@ -4,20 +4,19 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.deltaAlgebra.ReferenceEdge; +import models.dataSynchronizationModel.*; //https://github.com/iluwatar/java-design-patterns/tree/master/template-method public class TemplateMethod implements DesignPattern { - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - DataTransferContext dtc = design.getTransferContexts().getLast(); - ObjectNode halflingThief = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); - ObjectNode concreteMethod = (ObjectNode) dtc.getDstResource().getEdge(0).getDestination(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getLast(); + ObjectNode halflingThief = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); + ObjectNode concreteMethod = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); InterfaceNode stealingMethod = new InterfaceNode(concreteMethod, "StealingMethod"); DependencyInversion di = new DependencyInversion(concreteMethod, stealingMethod); diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java index 0288a30..6a7f6f3 100644 --- a/src/main/java/designPatternExtensions/designPattern/Visitor.java +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -11,18 +11,18 @@ import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.deltaAlgebra.ReferenceEdge; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import java.util.ArrayList; import java.util.List; public class Visitor implements DesignPattern{ - public DataTransferDesign create() throws IllegalRelationException { - DataTransferDesign design = ModelLoader.load("models/designPattern/Visitor.Json"); - DataTransferContext dtc = design.getTransferContexts().getFirst(); - ObjectNode visitor = dtc.getDataType(); - ObjectNode commander = dtc.getSrcFirstResource(); + public DataSynchronizationDesign create() throws IllegalRelationException { + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Visitor.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode visitor = dtc.getSrcObjectHierarchy().getBottom(); + ObjectNode commander = dtc.getSrcTopObject(); DependencyInversion di = new DependencyInversion( visitor, new InterfaceNode(visitor, "UnitVisitor"), commander diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index 7fdd86f..d6aa1da 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -10,7 +10,7 @@ import designPatternExtensions.PresenterInsertion; import models.dataConstraintModel.MapType; import models.deltaAlgebra.*; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; public class ASTGenerator { public static final String getterPrefix = "get"; @@ -32,20 +32,20 @@ return name.substring(0, 1).toLowerCase() + name.substring(1); } - public static Codebase generate(DataTransferDesign dataTransferDesign) { + public static Codebase generate(DataSynchronizationDesign dataSynchronizationDesign) { Codebase codebase = new Codebase(); - DeltaComplex deltaComplex = dataTransferDesign.getDeltaComplex(); + DeltaComplex deltaComplex = dataSynchronizationDesign.getDeltaComplex(); for (Delta delta: deltaComplex.decompose()) { codebase = weaveDelta(codebase, delta); } // do not change flow : MediatorInsertion -> DependencyInversion - for (MediatorInsertion mi: dataTransferDesign.getMediatorInsertions()) { + for (MediatorInsertion mi: dataSynchronizationDesign.getMediatorInsertions()) { codebase = weaveMediatorInsertion(codebase, mi); } - for (PresenterInsertion pi: dataTransferDesign.getPresenterInsertions()) { + for (PresenterInsertion pi: dataSynchronizationDesign.getPresenterInsertions()) { codebase = weavePresenterInsertion(codebase, pi); } - for (DependencyInversion di: dataTransferDesign.getDependencyInversions()) { + for (DependencyInversion di: dataSynchronizationDesign.getDependencyInversions()) { codebase = weaveDependencyInversion(codebase, di); } return codebase; diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java new file mode 100644 index 0000000..8b941b3 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java @@ -0,0 +1,235 @@ +package models.dataSynchronizationModel; + +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; +import parser.ArrayValue; +import parser.JsonValue; +import parser.StringValue; +import parser.Value; +import parser.exceptions.ExpectedJsonValue; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The reference context and properties of specific data synchronization. + * + * @author Nitta + * + */ +public class DataSynchronizationContext { + private List intermediateRelations; + private Relation syncronizationRelation; + private String dataName; + private PushPullValue transferStyle; + private Map objectNodeMap = new HashMap<>(); + + public DataSynchronizationContext(Value jsonValue) { + setDataTransferContext(jsonValue); + } + + public DataSynchronizationContext(List intermediateRelations, Relation syncronizationRelation, String dataName, PushPullValue transferStyle) { + this.intermediateRelations = intermediateRelations; + this.syncronizationRelation = syncronizationRelation; + this.dataName = dataName; + this.transferStyle = transferStyle; + } + + public List getIntermediateRelations() { + return intermediateRelations; + } + + public Relation getSyncronizationRelation() { + return syncronizationRelation; + } + + public boolean isFlat() { + return syncronizationRelation.isFlat(); + } + + public ObjectHierarchy getSrcObjectHierarchy() { + return syncronizationRelation.getSrcObjectHierarchy(); + } + + public ObjectHierarchy getDstObjectHierarchy() { + return syncronizationRelation.getDstObjectHierarchy(); + } + + public ObjectNode getSrcTopObject() { + return syncronizationRelation.getSrcTopObject(); + } + + public ObjectNode getDstTopObject() { + return syncronizationRelation.getDstTopObject(); + } + + + public MultiplicityValue getTransferMultiplicity() { + return syncronizationRelation.getMultiplicity(); + } + + public String getDataName() { + return dataName; + } + + public PushPullValue getTransferStyle() { + return transferStyle; + } + + private void setDataTransferContext(Value value) { + if (value instanceof JsonValue) { + for (StringValue keyValue : ((JsonValue) value).getJson().keySet()) { + String key = keyValue.getStringValue(); + if (key.equals("relations")) {//この部分は動作未確認(おそらくまだ動かない) + intermediateRelations = new ArrayList<>(); + ArrayValue arrayValue = ((ArrayValue)((JsonValue) value).getValue(keyValue)); + List relationValues = arrayValue.getValues(); + for(Value relationValue:relationValues){ + intermediateRelations.add(getRelation(relationValue)); + } + } else if (key.equals("transfer")) { + syncronizationRelation = getRelation(((JsonValue) value).getValue(keyValue)); + } + } + } + } + + private Relation getRelation(Value value){ + if (value instanceof JsonValue) { + MultiplicityValue multiplicityValue = null; + List srcEdges = new ArrayList<>(); + List dstEdges = new ArrayList<>(); + ObjectNode src = null; + ObjectNode dst = null; + for (StringValue keyValue : ((JsonValue) value).getJson().keySet()) { + String key = keyValue.getStringValue(); + if (key.equals("src")) { + src = setEdges((StringValue) ((JsonValue) value).getValue(keyValue), srcEdges); + } else if (key.equals("dst")) { + dst = setEdges((StringValue) ((JsonValue) value).getValue(keyValue), dstEdges); + } else if (key.equals("style")) { + setTransferStyle((StringValue) ((JsonValue) value).getValue(keyValue)); + } else if (key.equals("multiplicity")) { + StringValue multi = (StringValue) ((JsonValue) value).getValue(keyValue); + String multiplicity = multi.getStringValue(); + if (multiplicity.equals("*:1")) { + multiplicityValue = MultiplicityValue.ManyToOne; + } else if (multiplicity.equals("1:1")) { + multiplicityValue = MultiplicityValue.OneToOne; + } else if (multiplicity.equals("*:*")) { + multiplicityValue = MultiplicityValue.ManyToMany; + } else if (multiplicity.equals("1:*")) { + multiplicityValue = MultiplicityValue.OneToMany; + } + } else if (key.equals("data")) { + setTransferData(((JsonValue) value).getValue(keyValue)); + } + } + if (multiplicityValue == null) { + throw new RuntimeException("multiplicityが存在していません"); + } + if(src != null&&dst != null){//両方単独ObjectNode + return new Relation(src,dst,multiplicityValue); + }else if(src == null&&dst != null){//片方単独 + return new Relation(srcEdges,dst,multiplicityValue); + }else if(src != null&&dst == null){//上と同じ + return new Relation(src,dstEdges,multiplicityValue); + }else{//両方複数 + return new Relation(srcEdges,dstEdges,multiplicityValue); + } + } + throw new ExpectedJsonValue("Jsonではありません。"); + } + + private void setTransferStyle(StringValue stringValue){ + String style = stringValue.getStringValue(); + if (style.equals("PUSH")) { + transferStyle = PushPullValue.PUSH; + } else if (style.equals("PULL")) { + transferStyle = PushPullValue.PULL; + } + } + + private void setTransferData(Value dataTransferValue){ + if (dataTransferValue instanceof JsonValue) { + for (StringValue dataTransferValueKeyValue : ((JsonValue) dataTransferValue).getJson().keySet()) { + String dataTransferValueKey = dataTransferValueKeyValue.getStringValue(); + if (dataTransferValueKey.equals("name")) { + String name = ((StringValue) ((JsonValue) dataTransferValue).getValue(dataTransferValueKeyValue)).getStringValue(); + dataName = name; + } + } + } else { + throw new ExpectedJsonValue("jsonのtransferのdataが足りていません"); + } + } + + private ObjectNode setEdges(StringValue stringValue, List edges) {//objectNodeの場合はobjectNodeを返したい。 + String S = stringValue.getStringValue(); + int cur = 0; + ArrayList list = new ArrayList<>(); + while (cur < S.length()) { + StringBuilder variable = new StringBuilder(); + while (cur < S.length() && S.charAt(cur) != '.') { + variable.append(S.charAt(cur)); + cur++; + } + list.add(variable.toString()); + cur++; + } + if(list.size() == 1){//一つだけの場合はobjectNodeを返す + String src = list.get(0); + objectNodeMap.put(src, new ObjectNode(src)); + return objectNodeMap.get(src); + } + for (int i = 0; i < list.size() - 1; i++) { + String src = list.get(i); + String dst = list.get(i + 1); + if (dst.charAt(0) == '{' && dst.charAt(dst.length() - 1) == '}') {//oneToMany + dst = dst.substring(1, dst.length() - 1); + if(!objectNodeMap.containsKey(dst)){ + objectNodeMap.put(dst, new ObjectNode(dst)); + } + if (src.charAt(0) == '{' && src.charAt(src.length() - 1) == '}') { + src = src.substring(1, src.length() - 1); + if (!objectNodeMap.containsKey(src)) { + objectNodeMap.put(src, new ObjectNode(src)); + } + } else { + if (!objectNodeMap.containsKey(src)) { + objectNodeMap.put(src, new ObjectNode(src)); + } + } + edges.add(new ReferenceEdge(objectNodeMap.get(src), objectNodeMap.get(dst), convertTheFirstCharacterToLowerCase(dst), "String")); + } else {//oneToOne + if(!objectNodeMap.containsKey(dst)){ + objectNodeMap.put(dst, new ObjectNode(dst)); + } + if (src.charAt(0) == '{' && src.charAt(src.length() - 1) == '}') { + src = src.substring(1, src.length() - 1); + if (!objectNodeMap.containsKey(src)) { + objectNodeMap.put(src, new ObjectNode(src)); + } + } else { + if (!objectNodeMap.containsKey(src)) { + objectNodeMap.put(src, new ObjectNode(src)); + } + } + edges.add(new ReferenceEdge(objectNodeMap.get(src), objectNodeMap.get(dst), convertTheFirstCharacterToLowerCase(dst))); + } + } + return null; + } + + private String convertTheFirstCharacterToLowerCase(String s){ + if (Character.isUpperCase(s.charAt(0))) { + s = s.substring(0,1).toLowerCase() + s.substring(1); + return s; + } else { + return s; + } + } +} diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java new file mode 100644 index 0000000..8d8b269 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java @@ -0,0 +1,336 @@ +package models.dataSynchronizationModel; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.MediatorInsertion; + +import designPatternExtensions.PresenterInsertion; +import models.deltaAlgebra.*; +import parser.*; +import parser.exceptions.ExpectedJsonValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * The final data synchronization design containing delta algebra and dependency injection. + * + * @author Nitta + * + */ +public class DataSynchronizationDesign { + private List synchronizationContexts; + private DeltaComplex deltaComplex; + private List dependencyInversions = new ArrayList<>(); + private List mediatorInsertions = new ArrayList<>(); + private List presenterInsertions = new ArrayList<>(); + + public DataSynchronizationDesign(DataSynchronizationContext synchronizationContexts) throws IllegalRelationException { + this.synchronizationContexts = new ArrayList<>(); + this.synchronizationContexts.add(synchronizationContexts); + this.deltaComplex = createDefaultDeltaComplex(synchronizationContexts); + } + + public DataSynchronizationDesign(JsonValue jsonValue) throws IllegalRelationException { + this.synchronizationContexts = new ArrayList<>(); + for (StringValue keyValue : jsonValue.getJson().keySet()) { + String key = keyValue.getStringValue(); + if (key.equals("contexts")) { + ArrayValue arrayValue = (ArrayValue) jsonValue.getValue(keyValue); + setSynchronizationContexts(arrayValue); + } + } + } + + public void addDependencyInversion(DependencyInversion dependencyInversion) { + dependencyInversions.add(dependencyInversion); + } + + public List getDependencyInversions() { + return dependencyInversions; + } + + public void addMediatorInsertion(MediatorInsertion mediatorInsertion) { + mediatorInsertions.add(mediatorInsertion); + } + + public List getMediatorInsertions() { + return mediatorInsertions; + } + + public void addPresenterInsertion(PresenterInsertion presenterInsertion) { + presenterInsertions.add(presenterInsertion); + } + + public List getPresenterInsertions() { + return presenterInsertions; + } + + public DeltaComplex createDefaultDeltaComplex(DataSynchronizationContext transferContext) throws IllegalRelationException { + Stack deltaStack = constructDefaultDeltas(transferContext); + // Add all deltas. + DeltaComplex deltaComplex = null; + while (!deltaStack.isEmpty()) { + if (deltaComplex == null) { + deltaComplex = new DeltaComplex(deltaStack.pop()); + } else { + deltaComplex.attach(deltaStack.pop()); + } + } + return deltaComplex; + } + + private Stack constructDefaultDeltas(DataSynchronizationContext transferContext) throws IllegalRelationException { + Stack deltaStack = new Stack<>(); + PushPullValue transferStyle = transferContext.getTransferStyle(); + ObjectNode srcObj = null; + ObjectNode dstObj = null; + if (transferStyle == PushPullValue.PUSH) { + srcObj = transferContext.getSrcTopObject(); + dstObj = transferContext.getDstTopObject(); + } else { + srcObj = transferContext.getDstTopObject(); + dstObj = transferContext.getSrcTopObject(); + } + String refName = dstObj.getName().substring(0, 1).toLowerCase() + dstObj.getName().substring(1); + ReferenceEdge prevReference = new ReferenceEdge(srcObj, dstObj, refName); + boolean hasDiagonalRelation = false; + if (!transferContext.isFlat()) { + boolean toOne = true; // potential multiplicity + ObjectHierarchy srcHierarchy = null; + ObjectHierarchy dstHierarchy = null; + List allRelations = new ArrayList<>(transferContext.getIntermediateRelations()); + for (Relation relation: allRelations) { + if (transferContext.getSrcObjectHierarchy().isPrefixOf(relation.getSrcObjectHierarchy()) + || transferContext.getDstObjectHierarchy().isPrefixOf(relation.getDstObjectHierarchy())) { + hasDiagonalRelation = true; + break; + } + } + if (!hasDiagonalRelation) { + allRelations.add(transferContext.getSyncronizationRelation().getPrevRelation()); + } + for (Relation relation: allRelations) { + ObjectHierarchy newSrcHierarchy = null; + ObjectHierarchy newDstHierarchy = null; + if (transferStyle == PushPullValue.PUSH) { + newSrcHierarchy = relation.getSrcObjectHierarchy(); + newDstHierarchy = relation.getDstObjectHierarchy(); + } else { + newSrcHierarchy = relation.getDstObjectHierarchy(); + newDstHierarchy = relation.getSrcObjectHierarchy(); + } + if ((dstHierarchy == null || dstHierarchy.getDepth() < newDstHierarchy.getDepth()) || (srcHierarchy == null || srcHierarchy.getDepth() < newSrcHierarchy.getDepth())) { + List oneDestination = new ArrayList<>(); + List manyDestinations = new ArrayList<>(); + for (int i = 0; i < newDstHierarchy.getDepth(); i++) { + if (dstHierarchy != null && i < dstHierarchy.getDepth()) { + if (!dstHierarchy.getEdge(i).equals(newDstHierarchy.getEdge(i))) { + throw new IllegalRelationException(); + } + } else { + if (newDstHierarchy.getEdge(i).toMany()) { + toOne = false; + } + if (toOne) { + oneDestination.add(newDstHierarchy.getEdge(i)); + } else { + manyDestinations.add(newDstHierarchy.getEdge(i)); + } + } + } + + // 1) Create container passing deltas. + List primitiveDeltaList = new ArrayList<>(); + for (ReferenceEdge dstEdge: oneDestination) { + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) dstEdge.getDestination(); + String dataName = dstObj.getName(); + dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + if (!prevReference.isIdentical()) { + primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName)); + } + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } + for (int i = 0; i < newSrcHierarchy.getDepth(); i++) { + ReferenceEdge srcEdge = newSrcHierarchy.getEdge(i); + if (srcHierarchy != null && i < srcHierarchy.getDepth()) { + if (!srcHierarchy.getEdge(i).equals(srcEdge)) { + throw new IllegalRelationException(); + } + } else { + srcObj = (ObjectNode) srcEdge.getDestination(); + dstObj = (ObjectNode) prevReference.getDestination(); + String dataName = dstObj.getName(); + dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + if (!prevReference.isIdentical() && !prevReference.getDestination().equals(srcEdge.getDestination())) { + primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName)); + Delta delta = null; + for (PrimitiveDelta primDelta : primitiveDeltaList) { + if (delta == null) { + delta = new Delta(primDelta); + } else { + delta = new Delta(primDelta, delta); + } + } + deltaStack.push(delta); // add a container passing delta + primitiveDeltaList.clear(); + } + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } + } + + if (!toOne) { + boolean multipleDefinition = false; + if ((transferStyle == PushPullValue.PUSH && (relation.getMultiplicity() == MultiplicityValue.ManyToOne || relation.getMultiplicity() == MultiplicityValue.OneToOne)) + || (transferStyle != PushPullValue.PUSH && (relation.getMultiplicity() == MultiplicityValue.OneToMany || relation.getMultiplicity() == MultiplicityValue.OneToOne))) { + // If the specified multiplicity of destination objects does not match to their potential multiplicity, + // then the reference to select one destination object from potential multiple objects is needed. + toOne = true; + } else { + // If the specified multiplicity of destination objects and their potential multiplicity are both many, + // then the reference to select one destination object from potential multiple objects is needed. + multipleDefinition = true; + } + // 2) Create a component identifying delta. + PrimitiveDelta componentSelectingDelta = null; + for (ReferenceEdge dstEdge : manyDestinations) { + if (componentSelectingDelta == null) { + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) dstEdge.getDestination(); + String dataName = dstObj.getName(); + dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); + primitiveDeltaList.add(componentSelectingDelta); + Delta delta = null; + for (PrimitiveDelta primDelta : primitiveDeltaList) { + if (delta == null) { + delta = new Delta(primDelta); + } else { + delta = new Delta(primDelta, delta); + } + } + deltaStack.push(delta); // add a component identifying delta + primitiveDeltaList.clear(); + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } else { + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) dstEdge.getDestination(); + String dataName = dstObj.getName(); + dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition)); + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } + } + } + // 3) Create a component obtaining delta. + if (primitiveDeltaList.size() > 0) { + Delta delta = null; + for (PrimitiveDelta primDelta: primitiveDeltaList) { + if (delta == null) { + delta = new Delta(primDelta); + } else { + delta = new Delta(primDelta, delta); + } + } + deltaStack.push(delta); // add a component obtaining delta + } + } else { + throw new IllegalRelationException(); + } + srcHierarchy = newSrcHierarchy; + dstHierarchy = newDstHierarchy; + } + } + if (!hasDiagonalRelation) { + // 4) Create the bottom (data transfer) delta. + Delta dataTransferDelta = null; + if (transferStyle == PushPullValue.PUSH) { + // PUSH transfer + if (transferContext.getTransferMultiplicity() == MultiplicityValue.ManyToOne + || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { + // Simple PUSH + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); + String dataName = transferContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer + dataTransferDelta = new Delta(primDelta); + } else { + // Broadcasting + prevReference = new ReferenceEdge(prevReference); + prevReference.setKeyTypeName(transferContext.getDstObjectHierarchy().getEdges().getLast().getKeyTypeName()); + prevReference.setMultiplicity(MultiplicityValue.OneToMany); + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); + String dataName = transferContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName, true); // PUSH data transfer + dataTransferDelta = new Delta(primDelta); + } + } else { + if (transferContext.getTransferMultiplicity() == MultiplicityValue.OneToMany + || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { + // Simple PULL + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getDestination(); + dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); + String dataName = transferContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName); // PULL data transfer + dataTransferDelta = new Delta(primDelta); + } else { + // Data collecting + prevReference = new ReferenceEdge(prevReference); + prevReference.setKeyTypeName(transferContext.getSrcObjectHierarchy().getEdges().getLast().getKeyTypeName()); + prevReference.setMultiplicity(MultiplicityValue.OneToMany); + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getDestination(); + dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); + String dataName = transferContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName, true); // PULL data transfer + dataTransferDelta = new Delta(primDelta); + } + } + deltaStack.push(dataTransferDelta); + } + return deltaStack; + } + + private void setSynchronizationContexts(ArrayValue arrayValue) throws IllegalRelationException { + List values = arrayValue.getValues(); + for (int i = 0; i getSynchronizationContexts() { + return synchronizationContexts; + } +} diff --git a/src/main/java/models/dataSynchronizationModel/IllegalRelationException.java b/src/main/java/models/dataSynchronizationModel/IllegalRelationException.java new file mode 100644 index 0000000..f215e92 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/IllegalRelationException.java @@ -0,0 +1,5 @@ +package models.dataSynchronizationModel; + +public class IllegalRelationException extends Exception { + +} diff --git a/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java b/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java new file mode 100644 index 0000000..20a9fc5 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java @@ -0,0 +1,78 @@ +package models.dataSynchronizationModel; + +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; + +import java.util.ArrayList; +import java.util.List; + +public class ObjectHierarchy { + private ObjectNode top; + private List edges; + private boolean isFlat = false; + + public ObjectHierarchy(ObjectNode top) { + this.top = top; + this.edges = new ArrayList<>(); + this.isFlat = true; + } + + public ObjectHierarchy(List edges) { + this.top = (ObjectNode) edges.getFirst().getSource(); + this.edges = edges; + this.isFlat = false; + } + + public ObjectNode getTop() { + return top; + } + + public ObjectNode getBottom() { + if (edges.size() == 0) { + return top; + } + return (ObjectNode) edges.getLast().getDestination(); + } + + public List getEdges() { + return edges; + } + + public boolean isFlat() { + return isFlat; + } + + public int getDepth() { + return edges.size(); + } + + public ReferenceEdge getEdge(int index) { + return edges.get(index); + } + + public boolean isPrefixOf(ObjectHierarchy another) { + if (!top.equals(another.top)) { + return false; + } + for (int i = 0; i < edges.size(); i++) { + if (i >= another.edges.size() || !edges.get(i).equals(another.edges.get(i))) { + return false; + } + } + return true; + } + + public ObjectHierarchy getPrevObjectHierarchy() { + if (isFlat) { + return new ObjectHierarchy(edges); + } + List edges = new ArrayList<>(); + if (this.edges.size() == 1) { + return new ObjectHierarchy(top); + } + for (int i = 0; i < this.edges.size() - 1; i++) { + edges.add(this.edges.get(i)); + } + return new ObjectHierarchy(edges); + } +} diff --git a/src/main/java/models/dataSynchronizationModel/PushPullValue.java b/src/main/java/models/dataSynchronizationModel/PushPullValue.java new file mode 100644 index 0000000..26128c0 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/PushPullValue.java @@ -0,0 +1,20 @@ +package models.dataSynchronizationModel; + +public enum PushPullValue { + PULL, + PUSHorPULL, + PUSH; + + public String toString() { + switch (this) { + case PUSHorPULL: + return "PUSH/PULL"; + case PUSH: + return "PUSH"; + case PULL: + return "PULL"; + default: + return ""; + } + } +} diff --git a/src/main/java/models/dataSynchronizationModel/Relation.java b/src/main/java/models/dataSynchronizationModel/Relation.java new file mode 100644 index 0000000..b7abb85 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/Relation.java @@ -0,0 +1,78 @@ +package models.dataSynchronizationModel; + +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; + +import java.util.List; + +public class Relation { + private ObjectHierarchy srcObjectHierarchy; + private ObjectHierarchy dstObjectHierarchy; + private MultiplicityValue multiplicity; + private boolean isFlat = false; + + public Relation(ObjectHierarchy srcObjectHierarchy, ObjectHierarchy dstObjectHierarchy, MultiplicityValue multiplicity) { + this.srcObjectHierarchy = srcObjectHierarchy; + this.dstObjectHierarchy = dstObjectHierarchy; + this.multiplicity = multiplicity; + this.isFlat = srcObjectHierarchy.isFlat() && dstObjectHierarchy.isFlat(); + } + + + public Relation(List srcObjectHierarchy, List dstObjectHierarchy, MultiplicityValue multiplicity) { + isFlat = false; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); + this.multiplicity = multiplicity; + } + + public Relation(ObjectNode srcObjectNode, List dstObjectHierarchy, MultiplicityValue multiplicity) { + isFlat = false; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); + this.multiplicity = multiplicity; + } + + public Relation(List srcObjectHierarchy, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { + isFlat = false; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); + this.multiplicity = multiplicity; + } + + public Relation(ObjectNode srcObjectNode, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { + this.isFlat = true; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); + this.multiplicity = multiplicity; + } + + public boolean isFlat() { + return isFlat; + } + + public ObjectHierarchy getSrcObjectHierarchy() { + return srcObjectHierarchy; + } + + public ObjectHierarchy getDstObjectHierarchy() { + return dstObjectHierarchy; + } + + public ObjectNode getSrcTopObject() { + return srcObjectHierarchy.getTop(); + } + + public ObjectNode getDstTopObject() { + return dstObjectHierarchy.getTop(); + } + + public MultiplicityValue getMultiplicity() { + return multiplicity; + } + + public Relation getPrevRelation() { + return new Relation(this.srcObjectHierarchy.getPrevObjectHierarchy(), this.dstObjectHierarchy.getPrevObjectHierarchy(), this.multiplicity); + } +} diff --git a/src/main/java/models/dataSynchronizationModel/StatefulObjectNode.java b/src/main/java/models/dataSynchronizationModel/StatefulObjectNode.java new file mode 100644 index 0000000..301dc12 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/StatefulObjectNode.java @@ -0,0 +1,12 @@ +package models.dataSynchronizationModel; + +import models.algebra.Symbol.Type; +import models.deltaAlgebra.ObjectNode; + +public class StatefulObjectNode extends ObjectNode { + private Type stateType = null; + + public StatefulObjectNode(String name) { + super(name); + } +} diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java b/src/main/java/models/objectOrientedTransfer/DataTransferContext.java deleted file mode 100644 index 522a336..0000000 --- a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java +++ /dev/null @@ -1,244 +0,0 @@ -package models.objectOrientedTransfer; - -import models.deltaAlgebra.MultiplicityValue; -import models.deltaAlgebra.ObjectNode; -import models.deltaAlgebra.ReferenceEdge; -import parser.ArrayValue; -import parser.JsonValue; -import parser.StringValue; -import parser.Value; -import parser.exceptions.ExpectedJsonValue; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The reference context and properties of specific data transfer. - * - * @author Nitta - * - */ -public class DataTransferContext { - private List relations; - private Relation transferRelation; - private ObjectNode dataType; - private String dataName; - private PushPullValue transferStyle; - private Map objectNodeMap = new HashMap<>(); - - public DataTransferContext(Value jsonValue) { - setDataTransferContext(jsonValue); - } - - public DataTransferContext(List relations, Relation transferRelation, ObjectNode dataType, String dataName, PushPullValue transferStyle) { - this.relations = relations; - this.transferRelation = transferRelation; - this.dataType = dataType; - this.dataName = dataName; - this.transferStyle = transferStyle; - } - - public List getRelations() { - return relations; - } - - public Relation getTransferRelation() { - return transferRelation; - } - - public boolean isFlat() { - return transferRelation.isFlat(); - } - - public ObjectHierarchy getSrcResource() { - return transferRelation.getSrcObjectHierarchy(); - } - - public ObjectHierarchy getDstResource() { - return transferRelation.getDstObjectHierarchy(); - } - - public ObjectNode getSrcFirstResource() { - return transferRelation.getSrcTopObject(); - } - - public ObjectNode getDstFirstResource() { - return transferRelation.getDstTopObject(); - } - - - public MultiplicityValue getTransferMultiplicity() { - return transferRelation.getMultiplicity(); - } - - public ObjectNode getDataType() { - return dataType; - } - - public String getDataName() { - return dataName; - } - - public PushPullValue getTransferStyle() { - return transferStyle; - } - - private void setDataTransferContext(Value value) { - if (value instanceof JsonValue) { - for (StringValue keyValue : ((JsonValue) value).getJson().keySet()) { - String key = keyValue.getStringValue(); - if (key.equals("relations")) {//この部分は動作未確認(おそらくまだ動かない) - relations = new ArrayList<>(); - ArrayValue arrayValue = ((ArrayValue)((JsonValue) value).getValue(keyValue)); - List relationValues = arrayValue.getValues(); - for(Value relationValue:relationValues){ - relations.add(getRelation(relationValue)); - } - } else if (key.equals("transfer")) { - transferRelation = getRelation(((JsonValue) value).getValue(keyValue)); - } - } - } - } - - private Relation getRelation(Value value){ - if (value instanceof JsonValue) { - MultiplicityValue multiplicityValue = null; - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode src = null; - ObjectNode dst = null; - for (StringValue keyValue : ((JsonValue) value).getJson().keySet()) { - String key = keyValue.getStringValue(); - if (key.equals("src")) { - src = setEdges((StringValue) ((JsonValue) value).getValue(keyValue), srcEdges); - } else if (key.equals("dst")) { - dst = setEdges((StringValue) ((JsonValue) value).getValue(keyValue), dstEdges); - } else if (key.equals("style")) { - setTransferStyle((StringValue) ((JsonValue) value).getValue(keyValue)); - } else if (key.equals("multiplicity")) { - StringValue multi = (StringValue) ((JsonValue) value).getValue(keyValue); - String multiplicity = multi.getStringValue(); - if (multiplicity.equals("*:1")) { - multiplicityValue = MultiplicityValue.ManyToOne; - } else if (multiplicity.equals("1:1")) { - multiplicityValue = MultiplicityValue.OneToOne; - } else if (multiplicity.equals("*:*")) { - multiplicityValue = MultiplicityValue.ManyToMany; - } else if (multiplicity.equals("1:*")) { - multiplicityValue = MultiplicityValue.OneToMany; - } - } else if (key.equals("data")) { - setTransferData(((JsonValue) value).getValue(keyValue)); - } - } - if (multiplicityValue == null) { - throw new RuntimeException("multiplicityが存在していません"); - } - if(src != null&&dst != null){//両方単独ObjectNode - return new Relation(src,dst,multiplicityValue); - }else if(src == null&&dst != null){//片方単独 - return new Relation(srcEdges,dst,multiplicityValue); - }else if(src != null&&dst == null){//上と同じ - return new Relation(src,dstEdges,multiplicityValue); - }else{//両方複数 - return new Relation(srcEdges,dstEdges,multiplicityValue); - } - } - throw new ExpectedJsonValue("Jsonではありません。"); - } - - private void setTransferStyle(StringValue stringValue){ - String style = stringValue.getStringValue(); - if (style.equals("PUSH")) { - transferStyle = PushPullValue.PUSH; - } else if (style.equals("PULL")) { - transferStyle = PushPullValue.PULL; - } - } - - private void setTransferData(Value dataTransferValue){ - if (dataTransferValue instanceof JsonValue) { - for (StringValue dataTransferValueKeyValue : ((JsonValue) dataTransferValue).getJson().keySet()) { - String dataTransferValueKey = dataTransferValueKeyValue.getStringValue(); - if (dataTransferValueKey.equals("type")) { - String type = ((StringValue) ((JsonValue) dataTransferValue).getValue(dataTransferValueKeyValue)).getStringValue(); - dataType = new ObjectNode(type); - } else if (dataTransferValueKey.equals("name")) { - String name = ((StringValue) ((JsonValue) dataTransferValue).getValue(dataTransferValueKeyValue)).getStringValue(); - dataName = name; - } - } - } else { - throw new ExpectedJsonValue("jsonのtransferのdataが足りていません"); - } - } - - private ObjectNode setEdges(StringValue stringValue, List edges) {//objectNodeの場合はobjectNodeを返したい。 - String S = stringValue.getStringValue(); - int cur = 0; - ArrayList list = new ArrayList<>(); - while (cur < S.length()) { - StringBuilder variable = new StringBuilder(); - while (cur < S.length() && S.charAt(cur) != '.') { - variable.append(S.charAt(cur)); - cur++; - } - list.add(variable.toString()); - cur++; - } - if(list.size() == 1){//一つだけの場合はobjectNodeを返す - String src = list.get(0); - objectNodeMap.put(src, new ObjectNode(src)); - return objectNodeMap.get(src); - } - for (int i = 0; i < list.size() - 1; i++) { - String src = list.get(i); - String dst = list.get(i + 1); - if (dst.charAt(0) == '{' && dst.charAt(dst.length() - 1) == '}') {//oneToMany - dst = dst.substring(1, dst.length() - 1); - if(!objectNodeMap.containsKey(dst)){ - objectNodeMap.put(dst, new ObjectNode(dst)); - } - if (src.charAt(0) == '{' && src.charAt(src.length() - 1) == '}') { - src = src.substring(1, src.length() - 1); - if (!objectNodeMap.containsKey(src)) { - objectNodeMap.put(src, new ObjectNode(src)); - } - } else { - if (!objectNodeMap.containsKey(src)) { - objectNodeMap.put(src, new ObjectNode(src)); - } - } - edges.add(new ReferenceEdge(objectNodeMap.get(src), objectNodeMap.get(dst), convertTheFirstCharacterToLowerCase(dst), "String")); - } else {//oneToOne - if(!objectNodeMap.containsKey(dst)){ - objectNodeMap.put(dst, new ObjectNode(dst)); - } - if (src.charAt(0) == '{' && src.charAt(src.length() - 1) == '}') { - src = src.substring(1, src.length() - 1); - if (!objectNodeMap.containsKey(src)) { - objectNodeMap.put(src, new ObjectNode(src)); - } - } else { - if (!objectNodeMap.containsKey(src)) { - objectNodeMap.put(src, new ObjectNode(src)); - } - } - edges.add(new ReferenceEdge(objectNodeMap.get(src), objectNodeMap.get(dst), convertTheFirstCharacterToLowerCase(dst))); - } - } - return null; - } - - private String convertTheFirstCharacterToLowerCase(String s){ - if(Character.isUpperCase(s.charAt(0))){ - s = s.substring(0,1).toLowerCase() + s.substring(1); - return s; - }else{ - return s; - } - } -} diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java deleted file mode 100644 index ecffd8f..0000000 --- a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java +++ /dev/null @@ -1,339 +0,0 @@ -package models.objectOrientedTransfer; - -import designPatternExtensions.DependencyInversion; -import designPatternExtensions.MediatorInsertion; - -import designPatternExtensions.PresenterInsertion; -import models.deltaAlgebra.*; -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 List transferContexts; - private DeltaComplex deltaComplex; - private List dependencyInversions = new ArrayList<>(); - private List mediatorInsertions = new ArrayList<>(); - private List presenterInsertions = new ArrayList<>(); - - public DataTransferDesign(DataTransferContext transferContext) throws IllegalRelationException { - 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); - } - - public List getDependencyInversions() { - return dependencyInversions; - } - - public void addMediatorInsertion(MediatorInsertion mediatorInsertion) { - mediatorInsertions.add(mediatorInsertion); - } - - public List getMediatorInsertions() { - return mediatorInsertions; - } - - public void addPresenterInsertion(PresenterInsertion presenterInsertion) { - presenterInsertions.add(presenterInsertion); - } - - public List getPresenterInsertions() { - return presenterInsertions; - } - - public DeltaComplex createDefaultDeltaComlex(DataTransferContext transferContext) throws IllegalRelationException { - if (transferContext.getTransferStyle() == PushPullValue.PUSH) { - // PUSH transfer - - // Construct all deltas. - Stack deltaStack = new Stack<>(); - ReferenceEdge bottomReference = constructDefaultDeltas(transferContext, deltaStack); - - DeltaComplex deltaComplex = null; - if (transferContext.getTransferMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { - // Simple PUSH - - // Add the data transfer delta. - ObjectNode srcObj = (ObjectNode) bottomReference.getSource(); - ObjectNode dstObj = (ObjectNode) transferContext.getDataType(); - String dataName = transferContext.getDataName(); - ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); - PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, bottomReference, dataName); // PUSH data transfer - Delta dataTransferDelta = new Delta(primDelta); - deltaComplex = new DeltaComplex(dataTransferDelta); - } else { - // Broadcasting - bottomReference = new ReferenceEdge(bottomReference); - bottomReference.setKeyTypeName(transferContext.getDstResource().getEdges().getLast().getKeyTypeName()); - bottomReference.setMultiplicity(MultiplicityValue.OneToMany); - - // Add the data transfer delta. - ObjectNode srcObj = (ObjectNode) bottomReference.getSource(); - ObjectNode dstObj = (ObjectNode) transferContext.getDataType(); - String dataName = transferContext.getDataName(); - ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); - PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, bottomReference, dataName, true); // PUSH data transfer - Delta dataTransferDelta = new Delta(primDelta); - deltaComplex = new DeltaComplex(dataTransferDelta); - } - - // Add initialization deltas. - while (!deltaStack.isEmpty()) { - deltaComplex.attach(deltaStack.pop()); - } - return deltaComplex; - } else { - // PULL transfer - - // Construct all deltas. - Stack deltaStack = new Stack<>(); - ReferenceEdge bottomReference = constructDefaultDeltas(transferContext, deltaStack); - - DeltaComplex deltaComplex = null; - if (transferContext.getTransferMultiplicity() == MultiplicityValue.OneToMany - || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { - // Simple PULL - - // Add the data transfer delta. - ObjectNode srcObj = (ObjectNode) bottomReference.getDestination(); - ObjectNode dstObj = (ObjectNode) transferContext.getDataType(); - String dataName = transferContext.getDataName(); - ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); - PrimitivePullDelta primDelta = new PrimitivePullDelta(bottomReference, dataEdge, dataName); // PULL data transfer - Delta dataTransferDelta = new Delta(primDelta); - deltaComplex = new DeltaComplex(dataTransferDelta); - } else { - // Data collecting - bottomReference = new ReferenceEdge(bottomReference); - bottomReference.setKeyTypeName(transferContext.getSrcResource().getEdges().getLast().getKeyTypeName()); - bottomReference.setMultiplicity(MultiplicityValue.OneToMany); - - // Add the data transfer delta. - ObjectNode srcObj = (ObjectNode) bottomReference.getDestination(); - ObjectNode dstObj = (ObjectNode) transferContext.getDataType(); - String dataName = transferContext.getDataName(); - ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); - PrimitivePullDelta primDelta = new PrimitivePullDelta(bottomReference, dataEdge, dataName, true); // PULL data transfer - Delta dataTransferDelta = new Delta(primDelta); - deltaComplex = new DeltaComplex(dataTransferDelta); - } - - // Add initialization deltas. - while (!deltaStack.isEmpty()) { - deltaComplex.attach(deltaStack.pop()); - } - return deltaComplex; - } - } - - private ReferenceEdge constructDefaultDeltas(DataTransferContext transferContext, Stack deltaStack) throws IllegalRelationException { - PushPullValue transferStyle = transferContext.getTransferStyle(); - ObjectNode srcObj = null; - ObjectNode dstObj = null; - if (transferStyle == PushPullValue.PUSH) { - srcObj = transferContext.getSrcFirstResource(); - dstObj = transferContext.getDstFirstResource(); - } else { - srcObj = transferContext.getDstFirstResource(); - dstObj = transferContext.getSrcFirstResource(); - } - String refName = dstObj.getName().substring(0, 1).toLowerCase() + dstObj.getName().substring(1); - ReferenceEdge prevReference = new ReferenceEdge(srcObj, dstObj, refName); - if (transferContext.isFlat()) { - return prevReference; - } - boolean toOne = true; // potential multiplicity - ObjectHierarchy srcHierarchy = null; - ObjectHierarchy dstHierarchy = null; - List allRelations = new ArrayList<>(transferContext.getRelations()); - allRelations.add(transferContext.getTransferRelation()); - for (Relation relation: allRelations) { - ObjectHierarchy newSrcHierarchy = null; - ObjectHierarchy newDstHierarchy = null; - if (transferStyle == PushPullValue.PUSH) { - newSrcHierarchy = relation.getSrcObjectHierarchy(); - newDstHierarchy = relation.getDstObjectHierarchy(); - } else { - newSrcHierarchy = relation.getDstObjectHierarchy(); - newDstHierarchy = relation.getSrcObjectHierarchy(); - } - if ((dstHierarchy == null || dstHierarchy.getDepth() < newDstHierarchy.getDepth()) || (srcHierarchy == null || srcHierarchy.getDepth() < newSrcHierarchy.getDepth())) { - List oneDestination = new ArrayList<>(); - List manyDestinations = new ArrayList<>(); - for (int i = 0; i < newDstHierarchy.getDepth(); i++) { - if (dstHierarchy != null && i < dstHierarchy.getDepth()) { - if (!dstHierarchy.getEdge(i).equals(newDstHierarchy.getEdge(i))) { - throw new IllegalRelationException(); - } - } else { - if (newDstHierarchy.getEdge(i).toMany()) { - toOne = false; - } - if (toOne) { - oneDestination.add(newDstHierarchy.getEdge(i)); - } else { - manyDestinations.add(newDstHierarchy.getEdge(i)); - } - } - } - - // 1) Create container passing deltas. - List primitiveDeltaList = new ArrayList<>(); - for (ReferenceEdge dstEdge: oneDestination) { - srcObj = (ObjectNode) prevReference.getSource(); - dstObj = (ObjectNode) dstEdge.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - if (!prevReference.isIdentical()) { - primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName)); - } - prevReference = new ReferenceEdge(srcObj, dstObj, dataName); - } - for (int i = 0; i < newSrcHierarchy.getDepth(); i++) { - ReferenceEdge srcEdge = newSrcHierarchy.getEdge(i); - if (srcHierarchy != null && i < srcHierarchy.getDepth()) { - if (!srcHierarchy.getEdge(i).equals(srcEdge)) { - throw new IllegalRelationException(); - } - } else { - srcObj = (ObjectNode) srcEdge.getDestination(); - dstObj = (ObjectNode) prevReference.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - if (!prevReference.isIdentical() && !prevReference.getDestination().equals(srcEdge.getDestination())) { - primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName)); - Delta delta = null; - for (PrimitiveDelta primDelta : primitiveDeltaList) { - if (delta == null) { - delta = new Delta(primDelta); - } else { - delta = new Delta(primDelta, delta); - } - } - deltaStack.push(delta); // add a container passing delta - primitiveDeltaList.clear(); - } - prevReference = new ReferenceEdge(srcObj, dstObj, dataName); - } - } - - if (!toOne) { - boolean multipleDefinition = false; - if ((transferStyle == PushPullValue.PUSH && (relation.getMultiplicity() == MultiplicityValue.ManyToOne || relation.getMultiplicity() == MultiplicityValue.OneToOne)) - || (transferStyle != PushPullValue.PUSH && (relation.getMultiplicity() == MultiplicityValue.OneToMany || relation.getMultiplicity() == MultiplicityValue.OneToOne))) { - // If the specified multiplicity of destination objects does not match to their potential multiplicity, - // then the reference to select one destination object from potential multiple objects is needed. - toOne = true; - } else { - // If the specified multiplicity of destination objects and their potential multiplicity are both many, - // then the reference to select one destination object from potential multiple objects is needed. - multipleDefinition = true; - } - // 2) Create a component identifying delta. - PrimitiveDelta componentSelectingDelta = null; - for (ReferenceEdge dstEdge : manyDestinations) { - if (componentSelectingDelta == null) { - srcObj = (ObjectNode) prevReference.getSource(); - dstObj = (ObjectNode) dstEdge.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); - primitiveDeltaList.add(componentSelectingDelta); - Delta delta = null; - for (PrimitiveDelta primDelta : primitiveDeltaList) { - if (delta == null) { - delta = new Delta(primDelta); - } else { - delta = new Delta(primDelta, delta); - } - } - deltaStack.push(delta); // add a component identifying delta - primitiveDeltaList.clear(); - prevReference = new ReferenceEdge(srcObj, dstObj, dataName); - } else { - srcObj = (ObjectNode) prevReference.getSource(); - dstObj = (ObjectNode) dstEdge.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition)); - prevReference = new ReferenceEdge(srcObj, dstObj, dataName); - } - } - } - // 3) Create a component obtaining delta. - if (primitiveDeltaList.size() > 0) { - Delta delta = null; - for (PrimitiveDelta primDelta: primitiveDeltaList) { - if (delta == null) { - delta = new Delta(primDelta); - } else { - delta = new Delta(primDelta, delta); - } - } - deltaStack.push(delta); // add a component obtaining delta - } - } else { - throw new IllegalRelationException(); - } - srcHierarchy = newSrcHierarchy; - dstHierarchy = newDstHierarchy; - } - 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/IllegalRelationException.java b/src/main/java/models/objectOrientedTransfer/IllegalRelationException.java deleted file mode 100644 index 0813b4e..0000000 --- a/src/main/java/models/objectOrientedTransfer/IllegalRelationException.java +++ /dev/null @@ -1,5 +0,0 @@ -package models.objectOrientedTransfer; - -public class IllegalRelationException extends Exception { - -} diff --git a/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java b/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java deleted file mode 100644 index 238185f..0000000 --- a/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java +++ /dev/null @@ -1,45 +0,0 @@ -package models.objectOrientedTransfer; - -import models.deltaAlgebra.ObjectNode; -import models.deltaAlgebra.ReferenceEdge; - -import java.util.ArrayList; -import java.util.List; - -public class ObjectHierarchy { - private ObjectNode top; - private List edges; - private boolean isFlat = false; - - public ObjectHierarchy(ObjectNode top) { - this.top = top; - this.edges = new ArrayList<>(); - this.isFlat = true; - } - - public ObjectHierarchy(List edges) { - this.top = (ObjectNode) edges.getFirst().getSource(); - this.edges = edges; - this.isFlat = false; - } - - public ObjectNode getTop() { - return top; - } - - public List getEdges() { - return edges; - } - - public boolean isFlat() { - return isFlat; - } - - public int getDepth() { - return edges.size(); - } - - public ReferenceEdge getEdge(int index) { - return edges.get(index); - } -} diff --git a/src/main/java/models/objectOrientedTransfer/PushPullValue.java b/src/main/java/models/objectOrientedTransfer/PushPullValue.java deleted file mode 100644 index dd1a809..0000000 --- a/src/main/java/models/objectOrientedTransfer/PushPullValue.java +++ /dev/null @@ -1,20 +0,0 @@ -package models.objectOrientedTransfer; - -public enum PushPullValue { - PULL, - PUSHorPULL, - PUSH; - - public String toString() { - switch (this) { - case PUSHorPULL: - return "PUSH/PULL"; - case PUSH: - return "PUSH"; - case PULL: - return "PULL"; - default: - return ""; - } - } -} diff --git a/src/main/java/models/objectOrientedTransfer/Relation.java b/src/main/java/models/objectOrientedTransfer/Relation.java deleted file mode 100644 index 0f8d333..0000000 --- a/src/main/java/models/objectOrientedTransfer/Relation.java +++ /dev/null @@ -1,66 +0,0 @@ -package models.objectOrientedTransfer; - -import models.deltaAlgebra.MultiplicityValue; -import models.deltaAlgebra.ObjectNode; -import models.deltaAlgebra.ReferenceEdge; - -import java.util.List; - -public class Relation { - private ObjectHierarchy srcObjectHierarchy; - private ObjectHierarchy dstObjectHierarchy; - private MultiplicityValue multiplicity; - private boolean isFlat = false; - - public Relation(List srcObjectHierarchy, List dstObjectHierarchy, MultiplicityValue multiplicity) { - isFlat = false; - this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); - this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); - this.multiplicity = multiplicity; - } - - public Relation(ObjectNode srcObjectNode, List dstObjectHierarchy, MultiplicityValue multiplicity) { - isFlat = false; - this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); - this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); - this.multiplicity = multiplicity; - } - - public Relation(List srcObjectHierarchy, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { - isFlat = false; - this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); - this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); - this.multiplicity = multiplicity; - } - - public Relation(ObjectNode srcObjectNode, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { - this.isFlat = true; - this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); - this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); - this.multiplicity = multiplicity; - } - - public boolean isFlat() { - return isFlat; - } - - public ObjectHierarchy getSrcObjectHierarchy() { - return srcObjectHierarchy; - } - - public ObjectHierarchy getDstObjectHierarchy() { - return dstObjectHierarchy; - } - - public ObjectNode getSrcTopObject() { - return srcObjectHierarchy.getTop(); - } - - public ObjectNode getDstTopObject() { - return dstObjectHierarchy.getTop(); - } - - public MultiplicityValue getMultiplicity() { - return multiplicity; - } -} diff --git a/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java b/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java deleted file mode 100644 index e0b09ec..0000000 --- a/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java +++ /dev/null @@ -1,12 +0,0 @@ -package models.objectOrientedTransfer; - -import models.algebra.Symbol.Type; -import models.deltaAlgebra.ObjectNode; - -public class StatefulObjectNode extends ObjectNode { - private Type stateType = null; - - public StatefulObjectNode(String name) { - super(name); - } -} diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 0c20d1a..029b052 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,6 +1,5 @@ package parser; -import models.objectOrientedTransfer.*; import parser.exceptions.ExpectedArrayValue; import parser.exceptions.ExpectedJsonValue; import parser.exceptions.ExpectedStringValue; diff --git a/src/test/java/generator/TestMultipleContexts.java b/src/test/java/generator/TestMultipleContexts.java index 60262ab..2ceeec0 100644 --- a/src/test/java/generator/TestMultipleContexts.java +++ b/src/test/java/generator/TestMultipleContexts.java @@ -2,7 +2,7 @@ import generators.ASTGenerator; import models.deltaAlgebra.*; -import models.objectOrientedTransfer.*; +import models.dataSynchronizationModel.*; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/src/test/java/parser/TestParser.java b/src/test/java/parser/TestParser.java index 3c51bc3..1324ea0 100644 --- a/src/test/java/parser/TestParser.java +++ b/src/test/java/parser/TestParser.java @@ -1,9 +1,9 @@ package parser; import generators.ASTGenerator; -import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.DataTransferDesign; -import models.objectOrientedTransfer.IllegalRelationException; +import models.dataSynchronizationModel.DataTransferContext; +import models.dataSynchronizationModel.DataTransferDesign; +import models.dataSynchronizationModel.IllegalRelationException; import org.junit.jupiter.api.Test; import parser.exceptions.ExpectedArrayValue; import parser.exceptions.ExpectedJsonValue;