diff --git a/models/designPattern/MediatorInsertionTest.Json b/models/designPattern/MediatorInsertionTest.Json deleted file mode 100644 index 404698f..0000000 --- a/models/designPattern/MediatorInsertionTest.Json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name" : "MediatorInsertionTest", - "contexts" : [ - { - "relations": [], - "transfer": { - "src": "A.String", - "dst": "B.String", - "data": { "name": "string" }, - "style": "PUSH", - "multiplicity": "1:1" - } - } - ] -} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/DependencyInversion.java b/src/main/java/designPatternExtensions/DependencyInversion.java index 32a397b..0a54c13 100644 --- a/src/main/java/designPatternExtensions/DependencyInversion.java +++ b/src/main/java/designPatternExtensions/DependencyInversion.java @@ -12,6 +12,7 @@ this.dst = dst; this.interfaceNode = interfaceNode; this.targetSrc = null; + interfaceNode.setImplementSideNode(dst); } // Reverse the dependency for a single ObjectNode @@ -19,6 +20,7 @@ this.dst = dst; this.interfaceNode = interfaceNode; this.targetSrc = targetSrc; + interfaceNode.setImplementSideNode(dst); } public ObjectNode getDst() { diff --git a/src/main/java/designPatternExtensions/InterfaceNode.java b/src/main/java/designPatternExtensions/InterfaceNode.java index 397d69a..224fe56 100644 --- a/src/main/java/designPatternExtensions/InterfaceNode.java +++ b/src/main/java/designPatternExtensions/InterfaceNode.java @@ -6,33 +6,18 @@ import java.util.Set; public class InterfaceNode extends ObjectNode { - private Set dependencySideNodes = new HashSet<>(); private ObjectNode implementSideNode = null; - public InterfaceNode(ObjectNode implementSideNode, String name) { + public InterfaceNode(String name) { super(name); - this.implementSideNode = implementSideNode; - } - - public InterfaceNode(ObjectNode dependencySideNode, ObjectNode implementSideNode, String name) { - super(name); - this.dependencySideNodes.add(dependencySideNode); - this.implementSideNode = implementSideNode; - } - - public Set getDependencySideNodes() { - return dependencySideNodes; - } - - public void addDependencySideNode(ObjectNode node) { - dependencySideNodes.add(node); } public ObjectNode getImplementSideNode() { return implementSideNode; } - public void setImplementSideNode(ObjectNode implementSideNode) { + void setImplementSideNode(ObjectNode implementSideNode) { this.implementSideNode = implementSideNode; } + } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/PresenterInsertion.java b/src/main/java/designPatternExtensions/PresenterInsertion.java index 1ab9ccf..e69de29 100644 --- a/src/main/java/designPatternExtensions/PresenterInsertion.java +++ b/src/main/java/designPatternExtensions/PresenterInsertion.java @@ -1,38 +0,0 @@ -package designPatternExtensions; - -import models.deltaAlgebra.ObjectNode; -import models.dataSynchronizationModel.TransferStyle; - -public class PresenterInsertion { - private ObjectNode src; - private ObjectNode dst; - private ObjectNode presenter; - private TransferStyle transferStyle; - private boolean removeDirectDependency = false; - - public PresenterInsertion(ObjectNode src, ObjectNode dst, ObjectNode presenter, - TransferStyle transferStyle, boolean removeDirectDependency) { - this.src = src; - this.dst = dst; - this.presenter = presenter; - this.transferStyle = transferStyle; - this.removeDirectDependency = removeDirectDependency; - } - - public ObjectNode getSrc() { - return src; - } - - public ObjectNode getDst() { - return dst; - } - - public ObjectNode getPresenter() { - return presenter; - } - - public TransferStyle getPushPullValue() { return transferStyle; } - - 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 2dc4349..b348953 100644 --- a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java +++ b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java @@ -16,18 +16,6 @@ ObjectNode concreteCastle = dtc.getSrcTopObject(); ObjectNode app = dtc.getDstTopObject(); -// ObjectNode concreteKingdomFactory = new ObjectNode("ConcreteKingdomFactory"); -// MediatorInsertion mi = new MediatorInsertion(app, concreteCastle, concreteKingdomFactory, dtc); -// design.addMediatorInsertion(mi); -// -// DependencyInversion di1 = new DependencyInversion( -// concreteKingdomFactory, new InterfaceNode(concreteKingdomFactory, "KingdomFactory")); -// design.addDependencyInversion(di1); -// -// DependencyInversion di2 = new DependencyInversion( -// concreteCastle, new InterfaceNode(concreteCastle, "Castle")); -// design.addDependencyInversion(di2); - return design; } } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java index 586631e..626bb83 100644 --- a/src/main/java/designPatternExtensions/designPattern/Adapter.java +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -13,11 +13,11 @@ ObjectNode fishingBoat = dtc.getDstTopObject(); ObjectNode adapter = new ObjectNode("FishingBoatAdapter"); - MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, TransferStyle.PUSH); + MediatorInsertion mi = new MediatorInsertion(captain, fishingBoat, adapter, dtc.getTransferStyle()); design.addMediatorInsertion(mi); DependencyInversion di = new DependencyInversion( - adapter, new InterfaceNode(adapter, "RowingBoat")); + adapter, new InterfaceNode("RowingBoat")); design.addDependencyInversion(di); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Bridge.java b/src/main/java/designPatternExtensions/designPattern/Bridge.java index b653766..08369c0 100644 --- a/src/main/java/designPatternExtensions/designPattern/Bridge.java +++ b/src/main/java/designPatternExtensions/designPattern/Bridge.java @@ -16,10 +16,10 @@ ObjectNode concreteEnchant = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcObjectHierarchy().getEdge(0).getDestination(); ObjectNode concreteWeapon = (ObjectNode) design.getSynchronizationContexts().getFirst().getDstObjectHierarchy().getEdge(0).getDestination(); - DependencyInversion di1 = new DependencyInversion(concreteWeapon, new InterfaceNode(concreteWeapon, "Weapon")); + DependencyInversion di1 = new DependencyInversion(concreteWeapon, new InterfaceNode("Weapon")); design.addDependencyInversion(di1); - DependencyInversion di2 = new DependencyInversion(concreteEnchant, new InterfaceNode(concreteEnchant, "Enchantment")); + DependencyInversion di2 = new DependencyInversion(concreteEnchant, new InterfaceNode( "Enchantment")); design.addDependencyInversion(di2); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Builder.java b/src/main/java/designPatternExtensions/designPattern/Builder.java index 3e6957b..504bfcf 100644 --- a/src/main/java/designPatternExtensions/designPattern/Builder.java +++ b/src/main/java/designPatternExtensions/designPattern/Builder.java @@ -17,12 +17,6 @@ DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); ObjectNode builder = dtc.getSrcTopObject(); ObjectNode hero = dtc.getDstTopObject(); -// -// MediatorInsertion mi = new MediatorInsertion(main, builder, new ObjectNode("Hero")); -// design.addMediatorInsertion(mi); - -// PresenterInsertion pi = new PresenterInsertion(hero, builder, new ObjectNode("Presenter"), dtc.getTransferStyle(), true); -// design.addPresenterInsertion(pi); return design; } diff --git a/src/main/java/designPatternExtensions/designPattern/ChainOfResponsibility.java b/src/main/java/designPatternExtensions/designPattern/ChainOfResponsibility.java index 5a5e581..f0c29fa 100644 --- a/src/main/java/designPatternExtensions/designPattern/ChainOfResponsibility.java +++ b/src/main/java/designPatternExtensions/designPattern/ChainOfResponsibility.java @@ -19,8 +19,7 @@ ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); //ObjectNode concreteOrcRequestHandler = (ObjectNode) dtc.getDstResource().getEdge(0).getDestination(); - InterfaceNode requestHandler = new InterfaceNode(concreteOrcRequestHandler, "RequestHandler"); - DependencyInversion di = new DependencyInversion(concreteOrcRequestHandler, requestHandler); + DependencyInversion di = new DependencyInversion(concreteOrcRequestHandler, new InterfaceNode("RequestHandler")); design.addDependencyInversion(di); MediatorInsertion mi = new MediatorInsertion(main, concreteOrcRequestHandler, new ObjectNode("OrcKing"), TransferStyle.PUSH); diff --git a/src/main/java/designPatternExtensions/designPattern/Command.java b/src/main/java/designPatternExtensions/designPattern/Command.java index 24af3ab..69ff774 100644 --- a/src/main/java/designPatternExtensions/designPattern/Command.java +++ b/src/main/java/designPatternExtensions/designPattern/Command.java @@ -11,21 +11,6 @@ //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 { @@ -35,32 +20,9 @@ ObjectNode wizard = (ObjectNode) dtc.getDstObjectHierarchy().getEdges().get(0).getDestination(); ObjectNode goblin = dtc.getDstBottomObject(); -// MediatorInsertion mi = new MediatorInsertion(main, goblin, new ObjectNode("wizard"), dtc.getTransferStyle()); -// design.addMediatorInsertion(mi); - - DependencyInversion di = new DependencyInversion(goblin, new InterfaceNode(goblin, "Target")); + DependencyInversion di = new DependencyInversion(goblin, new InterfaceNode("Target")); design.addDependencyInversion(di); return design; } - } - -//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 + } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Composite.java b/src/main/java/designPatternExtensions/designPattern/Composite.java index abe40bb..3cce7af 100644 --- a/src/main/java/designPatternExtensions/designPattern/Composite.java +++ b/src/main/java/designPatternExtensions/designPattern/Composite.java @@ -19,7 +19,7 @@ ObjectNode letter = dtc3.getSrcTopObject(); ObjectNode word = dtc3.getDstTopObject(); - InterfaceNode LetterComposite = new InterfaceNode(sentence, "LetterComposite"); + InterfaceNode LetterComposite = new InterfaceNode("LetterComposite"); DependencyInversion di = new DependencyInversion(sentence, LetterComposite, main); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/Decorator.java b/src/main/java/designPatternExtensions/designPattern/Decorator.java index 25cb064..655e77b 100644 --- a/src/main/java/designPatternExtensions/designPattern/Decorator.java +++ b/src/main/java/designPatternExtensions/designPattern/Decorator.java @@ -8,10 +8,6 @@ import designPatternExtensions.ModelLoader; //https://github.com/iluwatar/java-design-patterns/tree/master/decorator -//SimpleTrollを用いてClubbedTrollを作成しないとDecoratorとは言えない? -//仲介者オブジェクトM A->M->B M作成時にに、MにBを参照先を引数とするコンストラクタをつける -// public ClubbedTroll(SimpleTroll simpleTroll) { -// this.simpleTroll = simpleTroll; } public class Decorator implements DesignPattern { public DataSynchronizationDesign create() throws IllegalRelationException { @@ -24,7 +20,7 @@ MediatorInsertion mi = new MediatorInsertion(simpleTroll, client, clubbedTroll, dtc); design.addMediatorInsertion(mi); - InterfaceNode troll = new InterfaceNode(clubbedTroll, "Troll"); + InterfaceNode troll = new InterfaceNode("Troll"); DependencyInversion di1 = new DependencyInversion(clubbedTroll, troll); design.addDependencyInversion(di1); diff --git a/src/main/java/designPatternExtensions/designPattern/Facade.java b/src/main/java/designPatternExtensions/designPattern/Facade.java index 0562122..b446b22 100644 --- a/src/main/java/designPatternExtensions/designPattern/Facade.java +++ b/src/main/java/designPatternExtensions/designPattern/Facade.java @@ -22,7 +22,7 @@ MediatorInsertion mi = new MediatorInsertion(main, concreteDwarvenDigger, facade, dtc.getTransferStyle()); design.addMediatorInsertion(mi); - DependencyInversion di = new DependencyInversion(concreteDwarvenDigger, new InterfaceNode(concreteDwarvenDigger, "DwarvenMineWorker")); + DependencyInversion di = new DependencyInversion(concreteDwarvenDigger, new InterfaceNode("DwarvenMineWorker")); design.addDependencyInversion(di); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/FactoryMethod.java b/src/main/java/designPatternExtensions/designPattern/FactoryMethod.java index 6f2bf56..eb883ad 100644 --- a/src/main/java/designPatternExtensions/designPattern/FactoryMethod.java +++ b/src/main/java/designPatternExtensions/designPattern/FactoryMethod.java @@ -16,7 +16,7 @@ ObjectNode concreteBlacksmith = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); ObjectNode main = dtc.getDstTopObject(); - InterfaceNode blackSmith = new InterfaceNode(concreteBlacksmith, "Blacksmith"); + InterfaceNode blackSmith = new InterfaceNode("Blacksmith"); DependencyInversion di = new DependencyInversion(concreteBlacksmith, blackSmith); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/Flyweight.java b/src/main/java/designPatternExtensions/designPattern/Flyweight.java index f098c92..8f3be58 100644 --- a/src/main/java/designPatternExtensions/designPattern/Flyweight.java +++ b/src/main/java/designPatternExtensions/designPattern/Flyweight.java @@ -15,29 +15,7 @@ public DataSynchronizationDesign create() throws IllegalRelationException { DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); DataSynchronizationContext dtc = design.getSynchronizationContexts().getLast(); -// ObjectNode potion = (ObjectNode) dtc.getSrcResource().getEdge(0).getDestination(); -// ObjectNode alchemistShop = dtc.getDstFirstResource(); -// -// 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 +} \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Interpreter.java b/src/main/java/designPatternExtensions/designPattern/Interpreter.java index b46f65e..16e3963 100644 --- a/src/main/java/designPatternExtensions/designPattern/Interpreter.java +++ b/src/main/java/designPatternExtensions/designPattern/Interpreter.java @@ -16,8 +16,7 @@ ObjectNode main = dtc.getSrcTopObject(); ObjectNode concreteExpression = dtc.getDstTopObject(); - InterfaceNode expression = new InterfaceNode(concreteExpression, "Expression"); - DependencyInversion di = new DependencyInversion(concreteExpression, expression); + DependencyInversion di = new DependencyInversion(concreteExpression, new InterfaceNode("Expression")); design.addDependencyInversion(di); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index 92a4e3c..e1f50b7 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -22,13 +22,6 @@ ObjectNode app = (ObjectNode) dtc.getDstTopObject(); ObjectNode client = dtc.getDstTopObject(); -// 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); - return design; } } \ No newline at end of file diff --git a/src/main/java/designPatternExtensions/designPattern/Mediator.java b/src/main/java/designPatternExtensions/designPattern/Mediator.java index 1333d5f..24c3f10 100644 --- a/src/main/java/designPatternExtensions/designPattern/Mediator.java +++ b/src/main/java/designPatternExtensions/designPattern/Mediator.java @@ -23,15 +23,15 @@ ObjectNode partyImpl = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); ObjectNode concretePartyMember = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); - InterfaceNode partyMemberBase = new InterfaceNode(concretePartyMember, "PartyMemberBase"); + InterfaceNode partyMemberBase = new InterfaceNode("PartyMemberBase"); DependencyInversion di = new DependencyInversion(concretePartyMember, partyMemberBase); design.addDependencyInversion(di); - InterfaceNode partyMember = new InterfaceNode(partyMemberBase, "PartyMember"); + InterfaceNode partyMember = new InterfaceNode("PartyMember"); DependencyInversion di2 = new DependencyInversion(partyMemberBase, partyMember); design.addDependencyInversion(di2); - InterfaceNode party = new InterfaceNode(partyImpl, "Party"); + InterfaceNode party = new InterfaceNode("Party"); DependencyInversion di3 = new DependencyInversion(partyImpl, party); design.addDependencyInversion(di3); diff --git a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java deleted file mode 100644 index aef2750..0000000 --- a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java +++ /dev/null @@ -1,38 +0,0 @@ - -package designPatternExtensions.designPattern; - - import designPatternExtensions.*; - import models.deltaAlgebra.ObjectNode; - import models.dataSynchronizationModel.*; - -public class MediatorInsertionTest implements DesignPattern { - - public DataSynchronizationDesign create() throws IllegalRelationException { - DataSynchronizationDesign design = ModelLoader.load("models/designPattern/MediatorInsertionTest.Json"); - DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); - ObjectNode a = dtc.getSrcTopObject(); - ObjectNode b = dtc.getDstTopObject(); - -// ObjectNode me = new ObjectNode("Me"); -// MediatorInsertion mi = new MediatorInsertion(a, b, me, dtc.getTransferStyle()); -// design.addMediatorInsertion(mi); - - ObjectNode presenter = new ObjectNode("Presenter"); - PresenterInsertion pi = new PresenterInsertion(a, b, presenter, dtc.getTransferStyle(), false); - design.addPresenterInsertion(pi); - - return design; - } -} - - -//A側Mediatorのsetter作成 - -//PresenterのSetDataをupdateDataとして命名されるように - -//Contextを持たせる理由 -//DataTransferDesignにはContextのリストがあり、その時に、いずれかのコンテキストのデータ転送かを -//判別する必要があると思うので、それを区別するためにMediatorInsertionの引数に渡している - -// Meが主導に時はPULL->PUSHになる -> PresenterInsertion or ControllerInsertionとして扱い -//PULLPULL PUSHPUSHはMediatorInsertionとして扱う \ 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 7be572c..f1c5e39 100644 --- a/src/main/java/designPatternExtensions/designPattern/Memento.java +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -13,22 +13,13 @@ 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); - 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); - ObjectNode starMementoInternal = new ObjectNode("StarMementoInternal"); DependencyInversion di = new DependencyInversion( - starMementoInternal, new InterfaceNode(starMementoInternal, "StarMemento") + starMementoInternal, new InterfaceNode("StarMemento") ); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index ddd9acf..8490a1f 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -21,10 +21,7 @@ ObjectNode main = dtc.getDstTopObject(); ObjectNode concreteObserver = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(1).getDestination(); -// MediatorInsertion mi = new MediatorInsertion(main, concreteObserver, new ObjectNode("Weather"), dtc.getTransferStyle()); -// design.addMediatorInsertion(mi); - - DependencyInversion di1 = new DependencyInversion(concreteObserver, new InterfaceNode(concreteObserver, "WeatherObserver")); + DependencyInversion di1 = new DependencyInversion(concreteObserver, new InterfaceNode("WeatherObserver")); design.addDependencyInversion(di1); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java index 10de1a5..eaba8e6 100644 --- a/src/main/java/designPatternExtensions/designPattern/Prototype.java +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -16,19 +16,19 @@ public DataSynchronizationDesign create() throws IllegalRelationException { DataSynchronizationDesign design = ModelLoader.load("models/designPattern/"+this.getClass().getSimpleName()+".Json"); DataSynchronizationContext dtc = design.getSynchronizationContexts().getFirst(); - ObjectNode factoryImpl = dtc.getSrcTopObject(); + ObjectNode factoryImpl = dtc.getDstTopObject(); ObjectNode orcConcreteHero = dtc.getSrcObjectHierarchy().getBottom(); //factoryImplとorcConcreteHeroの依存関係のみ逆転 - InterfaceNode concreteHero = new InterfaceNode(orcConcreteHero, "ConcreteHero"); + InterfaceNode concreteHero = new InterfaceNode("ConcreteHero"); DependencyInversion di = new DependencyInversion(orcConcreteHero, concreteHero, factoryImpl); design.addDependencyInversion(di); - InterfaceNode heroFactory = new InterfaceNode(factoryImpl, "HeroFactory"); + InterfaceNode heroFactory = new InterfaceNode("HeroFactory"); DependencyInversion di2 = new DependencyInversion(factoryImpl, heroFactory); design.addDependencyInversion(di2); - InterfaceNode prototype = new InterfaceNode(concreteHero, "Prototype"); + InterfaceNode prototype = new InterfaceNode("Prototype"); DependencyInversion di3 = new DependencyInversion(concreteHero, prototype); design.addDependencyInversion(di3); diff --git a/src/main/java/designPatternExtensions/designPattern/Proxy.java b/src/main/java/designPatternExtensions/designPattern/Proxy.java index bd68ebc..cae8de9 100644 --- a/src/main/java/designPatternExtensions/designPattern/Proxy.java +++ b/src/main/java/designPatternExtensions/designPattern/Proxy.java @@ -21,7 +21,7 @@ MediatorInsertion mi = new MediatorInsertion(client, ivoryTower, proxy, dtc); design.addMediatorInsertion(mi); - InterfaceNode wizardTower = new InterfaceNode(proxy, "WizardTower"); + InterfaceNode wizardTower = new InterfaceNode("WizardTower"); DependencyInversion di = new DependencyInversion(proxy, wizardTower); design.addDependencyInversion(di); DependencyInversion di2 = new DependencyInversion(ivoryTower, wizardTower); diff --git a/src/main/java/designPatternExtensions/designPattern/State.java b/src/main/java/designPatternExtensions/designPattern/State.java index 6c14af4..92888f3 100644 --- a/src/main/java/designPatternExtensions/designPattern/State.java +++ b/src/main/java/designPatternExtensions/designPattern/State.java @@ -16,7 +16,7 @@ ObjectNode concreteState = (ObjectNode) design.getSynchronizationContexts().getFirst().getSrcObjectHierarchy().getEdge(1).getDestination(); DependencyInversion di = new DependencyInversion( - concreteState, new InterfaceNode(concreteState, "State")); + concreteState, new InterfaceNode("State")); design.addDependencyInversion(di); return design; diff --git a/src/main/java/designPatternExtensions/designPattern/Strategy.java b/src/main/java/designPatternExtensions/designPattern/Strategy.java index bae2d63..580a660 100644 --- a/src/main/java/designPatternExtensions/designPattern/Strategy.java +++ b/src/main/java/designPatternExtensions/designPattern/Strategy.java @@ -17,36 +17,9 @@ ObjectNode concreteStrategy = (ObjectNode) design.getSynchronizationContexts().getFirst().getDstObjectHierarchy().getEdge(0).getDestination(); DependencyInversion di = new DependencyInversion( - concreteStrategy, new InterfaceNode(concreteStrategy, "DragonSlayingStrategy")); + concreteStrategy, new InterfaceNode("DragonSlayingStrategy")); design.addDependencyInversion(di); return design; } } - -//public class Strategy implements DesignPattern{ -// -// public DataTransferDesign create() throws IllegalRelationException { -// List srcEdges = new ArrayList<>(); -// List dstEdges = new ArrayList<>(); -// ObjectNode main = new ObjectNode("Main"); -// ObjectNode dragonSlayer = new ObjectNode("DragonSlayer"); -// ObjectNode meleeStrategy = new ObjectNode("MeleeStrategy"); -// ObjectNode data = new ObjectNode("BattleExecute"); -// srcEdges.add(new ReferenceEdge(main, dragonSlayer, "dragonSlayer")); -// dstEdges.add(new ReferenceEdge(main, meleeStrategy, "meleeStrategy", "Integer")); -// List relations = new ArrayList<>(); -// relations.add(new Relation(main, dstEdges, MultiplicityValue.OneToOne)); -// Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); -// DataTransferContext context = new DataTransferContext(relations, transferRelation, data, "battleExecute", PushPullValue.PUSH); -// DataTransferDesign design = new DataTransferDesign(context); -// -// DependencyInversion di = new DependencyInversion( -// meleeStrategy, new InterfaceNode(meleeStrategy, "DragonSlayingStrategy"), dragonSlayer -// ); -// design.addDependencyInversion(di); -// -// return design; -// } -// -//} diff --git a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java index a4f77f2..55af81d 100644 --- a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java +++ b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java @@ -18,7 +18,7 @@ ObjectNode halflingThief = (ObjectNode) dtc.getSrcObjectHierarchy().getEdge(0).getDestination(); ObjectNode concreteMethod = (ObjectNode) dtc.getDstObjectHierarchy().getEdge(0).getDestination(); - InterfaceNode stealingMethod = new InterfaceNode(concreteMethod, "StealingMethod"); + InterfaceNode stealingMethod = new InterfaceNode("StealingMethod"); DependencyInversion di = new DependencyInversion(concreteMethod, stealingMethod); design.addDependencyInversion(di); diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java index 6a7f6f3..1429f59 100644 --- a/src/main/java/designPatternExtensions/designPattern/Visitor.java +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -25,7 +25,7 @@ ObjectNode commander = dtc.getSrcTopObject(); DependencyInversion di = new DependencyInversion( - visitor, new InterfaceNode(visitor, "UnitVisitor"), commander + visitor, new InterfaceNode( "UnitVisitor"), commander ); design.addDependencyInversion(di); diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index d45e22d..38e0eab 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -1,15 +1,12 @@ package generators; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import ast.*; import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; -import designPatternExtensions.PresenterInsertion; import models.dataConstraintModel.MapType; import models.deltaAlgebra.*; import models.dataSynchronizationModel.*; @@ -42,13 +39,19 @@ } // do not change flow : MediatorInsertion -> DependencyInversion for (MediatorInsertion mi: dataSynchronizationDesign.getMediatorInsertions()) { - codebase = weaveMediatorInsertion(codebase, mi); - } - for (PresenterInsertion pi: dataSynchronizationDesign.getPresenterInsertions()) { - codebase = weavePresenterInsertion(codebase, pi); + ObjectNode srcNode, dstNode; + if (mi.getPushPullValue() == TransferStyle.PUSH) { + srcNode = mi.getSrc(); + dstNode = mi.getDst(); + } else { + srcNode = mi.getDst(); + dstNode = mi.getSrc(); + } + codebase = MediatorInsertionWeaver.weave(codebase, mi, srcNode, dstNode); + } for (DependencyInversion di: dataSynchronizationDesign.getDependencyInversions()) { - codebase = weaveDependencyInversion(codebase, di); + codebase = DependencyInversionWeaver.weave(codebase, di); } return codebase; } @@ -424,590 +427,7 @@ return codebase; } - - public static Codebase weaveMediatorInsertion(Codebase codebase, MediatorInsertion mediatorInsertion) { - TransferStyle style = mediatorInsertion.getPushPullValue(); - ObjectNode srcNode, dstNode; - if (style == TransferStyle.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()); - String mediatorName = toComponentName(mediatorNode.getName()); - String mediatorFieldName = toVariableName(mediatorName); - String dstFieldName = toVariableName(dstName); - - models.algebra.Type dstType = codebase.getComponentType(dstName); - - TypeDeclaration mediatorClass = createClass(codebase, mediatorName); - models.algebra.Type mediatorType = codebase.getComponentType(mediatorName); - 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); - 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)); - } - - 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)); - } - } - } - - 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 { - srcFieldToReplace.setType(mediatorType); - srcFieldToReplace.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)); - } - - // 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); - } - } - } - } - - List methodsToMove = new ArrayList<>(); - for (MethodDeclaration method: srcClass.getMethods()) { - if (method.isConstructor()) continue; - if (methodReferencesField(method, oldFieldName)) { - methodsToMove.add(method); - } - } - for (MethodDeclaration method: methodsToMove) { - srcClass.removeMethod(method); - List danglingFields = new ArrayList<>(); - if (method.getBody() != null) { - for (Statement statement: method.getBody().getStatements2()) { - collectDanglingValueFields(statement, srcClass, mediatorClass, oldFieldName, danglingFields); - } - } - Set danglingFieldNames = new HashSet<>(); - for (FieldDeclaration extra: danglingFields) { - danglingFieldNames.add(extra.getName()); - if (!hasParameterNamed(method, extra.getName())) { - method.addParameter(new VariableDeclaration(extra.getType(), extra.getName())); - } - } - if (!danglingFieldNames.isEmpty() && method.getBody() != null) { - for (Statement statement: method.getBody().getStatements2()) { - rewriteDanglingFieldsAsParams(statement, danglingFieldNames); - } - } - - 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()) { - if (danglingFieldNames.contains(param.getName())) { - args.add(new FieldAccess(param.getName())); - } else { - 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; - } - - private static void replaceFieldNameInStatement(Statement statement, String oldName, String newName) { - if (statement instanceof ExpressionStatement) { - replaceFieldNameInExpression(((ExpressionStatement) statement).getExpression(), oldName, newName); - } - } - - private static void replaceFieldNameInExpression(Expression expr, String oldName, String newName) { - if (expr instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) expr; - if (mi.getReceiver() instanceof FieldAccess) { - FieldAccess fa = (FieldAccess) mi.getReceiver(); - if (fa.getFieldName().equals(oldName)) { - fa.setFieldName(newName); - } - } - for (Expression arg: mi.getArguments()) { - replaceFieldNameInExpression(arg, oldName, newName); - } - } else if (expr instanceof Assignment) { - Assignment assignment = (Assignment) expr; - if (assignment.getLeft() instanceof FieldAccess) { - FieldAccess fa = (FieldAccess) assignment.getLeft(); - if (fa.getFieldName().equals(oldName)) { - fa.setFieldName(newName); - } - } - if (assignment.getRight() instanceof Variable) { - Variable var = (Variable) assignment.getRight(); - if (var.getName().equals(oldName)) { - assignment.setRight(new Variable(newName)); - } - } - replaceFieldNameInExpression(assignment.getLeft(), oldName, newName); - replaceFieldNameInExpression(assignment.getRight(), oldName, newName); - } - } - - - public static Codebase weavePresenterInsertion(Codebase codebase, PresenterInsertion presenterInsertion) { - ObjectNode srcNode = presenterInsertion.getSrc(); - ObjectNode dstNode = presenterInsertion.getDst(); - ObjectNode presenterNode = presenterInsertion.getPresenter(); - String srcName = toComponentName(srcNode.getName()); - String dstName = toComponentName(dstNode.getName()); - String presenterName = toComponentName(presenterNode.getName()); - String srcFieldName = toVariableName(srcName); - String dstFieldName = toVariableName(dstName); - - models.algebra.Type srcType = codebase.getComponentType(srcName); - models.algebra.Type dstType = codebase.getComponentType(dstName); - - TypeDeclaration presenterClass = createClass(codebase, presenterName); - - FieldDeclaration srcField = createField(presenterClass, srcFieldName, srcType); - FieldDeclaration dstField = createField(presenterClass, dstFieldName, dstType); - - MethodDeclaration constructor = createConstructor(presenterClass); - - if (!hasParameterNamed(constructor, srcFieldName)) { - constructor.addParameter(new VariableDeclaration(srcType, srcFieldName)); - constructor.addUniqueStatement(new ExpressionStatement( - new Assignment(new FieldAccess(new ThisExpression(), srcField.getName()), new Variable(srcFieldName)))); - } - if (!hasParameterNamed(constructor, dstFieldName)) { - constructor.addParameter(new VariableDeclaration(dstType, dstFieldName)); - constructor.addUniqueStatement(new ExpressionStatement( - new Assignment(new FieldAccess(new ThisExpression(), dstField.getName()), new Variable(dstFieldName)))); - } - - TypeDeclaration srcClass = createClass(codebase, srcName); - TypeDeclaration dstClass = createClass(codebase, dstName); - - List getters = new ArrayList<>(); - List boundProperties = new ArrayList<>(); - - for (MethodDeclaration getter: srcClass.getMethods()) { - if (getter.isConstructor() || getter.getReturnType() == null) continue; - if (!getter.getName().startsWith(getterPrefix)) continue; - getters.add(getter); - boundProperties.add(getter.getName().substring(getterPrefix.length())); - } - - for (FieldDeclaration field: srcClass.getFields()) { - if (field.getType() == null) continue; - if (field.getType().getTypeName().equals(dstType.getTypeName())) continue; - - String propertyName = toComponentName(field.getType().getTypeName()); - if (boundProperties.contains(propertyName)) continue; - - MethodDeclaration newGetter = createMethod(srcClass, getterPrefix + propertyName); - if (newGetter.getReturnType() == null) { - ReturnStatement returnStatement = new ReturnStatement(); - returnStatement.setExpression(new FieldAccess(new ThisExpression(), field.getName())); - newGetter.addUniqueStatement(returnStatement); - newGetter.setReturnType(field.getType()); - } - getters.add(newGetter); - boundProperties.add(propertyName); - } - - for (MethodDeclaration getter: getters) { - String propertyName = getter.getName().substring(getterPrefix.length()); - String setterName = setterPrefix + propertyName; - - MethodDeclaration setter = createMethod(dstClass, setterName); - if (setter.getReturnType() == null && (setter.getParameters() == null || setter.getParameters().isEmpty())) { - models.algebra.Type propertyType = getter.getReturnType(); - VariableDeclaration setterParam = new VariableDeclaration(propertyType, toVariableName(propertyName)); - setter.addParameter(setterParam); - FieldDeclaration propertyField = createField(dstClass, toVariableName(propertyName), propertyType); - setter.addUniqueStatement(new ExpressionStatement( - new Assignment(new FieldAccess(new ThisExpression(), propertyField.getName()), new Variable(toVariableName(propertyName))))); - } - - String presenterMethodName = updateMethodPrefix + dstName + propertyName; - - MethodDeclaration coordinator = createMethod(presenterClass, presenterMethodName); - if (coordinator.getBody() == null || coordinator.getBody().getStatements2().isEmpty()) { - List getterArgs = new ArrayList<>(); - MethodInvocation callGetter = new MethodInvocation(new FieldAccess(srcField.getName()), getter.getName(), getterArgs); - List setterArgs = new ArrayList<>(); - setterArgs.add(callGetter); - MethodInvocation callSetter = new MethodInvocation(new FieldAccess(dstField.getName()), setter.getName(), setterArgs); - coordinator.addUniqueStatement(new ExpressionStatement(callSetter)); - } - } - - if (presenterInsertion.getRemoveDirectDependency()) { - if (presenterInsertion.getPushPullValue() == TransferStyle.PUSH) { - removeDirectDependency(srcClass, dstType); - } else { - removeDirectDependency(dstClass, srcType); - } - } - - return codebase; - } - - private static boolean hasParameterNamed(MethodDeclaration method, String name) { - if (method.getParameters() == null) return false; - for (VariableDeclaration param: method.getParameters()) { - if (param.getName().equals(name)) return true; - } - return false; - } - - private static void removeDirectDependency(TypeDeclaration typeDecl, models.algebra.Type otherType) { - List fieldsToRemove = new ArrayList<>(); - for (FieldDeclaration field: typeDecl.getFields()) { - if (field.getType() != null && field.getType().getTypeName().equals(otherType.getTypeName())) { - fieldsToRemove.add(field); - } - } - if (fieldsToRemove.isEmpty()) return; - - List methodsToRemove = new ArrayList<>(); - for (MethodDeclaration method: typeDecl.getMethods()) { - if (method.isConstructor()) continue; - for (FieldDeclaration field: fieldsToRemove) { - if (methodReferencesField(method, field.getName())) { - methodsToRemove.add(method); - break; - } - } - } - for (MethodDeclaration method: methodsToRemove) { - typeDecl.removeMethod(method); - } - for (FieldDeclaration field: fieldsToRemove) { - typeDecl.removeField(field); - } - } - - private static boolean methodReferencesField(MethodDeclaration method, String fieldName) { - if (method.getBody() == null) return false; - for (Statement statement: method.getBody().getStatements2()) { - if (statementReferencesField(statement, fieldName)) return true; - } - return false; - } - - private static boolean statementReferencesField(Statement statement, String fieldName) { - if (statement instanceof ExpressionStatement) { - return expressionReferencesField(((ExpressionStatement) statement).getExpression(), fieldName); - } 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; - } - - private static void collectDanglingValueFields(Statement statement, TypeDeclaration srcClass, - TypeDeclaration mediatorClass, String movedFieldName, List out) { - if (statement instanceof ExpressionStatement) { - walkExpressionForDanglingFields(((ExpressionStatement) statement).getExpression(), false, srcClass, mediatorClass, movedFieldName, out); - } else if (statement instanceof ReturnStatement) { - walkExpressionForDanglingFields(((ReturnStatement) statement).getExpression(), true, srcClass, mediatorClass, movedFieldName, out); - } else if (statement instanceof EnhancedForStatement) { - EnhancedForStatement forStatement = (EnhancedForStatement) statement; - walkExpressionForDanglingFields(forStatement.getExpression(), false, srcClass, mediatorClass, movedFieldName, out); - Statement body = forStatement.getBody(); - if (body instanceof Block) { - for (Statement inner: ((Block) body).getStatements2()) { - collectDanglingValueFields(inner, srcClass, mediatorClass, movedFieldName, out); - } - } else if (body != null) { - collectDanglingValueFields(body, srcClass, mediatorClass, movedFieldName, out); - } - } - } - - private static void walkExpressionForDanglingFields(Expression expr, boolean asValue, TypeDeclaration srcClass, - TypeDeclaration mediatorClass, String movedFieldName, List out) { - if (expr == null) return; - if (expr instanceof FieldAccess) { - if (!asValue) return; - String name = ((FieldAccess) expr).getFieldName(); - if (name.equals(movedFieldName)) return; - for (FieldDeclaration f: mediatorClass.getFields()) if (f.getName().equals(name)) return; - for (FieldDeclaration f: out) if (f.getName().equals(name)) return; - for (FieldDeclaration f: srcClass.getFields()) { - if (f.getName().equals(name)) { out.add(f); return; } - } - } else if (expr instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) expr; - walkExpressionForDanglingFields(mi.getReceiver(), false, srcClass, mediatorClass, movedFieldName, out); - if (mi.getArguments() != null) { - for (Expression arg: mi.getArguments()) { - walkExpressionForDanglingFields(arg, true, srcClass, mediatorClass, movedFieldName, out); - } - } - } else if (expr instanceof Assignment) { - Assignment assignment = (Assignment) expr; - walkExpressionForDanglingFields(assignment.getLeft(), false, srcClass, mediatorClass, movedFieldName, out); - walkExpressionForDanglingFields(assignment.getRight(), true, srcClass, mediatorClass, movedFieldName, out); - } - } - - private static void rewriteDanglingFieldsAsParams(Statement statement, Set fieldNames) { - if (statement instanceof ExpressionStatement) { - rewriteExpressionValues(((ExpressionStatement) statement).getExpression(), false, fieldNames); - } else if (statement instanceof ReturnStatement) { - ReturnStatement rs = (ReturnStatement) statement; - Expression expr = rs.getExpression(); - if (expr instanceof FieldAccess && fieldNames.contains(((FieldAccess) expr).getFieldName())) { - rs.setExpression(new Variable(((FieldAccess) expr).getFieldName())); - } else { - rewriteExpressionValues(expr, true, fieldNames); - } - } else if (statement instanceof EnhancedForStatement) { - EnhancedForStatement forStatement = (EnhancedForStatement) statement; - Statement body = forStatement.getBody(); - if (body instanceof Block) { - for (Statement inner: ((Block) body).getStatements2()) { - rewriteDanglingFieldsAsParams(inner, fieldNames); - } - } else if (body != null) { - rewriteDanglingFieldsAsParams(body, fieldNames); - } - } - } - - private static void rewriteExpressionValues(Expression expr, boolean asValue, Set fieldNames) { - if (expr instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) expr; - rewriteExpressionValues(mi.getReceiver(), false, fieldNames); - if (mi.getArguments() != null) { - List args = mi.getArguments(); - for (int i = 0; i < args.size(); i++) { - Expression arg = args.get(i); - if (arg instanceof FieldAccess && fieldNames.contains(((FieldAccess) arg).getFieldName())) { - args.set(i, new Variable(((FieldAccess) arg).getFieldName())); - } else { - rewriteExpressionValues(arg, true, fieldNames); - } - } - } - } else if (expr instanceof Assignment) { - Assignment assignment = (Assignment) expr; - rewriteExpressionValues(assignment.getLeft(), false, fieldNames); - Expression right = assignment.getRight(); - if (right instanceof FieldAccess && fieldNames.contains(((FieldAccess) right).getFieldName())) { - assignment.setRight(new Variable(((FieldAccess) right).getFieldName())); - } else { - rewriteExpressionValues(right, true, fieldNames); - } - } - } - - private static boolean expressionReferencesField(Expression expr, String fieldName) { - if (expr == null) return false; - if (expr instanceof FieldAccess) { - FieldAccess fa = (FieldAccess) expr; - if (fieldName.equals(fa.getFieldName())) return true; - } - if (expr instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) expr; - if (expressionReferencesField(mi.getReceiver(), fieldName)) return true; - if (mi.getArguments() != null) { - for (Expression arg: mi.getArguments()) { - if (expressionReferencesField(arg, fieldName)) return true; - } - } - } else if (expr instanceof Assignment) { - Assignment assignment = (Assignment) expr; - if (expressionReferencesField(assignment.getLeft(), fieldName)) return true; - if (expressionReferencesField(assignment.getRight(), fieldName)) return true; - } - return false; - } - - public static Codebase weaveDependencyInversion(Codebase codebase, DependencyInversion dependencyInversion) { - ObjectNode dstNode = dependencyInversion.getDst(); - InterfaceNode interfaceNode = dependencyInversion.getInterfaceNode(); - String dstName = toComponentName(dstNode.getName()); - String interfaceName = toComponentName(interfaceNode.getName()); - - //print -> public interface interfaceName { ... } - InterfaceDeclaration interfaceDeclaration = DependencyInversionWeaver.createInterface(codebase, interfaceName); - - TypeDeclaration dstClass = createClass(codebase, dstName); - for (MethodDeclaration method: dstClass.getMethods()) { - if (!method.isConstructor()) { - boolean alreadyExists = interfaceDeclaration.getMethods().stream() - .anyMatch(m -> m.getName().equals(method.getName())); - if (!alreadyExists) { - interfaceDeclaration.addMethod(method); - } - } - } - - // public class "dstClass" implements "interfaceName" - if (!dstClass.getImplementsInterfaces().contains(interfaceName)) { - dstClass.addImplementsInterface(interfaceName); - } - - models.algebra.Type interfaceType = codebase.getComponentType(interfaceName); - models.algebra.Type dstType = codebase.getComponentType(dstName); - - // // Change dst class method return types - DependencyInversionWeaver.replaceDepedencyInClass(codebase, dstClass, dstType, interfaceType, interfaceName); - - if (dependencyInversion.getTargetSrc() != null) { - // Traverse only the specified target class - String targetSrcName = toComponentName(dependencyInversion.getTargetSrc().getName()); - TypeDeclaration srcClass = createClass(codebase, targetSrcName); - DependencyInversionWeaver.replaceDepedencyInClass(codebase, srcClass, dstType, interfaceType, interfaceName); - } else { - // Traverse all dependent classes(srcClass) in Codebase - for (CompilationUnit cu: codebase.getCompilationUnits()) { - TypeDeclaration srcClass = cu.types().getFirst(); - if (srcClass.getTypeName().equals(dstName)) continue; - DependencyInversionWeaver.replaceDepedencyInClass(codebase, srcClass, dstType, interfaceType, interfaceName); - } - } - return codebase; - } - - private static TypeDeclaration createClass(Codebase codebase, String name) { + public static TypeDeclaration createClass(Codebase codebase, String name) { if (codebase.getCompilationUnit(name) != null) return codebase.getCompilationUnit(name).types().getFirst(); TypeDeclaration type = new TypeDeclaration(name); CompilationUnit compilationUnit = new CompilationUnit(type); @@ -1015,7 +435,7 @@ return type; } - private static MethodDeclaration createMethod(TypeDeclaration type, String name) { + public static MethodDeclaration createMethod(TypeDeclaration type, String name) { for (MethodDeclaration method: type.getMethods()) { if (method.getName().equals(name)) return method; } @@ -1024,7 +444,7 @@ return method; } - private static MethodDeclaration createConstructor(TypeDeclaration type) { + public static MethodDeclaration createConstructor(TypeDeclaration type) { for (MethodDeclaration method: type.getMethods()) { if (method.getName().equals(type.getTypeName())) return method; } @@ -1033,7 +453,7 @@ return method; } - private static FieldDeclaration createField(TypeDeclaration type, String fieldName, models.algebra.Type fieldType) { + public static FieldDeclaration createField(TypeDeclaration type, String fieldName, models.algebra.Type fieldType) { for (FieldDeclaration field: type.getFields()) { if (field.getName().equals(fieldName)) return field; } diff --git a/src/main/java/generators/DependencyInversionWeaver.java b/src/main/java/generators/DependencyInversionWeaver.java index 1b36c7a..ebe7355 100644 --- a/src/main/java/generators/DependencyInversionWeaver.java +++ b/src/main/java/generators/DependencyInversionWeaver.java @@ -1,11 +1,61 @@ package generators; import ast.*; +import designPatternExtensions.DependencyInversion; +import designPatternExtensions.InterfaceNode; import models.dataConstraintModel.MapType; +import models.deltaAlgebra.ObjectNode; public class DependencyInversionWeaver { - static void replaceDepedencyInClass(Codebase codebase, TypeDeclaration srcClass, models.algebra.Type dstType, models.algebra.Type interfaceType, String interfaceName) { + static Codebase weave(Codebase codebase, DependencyInversion dependencyInversion) { + ObjectNode dstNode = dependencyInversion.getDst(); + InterfaceNode interfaceNode = dependencyInversion.getInterfaceNode(); + String dstName = ASTGenerator.toComponentName(dstNode.getName()); + String interfaceName = ASTGenerator.toComponentName(interfaceNode.getName()); + + //print -> public interface interfaceName { ... } + InterfaceDeclaration interfaceDeclaration = createInterface(codebase, interfaceName); + + TypeDeclaration dstClass = ASTGenerator.createClass(codebase, dstName); + for (MethodDeclaration method: dstClass.getMethods()) { + if (!method.isConstructor()) { + boolean alreadyExists = interfaceDeclaration.getMethods().stream() + .anyMatch(m -> m.getName().equals(method.getName())); + if (!alreadyExists) { + interfaceDeclaration.addMethod(method); + } + } + } + + // public class "dstClass" implements "interfaceName" + if (!dstClass.getImplementsInterfaces().contains(interfaceName)) { + dstClass.addImplementsInterface(interfaceName); + } + + models.algebra.Type interfaceType = codebase.getComponentType(interfaceName); + models.algebra.Type dstType = codebase.getComponentType(dstName); + + // Change dst class method return types + replaceDependencyInClass(codebase, dstClass, dstType, interfaceType, interfaceName); + + if (dependencyInversion.getTargetSrc() != null) { + // Traverse only the specified target class + String targetSrcName = ASTGenerator.toComponentName(dependencyInversion.getTargetSrc().getName()); + TypeDeclaration srcClass = ASTGenerator.createClass(codebase, targetSrcName); + replaceDependencyInClass(codebase, srcClass, dstType, interfaceType, interfaceName); + } else { + // Traverse all dependent classes(srcClass) in Codebase + for (CompilationUnit cu: codebase.getCompilationUnits()) { + TypeDeclaration srcClass = cu.types().getFirst(); + if (srcClass.getTypeName().equals(dstName)) continue; + replaceDependencyInClass(codebase, srcClass, dstType, interfaceType, interfaceName); + } + } + return codebase; + } + + static void replaceDependencyInClass(Codebase codebase, TypeDeclaration srcClass, models.algebra.Type dstType, models.algebra.Type interfaceType, String interfaceName) { for (FieldDeclaration field: srcClass.getFields()) { if (field.getType().equals(dstType)) { // private Companies companies → private ICompanies companies @@ -55,5 +105,4 @@ codebase.addInterfaceCompilationUnit(name, compilationUnit); return interfaceDeclaration; } - } \ No newline at end of file diff --git a/src/main/java/generators/MediatorInsertionWeaver.java b/src/main/java/generators/MediatorInsertionWeaver.java new file mode 100644 index 0000000..5921d84 --- /dev/null +++ b/src/main/java/generators/MediatorInsertionWeaver.java @@ -0,0 +1,459 @@ +package generators; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import ast.*; +import designPatternExtensions.MediatorInsertion; +import models.dataConstraintModel.MapType; +import models.deltaAlgebra.*; + +public class MediatorInsertionWeaver { + + static class MediatorContext { + final Codebase codebase; + final String srcName, dstName, mediatorName; + String mediatorFieldName; + final String dstFieldName; + final models.algebra.Type dstType, mediatorType; + final TypeDeclaration srcClass, dstClass, mediatorClass; + + boolean toMany; + FieldDeclaration srcDstMapField; + FieldDeclaration dstField; + FieldDeclaration srcFieldToReplace; + String oldFieldName; + + MediatorContext(Codebase codebase, ObjectNode srcNode, ObjectNode dstNode, ObjectNode mediatorNode) { + this.codebase = codebase; + this.srcName = ASTGenerator.toComponentName(srcNode.getName()); + this.dstName = ASTGenerator.toComponentName(dstNode.getName()); + this.mediatorName = ASTGenerator.toComponentName(mediatorNode.getName()); + this.mediatorFieldName = ASTGenerator.toVariableName(mediatorName); + this.dstFieldName = ASTGenerator.toVariableName(dstName); + this.dstType = codebase.getComponentType(dstName); + + this.mediatorClass = ASTGenerator.createClass(codebase, mediatorName); + this.mediatorType = codebase.getComponentType(mediatorName); + this.srcClass = ASTGenerator.createClass(codebase, srcName); + this.dstClass = ASTGenerator.createClass(codebase, dstName); + } + } + + static Codebase weave(Codebase codebase, MediatorInsertion mediatorInsertion, ObjectNode srcNode, ObjectNode dstNode) { + MediatorContext mediatorContext = new MediatorContext(codebase, srcNode, dstNode, mediatorInsertion.getMediator()); + + determineMediatorField(mediatorContext); + addMediatorConstructor(mediatorContext); + addMediatorDelegationMethods(mediatorContext); + findSrcFieldToReplace(mediatorContext); + if (mediatorContext.srcFieldToReplace != null) { + replaceSrcDependencyWithMediator(mediatorContext); + moveSrcMethodsToMediator(mediatorContext); + replaceRemainingFieldReferences(mediatorContext); + } + return codebase; + } + + static void determineMediatorField(MediatorContext mediatorContext) { + mediatorContext.srcDstMapField = null; + for (FieldDeclaration field: mediatorContext.srcClass.getFields()) { + if (field.getType() instanceof MapType) { + MapType mapType = (MapType) field.getType(); + if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(mediatorContext.dstType.getTypeName())) { + mediatorContext.srcDstMapField = field; + break; + } + } + } + mediatorContext.toMany = mediatorContext.srcDstMapField != null; + + if (mediatorContext.toMany) { + MapType srcMapType = (MapType) mediatorContext.srcDstMapField.getType(); + FieldDeclaration existingMediatorMapField = null; + for (FieldDeclaration field: mediatorContext.mediatorClass.getFields()) { + if (field.getType() instanceof MapType) { + MapType mapType = (MapType) field.getType(); + if (mapType.getValueType() != null && mapType.getValueType().getTypeName().equals(mediatorContext.dstType.getTypeName()) + && mapType.getKeyType().getTypeName().equals(srcMapType.getKeyType().getTypeName())) { + existingMediatorMapField = field; + break; + } + } + } + mediatorContext.dstField = (existingMediatorMapField != null) + ? existingMediatorMapField + : ASTGenerator.createField(mediatorContext.mediatorClass, mediatorContext.srcDstMapField.getName(), srcMapType); + } else { + mediatorContext.dstField = ASTGenerator.createField(mediatorContext.mediatorClass, mediatorContext.dstFieldName, mediatorContext.dstType); + } + } + + static void addMediatorConstructor(MediatorContext mediatorContext) { + MethodDeclaration constructor = ASTGenerator.createConstructor(mediatorContext.mediatorClass); + if (!hasParameterNamed(constructor, mediatorContext.dstField.getName())) { + VariableDeclaration dstParam = new VariableDeclaration(mediatorContext.dstField.getType(), mediatorContext.dstField.getName()); + constructor.addParameter(dstParam); + FieldAccess dstFieldAccess = new FieldAccess(new ThisExpression(), mediatorContext.dstField.getName()); + Assignment dstAssignment = new Assignment(dstFieldAccess, new Variable(mediatorContext.dstField.getName())); + constructor.addUniqueStatement(new ExpressionStatement(dstAssignment)); + } + } + + static void addMediatorDelegationMethods(MediatorContext mediatorContext) { + if (mediatorContext.toMany) return; + for (MethodDeclaration method: mediatorContext.dstClass.getMethods()) { + if (method.isConstructor()) continue; + MethodDeclaration delegateMethod = ASTGenerator.createMethod(mediatorContext.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())); + } + } + MethodInvocation callDst = new MethodInvocation(new FieldAccess(mediatorContext.dstField.getName()), method.getName(), args); + if (method.getReturnType() != null) { + ReturnStatement returnStatement = new ReturnStatement(); + returnStatement.setExpression(callDst); + delegateMethod.addUniqueStatement(returnStatement); + } else { + delegateMethod.addUniqueStatement(new ExpressionStatement(callDst)); + } + } + } + + static void findSrcFieldToReplace(MediatorContext mediatorContext) { + if (mediatorContext.toMany) { + mediatorContext.srcFieldToReplace = mediatorContext.srcDstMapField; + return; + } + for (FieldDeclaration field: mediatorContext.srcClass.getFields()) { + if (field.getType() != null && field.getType().getTypeName().equals(mediatorContext.dstType.getTypeName())) { + mediatorContext.srcFieldToReplace = field; + return; + } + } + mediatorContext.srcFieldToReplace = null; + } + + static void replaceSrcDependencyWithMediator(MediatorContext mediatorContext) { + FieldDeclaration existingMediatorField = null; + for (FieldDeclaration field: mediatorContext.srcClass.getFields()) { + if (field != mediatorContext.srcFieldToReplace && field.getType() != null + && field.getType().getTypeName().equals(mediatorContext.mediatorType.getTypeName())) { + existingMediatorField = field; + break; + } + } + mediatorContext.oldFieldName = mediatorContext.srcFieldToReplace.getName(); + if (existingMediatorField != null) { + mediatorContext.srcClass.removeField(mediatorContext.srcFieldToReplace); + mediatorContext.mediatorFieldName = existingMediatorField.getName(); + } else { + mediatorContext.srcFieldToReplace.setType(mediatorContext.mediatorType); + mediatorContext.srcFieldToReplace.setName(mediatorContext.mediatorFieldName); + } + + MethodDeclaration mediatorSetter = ASTGenerator.createMethod(mediatorContext.srcClass, ASTGenerator.setterPrefix + mediatorContext.mediatorName); + if (mediatorSetter.getParameters() == null || mediatorSetter.getParameters().isEmpty()) { + VariableDeclaration mediatorParam = new VariableDeclaration(mediatorContext.mediatorType, mediatorContext.mediatorFieldName); + mediatorSetter.addParameter(mediatorParam); + FieldAccess mediatorFieldAccess = new FieldAccess(new ThisExpression(), mediatorContext.mediatorFieldName); + Assignment mediatorAssignment = new Assignment(mediatorFieldAccess, new Variable(mediatorContext.mediatorFieldName)); + mediatorSetter.addUniqueStatement(new ExpressionStatement(mediatorAssignment)); + } + + for (MethodDeclaration method: mediatorContext.srcClass.getMethods()) { + if (method.isConstructor() && method.getParameters() != null) { + for (VariableDeclaration param: method.getParameters()) { + if (param.getType() != null && param.getType().getTypeName().equals(mediatorContext.dstType.getTypeName())) { + param.setType(mediatorContext.mediatorType); + param.setName(mediatorContext.mediatorFieldName); + } + } + } + } + } + + static void moveSrcMethodsToMediator(MediatorContext mediatorContext) { + List methodsToMove = new ArrayList<>(); + for (MethodDeclaration method: mediatorContext.srcClass.getMethods()) { + if (method.isConstructor()) continue; + if (methodReferencesField(method, mediatorContext.oldFieldName)) { + methodsToMove.add(method); + } + } + for (MethodDeclaration method: methodsToMove) { + moveSingleMethodToMediator(mediatorContext, method); + } + } + + private static void moveSingleMethodToMediator(MediatorContext mediatorContext, MethodDeclaration method) { + mediatorContext.srcClass.removeMethod(method); + List danglingFields = new ArrayList<>(); + if (method.getBody() != null) { + for (Statement statement: method.getBody().getStatements2()) { + collectDanglingValueFields(statement, mediatorContext.srcClass, mediatorContext.mediatorClass, mediatorContext.oldFieldName, danglingFields); + } + } + Set danglingFieldNames = new HashSet<>(); + for (FieldDeclaration extra: danglingFields) { + danglingFieldNames.add(extra.getName()); + if (!hasParameterNamed(method, extra.getName())) { + method.addParameter(new VariableDeclaration(extra.getType(), extra.getName())); + } + } + if (!danglingFieldNames.isEmpty() && method.getBody() != null) { + for (Statement statement: method.getBody().getStatements2()) { + rewriteDanglingFieldsAsParams(statement, danglingFieldNames); + } + } + + MethodDeclaration existingOnMediator = null; + for (MethodDeclaration existing: mediatorContext.mediatorClass.getMethods()) { + if (existing.getName().equals(method.getName())) { existingOnMediator = existing; break; } + } + if (existingOnMediator == null) { + mediatorContext.mediatorClass.addMethod(method); + } + + createSrcStubForMovedMethod(mediatorContext, method, danglingFieldNames); + } + + private static void createSrcStubForMovedMethod(MediatorContext mediatorContext, MethodDeclaration method, Set danglingFieldNames) { + MethodDeclaration stub = ASTGenerator.createMethod(mediatorContext.srcClass, method.getName()); + stub.setReturnType(method.getReturnType()); + List args = new ArrayList<>(); + if (method.getParameters() != null) { + for (VariableDeclaration param: method.getParameters()) { + if (danglingFieldNames.contains(param.getName())) { + args.add(new FieldAccess(param.getName())); + } else { + stub.addParameter(param); + args.add(new Variable(param.getName())); + } + } + } + MethodInvocation callMediator = new MethodInvocation(new FieldAccess(mediatorContext.mediatorFieldName), method.getName(), args); + if (method.getReturnType() != null) { + ReturnStatement returnStatement = new ReturnStatement(); + returnStatement.setExpression(callMediator); + stub.addUniqueStatement(returnStatement); + } else { + stub.addUniqueStatement(new ExpressionStatement(callMediator)); + } + } + + static void replaceRemainingFieldReferences(MediatorContext mediatorContext) { + for (MethodDeclaration method: mediatorContext.srcClass.getMethods()) { + if (method.getBody() == null) continue; + for (Statement statement: method.getBody().getStatements2()) { + replaceFieldNameInStatement(statement, mediatorContext.oldFieldName, mediatorContext.mediatorFieldName); + } + } + } + + //================================================================================== + // Field replacement, reference check, and reference cleanup + //================================================================================== + + private static void replaceFieldNameInStatement(Statement statement, String oldName, String newName) { + if (statement instanceof ExpressionStatement) { + replaceFieldNameInExpression(((ExpressionStatement) statement).getExpression(), oldName, newName); + } + } + + private static void replaceFieldNameInExpression(Expression expr, String oldName, String newName) { + if (expr instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation) expr; + if (mi.getReceiver() instanceof FieldAccess) { + FieldAccess fa = (FieldAccess) mi.getReceiver(); + if (fa.getFieldName().equals(oldName)) { + fa.setFieldName(newName); + } + } + for (Expression arg: mi.getArguments()) { + replaceFieldNameInExpression(arg, oldName, newName); + } + } else if (expr instanceof Assignment) { + Assignment assignment = (Assignment) expr; + if (assignment.getLeft() instanceof FieldAccess) { + FieldAccess fa = (FieldAccess) assignment.getLeft(); + if (fa.getFieldName().equals(oldName)) { + fa.setFieldName(newName); + } + } + if (assignment.getRight() instanceof Variable) { + Variable var = (Variable) assignment.getRight(); + if (var.getName().equals(oldName)) { + assignment.setRight(new Variable(newName)); + } + } + replaceFieldNameInExpression(assignment.getLeft(), oldName, newName); + replaceFieldNameInExpression(assignment.getRight(), oldName, newName); + } + } + + private static boolean methodReferencesField(MethodDeclaration method, String fieldName) { + if (method.getBody() == null) return false; + for (Statement statement: method.getBody().getStatements2()) { + if (statementReferencesField(statement, fieldName)) return true; + } + return false; + } + + private static boolean statementReferencesField(Statement statement, String fieldName) { + if (statement instanceof ExpressionStatement) { + return expressionReferencesField(((ExpressionStatement) statement).getExpression(), fieldName); + } 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; + } + + private static boolean expressionReferencesField(Expression expr, String fieldName) { + if (expr == null) return false; + if (expr instanceof FieldAccess) { + FieldAccess fa = (FieldAccess) expr; + if (fieldName.equals(fa.getFieldName())) return true; + } + if (expr instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation) expr; + if (expressionReferencesField(mi.getReceiver(), fieldName)) return true; + if (mi.getArguments() != null) { + for (Expression arg: mi.getArguments()) { + if (expressionReferencesField(arg, fieldName)) return true; + } + } + } else if (expr instanceof Assignment) { + Assignment assignment = (Assignment) expr; + if (expressionReferencesField(assignment.getLeft(), fieldName)) return true; + if (expressionReferencesField(assignment.getRight(), fieldName)) return true; + } + return false; + } + + private static void collectDanglingValueFields(Statement statement, TypeDeclaration srcClass, + TypeDeclaration mediatorClass, String movedFieldName, List out) { + if (statement instanceof ExpressionStatement) { + walkExpressionForDanglingFields(((ExpressionStatement) statement).getExpression(), false, srcClass, mediatorClass, movedFieldName, out); + } else if (statement instanceof ReturnStatement) { + walkExpressionForDanglingFields(((ReturnStatement) statement).getExpression(), true, srcClass, mediatorClass, movedFieldName, out); + } else if (statement instanceof EnhancedForStatement) { + EnhancedForStatement forStatement = (EnhancedForStatement) statement; + walkExpressionForDanglingFields(forStatement.getExpression(), false, srcClass, mediatorClass, movedFieldName, out); + Statement body = forStatement.getBody(); + if (body instanceof Block) { + for (Statement inner: ((Block) body).getStatements2()) { + collectDanglingValueFields(inner, srcClass, mediatorClass, movedFieldName, out); + } + } else if (body != null) { + collectDanglingValueFields(body, srcClass, mediatorClass, movedFieldName, out); + } + } + } + + private static void walkExpressionForDanglingFields(Expression expr, boolean asValue, TypeDeclaration srcClass, + TypeDeclaration mediatorClass, String movedFieldName, List out) { + if (expr == null) return; + if (expr instanceof FieldAccess) { + if (!asValue) return; + String name = ((FieldAccess) expr).getFieldName(); + if (name.equals(movedFieldName)) return; + for (FieldDeclaration f: mediatorClass.getFields()) if (f.getName().equals(name)) return; + for (FieldDeclaration f: out) if (f.getName().equals(name)) return; + for (FieldDeclaration f: srcClass.getFields()) { + if (f.getName().equals(name)) { out.add(f); return; } + } + } else if (expr instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation) expr; + walkExpressionForDanglingFields(mi.getReceiver(), false, srcClass, mediatorClass, movedFieldName, out); + if (mi.getArguments() != null) { + for (Expression arg: mi.getArguments()) { + walkExpressionForDanglingFields(arg, true, srcClass, mediatorClass, movedFieldName, out); + } + } + } else if (expr instanceof Assignment) { + Assignment assignment = (Assignment) expr; + walkExpressionForDanglingFields(assignment.getLeft(), false, srcClass, mediatorClass, movedFieldName, out); + walkExpressionForDanglingFields(assignment.getRight(), true, srcClass, mediatorClass, movedFieldName, out); + } + } + + private static void rewriteDanglingFieldsAsParams(Statement statement, Set fieldNames) { + if (statement instanceof ExpressionStatement) { + rewriteExpressionValues(((ExpressionStatement) statement).getExpression(), false, fieldNames); + } else if (statement instanceof ReturnStatement) { + ReturnStatement rs = (ReturnStatement) statement; + Expression expr = rs.getExpression(); + if (expr instanceof FieldAccess && fieldNames.contains(((FieldAccess) expr).getFieldName())) { + rs.setExpression(new Variable(((FieldAccess) expr).getFieldName())); + } else { + rewriteExpressionValues(expr, true, fieldNames); + } + } else if (statement instanceof EnhancedForStatement) { + EnhancedForStatement forStatement = (EnhancedForStatement) statement; + Statement body = forStatement.getBody(); + if (body instanceof Block) { + for (Statement inner: ((Block) body).getStatements2()) { + rewriteDanglingFieldsAsParams(inner, fieldNames); + } + } else if (body != null) { + rewriteDanglingFieldsAsParams(body, fieldNames); + } + } + } + + private static void rewriteExpressionValues(Expression expr, boolean asValue, Set fieldNames) { + if (expr instanceof MethodInvocation) { + MethodInvocation mi = (MethodInvocation) expr; + rewriteExpressionValues(mi.getReceiver(), false, fieldNames); + if (mi.getArguments() != null) { + List args = mi.getArguments(); + for (int i = 0; i < args.size(); i++) { + Expression arg = args.get(i); + if (arg instanceof FieldAccess && fieldNames.contains(((FieldAccess) arg).getFieldName())) { + args.set(i, new Variable(((FieldAccess) arg).getFieldName())); + } else { + rewriteExpressionValues(arg, true, fieldNames); + } + } + } + } else if (expr instanceof Assignment) { + Assignment assignment = (Assignment) expr; + rewriteExpressionValues(assignment.getLeft(), false, fieldNames); + Expression right = assignment.getRight(); + if (right instanceof FieldAccess && fieldNames.contains(((FieldAccess) right).getFieldName())) { + assignment.setRight(new Variable(((FieldAccess) right).getFieldName())); + } else { + rewriteExpressionValues(right, true, fieldNames); + } + } + } + + private static boolean hasParameterNamed(MethodDeclaration method, String name) { + if (method.getParameters() == null) return false; + for (VariableDeclaration param: method.getParameters()) { + if (param.getName().equals(name)) return true; + } + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java index 669999b..b5bfc4f 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java @@ -3,7 +3,6 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.MediatorInsertion; -import designPatternExtensions.PresenterInsertion; import models.deltaAlgebra.*; import parser.*; import parser.exceptions.ExpectedJsonValue; @@ -23,7 +22,6 @@ private DeltaComplex deltaComplex; private List dependencyInversions = new ArrayList<>(); 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); @@ -66,14 +64,6 @@ return mediatorInsertions; } - public void addPresenterInsertion(PresenterInsertion presenterInsertion) { - presenterInsertions.add(presenterInsertion); - } - - public List getPresenterInsertions() { - return presenterInsertions; - } - public DeltaComplex createDefaultDeltaComplex(DataSynchronizationContext transferContext) throws IllegalRelationException { Stack deltaStack = constructDefaultDeltas(transferContext); // Add all deltas. diff --git a/src/test/java/generator/TestMultipleContexts.java b/src/test/java/generator/TestMultipleContexts.java index ab5ea77..ba35f26 100644 --- a/src/test/java/generator/TestMultipleContexts.java +++ b/src/test/java/generator/TestMultipleContexts.java @@ -24,7 +24,7 @@ dstEdges.add(dstEdge); List relations = new ArrayList<>(); Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToOne); - DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "memento", PushPullValue.PULL); + DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "memento", TransferStyle.PULL); DataSynchronizationDesign design = new DataSynchronizationDesign(context); List srcEdges2 = new ArrayList<>(); @@ -34,7 +34,7 @@ ReferenceEdge dstEdge2 = new ReferenceEdge(main, star, "star"); dstEdges2.add(dstEdge2); Relation transferRelation2 = new Relation(srcEdges2, dstEdges2, MultiplicityValue.OneToOne); - DataSynchronizationContext context2 = new DataSynchronizationContext(relations, transferRelation2, "memento", PushPullValue.PUSH); + DataSynchronizationContext context2 = new DataSynchronizationContext(relations, transferRelation2, "memento", TransferStyle.PUSH); design.addTransferContext(context2); System.out.println(ASTGenerator.generate(design)); diff --git a/src/test/java/parser/PatternTest.java b/src/test/java/parser/PatternTest.java index 4cf733c..1ec5013 100644 --- a/src/test/java/parser/PatternTest.java +++ b/src/test/java/parser/PatternTest.java @@ -30,8 +30,6 @@ @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()));