diff --git a/models/designPattern/Bridge.Json b/models/designPattern/Bridge.Json index e6a98e0..c4b08af 100644 --- a/models/designPattern/Bridge.Json +++ b/models/designPattern/Bridge.Json @@ -1,10 +1,10 @@ { "relations": [], "transfer": { - "src": "ConcreteEnchantment.String", - "dst": "ConcreteWeapon.String", + "src": "Main.ConcreteWeapon.Data", + "dst": "Main.ConcreteEnchantment.Data", "data": { "name": "data" }, - "style": "PULL", + "style": "PUSH", "multiplicity": "1:1" } } \ No newline at end of file diff --git a/models/designPattern/Chain-of-responsibility.Json b/models/designPattern/Chain-of-responsibility.Json new file mode 100644 index 0000000..28a66b5 --- /dev/null +++ b/models/designPattern/Chain-of-responsibility.Json @@ -0,0 +1,18 @@ +{ + "name": "Chain-of-responsibility", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.OrcKing.{ConcreteOrcRequestHandler}", + "data": { + "type": "Request", + "name": "request" + }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Command2.Json b/models/designPattern/Command2.Json new file mode 100644 index 0000000..972e4ac --- /dev/null +++ b/models/designPattern/Command2.Json @@ -0,0 +1,31 @@ +{ + "name": "Command", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.Wizard", + "data": { + "type": "Goblin", + "name": "goblin" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main.Wizard", + "dst": "Main.Goblin", + "data": { + "type": "data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Composite.Json b/models/designPattern/Composite.Json new file mode 100644 index 0000000..bd4ba93 --- /dev/null +++ b/models/designPattern/Composite.Json @@ -0,0 +1,70 @@ +{ + "name": "Composite", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Messenger.Sentence", + "dst": "Main", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Sentence.{Word}", + "dst": "Messenger", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Word", + "dst": "Sentence", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Letter", + "dst": "Word", + "data": { + "type": "char", + "name": "char" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Letter", + "dst": "LetterComposite.{LetterComposite}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Facade.Json b/models/designPattern/Facade.Json new file mode 100644 index 0000000..e7f5b1f --- /dev/null +++ b/models/designPattern/Facade.Json @@ -0,0 +1,24 @@ +{ + "name" : "Facade", + "contexts" : [ + { + "relations": [ + { + "src": "Main", + "dst": "Main.DwarvenGoldmineFacade.{ConcreteDwarvenDigger}", + "multiplicity": "1:1" + } + ], + "transfer": { + "src": "Main", + "dst": "Main.DwarvenGoldmineFacade.{ConcreteDwarvenDigger}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Factory-method.Json b/models/designPattern/Factory-method.Json new file mode 100644 index 0000000..fc3a44e --- /dev/null +++ b/models/designPattern/Factory-method.Json @@ -0,0 +1,18 @@ +{ + "name": "Factory-method", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "ConcreteBlacksmith", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Flyweight.Json b/models/designPattern/Flyweight.Json new file mode 100644 index 0000000..bfa4d32 --- /dev/null +++ b/models/designPattern/Flyweight.Json @@ -0,0 +1,37 @@ +{ + "name": "Flyweight", + "contexts": [ + { + "relations": [ + { + "src": "Main.AlchemistShop", + "dst": "Main.AlchemistShop.TopShelf.{Potion}", + "multiplicity": "1:1" + } + ], + "transfer": { + "src": "Main.AlchemistShop.PotionFactory.{Potion}", + "dst": "Main.AlchemistShop.TopShelf.{Potion}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "*:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.AlchemistShop.TopShelf.{Potion}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Flyweight2.Json b/models/designPattern/Flyweight2.Json new file mode 100644 index 0000000..ac948d6 --- /dev/null +++ b/models/designPattern/Flyweight2.Json @@ -0,0 +1,31 @@ +{ + "name": "Flyweight", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "AlchemistShop", + "dst": "Main", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "AlchemistShop.{Potion}", + "dst": "AlchemistShop", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Interpreter.Json b/models/designPattern/Interpreter.Json new file mode 100644 index 0000000..fa365af --- /dev/null +++ b/models/designPattern/Interpreter.Json @@ -0,0 +1,32 @@ +{ + "name": "Interpreter", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "ConcreteExpression", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "ConcreteExpression", + "dst": "ConcreteExpression", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + + ] +} \ No newline at end of file diff --git a/models/designPattern/Iterator.Json b/models/designPattern/Iterator.Json index 28dd1f1..44a50e1 100644 --- a/models/designPattern/Iterator.Json +++ b/models/designPattern/Iterator.Json @@ -1,10 +1,15 @@ { - "relations": [], - "transfer": { - "src": "TreasureChest.String", - "dst": "Client.String", - "data": { "name": "data" }, - "style": "PULL", - "multiplicity": "1:1" - } + "name": "Chain-of-responsibility", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "App.{Item}.String", + "dst": "App.String", + "data": { "name": "data" }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] } \ No newline at end of file diff --git a/models/designPattern/Mediator.Json b/models/designPattern/Mediator.Json new file mode 100644 index 0000000..d2a1c4e --- /dev/null +++ b/models/designPattern/Mediator.Json @@ -0,0 +1,36 @@ +{ + "name": "Mediator", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "PartyImpl", + "data": { "type": "Action", "name": "action" }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.{ConcretePartyMember}", + "data": { "type": "Action", "name": "action" }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [ + ], + "transfer": { + "src": "Main.{ConcretePartyMember}", + "dst": "Main.{ConcretePartyMember}", + "data": { "type": "Action", "name": "action" }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Mediator2.Json b/models/designPattern/Mediator2.Json new file mode 100644 index 0000000..ee80533 --- /dev/null +++ b/models/designPattern/Mediator2.Json @@ -0,0 +1,26 @@ +{ + "name": "Mediator", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.PartyImpl.{ConcretePartyMember}", + "data": { "type": "Action", "name": "action" }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [ + ], + "transfer": { + "src": "Main.PartyImpl.{ConcretePartyMember}", + "dst": "Main.PartyImpl.{ConcretePartyMember}", + "data": { "type": "Action", "name": "action" }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Observer.Json b/models/designPattern/Observer.Json new file mode 100644 index 0000000..769a19e --- /dev/null +++ b/models/designPattern/Observer.Json @@ -0,0 +1,37 @@ +{ + "name": "Observer", + "contexts": [ + { + "relations": [ + { + "src": "Main", + "dst": "Main.Weather.{ConcreteObserver}", + "multiplicity": "1:1" + } + ], + "transfer": { + "src": "Main.Weather", + "dst": "Main.Weather.{ConcreteObserver}", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:*" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.Weather", + "data": { + "type": "ConcreteObserver", + "name": "concreteObserver" + }, + "style": "PUSH", + "multiplicity": "1:*" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Prototype.Json b/models/designPattern/Prototype.Json new file mode 100644 index 0000000..4110e45 --- /dev/null +++ b/models/designPattern/Prototype.Json @@ -0,0 +1,31 @@ +{ + "name": "Prototype", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "FactoryImpl", + "dst": "Main", + "data": { + "type": "OrcConcreteHero", + "name": "orcConcreteHero" + }, + "style": "PULL", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "FactoryImpl.OrcConcreteHero", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Strategy.Json b/models/designPattern/Strategy.Json index fc0d701..a75601f 100644 --- a/models/designPattern/Strategy.Json +++ b/models/designPattern/Strategy.Json @@ -2,14 +2,10 @@ "name": "Strategy", "contexts": [ { - "relations": [{ - "src": "main", - "dst": "main.{concreteStrategy}", - "multiplicity": "1:1" - }], + "relations": [], "transfer": { "src": "main.dragonSlayer.Data", - "dst": "main.{concreteStrategy}.Data", + "dst": "main.concreteStrategy.Data", "data": { "name": "data" }, diff --git a/models/designPattern/TemplateMethod.Json b/models/designPattern/TemplateMethod.Json new file mode 100644 index 0000000..71f253f --- /dev/null +++ b/models/designPattern/TemplateMethod.Json @@ -0,0 +1,18 @@ +{ + "name": "TemplateMethod", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Main.HalflingThief", + "dst": "Main.ConcreteMethod", + "data": { + "type": "Data", + "name": "data" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Visitor.Json b/models/designPattern/Visitor.Json new file mode 100644 index 0000000..e2c297d --- /dev/null +++ b/models/designPattern/Visitor.Json @@ -0,0 +1,18 @@ +{ + "name": "Visitor", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "Commander.{Sergent}.{Soldier}", + "dst": "Main.Client", + "data": { + "type": "SoldierVisitor", + "name": "visitor" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/models/designPattern/Visitor@Editing.Json b/models/designPattern/Visitor@Editing.Json deleted file mode 100644 index 88ccd09..0000000 --- a/models/designPattern/Visitor@Editing.Json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "relations": [], - "transfer": { - "src": "", - "dst": "", - "data": { "type": "String", "name": "visitor" }, - "style": "PULL", - "multiplicity": "1:1" - } -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/MediatorInsertion.java b/src/main/java/designPatternExtensions/MediatorInsertion.java index 785d2e9..d9ca498 100644 --- a/src/main/java/designPatternExtensions/MediatorInsertion.java +++ b/src/main/java/designPatternExtensions/MediatorInsertion.java @@ -9,6 +9,7 @@ private ObjectNode dst; private ObjectNode mediator; private PushPullValue pushPullValue; + private boolean removeDirectDependency = true; //全デザインパターンに適応出来たら不要になるメソッド public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, DataSynchronizationContext context) { @@ -19,10 +20,15 @@ } public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, PushPullValue pushPullValue) { + this(src, dst, mediator, pushPullValue, true); + } + + public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, PushPullValue pushPullValue, boolean removeDirectDependency) { this.src = src; this.dst = dst; this.mediator = mediator; this.pushPullValue = pushPullValue; + this.removeDirectDependency = removeDirectDependency; } public ObjectNode getSrc() { @@ -40,4 +46,8 @@ public PushPullValue getPushPullValue() { return pushPullValue; } + + public boolean getRemoveDirectDependency() { + return removeDirectDependency; + } } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java index 00d1d30..c0a5019 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.dataSynchronizationModel.*; +import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory diff --git a/src/main/java/designPatternExtensions/designPattern/Bridge.java b/src/main/java/designPatternExtensions/designPattern/Bridge.java index 29a0ba4..484b1a7 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.dataSynchronizationModel.*; +import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; //メモ @@ -13,8 +13,8 @@ public DataSynchronizationDesign create() throws IllegalRelationException { DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - ObjectNode concreteEnchant = design.getSynchronizationContexts().getFirst().getSrcTopObject(); - ObjectNode concreteWeapon = design.getSynchronizationContexts().getFirst().getDstTopObject(); + ObjectNode concreteEnchant = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcResource().getEdge(0).getDestination(); + ObjectNode concreteWeapon = (ObjectNode) design.getSynchronizationContexts().getFirst().getDstResource().getEdge(0).getDestination(); DependencyInversion di1 = new DependencyInversion(concreteWeapon, new InterfaceNode(concreteWeapon, "Weapon")); design.addDependencyInversion(di1); diff --git a/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java new file mode 100644 index 0000000..531d9d3 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Chain_of_Responsibility.java @@ -0,0 +1,50 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +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 javax.print.attribute.standard.Media; + +//メモ +//https://github.com/iluwatar/java-design-patterns/tree/master/chain-of-responsibility + +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(); + //ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstResource().getEdge(0).getDestination(); + + InterfaceNode requestHandler = new InterfaceNode(concreteOrcRequestHandler, "RequestHandler"); + DependencyInversion di = new DependencyInversion(concreteOrcRequestHandler, requestHandler); + design.addDependencyInversion(di); + +// MediatorInsertion mi = new MediatorInsertion(main, concreteOrcRequestHandler, new ObjectNode("OrcKing"), PushPullValue.PUSH); +// design.addMediatorInsertion(mi); + + return design; + } +} + +/* + (RequestTypeなどは仕様?) + public class Request + + public class ConcreteOrcRequestHandler + + public class OrcKing { + + private List handlers; + } + + ConcreteOrcRequestHandler ---> RequestHandler + */ \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Command.java b/src/main/java/designPatternExtensions/designPattern/Command.java index f136f8d..8882594 100644 --- a/src/main/java/designPatternExtensions/designPattern/Command.java +++ b/src/main/java/designPatternExtensions/designPattern/Command.java @@ -1,5 +1,7 @@ package designPatternExtensions.designPattern; +import designPatternExtensions.*; +import models.dataSynchronizationModel.DataSynchronizationDesign; import models.deltaAlgebra.ObjectNode; import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; @@ -9,13 +11,55 @@ //Stackで状態を元に戻したり、やり直したりする //Mainで制御の移譲を行う必要あり? +//public class Command implements DesignPattern { +// +// public DataTransferDesign create() throws IllegalRelationException { +// DataTransferDesign design = ModelLoader.load("models/designPattern/Command2.Json"); +// DataTransferContext dtc = design.getTransferContexts().getFirst(); +// ObjectNode wizard = dtc.getSrcFirstResource(); +// ObjectNode goblin = (ObjectNode) dtc.getDstResource().getEdges().get(0).getDestination(); +// +// DependencyInversion di = new DependencyInversion(goblin, new InterfaceNode(goblin, "Target")); +// design.addDependencyInversion(di); +// +// return design; +// } +//} + public class Command implements DesignPattern { public DataSynchronizationDesign create() throws IllegalRelationException { - DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - ObjectNode wizard = design.getSynchronizationContexts().getFirst().getSrcTopObject(); - ObjectNode goblin = design.getSynchronizationContexts().getFirst().getDstTopObject(); + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Command2.Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + //ObjectNode main = dtc.getSrcFirstResource(); + ObjectNode goblin = dtc.getSrcObjectHierarchy().getBottom(); + +// MediatorInsertion mi = new MediatorInsertion(main, goblin, new ObjectNode("Wizard"), dtc.getTransferStyle(), false); +// design.addMediatorInsertion(mi); + + DependencyInversion di = new DependencyInversion(goblin, new InterfaceNode(goblin, "Target")); + design.addDependencyInversion(di); return design; } - } \ No newline at end of file + } + +//public class Command implements DesignPattern { +// +// public DataTransferDesign create() throws IllegalRelationException { +// DataTransferDesign design = ModelLoader.load2("models/designPattern/"+this.getClass().getSimpleName()+".Json"); +// DataTransferContext dtc = design.getTransferContexts().getFirst(); +// ObjectNode main = dtc.getSrcFirstResource(); +// ObjectNode wizard = (ObjectNode) dtc.getDstResource().getEdges().get(0).getDestination(); +// ObjectNode goblin = dtc.getDataType(); +// +//// ObjectNode wizard = new ObjectNode("Wizard"); +//// MediatorInsertion mi = new MediatorInsertion(main, goblin, wizard, dtc.getTransferStyle()); +//// design.addMediatorInsertion(mi); +// +// DependencyInversion di = new DependencyInversion(goblin, new InterfaceNode(goblin, "Target")); +// design.addDependencyInversion(di); +// +// return design; +// } +//} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Composite.java b/src/main/java/designPatternExtensions/designPattern/Composite.java new file mode 100644 index 0000000..7975f82 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Composite.java @@ -0,0 +1,36 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//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(); + + InterfaceNode LetterComposite = new InterfaceNode(sentence, "LetterComposite"); + DependencyInversion di = new DependencyInversion(sentence, LetterComposite, main); + design.addDependencyInversion(di); + + DependencyInversion di2 = new DependencyInversion(letter, LetterComposite, letter); + design.addDependencyInversion(di2); + + DependencyInversion di3 = new DependencyInversion(word, LetterComposite, word); + design.addDependencyInversion(di3); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Facade.java b/src/main/java/designPatternExtensions/designPattern/Facade.java new file mode 100644 index 0000000..fd5600d --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Facade.java @@ -0,0 +1,28 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//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(); + + DependencyInversion di = new DependencyInversion(concreteDwarvenDigger, new InterfaceNode(concreteDwarvenDigger, "DwarvenMineWorker")); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Factory_method.java b/src/main/java/designPatternExtensions/designPattern/Factory_method.java new file mode 100644 index 0000000..77e9773 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Factory_method.java @@ -0,0 +1,27 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//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(); + + InterfaceNode blackSmith = new InterfaceNode(concreteBlacksmith, "Blacksmith"); + DependencyInversion di = new DependencyInversion(concreteBlacksmith, blackSmith); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Flyweight.java b/src/main/java/designPatternExtensions/designPattern/Flyweight.java new file mode 100644 index 0000000..cdef3e4 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Flyweight.java @@ -0,0 +1,45 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.MediatorInsertion; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//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(); +// ObjectNode potion = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); +// ObjectNode alchemistShop = dtc.getDstFirstResource(); +// +// ObjectNode potionFactory = new ObjectNode("PotionFactory"); +// MediatorInsertion mi = new MediatorInsertion(potion, alchemistShop, potionFactory, dtc.getTransferStyle()); +// design.addMediatorInsertion(mi); + + return design; + } +} + +//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(); +// ObjectNode potion = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); +// ObjectNode alchemistShop = dtc.getDstFirstResource(); +// +// ObjectNode potionFactory = new ObjectNode("PotionFactory"); +// MediatorInsertion mi = new MediatorInsertion(potion, alchemistShop, potionFactory, dtc.getTransferStyle()); +// design.addMediatorInsertion(mi); +// +// return design; +// } +//} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Interpreter.java b/src/main/java/designPatternExtensions/designPattern/Interpreter.java new file mode 100644 index 0000000..2b317a3 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Interpreter.java @@ -0,0 +1,27 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; + +//メモ +//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(); + + InterfaceNode expression = new InterfaceNode(concreteExpression, "Expression"); + DependencyInversion di = new DependencyInversion(concreteExpression, expression); + design.addDependencyInversion(di); + + return design; + } +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index 250eab7..fe1a8aa 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -2,6 +2,8 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; +import models.dataSynchronizationModel.DataSynchronizationContext; +import models.dataSynchronizationModel.DataSynchronizationDesign; import models.deltaAlgebra.ObjectNode; import models.dataSynchronizationModel.*; import designPatternExtensions.ModelLoader; @@ -16,16 +18,16 @@ public DataSynchronizationDesign create() throws IllegalRelationException { DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); - ObjectNode treasureChest = dtc.getSrcTopObject(); + ObjectNode item = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); + ObjectNode app = (ObjectNode) dtc.getDstTopObject(); ObjectNode client = dtc.getDstTopObject(); - ObjectNode iterator = new ObjectNode("TreasureChestItemIterator"); - MediatorInsertion mi = new MediatorInsertion(client, treasureChest, iterator, dtc); + MediatorInsertion mi = new MediatorInsertion(app, item, new ObjectNode("TreasureChest"), dtc); design.addMediatorInsertion(mi); - DependencyInversion di = new DependencyInversion( - iterator, new InterfaceNode(iterator, "Iterator")); - design.addDependencyInversion(di); +// DependencyInversion di = new DependencyInversion( +// iterator, new InterfaceNode(iterator, "Iterator")); +// design.addDependencyInversion(di); return design; } diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator.java b/src/main/java/designPatternExtensions/designPattern/Mediator.java new file mode 100644 index 0000000..f96da78 --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Mediator.java @@ -0,0 +1,61 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.*; +import models.deltaAlgebra.ObjectNode; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; +import models.objectOrientedTransfer.IllegalRelationException; +import models.objectOrientedTransfer.PushPullValue; + +//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(); + + InterfaceNode partyMemberBase = new InterfaceNode(concretePartyMember, "PartyMemberBase"); + DependencyInversion di = new DependencyInversion(concretePartyMember, partyMemberBase); + design.addDependencyInversion(di); + + InterfaceNode partyMember = new InterfaceNode(partyMemberBase, "PartyMember"); + DependencyInversion di2 = new DependencyInversion(partyMemberBase, partyMember); + design.addDependencyInversion(di2); + + InterfaceNode party = new InterfaceNode(partyImpl, "Party"); + DependencyInversion di3 = new DependencyInversion(partyImpl, party); + design.addDependencyInversion(di3); + + MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, partyImpl, PushPullValue.PUSH); + design.addMediatorInsertion(mi); + + MediatorInsertion mi2 = new MediatorInsertion(main, concretePartyMember, partyImpl, PushPullValue.PUSH); + design.addMediatorInsertion(mi2); + + return design; + } +} +/* 極端に解釈すると + public abstract class PartyMemberBase{ + protected PartyImpl party; + } + + public class PartyImpl { + private final List members; + } + + Implements + PartyImpl <--- Party + PartyMemberBase <--- PartyMember + ConcretePartyMember <--- PartyMemberBase + + Main -> PartyImpl + Main -> ConcretePartyMember -> PartyImpl(Mediator?) -> List + 2つ目をどうする? + */ \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator2.java b/src/main/java/designPatternExtensions/designPattern/Mediator2.java new file mode 100644 index 0000000..8ea4c0b --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/Mediator2.java @@ -0,0 +1,69 @@ +package designPatternExtensions.designPattern; + +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; +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; + +//concretePartyMemberがActionをおこすと、PartyImplからほかのPartyMemberの処理を呼び出す +//https://github.com/iluwatar/java-design-patterns/tree/master/mediator + +//srcとdstが同じ型の転送の場合、weaveDeltaが生成したメソッドの中に、そのクラス固有の兄弟フィールドへの +//参照が入り込んでしまう(partyImpl→thisへの読み替え、action→パラメータ化)で対応できる +//MediatorInsertionで対応するべきかそれより前の問題か + +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(); + +// InterfaceNode partyMemberBase = new InterfaceNode(concretePartyMember, "PartyMemberBase"); +// DependencyInversion di = new DependencyInversion(concretePartyMember, partyMemberBase); +// design.addDependencyInversion(di); +// +// InterfaceNode partyMember = new InterfaceNode(partyMemberBase, "PartyMember"); +// DependencyInversion di2 = new DependencyInversion(partyMemberBase, partyMember); +// design.addDependencyInversion(di2); +// +// InterfaceNode party = new InterfaceNode(partyImpl, "Party"); +// DependencyInversion di3 = new DependencyInversion(partyImpl, party); +// design.addDependencyInversion(di3); + + ObjectNode imp2 = new ObjectNode("PartyImpl2"); + + MediatorInsertion mi = new MediatorInsertion(concretePartyMember, concretePartyMember, imp2, PushPullValue.PUSH); + design.addMediatorInsertion(mi); + +// MediatorInsertion mi2 = new MediatorInsertion(main, concretePartyMember, partyImpl, PushPullValue.PUSH); +// design.addMediatorInsertion(mi2); + + return design; + } +} +/* 極端に解釈すると + public abstract class PartyMemberBase{ + protected PartyImpl party; + } + + public class PartyImpl { + private final List members; + } + + Implements + PartyImpl <--- Party + PartyMemberBase <--- PartyMember + ConcretePartyMember <--- PartyMemberBase + + Main -> PartyImpl + Main -> ConcretePartyMember -> PartyImpl(Mediator?) -> List + 2つ目をどうする? + */ \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index bfea714..89d0c6d 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -1,6 +1,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.dataSynchronizationModel.*; @@ -14,46 +15,13 @@ public class Observer implements DesignPattern{ public DataSynchronizationDesign create() throws IllegalRelationException { - ObjectNode weather = new ObjectNode("Weather"); - ObjectNode orcs = new ObjectNode("Orcs"); - ObjectNode hobbits = new ObjectNode("Hobbits"); - ObjectNode data = new ObjectNode("WeatherType"); + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode concreteObserver = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); - Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); - DataSynchronizationContext context = new DataSynchronizationContext( - new ArrayList<>(), transferRelation, "currentWeather", PushPullValue.PUSH - ); - - DataSynchronizationDesign design = new DataSynchronizationDesign(context); - - DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); - DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); + DependencyInversion di1 = new DependencyInversion(concreteObserver, new InterfaceNode(concreteObserver, "WeatherObserver")); design.addDependencyInversion(di1); - design.addDependencyInversion(di2); return design; } -} - -//public class Observer { -// public static DataTransferDesign create() throws IllegalRelationException { -// ObjectNode weather = new ObjectNode("Weather"); -// ObjectNode orcs = new ObjectNode("Orcs"); -// ObjectNode hobbits = new ObjectNode("Hobbits"); -// ObjectNode data = new ObjectNode("WeatherType"); -// -// Relation transferRelation = new Relation(weather, orcs, MultiplicityValue.OneToOne); -// DataTransferContext context = new DataTransferContext( -// new ArrayList<>(), transferRelation, data, "currentWeather", PushPullValue.PUSH -// ); -// -// DataTransferDesign design = new DataTransferDesign(context); -// -// DependencyInversion di1 = new DependencyInversion(orcs, new InterfaceNode(orcs, "WeatherObserver"), weather); -// DependencyInversion di2 = new DependencyInversion(hobbits, new InterfaceNode(hobbits, "WeatherObserver"), weather); -// design.addDependencyInversion(di1); -// design.addDependencyInversion(di2); -// -// return design; -// } -//} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java index 2690fc9..10de1a5 100644 --- a/src/main/java/designPatternExtensions/designPattern/Prototype.java +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -2,6 +2,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.dataSynchronizationModel.*; @@ -13,22 +14,62 @@ public class Prototype implements DesignPattern{ public DataSynchronizationDesign create() throws IllegalRelationException { - ObjectNode heroFactoryImpl = new ObjectNode("HeroFactoryImpl"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode beast = new ObjectNode("Beast"); + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); + DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); + ObjectNode factoryImpl = dtc.getSrcTopObject(); + ObjectNode orcConcreteHero = dtc.getSrcObjectHierarchy().getBottom(); - Relation transferRelation = new Relation(heroFactoryImpl, client, MultiplicityValue.OneToOne); - DataSynchronizationContext context = new DataSynchronizationContext( - new ArrayList<>(), transferRelation, "beast", PushPullValue.PULL - ); - - DataSynchronizationDesign design = new DataSynchronizationDesign(context); - - DependencyInversion di = new DependencyInversion( - heroFactoryImpl, new InterfaceNode(heroFactoryImpl, "HeroFactory"), client - ); + //factoryImplとorcConcreteHeroの依存関係のみ逆転 + InterfaceNode concreteHero = new InterfaceNode(orcConcreteHero, "ConcreteHero"); + DependencyInversion di = new DependencyInversion(orcConcreteHero, concreteHero, factoryImpl); design.addDependencyInversion(di); + InterfaceNode heroFactory = new InterfaceNode(factoryImpl, "HeroFactory"); + DependencyInversion di2 = new DependencyInversion(factoryImpl, heroFactory); + design.addDependencyInversion(di2); + + InterfaceNode prototype = new InterfaceNode(concreteHero, "Prototype"); + DependencyInversion di3 = new DependencyInversion(concreteHero, prototype); + design.addDependencyInversion(di3); + return design; } -} \ No newline at end of file +} +/*{ + "name": "Prototype", + "contexts": [ + { + "relations": [ + { + "src": "Main", + "dst": "FactoryImpl", + "multiplicity": "1:1" + } + ], + "transfer": { + "src": "Main.{OrcConcreteHero}", + "dst": "FactoryImpl", + "data": { + "type": "OrcConcreteHero", + "name": "orcConcreteHero" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "FactoryImpl.OrcConcreteHero", + "dst": "Main", + "data": { + "type": "Weapon", + "name": "weapon" + }, + "style": "PULL", + "multiplicity": "1:1" + } + } + ] +} +*/ \ 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 8ba8ab5..6c14af4 100644 --- a/src/main/java/designPatternExtensions/designPattern/State.java +++ b/src/main/java/designPatternExtensions/designPattern/State.java @@ -15,10 +15,6 @@ ObjectNode main = design.getSynchronizationContexts().getFirst().getSrcTopObject(); ObjectNode concreteState = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcObjectHierarchy().getEdge(1).getDestination(); -// MediatorInsertion mi = new MediatorInsertion( -// main, concreteState, new ObjectNode("Mammoth")); -// design.addMediatorInsertion(mi); - DependencyInversion di = new DependencyInversion( concreteState, new InterfaceNode(concreteState, "State")); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java index 51ebdbc..a4f77f2 100644 --- a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java +++ b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java @@ -2,43 +2,24 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; -import models.deltaAlgebra.MultiplicityValue; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.ObjectNode; import models.deltaAlgebra.ReferenceEdge; import models.dataSynchronizationModel.*; -import java.util.ArrayList; -import java.util.List; - -//メモ //https://github.com/iluwatar/java-design-patterns/tree/master/template-method + public class TemplateMethod implements DesignPattern { public DataSynchronizationDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode main = new ObjectNode("Main"); - ObjectNode halflingThief = new ObjectNode("HalflingThief"); - ObjectNode subtleMethod = new ObjectNode("SubtleMethod"); - ObjectNode data = new ObjectNode("data"); + 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(); - srcEdges.add(new ReferenceEdge(main, halflingThief, "halflingThief")); - dstEdges.add(new ReferenceEdge(main, subtleMethod, "method", "Integer")); - - List relations = new ArrayList<>(); - relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - - DataSynchronizationContext context = new DataSynchronizationContext( - relations, transferRelation, "data", PushPullValue.PUSH - ); - - DataSynchronizationDesign design = new DataSynchronizationDesign(context); - - DependencyInversion di = new DependencyInversion( - subtleMethod, new InterfaceNode(subtleMethod, "StealingMethod"), halflingThief - ); + InterfaceNode stealingMethod = new InterfaceNode(concreteMethod, "StealingMethod"); + DependencyInversion di = new DependencyInversion(concreteMethod, stealingMethod); design.addDependencyInversion(di); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java index 2756eea..85b152b 100644 --- a/src/main/java/designPatternExtensions/designPattern/Visitor.java +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -7,6 +7,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import designPatternExtensions.ModelLoader; import models.deltaAlgebra.MultiplicityValue; import models.deltaAlgebra.ObjectNode; import models.deltaAlgebra.ReferenceEdge; @@ -18,28 +19,10 @@ public class Visitor implements DesignPattern{ public DataSynchronizationDesign create() throws IllegalRelationException { - List srcEdges = new ArrayList<>(); - List dstEdges = new ArrayList<>(); - ObjectNode commander = new ObjectNode("Commander"); - ObjectNode sergent = new ObjectNode("Sergent"); - ObjectNode soldier = new ObjectNode("Soldier"); - ObjectNode client = new ObjectNode("Client"); - ObjectNode main = new ObjectNode("Main"); - ObjectNode visitor = new ObjectNode("SoldierVisitor"); - - ReferenceEdge srcEdge = new ReferenceEdge(commander, sergent, "children", "Integer"); - srcEdges.add(srcEdge); - srcEdge = new ReferenceEdge(sergent, soldier, "children", "Integer"); - srcEdges.add(srcEdge); - ReferenceEdge dstEdge = new ReferenceEdge(main, client, "client"); - dstEdges.add(dstEdge); - - Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - DataSynchronizationContext context = new DataSynchronizationContext( - new ArrayList<>(), transferRelation, "visitor", PushPullValue.PULL - ); - - DataSynchronizationDesign design = new DataSynchronizationDesign(context); + DataSynchronizationDesign design = ModelLoader.load("models/designPattern/Visitor.Json"); + DataSynchronizationContext dtc = design.getSynchronizationCContexts().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 3432d09..d6aa1da 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -63,7 +63,6 @@ return codebase; } } - public static Codebase weavePrimitiveDelta(Codebase codebase, PrimitiveDelta primitiveDelta) { if (primitiveDelta instanceof PrimitivePullDelta) { codebase = weavePrimitivePullDelta(codebase, (PrimitivePullDelta) primitiveDelta); @@ -334,105 +333,173 @@ models.algebra.Type dstType = codebase.getComponentType(dstName); - // Create a Mediator class and add a field of type dst TypeDeclaration mediatorClass = createClass(codebase, mediatorName); models.algebra.Type mediatorType = codebase.getComponentType(mediatorName); - FieldDeclaration dstField = createField(mediatorClass, dstFieldName, dstType); + TypeDeclaration srcClass = createClass(codebase, srcName); + TypeDeclaration dstClass = createClass(codebase, dstName); + + FieldDeclaration srcDstMapField = null; + for (FieldDeclaration field: srcClass.getFields()) { + if (field.getType() instanceof MapType) { + MapType mapType = (MapType) field.getType(); + if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(dstType.getTypeName())) { + srcDstMapField = field; + break; + } + } + } + boolean toMany = srcDstMapField != null; + + FieldDeclaration dstField; + if (toMany) { + MapType srcMapType = (MapType) srcDstMapField.getType(); + FieldDeclaration existingMediatorMapField = null; + for (FieldDeclaration field: mediatorClass.getFields()) { + if (field.getType() instanceof MapType) { + MapType mapType = (MapType) field.getType(); + if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(dstType.getTypeName()) + && mapType.getKeyType().getTypeName().equals(srcMapType.getKeyType().getTypeName())) { + existingMediatorMapField = field; + break; + } + } + } + dstField = (existingMediatorMapField != null) + ? existingMediatorMapField + : createField(mediatorClass, srcDstMapField.getName(), srcMapType); + } else { + dstField = createField(mediatorClass, dstFieldName, dstType); + } // Add Constructor MethodDeclaration constructor = createConstructor(mediatorClass); - VariableDeclaration dstParam = new VariableDeclaration(dstType, dstFieldName); - constructor.addParameter(dstParam); - FieldAccess dstFieldAccess = new FieldAccess(new ThisExpression(), dstField.getName()); - Assignment dstAssignment = new Assignment(dstFieldAccess, new Variable(dstFieldName)); // this.b = b; - constructor.addUniqueStatement(new ExpressionStatement(dstAssignment)); + if (!hasParameterNamed(constructor, dstField.getName())) { + VariableDeclaration dstParam = new VariableDeclaration(dstField.getType(), dstField.getName()); + constructor.addParameter(dstParam); + FieldAccess dstFieldAccess = new FieldAccess(new ThisExpression(), dstField.getName()); + Assignment dstAssignment = new Assignment(dstFieldAccess, new Variable(dstField.getName())); + constructor.addUniqueStatement(new ExpressionStatement(dstAssignment)); + } - // Add delegation methods to the Mediator that forward calls to dst's public methods - TypeDeclaration dstClass = createClass(codebase, dstName); - for (MethodDeclaration method: dstClass.getMethods()) { - if (method.isConstructor()) continue; - MethodDeclaration delegateMethod = createMethod(mediatorClass, method.getName()); - delegateMethod.setReturnType(method.getReturnType()); - List args = new ArrayList<>(); - if (method.getParameters() != null) { - for (VariableDeclaration param: method.getParameters()) { - delegateMethod.addParameter(param); - args.add(new Variable(param.getName())); + if (!toMany) { + for (MethodDeclaration method: dstClass.getMethods()) { + if (method.isConstructor()) continue; + MethodDeclaration delegateMethod = createMethod(mediatorClass, method.getName()); + delegateMethod.setReturnType(method.getReturnType()); + List args = new ArrayList<>(); + if (method.getParameters() != null) { + for (VariableDeclaration param: method.getParameters()) { + delegateMethod.addParameter(param); + args.add(new Variable(param.getName())); + } + } + FieldAccess dstAccess = new FieldAccess(dstField.getName()); + MethodInvocation callDst = new MethodInvocation(dstAccess, method.getName(), args); + if (method.getReturnType() != null) { + ReturnStatement returnStatement = new ReturnStatement(); + returnStatement.setExpression(callDst); + delegateMethod.addUniqueStatement(returnStatement); + } else { + delegateMethod.addUniqueStatement(new ExpressionStatement(callDst)); } } - FieldAccess dstAccess = new FieldAccess(dstField.getName()); - MethodInvocation callDst = new MethodInvocation(dstAccess, method.getName(), args); - if (method.getReturnType() != null) { - ReturnStatement returnStatement = new ReturnStatement(); - returnStatement.setExpression(callDst); - delegateMethod.addUniqueStatement(returnStatement); + } + + FieldDeclaration srcFieldToReplace = toMany ? srcDstMapField : null; + if (!toMany) { + for (FieldDeclaration field: srcClass.getFields()) { + if (field.getType() != null && field.getType().getTypeName().equals(dstType.getTypeName())) { + srcFieldToReplace = field; + break; + } + } + } + + if (srcFieldToReplace != null) { + FieldDeclaration existingMediatorField = null; + for (FieldDeclaration field: srcClass.getFields()) { + if (field != srcFieldToReplace && field.getType() != null + && field.getType().getTypeName().equals(mediatorType.getTypeName())) { + existingMediatorField = field; + break; + } + } + String oldFieldName = srcFieldToReplace.getName(); + if (existingMediatorField != null) { + srcClass.removeField(srcFieldToReplace); + mediatorFieldName = existingMediatorField.getName(); } else { - delegateMethod.addUniqueStatement(new ExpressionStatement(callDst)); + srcFieldToReplace.setType(mediatorType); + srcFieldToReplace.setName(mediatorFieldName); } - } - // Replace the dst-type field in src with a Mediator-type field - TypeDeclaration srcClass = createClass(codebase, srcName); - for (FieldDeclaration field: srcClass.getFields()) { - if (field.getType() != null && field.getType().getTypeName().equals(dstType.getTypeName())) { - field.setType(mediatorType); - field.setName(mediatorFieldName); - } else if (field.getType() instanceof MapType) { - MapType mapType = (MapType) field.getType(); - if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(dstType.getTypeName())) { - field.setType(codebase.getMapType(mapType.getKeyType().getTypeName(), mediatorName)); - field.setName(mediatorFieldName); - } + // Add Mediator Setter + MethodDeclaration mediatorSetter = createMethod(srcClass, setterPrefix + mediatorName); + if (mediatorSetter.getParameters() == null || mediatorSetter.getParameters().isEmpty()) { + VariableDeclaration mediatorParam = new VariableDeclaration(mediatorType, mediatorFieldName); + mediatorSetter.addParameter(mediatorParam); + FieldAccess mediatorFieldAccess = new FieldAccess(new ThisExpression(), mediatorFieldName); + Assignment mediatorAssignment = new Assignment(mediatorFieldAccess, new Variable(mediatorFieldName)); + mediatorSetter.addUniqueStatement(new ExpressionStatement(mediatorAssignment)); } - } - // Add Mediator Setter - MethodDeclaration mediatorSetter = createMethod(srcClass, setterPrefix + mediatorName); - VariableDeclaration mediatorParam = new VariableDeclaration(mediatorType, mediatorFieldName); - mediatorSetter.addParameter(mediatorParam); - FieldAccess mediatorFieldAccess = new FieldAccess(new ThisExpression(), mediatorFieldName); - Assignment mediatorAssignment = new Assignment(mediatorFieldAccess, new Variable(mediatorFieldName)); // this.me = me; - mediatorSetter.addUniqueStatement(new ExpressionStatement(mediatorAssignment)); - - // Change the constructor parameter type in src from dst to Mediator, and rename the parameter accordingly - for (MethodDeclaration method: srcClass.getMethods()) { - if (method.isConstructor() && method.getParameters() != null) { - for (VariableDeclaration param: method.getParameters()) { - if (param.getType() != null && param.getType().getTypeName().equals(dstType.getTypeName())) { - param.setType(mediatorType); - param.setName(mediatorFieldName); + // Change the constructor parameter type in src from dst to Mediator, and rename the parameter accordingly + for (MethodDeclaration method: srcClass.getMethods()) { + if (method.isConstructor() && method.getParameters() != null) { + for (VariableDeclaration param: method.getParameters()) { + if (param.getType() != null && param.getType().getTypeName().equals(dstType.getTypeName())) { + param.setType(mediatorType); + param.setName(mediatorFieldName); + } } } } - } - // Replace all references to the dst field with references to the mediator field in the bodies of src's methods - for (MethodDeclaration method: srcClass.getMethods()) { - if (method.getBody() == null) continue; - for (Statement statement: method.getBody().getStatements2()) { - replaceFieldNameInStatement(statement, dstFieldName, mediatorFieldName); - } - } - - // Replace return type and MapType value type matching dst type with Mediator type in all classes - for (CompilationUnit cu: codebase.getCompilationUnits()) { - TypeDeclaration cls = cu.types().getFirst(); - for (MethodDeclaration method: cls.getMethods()) { - if (!method.isConstructor() && method.getReturnType() != null) { - if (method.getReturnType().getTypeName().equals(dstType.getTypeName())) { - method.setReturnType(mediatorType); - } + List methodsToMove = new ArrayList<>(); + for (MethodDeclaration method: srcClass.getMethods()) { + if (method.isConstructor()) continue; + if (methodReferencesField(method, oldFieldName)) { + methodsToMove.add(method); } } - for (FieldDeclaration field: cls.getFields()) { - if (field.getType() instanceof MapType) { - MapType mapType = (MapType) field.getType(); - if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(dstType.getTypeName())) { - field.setType(codebase.getMapType(mapType.getKeyType().getTypeName(), mediatorName)); + for (MethodDeclaration method: methodsToMove) { + srcClass.removeMethod(method); + MethodDeclaration existingOnMediator = null; + for (MethodDeclaration existing: mediatorClass.getMethods()) { + if (existing.getName().equals(method.getName())) { existingOnMediator = existing; break; } + } + if (existingOnMediator == null) { + mediatorClass.addMethod(method); + } + + MethodDeclaration stub = createMethod(srcClass, method.getName()); + stub.setReturnType(method.getReturnType()); + List args = new ArrayList<>(); + if (method.getParameters() != null) { + for (VariableDeclaration param: method.getParameters()) { + stub.addParameter(param); + args.add(new Variable(param.getName())); } } + FieldAccess mediatorAccess = new FieldAccess(mediatorFieldName); + MethodInvocation callMediator = new MethodInvocation(mediatorAccess, method.getName(), args); + if (method.getReturnType() != null) { + ReturnStatement returnStatement = new ReturnStatement(); + returnStatement.setExpression(callMediator); + stub.addUniqueStatement(returnStatement); + } else { + stub.addUniqueStatement(new ExpressionStatement(callMediator)); + } + } + + for (MethodDeclaration method: srcClass.getMethods()) { + if (method.getBody() == null) continue; + for (Statement statement: method.getBody().getStatements2()) { + replaceFieldNameInStatement(statement, oldFieldName, mediatorFieldName); + } } } + return codebase; } @@ -623,6 +690,18 @@ } else if (statement instanceof ReturnStatement) { Expression expr = ((ReturnStatement) statement).getExpression(); return expr != null && expressionReferencesField(expr, fieldName); + } else if (statement instanceof EnhancedForStatement) { + EnhancedForStatement forStatement = (EnhancedForStatement) statement; + if (expressionReferencesField(forStatement.getExpression(), fieldName)) return true; + Statement body = forStatement.getBody(); + if (body == null) return false; + if (body instanceof Block) { + for (Statement inner: ((Block) body).getStatements2()) { + if (statementReferencesField(inner, fieldName)) return true; + } + return false; + } + return statementReferencesField(body, fieldName); } return false; } diff --git a/src/test/java/generator/TestMultipleContexts.java b/src/test/java/generator/TestMultipleContexts.java index ff40cf7..2ceeec0 100644 --- a/src/test/java/generator/TestMultipleContexts.java +++ b/src/test/java/generator/TestMultipleContexts.java @@ -1,6 +1,7 @@ package generator; import generators.ASTGenerator; +import models.deltaAlgebra.*; import models.dataSynchronizationModel.*; import org.junit.jupiter.api.Test; diff --git a/src/test/java/parser/PatternTest.java b/src/test/java/parser/PatternTest.java index 18a783b..1694cc3 100644 --- a/src/test/java/parser/PatternTest.java +++ b/src/test/java/parser/PatternTest.java @@ -10,14 +10,16 @@ @Test void adapter() throws Exception { run(new Adapter()); } @Test void bridge() throws Exception { run(new Bridge()); } @Test void builder() throws Exception { run(new Builder()); } -// @Test void chainOfResponsibility() throws Exception { run(new ChainOfResponsibility()); } + @Test void chainOfResponsibility() throws Exception { run(new Chain_of_Responsibility()); } @Test void command() throws Exception { run(new Command()); } + @Test void composite() throws Exception { run(new Composite()); } @Test void decorator() throws Exception { run(new Decorator()); } -// @Test void facade() throws Exception { run(new Facade()); } -// @Test void factoryMethod() throws Exception { run(new FactoryMethod()); } -// @Test void interpreter() throws Exception { run(new Interpreter()); } + @Test void facade() throws Exception { run(new Facade()); } + @Test void factoryMethod() throws Exception { run(new Factory_method()); } + @Test void flyweight() throws Exception { run(new Flyweight()); } + @Test void interpreter() throws Exception { run(new Interpreter()); } @Test void iterator() throws Exception { run(new Iterator()); } -// @Test void mediator() throws Exception { run(new Mediator()); } + @Test void mediator() throws Exception { run(new Mediator2()); } @Test void memento() throws Exception { run(new Memento()); } @Test void observer() throws Exception { run(new Observer()); } @Test void prototype() throws Exception { run(new Prototype()); }