diff --git a/models/designPattern/Flyweight.Json b/models/designPattern/Flyweight.Json index 0f8e1fa..708108b 100644 --- a/models/designPattern/Flyweight.Json +++ b/models/designPattern/Flyweight.Json @@ -22,13 +22,13 @@ { "relations": [], "transfer": { - "src": "Main.AlchemistShop.TopShelf.{Potion}.Data", - "dst": "Main.AlchemistShop.Data", + "src": "Main.AlchemistShop.TopShelf.{Potion}", + "dst": "Main.AlchemistShop.{Potion}", "data": { - "name": "data" + "name": "potion" }, "style": "PULL", - "multiplicity": "*:1" + "multiplicity": "*:*" } } ] diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 7570aeb..451a648 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -28,8 +28,8 @@ dstEdges.add(dstEdge); dstEdges.add(dstEdge2); List relations = new ArrayList<>(); -// Relation transferRelation = new Relation(company, customer, MultiplicityValue.OneToOne); Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToMany); +// DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PULL); DataSynchronizationContext context = new DataSynchronizationContext(relations, transferRelation, "address", PushPullValue.PUSH); DataSynchronizationDesign design; @@ -43,7 +43,7 @@ // DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); // design.addDependencyInversion(di); - design = new Flyweight().create(); +// design = new Flyweight().create(); System.out.println(design.getDeltaComplex()); System.out.println(ASTGenerator.generate(design)); diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index cf5fc92..294fc50 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -145,7 +145,8 @@ FieldAccess field3 = new FieldAccess(new ThisExpression(), field13.getName()); // this.name3 FieldAccess field2 = new FieldAccess(field12.getName()); List args = new ArrayList<>(); - if (primitivePullDelta.isMultipleDefinition() && !pullEdge1.toMany() && !primitivePullDelta.isMultipleTransfer()) { + if ((!primitivePullDelta.isMultipleDefinition() && pullEdge2.toMany()) + || (primitivePullDelta.isMultipleDefinition() && !pullEdge1.toMany() && !primitivePullDelta.isMultipleTransfer())) { VariableDeclaration idVar = new VariableDeclaration(keyType, pullEdge2.getName() + idPostfix); coordionator.addParameter(idVar); args.add(new Variable(idVar.getName())); // name2.getName3(name3Id) @@ -246,58 +247,72 @@ // Construct setter method MethodDeclaration setter = null; VariableDeclaration param2Id = null; - if (!pushEdge.toMany() || primitivePullPushDelta.isMultipleDefinition()) { + if (pushEdge.toMany() && !primitivePullPushDelta.isMultipleDefinition() && !primitivePullPushDelta.isMultipleTransfer()) { + setter = createConstructor(class3); + } else { setter = createMethod(class3, setterPrefix + toComponentName(name2)); if (primitivePullPushDelta.isMultipleDefinition()) { param2Id = new VariableDeclaration(keyType2, toVariableName(name2) + idPostfix); setter.addParameter(param2Id); } - } else { - setter = createConstructor(class3); } - VariableDeclaration param2 = new VariableDeclaration(type2, toVariableName(name2)); + VariableDeclaration param2 = new VariableDeclaration(type2, toVariableName(pullEdge.getName())); setter.addParameter(param2); FieldAccess field2 = new FieldAccess(new ThisExpression(), field32.getName()); - if (!primitivePullPushDelta.isMultipleDefinition()) { - Assignment assignment = new Assignment(field2, new Variable(toVariableName(name2))); // this.name2 = name2; - ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - setter.addUniqueStatement(assignmentStatement); - } else { + if (primitivePullPushDelta.isMultipleDefinition()) { List args = new ArrayList<>(); args.add(new Variable(param2Id.getName())); args.add(new Variable(toVariableName(name2))); setter.addUniqueStatement(new ExpressionStatement(new MethodInvocation(field2, mapPut, args))); // name2Map.put(name2Id, name2); + } else { + Assignment assignment = new Assignment(field2, new Variable(toVariableName(pullEdge.getName()))); // this.name2 = name2; + ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); + setter.addUniqueStatement(assignmentStatement); } // Construct coordinator method MethodDeclaration coordionator = null; - if (!pushEdge.toMany() || primitivePullPushDelta.isMultipleDefinition()) { - coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name3)); - } else { + if (pushEdge.toMany() && !primitivePullPushDelta.isMultipleDefinition() && !primitivePullPushDelta.isMultipleTransfer()) { coordionator = createMethod(class1, addMethodPrefix + toComponentName(name3)); + } else { + coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name3)); } FieldAccess field3 = new FieldAccess(field13.getName()); - if (!pushEdge.toMany() || primitivePullPushDelta.isMultipleDefinition()) { - if (!primitivePullPushDelta.isMultipleDefinition()) { + if (!pushEdge.toMany() || primitivePullPushDelta.isMultipleDefinition() || primitivePullPushDelta.isMultipleTransfer()) { + if (!primitivePullPushDelta.isMultipleDefinition() && !primitivePullPushDelta.isMultipleTransfer()) { List args = new ArrayList<>(); args.add(new FieldAccess(field12.getName())); MethodInvocation callSetter = new MethodInvocation(field3, setter.getName(), args); // name3.setName2(name2) coordionator.addUniqueStatement(new ExpressionStatement(callSetter)); } else { EnhancedForStatement broadcastLoop = new EnhancedForStatement(); // for (key2 loopVar: name2Map.keySet()) - String loopVarName = pullEdge.getName() + idPostfix; - keyType = ((MapType) field12.getType()).getKeyType(); + MethodInvocation callSetter = null; + MethodInvocation keysGetter = null; + String loopVarName = null; List args = new ArrayList<>(); - args.add(new Variable(loopVarName)); - MethodInvocation valueGetter = new MethodInvocation(field2, mapGet, args); - args = new ArrayList<>(); - args.add(new Variable(loopVarName)); - args.add(valueGetter); - MethodInvocation callSetter = new MethodInvocation(field3, setter.getName(), args); // name3.setName2(loopVar, name2Map.get(loopVar)) + if (pullEdge.toMany()) { + loopVarName = pullEdge.getName() + idPostfix; + keyType = ((MapType) field12.getType()).getKeyType(); + args.add(new Variable(loopVarName)); + MethodInvocation valueGetter = new MethodInvocation(field2, mapGet, args); + args = new ArrayList<>(); + args.add(new Variable(loopVarName)); + args.add(valueGetter); + callSetter = new MethodInvocation(field3, setter.getName(), args); // name3.setName2(loopVar, name2Map.get(loopVar)) + keysGetter = new MethodInvocation(field2, mapKeySet); + } else { + loopVarName = pushEdge.getName() + idPostfix; + keyType = ((MapType) field13.getType()).getKeyType(); + args.add(new Variable(loopVarName)); + MethodInvocation valueGetter = new MethodInvocation(field3, mapGet, args); + args = new ArrayList<>(); + args.add(field2); + callSetter = new MethodInvocation(valueGetter, setter.getName(), args); // name3Map.get(loopVar).setName2(name2) + keysGetter = new MethodInvocation(field3, mapKeySet); + } Block loopBody = new Block(); loopBody.addStatement(new ExpressionStatement(callSetter)); VariableDeclaration loopVar = new VariableDeclaration(keyType, loopVarName); - MethodInvocation keysGetter = new MethodInvocation(field2, mapKeySet); broadcastLoop.setParameter(loopVar); broadcastLoop.setExpression(keysGetter); broadcastLoop.setBody(loopBody); diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java index 8b941b3..486fb2e 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationContext.java @@ -66,6 +66,13 @@ return syncronizationRelation.getDstTopObject(); } + public ObjectNode getSrcBottomObject() { + return syncronizationRelation.getSrcBottomObject(); + } + + public ObjectNode getDstBottomObject() { + return syncronizationRelation.getDstBottomObject(); + } public MultiplicityValue getTransferMultiplicity() { return syncronizationRelation.getMultiplicity(); diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java index 7766a54..e21fedf 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java @@ -220,12 +220,7 @@ dstObj = (ObjectNode) dstEdge.getDestination(); String dataName = dstObj.getName(); dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition, true); - if (dstObj.equals(transferContext.getSyncronizationRelation().getSrcBottomObject()) - && (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany)) { - componentSelectingDelta.setMultipleTransfer(false); - } + componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); primitiveDeltaList.add(componentSelectingDelta); Delta delta = null; for (PrimitiveDelta primDelta : primitiveDeltaList) { @@ -247,12 +242,7 @@ dstObj = (ObjectNode) dstEdge.getDestination(); String dataName = dstObj.getName(); dataName = dataName.substring(0, 1).toLowerCase() + dataName.substring(1); - componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition, true); - if (dstObj.equals(transferContext.getSyncronizationRelation().getSrcBottomObject()) - && (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne - || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany)) { - componentSelectingDelta.setMultipleTransfer(false); - } + componentSelectingDelta = new PrimitivePullDelta(prevReference, dstEdge, dataName, multipleDefinition); primitiveDeltaList.add(componentSelectingDelta); if (!multipleDefinition) { prevReference = new ReferenceEdge(srcObj, dstObj, dataName); @@ -296,19 +286,31 @@ String dataName = transferContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer + if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.OneToMany + || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + primDelta.setMultipleTransfer(true); + } dataTransferDelta = new Delta(primDelta); } else { // Broadcasting prevReference = new ReferenceEdge(prevReference); prevReference.setKeyTypeName(transferContext.getDstObjectHierarchy().getEdges().getLast().getKeyTypeName()); - prevReference.setMultiplicity(MultiplicityValue.OneToMany); +// prevReference.setMultiplicity(MultiplicityValue.OneToMany); // Add the data transfer delta. srcObj = (ObjectNode) prevReference.getSource(); dstObj = (ObjectNode) transferContext.getSrcObjectHierarchy().getBottom(); String dataName = transferContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); - PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName, true); // PUSH data transfer + PrimitivePullPushDelta primDelta = new PrimitivePullPushDelta(dataEdge, prevReference, dataName); // PUSH data transfer + if (transferContext.getDstObjectHierarchy().getEdges().getLast().getMultiplicity() == MultiplicityValue.OneToMany + || transferContext.getDstObjectHierarchy().getEdges().getLast().getMultiplicity() == MultiplicityValue.ManyToMany) { + primDelta.setMultipleDefinition(true); + } + if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.OneToMany + || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + primDelta.setMultipleTransfer(true); + } dataTransferDelta = new Delta(primDelta); } } else { @@ -322,12 +324,16 @@ String dataName = transferContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName); // PULL data transfer + if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne + || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + primDelta.setMultipleTransfer(true); + } dataTransferDelta = new Delta(primDelta); } else { // Data collecting prevReference = new ReferenceEdge(prevReference); prevReference.setKeyTypeName(transferContext.getSrcObjectHierarchy().getEdges().getLast().getKeyTypeName()); - prevReference.setMultiplicity(MultiplicityValue.OneToMany); +// prevReference.setMultiplicity(MultiplicityValue.OneToMany); // Add the data transfer delta. srcObj = (ObjectNode) prevReference.getDestination(); @@ -335,6 +341,10 @@ String dataName = transferContext.getDataName(); ReferenceEdge dataEdge = new ReferenceEdge(srcObj, dstObj, dataName); PrimitivePullDelta primDelta = new PrimitivePullDelta(prevReference, dataEdge, dataName, true); // PULL data transfer + if (transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToOne + || transferContext.getSyncronizationRelation().getMultiplicity() == MultiplicityValue.ManyToMany) { + primDelta.setMultipleTransfer(true); + } dataTransferDelta = new Delta(primDelta); } } diff --git a/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java b/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java index 8c7a95b..4158392 100644 --- a/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java +++ b/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java @@ -72,10 +72,18 @@ return multipleDefinition; } + public void setMultipleDefinition(boolean multipleDefinition) { + this.multipleDefinition = multipleDefinition; + } + public boolean isMultipleTransfer() { return multipleTransfer; } + public void setMultipleTransfer(boolean multipleTransfer) { + this.multipleTransfer = multipleTransfer; + } + @Override public PrimitivePullPushDelta copy() { return new PrimitivePullPushDelta(pullEdge, pushEdge, dataName, multipleDefinition, multipleTransfer);