diff --git a/models/Test.json b/models/Test.json new file mode 100644 index 0000000..fa4f96c --- /dev/null +++ b/models/Test.json @@ -0,0 +1,17 @@ +{ + "name": "test", + "contexts": [ + { + "relations": [], + "transfer": { + "src": "A.{B}.{C}.{D}.Data", + "dst": "E.{F}.{G}.{H}.Data", + "data": { + "name": "data" + }, + "style": "HIERARCHICAL", + "multiplicity": "*:*" + } + } + ] +} \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index ca2c911..482d01e 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -32,7 +32,7 @@ DataSynchronizationDesign design; -// design = ModelLoader.load("models/CustomerManagement-PUSH.Json"); +// design = ModelLoader.load("models/Test.Json"); // System.out.println(design.getDeltaComplex()); // System.out.println(ASTGenerator.generate(design)); @@ -47,7 +47,7 @@ // DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); // design.addDependencyInversion(di); - design = new Flyweight().create(); + design = new FactoryMethod().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 225b693..d45e22d 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -296,38 +296,71 @@ 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()) MethodInvocation callSetter = null; MethodInvocation keysGetter = null; String loopVarName = null; List args = new ArrayList<>(); - 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; + if (pullEdge.toMany() && pushEdge.toMany()) { 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) + loopVarName = pushEdge.getName() + idPostfix; keysGetter = new MethodInvocation(field3, mapKeySet); + String loopVarName2 = pullEdge.getName() + idPostfix; + keyType2 = ((MapType) field12.getType()).getKeyType(); + args.add(new Variable(loopVarName2)); + MethodInvocation componentGetter = new MethodInvocation(field2, mapGet, args); + args = new ArrayList<>(); + args.add(new Variable(loopVarName2)); + args.add(componentGetter); + List args2 = new ArrayList<>(); + args2.add(new Variable(loopVarName)); + Expression containerGetter = new MethodInvocation(field3, mapGet, args2); + callSetter = new MethodInvocation(containerGetter, setter.getName(), args); // name3Map.get(loopVar).setName2(loopVar2, name2Map.get(loopVar2)) + MethodInvocation keysGetter2 = new MethodInvocation(field2, mapKeySet); + Block loopBody2 = new Block(); + loopBody2.addStatement(new ExpressionStatement(callSetter)); + VariableDeclaration loopVar2 = new VariableDeclaration(keyType2, loopVarName2); + EnhancedForStatement broadcastLoop2 = new EnhancedForStatement(); // for (key2 loopVar2: name2Map.keySet()) + broadcastLoop2.setParameter(loopVar2); + broadcastLoop2.setExpression(keysGetter2); + broadcastLoop2.setBody(loopBody2); + Block loopBody1 = new Block(); + loopBody1.addStatement(broadcastLoop2); + VariableDeclaration loopVar = new VariableDeclaration(keyType, loopVarName); + EnhancedForStatement broadcastLoop1 = new EnhancedForStatement(); // for (key3 loopVar: name3Map.keySet()) + broadcastLoop1.setParameter(loopVar); + broadcastLoop1.setExpression(keysGetter); + broadcastLoop1.setBody(loopBody1); + coordionator.addUniqueStatement(broadcastLoop1); + } else { + EnhancedForStatement broadcastLoop = new EnhancedForStatement(); // for (key2 loopVar: name2Map.keySet()) + if (pullEdge.toMany()) { + loopVarName = pullEdge.getName() + idPostfix; + keyType = ((MapType) field12.getType()).getKeyType(); + args.add(new Variable(loopVarName)); + MethodInvocation componentGetter = new MethodInvocation(field2, mapGet, args); + args = new ArrayList<>(); + args.add(new Variable(loopVarName)); + args.add(componentGetter); + 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 containerGetter = new MethodInvocation(field3, mapGet, args); + args = new ArrayList<>(); + args.add(field2); + callSetter = new MethodInvocation(containerGetter, 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); + broadcastLoop.setParameter(loopVar); + broadcastLoop.setExpression(keysGetter); + broadcastLoop.setBody(loopBody); + coordionator.addUniqueStatement(broadcastLoop); } - Block loopBody = new Block(); - loopBody.addStatement(new ExpressionStatement(callSetter)); - VariableDeclaration loopVar = new VariableDeclaration(keyType, loopVarName); - broadcastLoop.setParameter(loopVar); - broadcastLoop.setExpression(keysGetter); - broadcastLoop.setBody(loopBody); - coordionator.addUniqueStatement(broadcastLoop); } } else { VariableDeclaration idVar = new VariableDeclaration(keyType, pushEdge.getName() + idPostfix); diff --git a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java index 6adbf0a..669999b 100644 --- a/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java +++ b/src/main/java/models/dataSynchronizationModel/DataSynchronizationDesign.java @@ -217,10 +217,12 @@ } else { delta = delta.combine(primDelta); } - if (!prevDstEdge.toMany()) { - prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName); - } else { + if (prevDstEdge.toMany()) { prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName, prevDstEdge.getKeyTypeName()); + } else if (dstEdge.toMany()) { + prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName, dstEdge.getKeyTypeName()); + } else { + prevDstEdge = new ReferenceEdge(srcObj, dstObj, dataName); } } } else {