diff --git a/models/designPattern/MediatorInsertionTest.Json b/models/designPattern/MediatorInsertionTest.Json new file mode 100644 index 0000000..d8a0ac9 --- /dev/null +++ b/models/designPattern/MediatorInsertionTest.Json @@ -0,0 +1,15 @@ +{ + "name" : "MediatorInsertionTest", + "contexts" : [ + { + "relations": [], + "transfer": { + "src": "A", + "dst": "B", + "data": { "type": "String", "name": "data" }, + "style": "PUSH", + "multiplicity": "1:1" + } + } + ] +} \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index f97ac6f..2d7e935 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -30,7 +30,7 @@ design = new DataTransferDesign(context); ObjectNode cm = new ObjectNode("CompanyMediator"); - MediatorInsertion mi = new MediatorInsertion(customer, company, cm); + MediatorInsertion mi = new MediatorInsertion(customer, company, cm, context); design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); diff --git a/src/main/java/designPatternExtensions/ControlFlowInversion.java b/src/main/java/designPatternExtensions/ControlFlowInversion.java new file mode 100644 index 0000000..59880dd --- /dev/null +++ b/src/main/java/designPatternExtensions/ControlFlowInversion.java @@ -0,0 +1,22 @@ +package designPatternExtensions; + +import models.objectOrientedTransfer.PushPullValue; + +public class ControlFlowInversion { + private MediatorInsertion mediatorInsertion; + private PushPullValue newDirection; + + public ControlFlowInversion(MediatorInsertion mediatorInsertion, PushPullValue newDirection){ + this.mediatorInsertion = mediatorInsertion; + this.newDirection = newDirection; + } + + public MediatorInsertion getMediatorInsertion(){ + return mediatorInsertion; + } + + public PushPullValue getNewDirection(){ + return newDirection; + } + +} diff --git a/src/main/java/designPatternExtensions/MediatorInsertion.java b/src/main/java/designPatternExtensions/MediatorInsertion.java index 552a090..6a2b7a6 100644 --- a/src/main/java/designPatternExtensions/MediatorInsertion.java +++ b/src/main/java/designPatternExtensions/MediatorInsertion.java @@ -1,25 +1,23 @@ package designPatternExtensions; +import designPatternExtensions.designPattern.MediatorInsertionTest; +import models.objectOrientedTransfer.DataTransferContext; +import models.objectOrientedTransfer.DataTransferDesign; import models.objectOrientedTransfer.ObjectNode; +import javax.print.attribute.standard.Media; + public class MediatorInsertion { private ObjectNode src; private ObjectNode dst; private ObjectNode mediator; - private String mediatorFieldName; + private DataTransferContext context; - public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator) { + public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, DataTransferContext context) { this.src = src; this.dst = dst; this.mediator = mediator; - this.mediatorFieldName = mediator.getName().substring(0, 1).toLowerCase() + mediator.getName().substring(1); - } - - public MediatorInsertion(ObjectNode src, ObjectNode dst, ObjectNode mediator, String mediatorFieldName) { - this.src = src; - this.dst = dst; - this.mediator = mediator; - this.mediatorFieldName = mediatorFieldName; + this.context = context; } public ObjectNode getSrc() { @@ -34,7 +32,7 @@ return mediator; } - public String getMediatorFieldName() { - return mediatorFieldName; + public DataTransferContext getContext() { + return context; } } \ 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 f8f6aad..9731efc 100644 --- a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java +++ b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java @@ -11,11 +11,12 @@ public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/AbstractFactory.Json"); - ObjectNode concreteCastle = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode app = design.getTransferContexts().getFirst().getDstFirstResource(); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode concreteCastle = dtc.getSrcFirstResource(); + ObjectNode app = dtc.getDstFirstResource(); ObjectNode concreteKingdomFactory = new ObjectNode("ConcreteKingdomFactory"); - MediatorInsertion mi = new MediatorInsertion(app, concreteCastle, concreteKingdomFactory); + MediatorInsertion mi = new MediatorInsertion(app, concreteCastle, concreteKingdomFactory, dtc); design.addMediatorInsertion(mi); DependencyInversion di1 = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java index a329820..583299d 100644 --- a/src/main/java/designPatternExtensions/designPattern/Adapter.java +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -1,20 +1,18 @@ package designPatternExtensions.designPattern; -import designPatternExtensions.DependencyInversion; -import designPatternExtensions.InterfaceNode; -import designPatternExtensions.MediatorInsertion; +import designPatternExtensions.*; import models.objectOrientedTransfer.*; -import designPatternExtensions.ModelLoader; public class Adapter implements DesignPattern { public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/Adapter.Json"); - ObjectNode fishingBoat = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode captain = design.getTransferContexts().getFirst().getDstFirstResource(); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode fishingBoat = dtc.getSrcFirstResource(); + ObjectNode captain = dtc.getDstFirstResource(); ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); - MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter); + MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, dtc); design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/Decorator.java b/src/main/java/designPatternExtensions/designPattern/Decorator.java index 1885ffb..93a4724 100644 --- a/src/main/java/designPatternExtensions/designPattern/Decorator.java +++ b/src/main/java/designPatternExtensions/designPattern/Decorator.java @@ -15,11 +15,12 @@ public class Decorator implements DesignPattern { public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/Decorator.Json"); - ObjectNode simpleTroll = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode client = design.getTransferContexts().getFirst().getDstFirstResource(); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode simpleTroll = dtc.getSrcFirstResource(); + ObjectNode client = dtc.getDstFirstResource(); ObjectNode clubbedTroll = new ObjectNode("ClubbedTroll"); - MediatorInsertion mi = new MediatorInsertion(client, simpleTroll, clubbedTroll); + MediatorInsertion mi = new MediatorInsertion(client, simpleTroll, clubbedTroll, dtc); design.addMediatorInsertion(mi); InterfaceNode troll = new InterfaceNode(clubbedTroll, "Troll"); diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index 79c9482..221c203 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -16,11 +16,12 @@ public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); - ObjectNode treasureChest = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode client = design.getTransferContexts().getFirst().getDstFirstResource(); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode treasureChest = dtc.getSrcFirstResource(); + ObjectNode client = dtc.getDstFirstResource(); ObjectNode iterator = new ObjectNode("TreasureChestItemIterator"); - MediatorInsertion mi = new MediatorInsertion(client, treasureChest, iterator); + MediatorInsertion mi = new MediatorInsertion(client, treasureChest, iterator, dtc); design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java new file mode 100644 index 0000000..3f0e6dc --- /dev/null +++ b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java @@ -0,0 +1,30 @@ + +package designPatternExtensions.designPattern; + + import designPatternExtensions.*; + import models.objectOrientedTransfer.*; + +public class MediatorInsertionTest implements DesignPattern { + + public DataTransferDesign create() throws IllegalRelationException { + DataTransferDesign design = ModelLoader.load("models/designPattern/MediatorInsertionTest.Json"); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode a = dtc.getSrcFirstResource(); + ObjectNode b = dtc.getDstFirstResource(); + + ObjectNode me = new ObjectNode("Me"); + MediatorInsertion mi = new MediatorInsertion(a, b, me, dtc); + design.addMediatorInsertion(mi); + // ControlFlowInversion ci = new ControlFlowInversion(mi, PushPullValue.PUSH); + + return design; + } +} + +//Contextを持たせる理由 +//DataTransferDesignにはContextのリストがあり、その時に、いずれかのコンテキストのデータ転送かを +//判別する必要があると思うので、それを区別するためにMediatorInsertionの引数に渡している + +// A -PUSH-> B にMediatorInsertionする場合はnew MediatorInsertion(A, B, me); +// A -PULL-> B の時はnew MediatorInsertion(B, A, me); +// Meが主導に時はPULL->PUSHになる? \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Memento.java b/src/main/java/designPatternExtensions/designPattern/Memento.java index 19b03f2..982e1ac 100644 --- a/src/main/java/designPatternExtensions/designPattern/Memento.java +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -23,7 +23,7 @@ DataTransferDesign design = new DataTransferDesign(context); - MediatorInsertion client = new MediatorInsertion(star, states, new ObjectNode("Client")); + MediatorInsertion client = new MediatorInsertion(star, states, new ObjectNode("Client"), context); design.addMediatorInsertion(client); DependencyInversion di = new DependencyInversion( diff --git a/src/main/java/designPatternExtensions/designPattern/Proxy.java b/src/main/java/designPatternExtensions/designPattern/Proxy.java index 410f1ff..38db83f 100644 --- a/src/main/java/designPatternExtensions/designPattern/Proxy.java +++ b/src/main/java/designPatternExtensions/designPattern/Proxy.java @@ -12,11 +12,12 @@ public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/Proxy.Json"); - ObjectNode client = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode ivoryTower = design.getTransferContexts().getFirst().getDstFirstResource(); + DataTransferContext dtc = design.getTransferContexts().getFirst(); + ObjectNode client = dtc.getSrcFirstResource(); + ObjectNode ivoryTower = dtc.getDstFirstResource(); ObjectNode proxy = new ObjectNode("WizardTowerProxy"); - MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy); + MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy, dtc); design.addMediatorInsertion(mi); InterfaceNode wizardTower = new InterfaceNode(proxy, "WizardTower"); diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index b6024fd..3cd6291 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -236,8 +236,15 @@ } public static Codebase weaveMediatorInsertion(Codebase codebase, MediatorInsertion mediatorInsertion) { - ObjectNode srcNode = mediatorInsertion.getSrc(); - ObjectNode dstNode = mediatorInsertion.getDst(); + PushPullValue style = mediatorInsertion.getContext().getTransferStyle(); + ObjectNode srcNode, dstNode; + if (style == PushPullValue.PUSH) { + srcNode = mediatorInsertion.getSrc(); + dstNode = mediatorInsertion.getDst(); + } else { + srcNode = mediatorInsertion.getDst(); + dstNode = mediatorInsertion.getSrc(); + } ObjectNode mediatorNode = mediatorInsertion.getMediator(); String srcName = toComponentName(srcNode.getName()); String dstName = toComponentName(dstNode.getName()); @@ -252,6 +259,15 @@ models.algebra.Type mediatorType = codebase.getComponentType(mediatorName); FieldDeclaration 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.addStatement(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()) { diff --git a/src/test/java/parser/PatternTest.java b/src/test/java/parser/PatternTest.java index 31e54ab..18a783b 100644 --- a/src/test/java/parser/PatternTest.java +++ b/src/test/java/parser/PatternTest.java @@ -28,6 +28,8 @@ @Test void templateMethod() throws Exception { run(new TemplateMethod()); } @Test void visitor() throws Exception { run(new Visitor()); } + @Test void mediatorInsertionTest() throws Exception { run(new MediatorInsertionTest()); } + private void run(DesignPattern pattern) throws Exception { System.out.println(pattern.getClass().getSimpleName()); System.out.println(ASTGenerator.generate(pattern.create()));