diff --git a/models/designPattern/Builder.Json b/models/designPattern/Builder.Json index 2881759..cda010b 100644 --- a/models/designPattern/Builder.Json +++ b/models/designPattern/Builder.Json @@ -5,13 +5,52 @@ "relations": [], "transfer": { "src": "Main.{Builder}", - "dst": "Main.{Hero}", + "dst": "Main", "data": { "type": "Hero", "name": "hero" }, "style": "PULL", - "multiplicity": "1:*" + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.{Builder}", + "data": { + "type": "HairType", + "name": "hairType" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.{Builder}", + "data": { + "type": "HairColor", + "name": "hairColor" + }, + "style": "PUSH", + "multiplicity": "1:1" + } + }, + { + "relations": [], + "transfer": { + "src": "Main", + "dst": "Main.{Builder}", + "data": { + "type": "Armor", + "name": "armor" + }, + "style": "PUSH", + "multiplicity": "1:1" } } ] diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 2d7e935..fb8c9f1 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -23,7 +23,7 @@ List relations = new ArrayList<>(); // Relation transferRelation = new Relation(company, customer, MultiplicityValue.OneToOne); Relation transferRelation = new Relation(srcEdges, dstEdges, MultiplicityValue.OneToMany); - DataTransferContext context = new DataTransferContext(relations, transferRelation, address, "address", PushPullValue.PUSH); + DataTransferContext context = new DataTransferContext(relations, transferRelation, address, "address", PushPullValue.PULL); DataTransferDesign design; try { diff --git a/src/main/java/ast/MethodDeclaration.java b/src/main/java/ast/MethodDeclaration.java index df8d29e..9718762 100644 --- a/src/main/java/ast/MethodDeclaration.java +++ b/src/main/java/ast/MethodDeclaration.java @@ -92,20 +92,40 @@ this.body = body; } + public void addUniqueStatement(Statement statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(statement))) return; + body.addStatement(statement); + } + public void addStatement(Statement statement) { if (body == null) { body = new Block(); } body.addStatement(statement); } - + + public void addUniqueStatement(String statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(new PlainStatement(statement)))) return; + body.addStatement(statement); + } + public void addStatement(String statement) { if (body == null) { body = new Block(); } body.addStatement(statement); } - + public void addFirstStatement(Statement statement) { if (body == null) { body = new Block(); diff --git a/src/main/java/ast/Statement.java b/src/main/java/ast/Statement.java index 9c3fad6..9da4841 100644 --- a/src/main/java/ast/Statement.java +++ b/src/main/java/ast/Statement.java @@ -4,4 +4,12 @@ @Override public abstract String toString(); + + @Override + public boolean equals(Object another) { + if (!(another instanceof Statement)) { + return false; + } + return toString().equals(another.toString()); + } } diff --git a/src/main/java/designPatternExtensions/designPattern/Strategy.java b/src/main/java/designPatternExtensions/designPattern/Strategy.java index 56ffed2..fea5abf 100644 --- a/src/main/java/designPatternExtensions/designPattern/Strategy.java +++ b/src/main/java/designPatternExtensions/designPattern/Strategy.java @@ -16,7 +16,7 @@ public DataTransferDesign create() throws IllegalRelationException { DataTransferDesign design = ModelLoader.load("models/designPattern/Strategy.Json"); ObjectNode dragonSlayer = design.getTransferContexts().getFirst().getSrcFirstResource(); - ObjectNode concreteStrategy = (ObjectNode) design.getTransferContexts().getFirst().getDstResource().get(0).getDestination(); + ObjectNode concreteStrategy = (ObjectNode) design.getTransferContexts().getFirst().getDstResource().getEdges().get(0).getDestination(); DependencyInversion di = new DependencyInversion( concreteStrategy, new InterfaceNode(concreteStrategy, "DragonSlayingStrategy")); diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index 7814fb1..be5b6b3 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -110,7 +110,7 @@ MethodInvocation callGetter = new MethodInvocation(field3, mapGet, args); // name3Map.get(name3Id) return23.setExpression(callGetter); // return name3Map.get(name3Id); } - getter.addStatement(return23); + getter.addUniqueStatement(return23); getter.setReturnType(type3); // Construct coordinator method @@ -126,7 +126,7 @@ MethodInvocation callGetter = new MethodInvocation(field2, getter.getName(), args); // name2.getName3() Assignment assignment = new Assignment(field3, callGetter); // this.name3 = name2.getName3(); ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - coordionator.addStatement(assignmentStatement); + coordionator.addUniqueStatement(assignmentStatement); return codebase; } @@ -169,7 +169,7 @@ FieldAccess field2 = new FieldAccess(new ThisExpression(), field32.getName()); // this.name2 Assignment assignment = new Assignment(field2, new Variable(toVariableName(name2))); // this.name2 = name2; ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - setter.addStatement(assignmentStatement); + setter.addUniqueStatement(assignmentStatement); // Construct coordinator method MethodDeclaration coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name2)); @@ -178,7 +178,7 @@ FieldAccess field3 = new FieldAccess(field13.getName()); if (!pushEdge.toMany()) { MethodInvocation callSetter = new MethodInvocation(field3, setter.getName(), args); // name3.setName2(name2) - coordionator.addStatement(new ExpressionStatement(callSetter)); + coordionator.addUniqueStatement(new ExpressionStatement(callSetter)); } else { VariableDeclaration idVar = new VariableDeclaration(keyType, pushEdge.getName() + idPostfix); coordionator.addParameter(idVar); @@ -186,7 +186,7 @@ args = new ArrayList<>(); args.add(new Variable(idVar.getName())); args.add(callConstructor); - coordionator.addStatement(new ExpressionStatement(new MethodInvocation(field3, mapPut, args))); // name3Map.put(name3Id, new new Name3(name2)); + coordionator.addUniqueStatement(new ExpressionStatement(new MethodInvocation(field3, mapPut, args))); // name3Map.put(name3Id, new new Name3(name2)); } return codebase; } @@ -217,7 +217,7 @@ FieldAccess field1 = new FieldAccess(new ThisExpression(), field31.getName()); // this.name1 Assignment assignment = new Assignment(field1, new Variable(toVariableName(name1))); // this.name1 = name1; ExpressionStatement assignmentStatement = new ExpressionStatement(assignment); - setter3.addStatement(assignmentStatement); + setter3.addUniqueStatement(assignmentStatement); // Construct setter in class2 MethodDeclaration setter2 = createMethod(class2, setterPrefix + toComponentName(name1)); @@ -227,7 +227,7 @@ List args = new ArrayList<>(); args.add(new Variable(param1.getName())); MethodInvocation callSetter = new MethodInvocation(field3, setter3.getName(), args); // name3.setName1(name1) - setter2.addStatement(new ExpressionStatement(callSetter)); + setter2.addUniqueStatement(new ExpressionStatement(callSetter)); // Construct coordinator method MethodDeclaration coordionator = createMethod(class1, updateMethodPrefix + toComponentName(name1)); @@ -235,7 +235,7 @@ args = new ArrayList<>(); args.add(new ThisExpression()); callSetter = new MethodInvocation(field2, setter2.getName(), args); // name2.setName1(this) - coordionator.addStatement(new ExpressionStatement(callSetter)); + coordionator.addUniqueStatement(new ExpressionStatement(callSetter)); return codebase; } @@ -270,7 +270,7 @@ constructor.addParameter(dstParam); FieldAccess dstFieldAccess = new FieldAccess(new ThisExpression(), dstField.getName()); Assignment dstAssignment = new Assignment(dstFieldAccess, new Variable(dstFieldName)); // this.b = b; - constructor.addStatement(new ExpressionStatement(dstAssignment)); + constructor.addUniqueStatement(new ExpressionStatement(dstAssignment)); // Add delegation methods to the Mediator that forward calls to dst's public methods TypeDeclaration dstClass = createClass(codebase, dstName); @@ -290,9 +290,9 @@ if (method.getReturnType() != null) { ReturnStatement returnStatement = new ReturnStatement(); returnStatement.setExpression(callDst); - delegateMethod.addStatement(returnStatement); + delegateMethod.addUniqueStatement(returnStatement); } else { - delegateMethod.addStatement(new ExpressionStatement(callDst)); + delegateMethod.addUniqueStatement(new ExpressionStatement(callDst)); } } @@ -317,7 +317,7 @@ mediatorSetter.addParameter(mediatorParam); FieldAccess mediatorFieldAccess = new FieldAccess(new ThisExpression(), mediatorFieldName); Assignment mediatorAssignment = new Assignment(mediatorFieldAccess, new Variable(mediatorFieldName)); // this.me = me; - mediatorSetter.addStatement(new ExpressionStatement(mediatorAssignment)); + 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()) { @@ -421,12 +421,12 @@ if (!hasParameterNamed(constructor, srcFieldName)) { constructor.addParameter(new VariableDeclaration(srcType, srcFieldName)); - constructor.addStatement(new ExpressionStatement( + 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.addStatement(new ExpressionStatement( + constructor.addUniqueStatement(new ExpressionStatement( new Assignment(new FieldAccess(new ThisExpression(), dstField.getName()), new Variable(dstFieldName)))); } @@ -454,7 +454,7 @@ if (newGetter.getReturnType() == null) { ReturnStatement returnStatement = new ReturnStatement(); returnStatement.setExpression(new FieldAccess(new ThisExpression(), field.getName())); - newGetter.addStatement(returnStatement); + newGetter.addUniqueStatement(returnStatement); newGetter.setReturnType(field.getType()); } getters.add(newGetter); @@ -471,7 +471,7 @@ VariableDeclaration setterParam = new VariableDeclaration(propertyType, toVariableName(propertyName)); setter.addParameter(setterParam); FieldDeclaration propertyField = createField(dstClass, toVariableName(propertyName), propertyType); - setter.addStatement(new ExpressionStatement( + setter.addUniqueStatement(new ExpressionStatement( new Assignment(new FieldAccess(new ThisExpression(), propertyField.getName()), new Variable(toVariableName(propertyName))))); } @@ -484,7 +484,7 @@ List setterArgs = new ArrayList<>(); setterArgs.add(callGetter); MethodInvocation callSetter = new MethodInvocation(new FieldAccess(dstField.getName()), setter.getName(), setterArgs); - coordinator.addStatement(new ExpressionStatement(callSetter)); + coordinator.addUniqueStatement(new ExpressionStatement(callSetter)); } } diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java b/src/main/java/models/objectOrientedTransfer/DataTransferContext.java index 9bfe279..32488cf 100644 --- a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java +++ b/src/main/java/models/objectOrientedTransfer/DataTransferContext.java @@ -49,20 +49,20 @@ return transferRelation.isFlat(); } - public List getSrcResource() { - return transferRelation.getSrcResource(); + public ObjectHierarchy getSrcResource() { + return transferRelation.getSrcObjectHierarchy(); } - public List getDstResource() { - return transferRelation.getDstResource(); + public ObjectHierarchy getDstResource() { + return transferRelation.getDstObjectHierarchy(); } public ObjectNode getSrcFirstResource() { - return transferRelation.getSrcFirstResource(); + return transferRelation.getSrcTopObject(); } public ObjectNode getDstFirstResource() { - return transferRelation.getDstFirstResource(); + return transferRelation.getDstTopObject(); } diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java index 9aa7fc8..312ce3b 100644 --- a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java +++ b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java @@ -140,36 +140,36 @@ return prevReference; } boolean toOne = true; // potential multiplicity - List srcResource = new ArrayList<>(); - List dstResource = new ArrayList<>(); + ObjectHierarchy srcHierarchy = null; + ObjectHierarchy dstHierarchy = null; List allRelations = new ArrayList<>(transferContext.getRelations()); allRelations.add(transferContext.getTransferRelation()); for (Relation relation: allRelations) { - List newSrcResource = null; - List newDstResource = null; + ObjectHierarchy newSrcHierarchy = null; + ObjectHierarchy newDstHierarchy = null; if (transferStyle == PushPullValue.PUSH) { - newSrcResource = relation.getSrcResource(); - newDstResource = relation.getDstResource(); + newSrcHierarchy = relation.getSrcObjectHierarchy(); + newDstHierarchy = relation.getDstObjectHierarchy(); } else { - newSrcResource = relation.getDstResource(); - newDstResource = relation.getSrcResource(); + newSrcHierarchy = relation.getDstObjectHierarchy(); + newDstHierarchy = relation.getSrcObjectHierarchy(); } - if (dstResource.size() < newDstResource.size() || srcResource.size() < newSrcResource.size()) { + if ((dstHierarchy == null || dstHierarchy.getDepth() < newDstHierarchy.getDepth()) || (srcHierarchy == null || srcHierarchy.getDepth() < newSrcHierarchy.getDepth())) { List oneDestination = new ArrayList<>(); List manyDestinations = new ArrayList<>(); - for (int i = 0; i < newDstResource.size(); i++) { - if (i < dstResource.size()) { - if (!dstResource.get(i).equals(newDstResource.get(i))) { + for (int i = 0; i < newDstHierarchy.getDepth(); i++) { + if (dstHierarchy != null && i < dstHierarchy.getDepth()) { + if (!dstHierarchy.getEdge(i).equals(newDstHierarchy.getEdge(i))) { throw new IllegalRelationException(); } } else { - if (newDstResource.get(i).toMany()) { + if (newDstHierarchy.getEdge(i).toMany()) { toOne = false; } if (toOne) { - oneDestination.add(newDstResource.get(i)); + oneDestination.add(newDstHierarchy.getEdge(i)); } else { - manyDestinations.add(newDstResource.get(i)); + manyDestinations.add(newDstHierarchy.getEdge(i)); } } } @@ -184,10 +184,10 @@ primitiveDeltaList.add(new PrimitivePullDelta(prevReference, dstEdge, dataName)); prevReference = new ReferenceEdge(srcObj, dstObj, dataName); } - for (int i = 0; i < newSrcResource.size(); i++) { - ReferenceEdge srcEdge = newSrcResource.get(i); - if (i < srcResource.size()) { - if (!srcResource.get(i).equals(srcEdge)) { + for (int i = 0; i < newSrcHierarchy.getDepth(); i++) { + ReferenceEdge srcEdge = newSrcHierarchy.getEdge(i); + if (srcHierarchy != null && i < srcHierarchy.getDepth()) { + if (!srcHierarchy.getEdge(i).equals(srcEdge)) { throw new IllegalRelationException(); } } else { @@ -264,8 +264,8 @@ } else { throw new IllegalRelationException(); } - srcResource = newSrcResource; - dstResource = newDstResource; + srcHierarchy = newSrcHierarchy; + dstHierarchy = newDstHierarchy; } return prevReference; } diff --git a/src/main/java/models/objectOrientedTransfer/Delta.java b/src/main/java/models/objectOrientedTransfer/Delta.java index d5ed3db..8f83631 100644 --- a/src/main/java/models/objectOrientedTransfer/Delta.java +++ b/src/main/java/models/objectOrientedTransfer/Delta.java @@ -43,10 +43,10 @@ /** * binding composition - * (this * delta) + * (this o delta) * * @param delta - * @return this * delta + * @return this o delta */ public Delta combine(PrimitiveDelta delta) { return new Delta(delta, this); @@ -54,10 +54,10 @@ /** * binding composition - * (this * delta) + * (this o delta) * * @param delta - * @return this * delta + * @return this o delta */ public Delta combine(Delta delta) { Delta preDelta = this.copy(); @@ -68,7 +68,7 @@ } /** - * if this = d1 * d2 * ... * dn + * if this = d1 o d2 o ... o dn * * @return [d1, d2, ..., dn] */ @@ -89,4 +89,8 @@ } return new Delta(bottomDelta.copy(), subDelta.copy()); } + + public String toString() { + return bottomDelta.toString() + (subDelta == null ? "" : " o " + subDelta.toString()); + } } diff --git a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java index 81ce625..a26c0d2 100644 --- a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java +++ b/src/main/java/models/objectOrientedTransfer/DeltaComplex.java @@ -23,7 +23,7 @@ } /** - * dependency composition + * dependency chaining * (this = delta | this) * * @param delta @@ -99,4 +99,8 @@ } return new DeltaComplex(frontierDelta.copy(), subComplex.copy()); } + + public String toString() { + return "tau_C(" + frontierDelta.toString() + ")" + (subComplex == null ? "" : " | " + subComplex.toString()); + } } diff --git a/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java b/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java new file mode 100644 index 0000000..cf8e86b --- /dev/null +++ b/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java @@ -0,0 +1,42 @@ +package models.objectOrientedTransfer; + +import java.util.ArrayList; +import java.util.List; + +public class ObjectHierarchy { + private ObjectNode top; + private List edges; + private boolean isFlat = false; + + public ObjectHierarchy(ObjectNode top) { + this.top = top; + this.edges = new ArrayList<>(); + this.isFlat = true; + } + + public ObjectHierarchy(List edges) { + this.top = (ObjectNode) edges.getFirst().getSource(); + this.edges = edges; + this.isFlat = false; + } + + public ObjectNode getTop() { + return top; + } + + public List getEdges() { + return edges; + } + + public boolean isFlat() { + return isFlat; + } + + public int getDepth() { + return edges.size(); + } + + public ReferenceEdge getEdge(int index) { + return edges.get(index); + } +} diff --git a/src/main/java/models/objectOrientedTransfer/ObjectNode.java b/src/main/java/models/objectOrientedTransfer/ObjectNode.java index 0ffdaa8..7d62d05 100644 --- a/src/main/java/models/objectOrientedTransfer/ObjectNode.java +++ b/src/main/java/models/objectOrientedTransfer/ObjectNode.java @@ -16,4 +16,8 @@ public void setName(String name) { this.name = name; } + + public String toString() { + return name; + } } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java index bf3037f..3b6d625 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java @@ -49,4 +49,8 @@ return new PrimitivePullDelta(pullEdge1, pullEdge2, dataName); } + public String toString() { + return "Delta[" + pullEdge1.getSource().toString() + "->" + pullEdge2.getDestination().toString() + "]"; + } + } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java index 8fa3e07..0e41d15 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java @@ -49,4 +49,7 @@ return new PrimitivePullPushDelta(pullEdge, pushEdge, dataName); } + public String toString() { + return "Delta[" + pullEdge.getDestination().toString() + "->" + pushEdge.getDestination().toString() + "]"; + } } diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java index 63d0635..14bbd4b 100644 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java +++ b/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java @@ -50,4 +50,7 @@ return new PrimitivePushDelta(pushEdge1, pushEdge2, dataName); } + public String toString() { + return "Delta[" + pushEdge2.getDestination().toString() + "->" + pushEdge1.getSource().toString() + "]"; + } } diff --git a/src/main/java/models/objectOrientedTransfer/Relation.java b/src/main/java/models/objectOrientedTransfer/Relation.java index c0100f1..dd21789 100644 --- a/src/main/java/models/objectOrientedTransfer/Relation.java +++ b/src/main/java/models/objectOrientedTransfer/Relation.java @@ -1,45 +1,38 @@ package models.objectOrientedTransfer; -import java.util.ArrayList; import java.util.List; public class Relation { - private List srcResource; - private List dstResource; + private ObjectHierarchy srcObjectHierarchy; + private ObjectHierarchy dstObjectHierarchy; private MultiplicityValue multiplicity; private boolean isFlat = false; - private ObjectNode srcResourceNode; - private ObjectNode dstResourceNode; - public Relation(List srcResource, List dstResource, MultiplicityValue multiplicity) { + public Relation(List srcObjectHierarchy, List dstObjectHierarchy, MultiplicityValue multiplicity) { isFlat = false; - this.srcResource = srcResource; - this.dstResource = dstResource; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); this.multiplicity = multiplicity; } - public Relation(ObjectNode srcResourceNode, List dstResource, MultiplicityValue multiplicity) { + public Relation(ObjectNode srcObjectNode, List dstObjectHierarchy, MultiplicityValue multiplicity) { isFlat = false; - this.srcResource = new ArrayList<>(); - this.dstResource = dstResource; - this.srcResourceNode = srcResourceNode; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectHierarchy); this.multiplicity = multiplicity; } - public Relation(List srcResource, ObjectNode dstResourceNode, MultiplicityValue multiplicity) { + public Relation(List srcObjectHierarchy, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { isFlat = false; - this.srcResource = srcResource; - this.dstResource = new ArrayList<>(); - this.dstResourceNode = dstResourceNode; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectHierarchy); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); this.multiplicity = multiplicity; } - public Relation(ObjectNode srcResourceNode, ObjectNode dstResourceNode, MultiplicityValue multiplicity) { + public Relation(ObjectNode srcObjectNode, ObjectNode dstObjectNode, MultiplicityValue multiplicity) { this.isFlat = true; - this.srcResource = new ArrayList<>(); - this.dstResource = new ArrayList<>(); - this.srcResourceNode = srcResourceNode; - this.dstResourceNode = dstResourceNode; + this.srcObjectHierarchy = new ObjectHierarchy(srcObjectNode); + this.dstObjectHierarchy = new ObjectHierarchy(dstObjectNode); this.multiplicity = multiplicity; } @@ -47,26 +40,20 @@ return isFlat; } - public List getSrcResource() { - return srcResource; + public ObjectHierarchy getSrcObjectHierarchy() { + return srcObjectHierarchy; } - public List getDstResource() { - return dstResource; + public ObjectHierarchy getDstObjectHierarchy() { + return dstObjectHierarchy; } - public ObjectNode getSrcFirstResource() { - if (isFlat) { - return srcResourceNode; - } - return (ObjectNode) srcResource.getFirst().getSource(); + public ObjectNode getSrcTopObject() { + return srcObjectHierarchy.getTop(); } - public ObjectNode getDstFirstResource() { - if (isFlat) { - return dstResourceNode; - } - return (ObjectNode) dstResource.getFirst().getSource(); + public ObjectNode getDstTopObject() { + return dstObjectHierarchy.getTop(); } public MultiplicityValue getMultiplicity() {