diff --git a/models/CustomerManagement-PULL.Json b/models/CustomerManagement-PULL.Json new file mode 100644 index 0000000..3fc8821 --- /dev/null +++ b/models/CustomerManagement-PULL.Json @@ -0,0 +1,15 @@ +{ + "name" : "CustomerManagement", + "contexts" : [ + { + "relations": [], + "transfer": { + "src": "companies.{company}.String", + "dst": "customers.{customer}.String", + "data": {"name": "address"}, + "style": "PULL", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/CustomerManagement-PUSH.Json b/models/CustomerManagement-PUSH.Json new file mode 100644 index 0000000..bf420fb --- /dev/null +++ b/models/CustomerManagement-PUSH.Json @@ -0,0 +1,21 @@ +{ + "name" : "CustomerManagement", + "contexts" : [ + { + "relations": [ + { + "src": "companies.{company}", + "dst": "customers", + "multiplicity": "*:1" + } + ], + "transfer": { + "src": "companies.{company}.String", + "dst": "customers.{customer}.String", + "data": {"name": "address"}, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/CustomerManagement.Json b/models/CustomerManagement.Json deleted file mode 100644 index 59e6c0e..0000000 --- a/models/CustomerManagement.Json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name" : "CustomerManagement", - "contexts" : [ - { - "relations": [], - "transfer": { - "src": "Companies.{company}.String", - "dst": "customers.{customer}.String", - "data": {"name": "address"}, - "style": "PULL", - "multiplicity": "1:*" - } - } - ] -} \ No newline at end of file diff --git a/models/Memento.Json b/models/Memento.Json deleted file mode 100644 index ce8bc73..0000000 --- a/models/Memento.Json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name" : "Memento", - "contexts" : [ - { - "relations": [], - "transfer": { - "src": "Star.StarMementoInternal", - "dst": "States.StarMementoInternal", - "data": {"name": "memento"}, - "style": "PUSH", - "multiplicity": "1:1" - } - }, - { - "relations": [], - "transfer": { - "src": "States.StarMementoInternal", - "dst": "Star.StarMementoInternal", - "data": {"name": "memento"}, - "style": "PUSH", - "multiplicity": "1:1" - } - } - ] -} \ No newline at end of file diff --git a/models/designPattern/Command2.Json b/models/designPattern/Command2.Json index a4b5779..dcc37e7 100644 --- a/models/designPattern/Command2.Json +++ b/models/designPattern/Command2.Json @@ -14,14 +14,18 @@ } }, { - "relations": [], + "relations": [{ + "src": "Main.Data", + "dst": "Main.Wizard.Goblin.Data", + "multiplicity": "1:1" + }], "transfer": { "src": "Main.Data", "dst": "Main.Wizard.Goblin.Data", "data": { "name": "data" }, - "style": "PUSH", + "style": "PLAIN", "multiplicity": "1:1" } } diff --git a/models/designPattern/Composite.Json b/models/designPattern/Composite.Json index bd4ba93..5ae8210 100644 --- a/models/designPattern/Composite.Json +++ b/models/designPattern/Composite.Json @@ -4,10 +4,9 @@ { "relations": [], "transfer": { - "src": "Messenger.Sentence", - "dst": "Main", + "src": "Messenger.Sentence.Data", + "dst": "Main.Data", "data": { - "type": "Data", "name": "data" }, "style": "PULL", @@ -17,10 +16,9 @@ { "relations": [], "transfer": { - "src": "Sentence.{Word}", - "dst": "Messenger", + "src": "Sentence.{Word}.Data", + "dst": "Messenger.Data", "data": { - "type": "Data", "name": "data" }, "style": "PULL", @@ -30,10 +28,9 @@ { "relations": [], "transfer": { - "src": "Word", - "dst": "Sentence", + "src": "Word.Data", + "dst": "Sentence.Data", "data": { - "type": "Data", "name": "data" }, "style": "PULL", @@ -43,10 +40,9 @@ { "relations": [], "transfer": { - "src": "Letter", - "dst": "Word", + "src": "Letter.char", + "dst": "Word.char", "data": { - "type": "char", "name": "char" }, "style": "PULL", @@ -56,10 +52,9 @@ { "relations": [], "transfer": { - "src": "Letter", - "dst": "LetterComposite.{LetterComposite}", + "src": "Letter.Data", + "dst": "LetterComposite.{LetterComposite}.Data", "data": { - "type": "Data", "name": "data" }, "style": "PULL", diff --git a/models/designPattern/Factory-method.Json b/models/designPattern/Factory-method.Json index fc3a44e..2af49da 100644 --- a/models/designPattern/Factory-method.Json +++ b/models/designPattern/Factory-method.Json @@ -4,14 +4,13 @@ { "relations": [], "transfer": { - "src": "ConcreteBlacksmith", - "dst": "Main", + "src": "Main.ConcreteBlacksmith.{Weapon}", + "dst": "Main.Weapon", "data": { - "type": "Weapon", "name": "weapon" }, - "style": "PULL", - "multiplicity": "1:1" + "style": "PLAIN", + "multiplicity": "*:1" } } ] diff --git a/models/designPattern/Flyweight.Json b/models/designPattern/Flyweight.Json index 708108b..9eeb987 100644 --- a/models/designPattern/Flyweight.Json +++ b/models/designPattern/Flyweight.Json @@ -2,20 +2,14 @@ "name": "Flyweight", "contexts": [ { - "relations": [ - { - "src": "Main.AlchemistShop.PotionFactory.{Potion}", - "dst": "Main.AlchemistShop", - "multiplicity": "*:*" - } - ], + "relations": [], "transfer": { "src": "Main.AlchemistShop.PotionFactory.{Potion}", "dst": "Main.AlchemistShop.TopShelf.{Potion}", "data": { - "name": "data" + "name": "potion" }, - "style": "PULL", + "style": "PLAIN", "multiplicity": "*:*" } }, diff --git a/models/designPattern/Iterator.Json b/models/designPattern/Iterator.Json index 44a50e1..26afd82 100644 --- a/models/designPattern/Iterator.Json +++ b/models/designPattern/Iterator.Json @@ -1,15 +1,25 @@ { - "name": "Chain-of-responsibility", + "name": "Iterator", "contexts": [ { "relations": [], "transfer": { - "src": "App.{Item}.String", + "src": "App.TreasureChest.{Item}.String", "dst": "App.String", "data": { "name": "data" }, "style": "PULL", "multiplicity": "1:1" } + }, + { + "relations": [], + "transfer": { + "src": "App.TreasureChest.Iterator", + "dst": "App.Iterator", + "data": { "name": "iterator" }, + "style": "PLAIN", + "multiplicity": "1:1" + } } ] } \ No newline at end of file diff --git a/models/designPattern/Memento.Json b/models/designPattern/Memento.Json new file mode 100644 index 0000000..2aa7b91 --- /dev/null +++ b/models/designPattern/Memento.Json @@ -0,0 +1,25 @@ +{ + "name" : "Memento", + "contexts" : [ + { + "relations": [], + "transfer": { + "src": "Main.Star.StarMementoInternal", + "dst": "Main.States.StarMementoInternal", + "data": {"name": "memento"}, + "style": "PLAIN", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main.States.StarMementoInternal", + "dst": "Main.Star.StarMementoInternal", + "data": {"name": "memento"}, + "style": "PLAIN", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Observer.Json b/models/designPattern/Observer.Json index d439ae5..68ddeaa 100644 --- a/models/designPattern/Observer.Json +++ b/models/designPattern/Observer.Json @@ -4,8 +4,8 @@ { "relations": [], "transfer": { - "src": "Main.Data", - "dst": "Main.{ConcreteObserver}.Data", + "src": "Main.Weather.Data", + "dst": "Main.Weather.{ConcreteObserver}.Data", "data": { "name": "data" }, @@ -16,13 +16,13 @@ { "relations": [], "transfer": { - "src": "Main.ConcreteObserver", + "src": "Main.{ConcreteObserver}", "dst": "Main.Weather.{ConcreteObserver}", "data": { - "name": "concreteObserver" + "name": "observers" }, - "style": "PUSH", - "multiplicity": "1:1" + "style": "PLAIN", + "multiplicity": "*:*" } } ] diff --git a/models/designPattern/Prototype.Json b/models/designPattern/Prototype.Json index 4110e45..0f1ff0a 100644 --- a/models/designPattern/Prototype.Json +++ b/models/designPattern/Prototype.Json @@ -4,10 +4,21 @@ { "relations": [], "transfer": { - "src": "FactoryImpl", - "dst": "Main", + "src": "Main.OrcConcreteHero", + "dst": "FactoryImpl.OrcConcreteHero", "data": { - "type": "OrcConcreteHero", + "name": "orcConcreteHero" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "FactoryImpl.OrcConcreteHero", + "dst": "Main.OrcConcreteHero", + "data": { "name": "orcConcreteHero" }, "style": "PULL", @@ -17,10 +28,9 @@ { "relations": [], "transfer": { - "src": "FactoryImpl.OrcConcreteHero", - "dst": "Main", + "src": "FactoryImpl.OrcConcreteHero.Weapon", + "dst": "Main.Weapon", "data": { - "type": "Weapon", "name": "weapon" }, "style": "PULL", diff --git a/models/designPattern/Visitor.Json b/models/designPattern/Visitor.Json index 9c89347..acff773 100644 --- a/models/designPattern/Visitor.Json +++ b/models/designPattern/Visitor.Json @@ -5,11 +5,11 @@ "relations": [], "transfer": { "src": "Main.SoldierVisitor", - "dst": "Commander.{Sergent}.{Soldier}.SoldierVisitor", + "dst": "Main.Commander.{Sergent}.{Soldier}.SoldierVisitor", "data": { "name": "visitor" }, - "style": "PUSH", + "style": "PLAIN", "multiplicity": "1:*" } } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 451a648..44e00cb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,7 +1,7 @@ import java.util.ArrayList; import java.util.List; -import designPatternExtensions.*; +import designPatternExtensions.ModelLoader; import designPatternExtensions.designPattern.*; import generators.ASTGenerator; import models.deltaAlgebra.MultiplicityValue; @@ -29,11 +29,15 @@ dstEdges.add(dstEdge2); List relations = new ArrayList<>(); Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToMany); -// DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PULL); - DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PUSH); - + DataSynchronizationDesign design; + +// design = ModelLoader.load("models/CustomerManagement-PUSH.Json"); +// System.out.println(design.getDeltaComplex()); +// System.out.println(ASTGenerator.generate(design)); + try { + DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", TransferStyle.PULL); design = new DataSynchronizationDesign(context); // ObjectNode cm = new ObjectNode("CompanyMediator"); @@ -43,7 +47,7 @@ // DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); // design.addDependencyInversion(di); -// design = new Flyweight().create(); + design = new Iterator().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 d9ca498..224771f 100644 --- a/src/main/java/designPatternExtensions/MediatorInsertion.java +++ b/src/main/java/designPatternExtensions/MediatorInsertion.java @@ -2,13 +2,13 @@ import models.dataSynchronizationModel.DataSynchronizationContext; import models.deltaAlgebra.ObjectNode; -import models.dataSynchronizationModel.PushPullValue; +import models.dataSynchronizationModel.TransferStyle; public class MediatorInsertion { private ObjectNode src; private ObjectNode dst; private ObjectNode mediator; - private PushPullValue pushPullValue; + private TransferStyle transferStyle; private boolean removeDirectDependency = true; //全デザインパターンに適応出来たら不要になるメソッド @@ -16,18 +16,18 @@ this.src = src; this.dst = dst; this.mediator = mediator; - this.pushPullValue = context.getTransferStyle(); + this.transferStyle = context.getTransferStyle(); } - public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, PushPullValue pushPullValue) { - this(src, dst, mediator, pushPullValue, true); + public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, TransferStyle transferStyle) { + this(src, dst, mediator, transferStyle, true); } - public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, PushPullValue pushPullValue, boolean removeDirectDependency) { + public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, TransferStyle transferStyle, boolean removeDirectDependency) { this.src = src; this.dst = dst; this.mediator = mediator; - this.pushPullValue = pushPullValue; + this.transferStyle = transferStyle; this.removeDirectDependency = removeDirectDependency; } @@ -43,8 +43,8 @@ return mediator; } - public PushPullValue getPushPullValue() { - return pushPullValue; + public TransferStyle getPushPullValue() { + return transferStyle; } public boolean getRemoveDirectDependency() { diff --git a/src/main/java/designPatternExtensions/PresenterInsertion.java b/src/main/java/designPatternExtensions/PresenterInsertion.java index 311518c..1ab9ccf 100644 --- a/src/main/java/designPatternExtensions/PresenterInsertion.java +++ b/src/main/java/designPatternExtensions/PresenterInsertion.java @@ -1,21 +1,21 @@ package designPatternExtensions; import models.deltaAlgebra.ObjectNode; -import models.dataSynchronizationModel.PushPullValue; +import models.dataSynchronizationModel.TransferStyle; public class PresenterInsertion { private ObjectNode src; private ObjectNode dst; private ObjectNode presenter; - private PushPullValue pushPullValue; + private TransferStyle transferStyle; private boolean removeDirectDependency = false; public PresenterInsertion(ObjectNode src, ObjectNode dst, ObjectNode presenter, - PushPullValue pushPullValue, boolean removeDirectDependency) { + TransferStyle transferStyle, boolean removeDirectDependency) { this.src = src; this.dst = dst; this.presenter = presenter; - this.pushPullValue = pushPullValue; + this.transferStyle = transferStyle; this.removeDirectDependency = removeDirectDependency; } @@ -31,7 +31,7 @@ return presenter; } - public PushPullValue getPushPullValue() { return pushPullValue; } + public TransferStyle getPushPullValue() { return transferStyle; } public boolean getRemoveDirectDependency() { return removeDirectDependency; } diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java index a24c366..586631e 100644 --- a/src/main/java/designPatternExtensions/designPattern/Adapter.java +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -13,7 +13,7 @@ ObjectNode fishingBoat = dtc.getDstTopObject(); ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); - MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, PushPullValue.PUSH); + MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, TransferStyle.PUSH); design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java index 0ae79f0..d3ade28 100644 --- a/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java +++ b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java @@ -7,8 +7,6 @@ import models.deltaAlgebra.ObjectNode; import models.dataSynchronizationModel.*; -import javax.print.attribute.standard.Media; - //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/chain-of-responsibility @@ -25,7 +23,7 @@ DependencyInversion di = new DependencyInversion(concreteOrcRequestHandler, requestHandler); design.addDependencyInversion(di); - MediatorInsertion mi = new MediatorInsertion(main, concreteOrcRequestHandler, new ObjectNode("OrcKing"), PushPullValue.PUSH); + MediatorInsertion mi = new MediatorInsertion(main, concreteOrcRequestHandler, new ObjectNode("OrcKing"), TransferStyle.PUSH); design.addMediatorInsertion(mi); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Factory_method.java b/src/main/java/designPatternExtensions/designPattern/Factory_method.java index 072e3fd..46eacf4 100644 --- a/src/main/java/designPatternExtensions/designPattern/Factory_method.java +++ b/src/main/java/designPatternExtensions/designPattern/Factory_method.java @@ -13,7 +13,7 @@ public DataSynchronizationDesign create() throws IllegalRelationException { DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Factory-method.Json"); DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); - ObjectNode concreteBlacksmith = dtc.getSrcTopObject(); + ObjectNode concreteBlacksmith = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); ObjectNode main = dtc.getDstTopObject(); InterfaceNode blackSmith = new InterfaceNode(concreteBlacksmith, "Blacksmith"); diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index fe1a8aa..92a4e3c 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -22,8 +22,8 @@ ObjectNode app = (ObjectNode) dtc.getDstTopObject(); ObjectNode client = dtc.getDstTopObject(); - MediatorInsertion mi = new MediatorInsertion(app, item, new ObjectNode("TreasureChest"), dtc); - design.addMediatorInsertion(mi); +// MediatorInsertion mi = new MediatorInsertion(app, item, new ObjectNode("TreasureChest"), dtc); +// design.addMediatorInsertion(mi); // DependencyInversion di = new DependencyInversion( // iterator, new InterfaceNode(iterator, "Iterator")); diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator.java b/src/main/java/designPatternExtensions/designPattern/Mediator.java index c331a44..1333d5f 100644 --- a/src/main/java/designPatternExtensions/designPattern/Mediator.java +++ b/src/main/java/designPatternExtensions/designPattern/Mediator.java @@ -35,7 +35,7 @@ DependencyInversion di3 = new DependencyInversion(partyImpl, party); design.addDependencyInversion(di3); - MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, partyImpl, PushPullValue.PUSH); + MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, partyImpl, TransferStyle.PUSH); design.addMediatorInsertion(mi); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Memento.java b/src/main/java/designPatternExtensions/designPattern/Memento.java index 48ba242..7be572c 100644 --- a/src/main/java/designPatternExtensions/designPattern/Memento.java +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -8,23 +8,23 @@ public class Memento implements DesignPattern{ public DataSynchronizationDesign create() throws IllegalRelationException { - DataSynchronizationDesign design = ModelLoader.load("models/Memento.Json"); + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/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); +// ObjectNode presenter = new ObjectNode("Main"); +// PresenterInsertion main = new PresenterInsertion(star, states, +// presenter, dtc.getTransferStyle(), true); +// design.addPresenterInsertion(main); DataSynchronizationContext dtc2 = design.getSynchronizationContexts().getLast(); ObjectNode states2 = dtc2.getSrcTopObject(); ObjectNode star2 = dtc2.getDstTopObject(); - PresenterInsertion main2 = new PresenterInsertion(states2, star2, - presenter, dtc2.getTransferStyle(), true); - design.addPresenterInsertion(main2); +// PresenterInsertion main2 = new PresenterInsertion(states2, star2, +// presenter, dtc2.getTransferStyle(), true); +// design.addPresenterInsertion(main2); ObjectNode starMementoInternal = new ObjectNode("StarMementoInternal"); DependencyInversion di = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index c0fde19..ddd9acf 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -19,7 +19,7 @@ DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); ObjectNode main = dtc.getDstTopObject(); - ObjectNode concreteObserver = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); + ObjectNode concreteObserver = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); // MediatorInsertion mi = new MediatorInsertion(main, concreteObserver, new ObjectNode("Weather"), dtc.getTransferStyle()); // design.addMediatorInsertion(mi); diff --git a/src/main/java/designPatternExtensions/designPattern/Singleton.java b/src/main/java/designPatternExtensions/designPattern/Singleton.java index e5acb55..2322e52 100644 --- a/src/main/java/designPatternExtensions/designPattern/Singleton.java +++ b/src/main/java/designPatternExtensions/designPattern/Singleton.java @@ -17,7 +17,7 @@ Relation transferRelation = new Relation(enumIvoryTower, client, MultiplicityValue.OneToOne); DataSynchronizationContext context = new DataSynchronizationContext( - new ArrayList<>(), transferRelation, "data", PushPullValue.PULL + new ArrayList<>(), transferRelation, "data", TransferStyle.PULL ); return new DataSynchronizationDesign(context); diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index 109e402..225b693 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -93,7 +93,9 @@ models.algebra.Type type3 = codebase.getComponentType(name3); FieldDeclaration field12 = null; if (!pullEdge1.toMany()) { - field12 = createField(class1, pullEdge1.getName(), type2); // class1 -> class2 (PULL) + if (!pullEdge1.isIdentical()) { + field12 = createField(class1, pullEdge1.getName(), type2); // class1 -> class2 (PULL) + } } else { MapType typeKeyToType2 = codebase.getMapType(pullEdge1.getKeyTypeName(), name2); field12 = createField(class1, pullEdge1.getName() + mapPostfix, typeKeyToType2); // class1 -> {class2} (PULL) @@ -145,7 +147,12 @@ coordionator = createMethod(class1, updateMethodPrefix + toComponentName(pullEdge2.getName())); } FieldAccess field3 = new FieldAccess(new ThisExpression(), field13.getName()); // this.name3 - FieldAccess field2 = new FieldAccess(field12.getName()); + Expression field2 = null; + if (field12 != null) { + field2 = new FieldAccess(field12.getName()); + } else { + field2 = new ThisExpression(); + } List args = new ArrayList<>(); if ((!primitivePullDelta.isMultipleDefinition() && pullEdge2.toMany()) || (primitivePullDelta.isMultipleDefinition() && !pullEdge1.toMany() && !primitivePullDelta.isMultipleTransfer())) { @@ -170,7 +177,9 @@ String loopVarName = null; if (pullEdge1.toMany()) { loopVarName = pullEdge1.getName() + idPostfix; - keyType = ((MapType) field12.getType()).getKeyType(); + if (field12 != null) { + keyType = ((MapType) field12.getType()).getKeyType(); + } } else { loopVarName = pullEdge2.getName() + idPostfix; keyType = ((MapType) field13.getType()).getKeyType(); @@ -384,9 +393,9 @@ public static Codebase weaveMediatorInsertion(Codebase codebase, MediatorInsertion mediatorInsertion) { - PushPullValue style = mediatorInsertion.getPushPullValue(); + TransferStyle style = mediatorInsertion.getPushPullValue(); ObjectNode srcNode, dstNode; - if (style == PushPullValue.PUSH) { + if (style == TransferStyle.PUSH) { srcNode = mediatorInsertion.getSrc(); dstNode = mediatorInsertion.getDst(); } else { @@ -723,7 +732,7 @@ } if (presenterInsertion.getRemoveDirectDependency()) { - if (presenterInsertion.getPushPullValue() == PushPullValue.PUSH) { + if (presenterInsertion.getPushPullValue() == TransferStyle.PUSH) { removeDirectDependency(srcClass, dstType); } else { removeDirectDependency(dstClass, srcType); diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java index 486fb2e..1f22ccf 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java @@ -24,14 +24,14 @@ private List intermediateRelations; private Relation syncronizationRelation; private String dataName; - private PushPullValue transferStyle; + private TransferStyle transferStyle = TransferStyle.PLAIN; private Map objectNodeMap = new HashMap<>(); public DataSynchronizationContext(Value jsonValue) { setDataTransferContext(jsonValue); } - public DataSynchronizationContext(List intermediateRelations, Relation syncronizationRelation, String dataName, PushPullValue transferStyle) { + public DataSynchronizationContext(List intermediateRelations, Relation syncronizationRelation, String dataName, TransferStyle transferStyle) { this.intermediateRelations = intermediateRelations; this.syncronizationRelation = syncronizationRelation; this.dataName = dataName; @@ -78,11 +78,27 @@ return syncronizationRelation.getMultiplicity(); } + public boolean isTransferToOne() { + return (syncronizationRelation.getMultiplicity() == MultiplicityValue.OneToOne || syncronizationRelation.getMultiplicity() == MultiplicityValue.ManyToOne); + } + + public boolean isTransferToMany() { + return (syncronizationRelation.getMultiplicity() == MultiplicityValue.OneToMany || syncronizationRelation.getMultiplicity() == MultiplicityValue.ManyToMany); + } + + public boolean isTransferOneTo() { + return (syncronizationRelation.getMultiplicity() == MultiplicityValue.OneToOne || syncronizationRelation.getMultiplicity() == MultiplicityValue.OneToMany); + } + + public boolean isTransferManyTo() { + return (syncronizationRelation.getMultiplicity() == MultiplicityValue.ManyToOne || syncronizationRelation.getMultiplicity() == MultiplicityValue.ManyToMany); + } + public String getDataName() { return dataName; } - public PushPullValue getTransferStyle() { + public TransferStyle getTransferStyle() { return transferStyle; } @@ -153,10 +169,12 @@ private void setTransferStyle(StringValue stringValue){ String style = stringValue.getStringValue(); - if (style.equals("PUSH")) { - transferStyle = PushPullValue.PUSH; + if (style.equals("PLAIN")) { + transferStyle = TransferStyle.PLAIN; + } else if (style.equals("PUSH")) { + transferStyle = TransferStyle.PUSH; } else if (style.equals("PULL")) { - transferStyle = PushPullValue.PULL; + transferStyle = TransferStyle.PULL; } } diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java index e21fedf..11564a3 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java @@ -25,6 +25,14 @@ private List mediatorInsertions = new ArrayList<>(); private List presenterInsertions = new ArrayList<>(); + public static String toComponentName(String name) { + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + + public static String toVariableName(String name) { + return name.substring(0, 1).toLowerCase() + name.substring(1); + } + public DataSynchronizationDesign(DataSynchronizationContext synchronizationContexts) throws IllegalRelationException { this.synchronizationContexts = new ArrayList<>(); this.synchronizationContexts.add(synchronizationContexts); @@ -80,54 +88,353 @@ return deltaComplex; } - private Stack constructDefaultDeltas(DataSynchronizationContext transferContext) throws IllegalRelationException { + /* + * construct default deltas that satisfy the law of demeter. + * + * @param synchronizationContext a synchronization context in data synchronization model + * @return generated deltas + */ + private Stack constructDefaultDeltas(DataSynchronizationContext synchronizationContext) throws IllegalRelationException { Stack deltaStack = new Stack<>(); - PushPullValue transferStyle = transferContext.getTransferStyle(); + TransferStyle transferStyle = synchronizationContext.getTransferStyle(); ObjectNode srcObj = null; ObjectNode dstObj = null; - if (transferStyle == PushPullValue.PUSH) { - srcObj = transferContext.getSrcTopObject(); - dstObj = transferContext.getDstTopObject(); + boolean useShortcut = true; + if (transferStyle == TransferStyle.PUSH) { + // Transfer style is PUSH + srcObj = synchronizationContext.getSrcTopObject(); + dstObj = synchronizationContext.getDstTopObject(); } else { - srcObj = transferContext.getDstTopObject(); - dstObj = transferContext.getSrcTopObject(); + // Transfer style is PULL or PLAIN + srcObj = synchronizationContext.getDstTopObject(); + dstObj = synchronizationContext.getSrcTopObject(); + if (transferStyle == TransferStyle.PLAIN) { + useShortcut = false; + } } - String refName = dstObj.getName().substring(0, 1).toLowerCase() + dstObj.getName().substring(1); + String refName = toVariableName(dstObj.getName()); ReferenceEdge prevReference = new ReferenceEdge(srcObj, dstObj, refName); - boolean hasDiagonalRelation = false; - if (!transferContext.isFlat()) { - boolean toOne = true; // potential multiplicity + if (!synchronizationContext.isFlat()) { + boolean toOne = true; // identifiable multiplicity + List allRelations = new ArrayList<>(synchronizationContext.getIntermediateRelations()); + if (useShortcut) { + for (Relation relation : allRelations) { + if (synchronizationContext.getSrcObjectHierarchy().isPrefixOf(relation.getSrcObjectHierarchy()) + || synchronizationContext.getDstObjectHierarchy().isPrefixOf(relation.getDstObjectHierarchy())) { + useShortcut = false; + break; + } + } + } + if (useShortcut) { + allRelations.add(synchronizationContext.getSyncronizationRelation().getPrevRelation()); + } else { + if (transferStyle == TransferStyle.PLAIN) { + allRelations.add(synchronizationContext.getSyncronizationRelation()); + } else { + Relation lastRelation = allRelations.getLast(); + Relation bottomRelation = null; + if (!synchronizationContext.getSrcObjectHierarchy().isPrefixOf(lastRelation.getSrcObjectHierarchy())) { + bottomRelation = new Relation(synchronizationContext.getSrcObjectHierarchy().getPrevObjectHierarchy(), + synchronizationContext.getSrcObjectHierarchy(), + synchronizationContext.getTransferMultiplicity()); + allRelations.add(bottomRelation); + } else if (!synchronizationContext.getDstObjectHierarchy().isPrefixOf(lastRelation.getDstObjectHierarchy())) { + bottomRelation = new Relation(synchronizationContext.getSrcObjectHierarchy(), + synchronizationContext.getDstObjectHierarchy().getPrevObjectHierarchy(), + synchronizationContext.getTransferMultiplicity()); + allRelations.add(bottomRelation); + } + } + } 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())) { + ObjectHierarchy newSrcHierarchy = null; + ObjectHierarchy newDstHierarchy = null; + if (transferStyle == TransferStyle.PUSH) { + newSrcHierarchy = relation.getSrcObjectHierarchy(); + newDstHierarchy = relation.getDstObjectHierarchy(); + } else { + newSrcHierarchy = relation.getDstObjectHierarchy(); + newDstHierarchy = relation.getSrcObjectHierarchy(); + } + if (srcHierarchy == null) { + srcHierarchy = new ObjectHierarchy(newSrcHierarchy.getTop()); + } + if (dstHierarchy == null) { + dstHierarchy = new ObjectHierarchy(newDstHierarchy.getTop()); + } + while (dstHierarchy.getDepth() < newDstHierarchy.getDepth() || srcHierarchy.getDepth() < newSrcHierarchy.getDepth()) { + List oneDestinations = new ArrayList<>(); + List manyDestinations = new ArrayList<>(); + boolean tmpToOne = toOne; + for (int i = 0; i < newDstHierarchy.getDepth(); i++) { + ReferenceEdge dstEdge = newDstHierarchy.getEdge(i); + if (dstHierarchy != null && i < dstHierarchy.getDepth()) { + if (!dstHierarchy.getEdge(i).equals(dstEdge)) { + throw new IllegalRelationException(); + } + } else { + dstHierarchy.addEdge(dstEdge); + if (dstEdge.toMany()) { + tmpToOne = false; + toOne = false; + } + if (!tmpToOne && + (transferStyle == TransferStyle.PUSH && relation.toOne() + || transferStyle != TransferStyle.PUSH && (relation.oneTo()))) { + // If the specified multiplicity of destination objects does not match to their identifiable multiplicity, + // then the reference to select one destination object from identifiable multiple objects is needed. + manyDestinations.add(dstEdge); + toOne = true; + } else { + // If the specified multiplicity of destination objects and their identifiable are both many or both one, + // then the reference to select one destination object from identifiable multiple objects is not needed. + oneDestinations.add(dstEdge); + } + } + } + + // 1) Create component obtaining deltas. + Delta delta = null; + ReferenceEdge prevDstEdge = null; + for (int i = oneDestinations.size() - 1; i >= 0; i--) { + ReferenceEdge dstEdge = oneDestinations.get(i); + if (prevDstEdge != null) { + srcObj = (ObjectNode) dstEdge.getSource(); + dstObj = (ObjectNode) prevDstEdge.getDestination(); + String dataName = toVariableName(prevDstEdge.getName()); + if (!newSrcHierarchy.contains((ObjectNode) dstEdge.getDestination())) { + PrimitiveDelta primDelta = null; + if (!prevDstEdge.toMany()) { + primDelta = new PrimitivePullDelta(dstEdge, prevDstEdge, dataName); // a primitive component obtaining delta + } else { + primDelta = new PrimitivePullDelta(dstEdge, prevDstEdge, dataName, true, false); // a primitive component obtaining delta + } + if (delta == null) { + delta = new Delta(primDelta); + } else { + delta = delta.combine(primDelta); + } + if (!prevDstEdge.toMany()) { + prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName); + } else { + prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName, prevDstEdge.getKeyTypeName()); + } + } + } else { + prevDstEdge = dstEdge; + } + } + if (delta != null) deltaStack.push(delta); // add a component obtaining SIMPLEX delta + if (prevDstEdge != null) { + if (!prevReference.isIdentical()) { + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) prevDstEdge.getDestination(); + String dataName = toVariableName(prevDstEdge.getName()); + delta = new Delta(new PrimitivePullDelta(prevReference, prevDstEdge, dataName, prevDstEdge.toMany())); + if (delta != null) + deltaStack.push(delta); // add a component obtaining SIMPLEX delta + if (!prevDstEdge.toMany()) { + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } else { + prevReference = new ReferenceEdge(srcObj, dstObj, dataName, prevDstEdge.getKeyTypeName()); + } + } else { + prevReference = prevDstEdge; + } + } + + // 2) Create container passing deltas. + delta = null; + boolean oneTo = true; + 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 { + srcHierarchy.addEdge(srcEdge); + if (srcEdge.toMany()) { + oneTo = false; + } + srcObj = (ObjectNode) srcEdge.getDestination(); + dstObj = (ObjectNode) prevReference.getDestination(); + String dataName = toVariableName(prevReference.getName()); + if (!prevReference.isIdentical() && !dstHierarchy.contains(srcObj)) { + PrimitiveDelta primDelta = null; + if (toOne) { + primDelta = new PrimitivePullPushDelta(prevReference, srcEdge, dataName); // a container passing primitive delta + } else { + primDelta = new PrimitivePullPushDelta(prevReference, srcEdge, dataName, true); // a container passing primitive delta + } + if (delta == null) { + delta = new Delta(primDelta); + } else { + if (oneTo) { + delta = delta.combine(primDelta); + } else { + if (delta != null) { + deltaStack.push(delta); // add a container passing SIMPLEX delta + } + delta = new Delta(primDelta); + } + } + } + if (toOne) { + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } else { + prevReference = new ReferenceEdge(srcObj, dstObj, dataName, prevReference.getKeyTypeName()); + } + } + } + if (delta != null) deltaStack.push(delta); // add a container passing SIMPLEX delta + + // 3) Create a component selecting delta. + for (ReferenceEdge dstEdge : manyDestinations) { + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) dstEdge.getDestination(); + String dataName = toVariableName(dstEdge.getName()); + PrimitivePullDelta componentSelectingDelta = null; + componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName); + delta = new Delta(componentSelectingDelta); + deltaStack.push(delta); // add a component selecting delta + prevReference = new ReferenceEdge(srcObj, dstObj, dataName); + } + } + } + } + if (useShortcut) { + // 4) Create the bottom (data transfer) delta. + Delta dataTransferDelta = null; + if (transferStyle == TransferStyle.PUSH) { + // PUSH transfer + if (synchronizationContext.isTransferToOne()) { + // Simple PUSH + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer + if (synchronizationContext.getSyncronizationRelation().toMany()) { + primDelta.setMultipleTransfer(true); + } + dataTransferDelta = new Delta(primDelta); + } else { + // Broadcasting + prevReference = new ReferenceEdge(prevReference); +// prevReference.setKeyTypeName(synchronizationContext.getDstObjectHierarchy().getEdges().getLast().getKeyTypeName()); +// prevReference.setMultiplicity(MultiplicityValue.OneToMany); + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getSource(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer + if (synchronizationContext.getDstObjectHierarchy().getEdges().getLast().toMany()) { + primDelta.setMultipleDefinition(true); + } + if (synchronizationContext.getSyncronizationRelation().toMany()) { + primDelta.setMultipleTransfer(true); + } + dataTransferDelta = new Delta(primDelta); + } + } else { + if (synchronizationContext.isTransferOneTo()) { + // Simple PULL + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getDestination(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName); // PULL data transfer + if (synchronizationContext.getSyncronizationRelation().manyTo()) { + primDelta.setMultipleTransfer(true); + } + dataTransferDelta = new Delta(primDelta); + } else { + // Data collecting + prevReference = new ReferenceEdge(prevReference); +// prevReference.setKeyTypeName(synchronizationContext.getSrcObjectHierarchy().getEdges().getLast().getKeyTypeName()); +// prevReference.setMultiplicity(MultiplicityValue.OneToMany); + + // Add the data transfer delta. + srcObj = (ObjectNode) prevReference.getDestination(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); + ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); + PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName, true); // PULL data transfer + if (synchronizationContext.getSyncronizationRelation().manyTo()) { + primDelta.setMultipleTransfer(true); + } + dataTransferDelta = new Delta(primDelta); + } + } + deltaStack.push(dataTransferDelta); + } + return deltaStack; + } + + /* + * construct default deltas that do not satisfy the law of demeter. + * + * @param synchronizationContext a synchronization context in data synchronization model + * @return generated deltas + */ + private Stack constructDefaultDeltas2(DataSynchronizationContext synchronizationContext) throws IllegalRelationException { + Stack deltaStack = new Stack<>(); + TransferStyle transferStyle = synchronizationContext.getTransferStyle(); + ObjectNode srcObj = null; + ObjectNode dstObj = null; + if (transferStyle == TransferStyle.PUSH) { + srcObj = synchronizationContext.getSrcTopObject(); + dstObj = synchronizationContext.getDstTopObject(); + } else { + srcObj = synchronizationContext.getDstTopObject(); + dstObj = synchronizationContext.getSrcTopObject(); + } + String refName = toVariableName(dstObj.getName()); + ReferenceEdge prevReference = new ReferenceEdge(srcObj, dstObj, refName); + boolean hasDiagonalRelation = false; + if (!synchronizationContext.isFlat()) { + boolean toOne = true; // identifiable multiplicity + ObjectHierarchy srcHierarchy = null; + ObjectHierarchy dstHierarchy = null; + List allRelations = new ArrayList<>(synchronizationContext.getIntermediateRelations()); + for (Relation relation: allRelations) { + if (synchronizationContext.getSrcObjectHierarchy().isPrefixOf(relation.getSrcObjectHierarchy()) + || synchronizationContext.getDstObjectHierarchy().isPrefixOf(relation.getDstObjectHierarchy())) { hasDiagonalRelation = true; break; } } if (!hasDiagonalRelation) { - allRelations.add(transferContext.getSyncronizationRelation().getPrevRelation()); + allRelations.add(synchronizationContext.getSyncronizationRelation().getPrevRelation()); } else { Relation lastRelation = allRelations.getLast(); Relation bottomRelation = null; - if (!transferContext.getSrcObjectHierarchy().isPrefixOf(lastRelation.getSrcObjectHierarchy())) { - bottomRelation = new Relation(transferContext.getSrcObjectHierarchy().getPrevObjectHierarchy(), - transferContext.getSrcObjectHierarchy(), - transferContext.getTransferMultiplicity()); + if (!synchronizationContext.getSrcObjectHierarchy().isPrefixOf(lastRelation.getSrcObjectHierarchy())) { + bottomRelation = new Relation(synchronizationContext.getSrcObjectHierarchy().getPrevObjectHierarchy(), + synchronizationContext.getSrcObjectHierarchy(), + synchronizationContext.getTransferMultiplicity()); allRelations.add(bottomRelation); - } else if (!transferContext.getDstObjectHierarchy().isPrefixOf(lastRelation.getDstObjectHierarchy())) { - bottomRelation = new Relation(transferContext.getSrcObjectHierarchy(), - transferContext.getDstObjectHierarchy().getPrevObjectHierarchy(), - transferContext.getTransferMultiplicity()); + } else if (!synchronizationContext.getDstObjectHierarchy().isPrefixOf(lastRelation.getDstObjectHierarchy())) { + bottomRelation = new Relation(synchronizationContext.getSrcObjectHierarchy(), + synchronizationContext.getDstObjectHierarchy().getPrevObjectHierarchy(), + synchronizationContext.getTransferMultiplicity()); allRelations.add(bottomRelation); } } for (Relation relation: allRelations) { ObjectHierarchy newSrcHierarchy = null; ObjectHierarchy newDstHierarchy = null; - if (transferStyle == PushPullValue.PUSH) { + if (transferStyle == TransferStyle.PUSH) { newSrcHierarchy = relation.getSrcObjectHierarchy(); newDstHierarchy = relation.getDstObjectHierarchy(); } else { @@ -135,35 +442,35 @@ newDstHierarchy = relation.getSrcObjectHierarchy(); } if ((dstHierarchy == null || dstHierarchy.getDepth() < newDstHierarchy.getDepth()) || (srcHierarchy == null || srcHierarchy.getDepth() < newSrcHierarchy.getDepth())) { - List oneDestination = new ArrayList<>(); + List oneDestinations = new ArrayList<>(); List manyDestinations = new ArrayList<>(); boolean nextToOne = toOne; for (int i = 0; i < newDstHierarchy.getDepth(); i++) { + ReferenceEdge dstEdge = newDstHierarchy.getEdge(i); if (dstHierarchy != null && i < dstHierarchy.getDepth()) { - if (!dstHierarchy.getEdge(i).equals(newDstHierarchy.getEdge(i))) { + if (!dstHierarchy.getEdge(i).equals(dstEdge)) { throw new IllegalRelationException(); } } else { - if (newDstHierarchy.getEdge(i).toMany()) { + if (dstEdge.toMany()) { nextToOne = false; } if (nextToOne) { - oneDestination.add(newDstHierarchy.getEdge(i)); + oneDestinations.add(dstEdge); } else { - manyDestinations.add(newDstHierarchy.getEdge(i)); + manyDestinations.add(dstEdge); } } } - // 1) Create container passing deltas. + // 1) Create container passing simplex deltas. List primitiveDeltaList = new ArrayList<>(); - for (ReferenceEdge dstEdge: oneDestination) { + for (ReferenceEdge dstEdge: oneDestinations) { srcObj = (ObjectNode) prevReference.getSource(); dstObj = (ObjectNode) dstEdge.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + String dataName = toVariableName(dstObj.getName()); if (!prevReference.isIdentical()) { - primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName)); + primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName)); // a component obtaining primitive delta } prevReference = new ReferenceEdge(srcObj, dstObj, dataName); } @@ -176,13 +483,12 @@ } else { srcObj = (ObjectNode) srcEdge.getDestination(); dstObj = (ObjectNode) prevReference.getDestination(); - String dataName = dstObj.getName(); - dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); + String dataName = toVariableName(dstObj.getName()); if (!prevReference.isIdentical() && !prevReference.getDestination().equals(srcEdge.getDestination())) { if (toOne) { - primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName)); + primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName)); // a container passing primitive delta } else { - primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName, true)); + primitiveDeltaList.add(new PrimitivePullPushDelta(prevReference, srcEdge, dataName, true)); // a container passing primitive delta } Delta delta = null; for (PrimitiveDelta primDelta : primitiveDeltaList) { @@ -192,7 +498,7 @@ delta = new Delta(primDelta, delta); } } - deltaStack.push(delta); // add a container passing delta + deltaStack.push(delta); // add a container passing SIMPLEX delta primitiveDeltaList.clear(); } prevReference = new ReferenceEdge(srcObj, dstObj, dataName); @@ -202,24 +508,22 @@ if (!toOne) { boolean multipleDefinition = false; // destination multiplicity of the defined reference - 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. + if ((transferStyle == TransferStyle.PUSH && relation.toOne()) || (transferStyle != TransferStyle.PUSH && relation.oneTo())) { + // If the specified multiplicity of destination objects does not match to their identifiable multiplicity, + // then the reference to select one destination object from identifiable 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. + // If the specified multiplicity of destination objects and their identifiable multiplicity are both many, + // then the reference to select one destination object from identifiable multiple objects is needed. multipleDefinition = true; } - // 2) Create a component selecting delta. + // 2) Create a component selecting simplex delta. PrimitivePullDelta 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); + String dataName = toVariableName(dstObj.getName()); componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); primitiveDeltaList.add(componentSelectingDelta); Delta delta = null; @@ -230,7 +534,7 @@ delta = new Delta(primDelta, delta); } } - deltaStack.push(delta); // add a component identifying delta + deltaStack.push(delta); // add a component selecting SIMPLEX delta primitiveDeltaList.clear(); if (!multipleDefinition) { prevReference = new ReferenceEdge(srcObj, dstObj, dataName); @@ -240,9 +544,8 @@ } else { 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); + String dataName = toVariableName(dstObj.getName()); + componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); // a component obtaining primitive delta primitiveDeltaList.add(componentSelectingDelta); if (!multipleDefinition) { prevReference = new ReferenceEdge(srcObj, dstObj, dataName); @@ -252,7 +555,7 @@ } } } - // 3) Create a component obtaining delta. + // 3) Create a component obtaining simplex delta. if (primitiveDeltaList.size() > 0) { Delta delta = null; for (PrimitiveDelta primDelta: primitiveDeltaList) { @@ -262,7 +565,7 @@ delta = new Delta(primDelta, delta); } } - deltaStack.push(delta); // add a component obtaining delta + deltaStack.push(delta); // add a component obtaining SIMPLEX delta } } else { throw new IllegalRelationException(); @@ -274,75 +577,68 @@ if (!hasDiagonalRelation) { // 4) Create the bottom (data transfer) delta. Delta dataTransferDelta = null; - if (transferStyle == PushPullValue.PUSH) { + if (transferStyle == TransferStyle.PUSH) { // PUSH transfer - if (transferContext.getTransferMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { + if (synchronizationContext.isTransferToOne()) { // Simple PUSH // Add the data transfer delta. srcObj = (ObjectNode) prevReference.getSource(); - dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); - String dataName = transferContext.getDataName(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer - if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.OneToMany - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + if (synchronizationContext.getSyncronizationRelation().toMany()) { primDelta.setMultipleTransfer(true); } dataTransferDelta = new Delta(primDelta); } else { // Broadcasting prevReference = new ReferenceEdge(prevReference); - prevReference.setKeyTypeName(transferContext.getDstObjectHierarchy().getEdges().getLast().getKeyTypeName()); + prevReference.setKeyTypeName(synchronizationContext.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(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer - if (transferContext.getDstObjectHierarchy().getEdges().getLast().getMultiplicity() == MultiplicityValue.OneToMany - || transferContext.getDstObjectHierarchy().getEdges().getLast().getMultiplicity() == MultiplicityValue.ManyToMany) { + if (synchronizationContext.getDstObjectHierarchy().getEdges().getLast().toMany()) { primDelta.setMultipleDefinition(true); } - if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.OneToMany - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + if (synchronizationContext.getSyncronizationRelation().toMany()) { primDelta.setMultipleTransfer(true); } dataTransferDelta = new Delta(primDelta); } } else { - if (transferContext.getTransferMultiplicity() == MultiplicityValue.OneToMany - || transferContext.getTransferMultiplicity() == MultiplicityValue.OneToOne) { + if (synchronizationContext.isTransferOneTo()) { // Simple PULL // Add the data transfer delta. srcObj = (ObjectNode) prevReference.getDestination(); - dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); - String dataName = transferContext.getDataName(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName); // PULL data transfer - if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + if (synchronizationContext.getSyncronizationRelation().manyTo()) { primDelta.setMultipleTransfer(true); } dataTransferDelta = new Delta(primDelta); } else { // Data collecting prevReference = new ReferenceEdge(prevReference); - prevReference.setKeyTypeName(transferContext.getSrcObjectHierarchy().getEdges().getLast().getKeyTypeName()); + prevReference.setKeyTypeName(synchronizationContext.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(); + dstObj = (ObjectNode) synchronizationContext.getSrcObjectHierarchy().getBottom(); + String dataName = synchronizationContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName, true); // PULL data transfer - if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + if (synchronizationContext.getSyncronizationRelation().manyTo()) { primDelta.setMultipleTransfer(true); } dataTransferDelta = new Delta(primDelta); diff --git a/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java b/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java index 20a9fc5..afc2aee 100644 --- a/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java +++ b/src/main/java/models/dataSynchronizationModel/ObjectHierarchy.java @@ -38,6 +38,11 @@ return edges; } + public void addEdge(ReferenceEdge edge) { + edges.add(edge); + isFlat = false; + } + public boolean isFlat() { return isFlat; } @@ -50,6 +55,18 @@ return edges.get(index); } + public boolean contains(ObjectNode node) { + if (top.equals(node)) { + return true; + } + for (ReferenceEdge edge : edges) { + if (edge.getDestination().equals(node)) { + return true; + } + } + return false; + } + public boolean isPrefixOf(ObjectHierarchy another) { if (!top.equals(another.top)) { return false; @@ -75,4 +92,12 @@ } return new ObjectHierarchy(edges); } + + public String toString() { + String str = top.toString(); + for (ReferenceEdge edge : edges) { + str += "." + ((ObjectNode) edge.getDestination()).toString(); + } + return str; + } } diff --git a/src/main/java/models/dataSynchronizationModel/PushPullValue.java b/src/main/java/models/dataSynchronizationModel/PushPullValue.java deleted file mode 100644 index 26128c0..0000000 --- a/src/main/java/models/dataSynchronizationModel/PushPullValue.java +++ /dev/null @@ -1,20 +0,0 @@ -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 index 5ecfc46..f6edbf2 100644 --- a/src/main/java/models/dataSynchronizationModel/Relation.java +++ b/src/main/java/models/dataSynchronizationModel/Relation.java @@ -80,6 +80,22 @@ return multiplicity; } + public boolean toOne() { + return (multiplicity == MultiplicityValue.OneToOne || multiplicity == MultiplicityValue.ManyToOne); + } + + public boolean toMany() { + return (multiplicity == MultiplicityValue.OneToMany || multiplicity == MultiplicityValue.ManyToMany); + } + + public boolean oneTo() { + return (multiplicity == MultiplicityValue.OneToOne || multiplicity == MultiplicityValue.OneToMany); + } + + public boolean manyTo() { + return (multiplicity == MultiplicityValue.ManyToOne || multiplicity == MultiplicityValue.ManyToMany); + } + public Relation getPrevRelation() { return new Relation(this.srcObjectHierarchy.getPrevObjectHierarchy(), this.dstObjectHierarchy.getPrevObjectHierarchy(), this.multiplicity); } diff --git a/src/main/java/models/dataSynchronizationModel/TransferStyle.java b/src/main/java/models/dataSynchronizationModel/TransferStyle.java new file mode 100644 index 0000000..d4d3f90 --- /dev/null +++ b/src/main/java/models/dataSynchronizationModel/TransferStyle.java @@ -0,0 +1,20 @@ +package models.dataSynchronizationModel; + +public enum TransferStyle { + PULL, + PLAIN, + PUSH; + + public String toString() { + switch (this) { + case PLAIN: + return "PLAIN"; + case PUSH: + return "PUSH"; + case PULL: + return "PULL"; + default: + return ""; + } + } +} diff --git a/src/main/java/models/deltaAlgebra/ReferenceEdge.java b/src/main/java/models/deltaAlgebra/ReferenceEdge.java index 5c1547e..2713508 100644 --- a/src/main/java/models/deltaAlgebra/ReferenceEdge.java +++ b/src/main/java/models/deltaAlgebra/ReferenceEdge.java @@ -83,4 +83,8 @@ public int hashCode() { return Objects.hash(name.hashCode(), ((ObjectNode) source).getName().hashCode(), ((ObjectNode) destination).getName().hashCode()); } + + public String toString() { + return source.toString() + " -> " + destination.toString(); + } } \ No newline at end of file diff --git a/src/test/java/parser/TestParser.java b/src/test/java/parser/TestParser.java index 0f62959..433fbb1 100644 --- a/src/test/java/parser/TestParser.java +++ b/src/test/java/parser/TestParser.java @@ -17,7 +17,7 @@ @Test void testCustomerManagement(){ - //File file = new File("models/CustomerManagement.Json"); + //File file = new File("models/CustomerManagement-PULL.Json"); File file = new File("models/designPattern/Adapter.Json"); try {