diff --git a/src/main/java/Main.java b/src/main/java/Main.java index fb8c9f1..00cba3d 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -4,6 +4,9 @@ import designPatternExtensions.*; import designPatternExtensions.designPattern.Adapter; import generators.ASTGenerator; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; import models.objectOrientedTransfer.*; public class Main { @@ -36,6 +39,7 @@ DependencyInversion di = new DependencyInversion(company, new InterfaceNode(company, "ICompany"), customer); design.addDependencyInversion(di); + System.out.println(design.getDeltaComplex()); System.out.println(ASTGenerator.generate(design)); } catch (IllegalRelationException e) { e.printStackTrace(); diff --git a/src/main/java/designPatternExtensions/DependencyInversion.java b/src/main/java/designPatternExtensions/DependencyInversion.java index e007a9d..32a397b 100644 --- a/src/main/java/designPatternExtensions/DependencyInversion.java +++ b/src/main/java/designPatternExtensions/DependencyInversion.java @@ -1,6 +1,6 @@ package designPatternExtensions; -import models.objectOrientedTransfer.ObjectNode; +import models.deltaAlgebra.ObjectNode; public class DependencyInversion { private ObjectNode dst; diff --git a/src/main/java/designPatternExtensions/InterfaceNode.java b/src/main/java/designPatternExtensions/InterfaceNode.java index cf8facd..397d69a 100644 --- a/src/main/java/designPatternExtensions/InterfaceNode.java +++ b/src/main/java/designPatternExtensions/InterfaceNode.java @@ -1,6 +1,6 @@ package designPatternExtensions; -import models.objectOrientedTransfer.ObjectNode; +import models.deltaAlgebra.ObjectNode; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/designPatternExtensions/MediatorInsertion.java b/src/main/java/designPatternExtensions/MediatorInsertion.java index 2ccd7bb..9dbbf95 100644 --- a/src/main/java/designPatternExtensions/MediatorInsertion.java +++ b/src/main/java/designPatternExtensions/MediatorInsertion.java @@ -1,7 +1,7 @@ package designPatternExtensions; import models.objectOrientedTransfer.DataTransferContext; -import models.objectOrientedTransfer.ObjectNode; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.PushPullValue; public class MediatorInsertion { diff --git a/src/main/java/designPatternExtensions/PresenterInsertion.java b/src/main/java/designPatternExtensions/PresenterInsertion.java index 09a8751..0aa147b 100644 --- a/src/main/java/designPatternExtensions/PresenterInsertion.java +++ b/src/main/java/designPatternExtensions/PresenterInsertion.java @@ -1,6 +1,6 @@ package designPatternExtensions; -import models.objectOrientedTransfer.ObjectNode; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.PushPullValue; public class PresenterInsertion { diff --git a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java index 9731efc..150e6e3 100644 --- a/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java +++ b/src/main/java/designPatternExtensions/designPattern/AbstractFactory.java @@ -1,6 +1,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; diff --git a/src/main/java/designPatternExtensions/designPattern/Adapter.java b/src/main/java/designPatternExtensions/designPattern/Adapter.java index 583299d..fc9b1a1 100644 --- a/src/main/java/designPatternExtensions/designPattern/Adapter.java +++ b/src/main/java/designPatternExtensions/designPattern/Adapter.java @@ -1,6 +1,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; public class Adapter implements DesignPattern { diff --git a/src/main/java/designPatternExtensions/designPattern/Bridge.java b/src/main/java/designPatternExtensions/designPattern/Bridge.java index ed9f29b..c179c4b 100644 --- a/src/main/java/designPatternExtensions/designPattern/Bridge.java +++ b/src/main/java/designPatternExtensions/designPattern/Bridge.java @@ -2,11 +2,10 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; -import java.util.ArrayList; - //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/bridge diff --git a/src/main/java/designPatternExtensions/designPattern/Builder.java b/src/main/java/designPatternExtensions/designPattern/Builder.java index 0204d58..2d5f4c4 100644 --- a/src/main/java/designPatternExtensions/designPattern/Builder.java +++ b/src/main/java/designPatternExtensions/designPattern/Builder.java @@ -1,12 +1,9 @@ package designPatternExtensions.designPattern; -import designPatternExtensions.MediatorInsertion; -import designPatternExtensions.PresenterInsertion; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; -import java.util.ArrayList; - //メモ //https://github.com/iluwatar/java-design-patterns/tree/master/builder //staticがないとnew Hero().new Builder(...)のような形になり、Builderとして成立しない diff --git a/src/main/java/designPatternExtensions/designPattern/Command.java b/src/main/java/designPatternExtensions/designPattern/Command.java index c0a1fd4..d4d5f4f 100644 --- a/src/main/java/designPatternExtensions/designPattern/Command.java +++ b/src/main/java/designPatternExtensions/designPattern/Command.java @@ -1,8 +1,6 @@ package designPatternExtensions.designPattern; -import designPatternExtensions.DependencyInversion; -import designPatternExtensions.InterfaceNode; -import designPatternExtensions.MediatorInsertion; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; diff --git a/src/main/java/designPatternExtensions/designPattern/Decorator.java b/src/main/java/designPatternExtensions/designPattern/Decorator.java index 43d5882..dcf9fd1 100644 --- a/src/main/java/designPatternExtensions/designPattern/Decorator.java +++ b/src/main/java/designPatternExtensions/designPattern/Decorator.java @@ -3,6 +3,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; diff --git a/src/main/java/designPatternExtensions/designPattern/Iterator.java b/src/main/java/designPatternExtensions/designPattern/Iterator.java index 221c203..5b5dab8 100644 --- a/src/main/java/designPatternExtensions/designPattern/Iterator.java +++ b/src/main/java/designPatternExtensions/designPattern/Iterator.java @@ -2,10 +2,9 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; - -import java.util.ArrayList; //メモ //中身の構造を隠したまま、アイテムのタイプをifで回さなくても順番にデータを取り出す // diff --git a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java index 2ee6fa9..d122ad5 100644 --- a/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java +++ b/src/main/java/designPatternExtensions/designPattern/MediatorInsertionTest.java @@ -2,6 +2,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; + import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; public class MediatorInsertionTest implements DesignPattern { diff --git a/src/main/java/designPatternExtensions/designPattern/Memento.java b/src/main/java/designPatternExtensions/designPattern/Memento.java index 7958294..cbeaf2b 100644 --- a/src/main/java/designPatternExtensions/designPattern/Memento.java +++ b/src/main/java/designPatternExtensions/designPattern/Memento.java @@ -1,10 +1,9 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; -import java.util.ArrayList; - //https://github.com/iluwatar/java-design-patterns/tree/master/memento public class Memento implements DesignPattern{ diff --git a/src/main/java/designPatternExtensions/designPattern/Observer.java b/src/main/java/designPatternExtensions/designPattern/Observer.java index 996d54e..327fe7f 100644 --- a/src/main/java/designPatternExtensions/designPattern/Observer.java +++ b/src/main/java/designPatternExtensions/designPattern/Observer.java @@ -1,9 +1,10 @@ package designPatternExtensions.designPattern; import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import java.util.ArrayList; -import java.util.List; //https://github.com/iluwatar/java-design-patterns/tree/master/observer //依存性の逆転構造は再現できているが、OneToManyが使えないから再現できない? diff --git a/src/main/java/designPatternExtensions/designPattern/Prototype.java b/src/main/java/designPatternExtensions/designPattern/Prototype.java index f6066ee..cf18de0 100644 --- a/src/main/java/designPatternExtensions/designPattern/Prototype.java +++ b/src/main/java/designPatternExtensions/designPattern/Prototype.java @@ -2,6 +2,8 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import java.util.ArrayList; diff --git a/src/main/java/designPatternExtensions/designPattern/Proxy.java b/src/main/java/designPatternExtensions/designPattern/Proxy.java index 38db83f..d297f23 100644 --- a/src/main/java/designPatternExtensions/designPattern/Proxy.java +++ b/src/main/java/designPatternExtensions/designPattern/Proxy.java @@ -3,6 +3,7 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; diff --git a/src/main/java/designPatternExtensions/designPattern/Singleton.java b/src/main/java/designPatternExtensions/designPattern/Singleton.java index 1138454..a6c4eb8 100644 --- a/src/main/java/designPatternExtensions/designPattern/Singleton.java +++ b/src/main/java/designPatternExtensions/designPattern/Singleton.java @@ -1,5 +1,7 @@ package designPatternExtensions.designPattern; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import java.util.ArrayList; diff --git a/src/main/java/designPatternExtensions/designPattern/State.java b/src/main/java/designPatternExtensions/designPattern/State.java index ca462f9..0b2629f 100644 --- a/src/main/java/designPatternExtensions/designPattern/State.java +++ b/src/main/java/designPatternExtensions/designPattern/State.java @@ -1,6 +1,7 @@ package designPatternExtensions.designPattern; import designPatternExtensions.*; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; diff --git a/src/main/java/designPatternExtensions/designPattern/Strategy.java b/src/main/java/designPatternExtensions/designPattern/Strategy.java index fea5abf..2bc18dd 100644 --- a/src/main/java/designPatternExtensions/designPattern/Strategy.java +++ b/src/main/java/designPatternExtensions/designPattern/Strategy.java @@ -2,12 +2,10 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.ObjectNode; import models.objectOrientedTransfer.*; import designPatternExtensions.ModelLoader; -import java.util.ArrayList; -import java.util.List; - //https://github.com/iluwatar/java-design-patterns/tree/master/strategy //同じ役割の実装クラスを複数用意できない-> ConcreteStrategy diff --git a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java index c3cc290..fd5c97b 100644 --- a/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java +++ b/src/main/java/designPatternExtensions/designPattern/TemplateMethod.java @@ -2,6 +2,9 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; import models.objectOrientedTransfer.*; import java.util.ArrayList; diff --git a/src/main/java/designPatternExtensions/designPattern/Visitor.java b/src/main/java/designPatternExtensions/designPattern/Visitor.java index 4007d72..d23a19d 100644 --- a/src/main/java/designPatternExtensions/designPattern/Visitor.java +++ b/src/main/java/designPatternExtensions/designPattern/Visitor.java @@ -7,6 +7,9 @@ import designPatternExtensions.DependencyInversion; import designPatternExtensions.InterfaceNode; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; import models.objectOrientedTransfer.*; import java.util.ArrayList; diff --git a/src/main/java/generators/ASTGenerator.java b/src/main/java/generators/ASTGenerator.java index be5b6b3..0613207 100644 --- a/src/main/java/generators/ASTGenerator.java +++ b/src/main/java/generators/ASTGenerator.java @@ -8,8 +8,8 @@ import designPatternExtensions.InterfaceNode; import designPatternExtensions.MediatorInsertion; import designPatternExtensions.PresenterInsertion; -import models.algebra.Type; import models.dataConstraintModel.MapType; +import models.deltaAlgebra.*; import models.objectOrientedTransfer.*; public class ASTGenerator { @@ -32,7 +32,7 @@ public static Codebase generate(DataTransferDesign dataTransferDesign) { Codebase codebase = new Codebase(); DeltaComplex deltaComplex = dataTransferDesign.getDeltaComplex(); - for (Delta delta: deltaComplex.split()) { + for (Delta delta: deltaComplex.decompose()) { codebase = weaveDelta(codebase, delta); } // do not change flow : MediatorInsertion -> DependencyInversion diff --git a/src/main/java/models/deltaAlgebra/Delta.java b/src/main/java/models/deltaAlgebra/Delta.java new file mode 100644 index 0000000..69f254b --- /dev/null +++ b/src/main/java/models/deltaAlgebra/Delta.java @@ -0,0 +1,109 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; + +/** + * An open/closed (possibly composed) delta. + * + * @author Nitta + * + */ +public class Delta { + private PrimitiveDelta bottomDelta = null; + private Delta subDelta = null; + + public Delta(PrimitiveDelta delta) { + bottomDelta = delta; + } + + public Delta(PrimitiveDelta bottomDelta, Delta subDelta) { + this.bottomDelta = bottomDelta; + this.subDelta = subDelta; + } + + public ObjectNode getCoordinator() { + if (subDelta == null) return bottomDelta.getCoordinator(); + return subDelta.getCoordinator(); + } + + public List getPullEdges() { + if (subDelta == null) return bottomDelta.getPullEdges(); + List pullEdges = new ArrayList<>(subDelta.getPullEdges()); + pullEdges.addAll(bottomDelta.getPullEdges()); + return pullEdges; + } + + public List getPushEdges() { + if (subDelta == null) return bottomDelta.getPushEdges(); + List pushEdges = new ArrayList<>(subDelta.getPushEdges()); + pushEdges.addAll(bottomDelta.getPushEdges()); + return pushEdges; + } + + /** + * binding composition + * (this o delta) + * + * @param delta + * @return this o delta + */ + public Delta combine(PrimitiveDelta delta) { + return new Delta(delta, this); + } + + /** + * binding composition + * (this o delta) + * + * @param delta + * @return this o delta + */ + public Delta combine(Delta delta) { + Delta preDelta = this.copy(); + for (PrimitiveDelta atomicDelta: delta.split()) { + preDelta = preDelta.combine(atomicDelta); + } + return preDelta; + } + + /** + * if this = d1 o d2 o ... o dn + * + * @return [d1, d2, ..., dn] + */ + public List split() { + if (subDelta == null) { + List atomicDeltaSequence = new ArrayList<>(); + atomicDeltaSequence.add(bottomDelta); + return atomicDeltaSequence; + } + List atomicDeltaSequence = subDelta.split(); + atomicDeltaSequence.add(bottomDelta); + return atomicDeltaSequence; + } + + public Delta copy() { + if (subDelta == null) { + return new Delta(bottomDelta.copy()); + } + return new Delta(bottomDelta.copy(), subDelta.copy()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof Delta)) return false; + Delta another = (Delta) o; + return bottomDelta.equals(another.bottomDelta) && ((subDelta == null && another.subDelta == null) || subDelta.equals(another.subDelta)); + } + + @Override + public int hashCode() { + return bottomDelta.hashCode() + (subDelta == null ? 0 : subDelta.hashCode()); + } + + public String toString() { + return bottomDelta.toString() + (subDelta == null ? "" : " o " + subDelta.toString()); + } +} diff --git a/src/main/java/models/deltaAlgebra/DeltaCombination.java b/src/main/java/models/deltaAlgebra/DeltaCombination.java new file mode 100644 index 0000000..58fda58 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaCombination.java @@ -0,0 +1,6 @@ +package models.deltaAlgebra; + +import java.util.List; + +abstract public class DeltaCombination extends DeltaExpression { +} diff --git a/src/main/java/models/deltaAlgebra/DeltaComplex.java b/src/main/java/models/deltaAlgebra/DeltaComplex.java new file mode 100644 index 0000000..99a5bcf --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaComplex.java @@ -0,0 +1,208 @@ +package models.deltaAlgebra; + +import java.util.*; + +/** + * A dependency-chained closed delta + * + * @author Nitta + * + */ +public class DeltaComplex extends DeltaExpression { + private DeltaExpression frontierDelta; + private DeltaComplex subComplex = null; + + public DeltaComplex(Delta delta) { + this.frontierDelta = new DeltaSimplex(delta); + } + + public DeltaComplex(DeltaExpression delta) { + this.frontierDelta = delta; + } + + public DeltaComplex(Delta frontierDelta, DeltaComplex subComplex) { + this.frontierDelta = new DeltaSimplex(frontierDelta); + this.subComplex = subComplex; + } + + public DeltaComplex(DeltaExpression frontierDelta, DeltaComplex subComplex) { + this.frontierDelta = frontierDelta; + this.subComplex = subComplex; + } + + /** + * dependency chaining + * (this = delta | this) + * + * @param delta + */ + public void attach(Delta delta) { + this.subComplex = this.copy(); + this.frontierDelta = new DeltaSimplex(delta); + } + + /** + * split + * if this = d1 | d2 | ... | dn + * + * @return [d1, d2, ..., dn] + */ + public List split() { + if (subComplex == null) { + List deltaSequence = new ArrayList<>(); + deltaSequence.add(frontierDelta); + return deltaSequence; + } + List deltaSequence = subComplex.split(); + deltaSequence.add(0, frontierDelta); + return deltaSequence; + } + + /** + * decompose + * if this = (d1 x d2) | (d3 + d4 | d5) | (d6 + d7) + * + * @return [d1, d2, d3, d4, d5, d6, d7] + */ + @Override + public List decompose() { + if (subComplex == null) { + List deltaSequence = new ArrayList<>(); + deltaSequence.addAll(frontierDelta.decompose()); + return deltaSequence; + } + List deltaSequence = subComplex.decompose(); + deltaSequence.addAll(0, frontierDelta.decompose()); + return deltaSequence; + } + + /** + * merge operation (not add) + * + * if this = d1 | d2 | d3 | d5 and another = d1 | d4 | d5 + * then return d1 | ((d2 | d3) + d4) | d5 + * + * @param another + */ + public DeltaComplex merge(DeltaComplex another) { + // Compute LCS (Longest Common Subsequence) as anchors. + int i = 0; + HashMap anotherPosMap = new HashMap<>(); + List anotherSequence = another.split(); + Collections.reverse(anotherSequence); + for (DeltaExpression delta: anotherSequence) { + anotherPosMap.put(delta, i); + i++; + } + // Compute LIS (Longest Increasing Subsequence) in positions. + List anotherPositions = new ArrayList<>(); + int j = 0; + HashMap thisPosMap = new HashMap<>(); + List thisSequence = this.split(); + Collections.reverse(thisSequence); + for (DeltaExpression delta: thisSequence) { + thisPosMap.put(delta, j); + j++; + Integer pos = anotherPosMap.get(delta); + if (pos != null) { + anotherPositions.add(pos); + } + } + int tails[] = new int[anotherPositions.size()]; + int tailValues[] = new int[anotherPositions.size()]; + int prev[] = new int[anotherPositions.size()]; + Arrays.fill(prev, -1); + int len = 0; + for (i = 0; i < anotherPositions.size(); i++) { + int pos = anotherPositions.get(i); + int index = Arrays.binarySearch(tailValues, 0, len, pos); + if (index < 0) { + index = -index - 1; + } + if (index > 0) { + prev[i] = tails[index - 1]; + } + tails[index] = i; + tailValues[index] = pos; + + if (index == len) { + len++; + } + } + List lis = new ArrayList<>(); + if (len > 0) { + for (i = tails[len - 1]; i >= 0; i = prev[i]) { + lis.add(anotherPositions.get(i)); + } + Collections.reverse(lis); + } + + DeltaComplex deltaComplex = null; + int anotherPrevPos = -1; + int thisPrevPos = -1; + for (int anotherPos: lis) { + DeltaExpression delta = anotherSequence.get(anotherPos); + int thisPos = thisPosMap.get(delta); + DeltaComplex leftComplex = null; + if (thisPos - thisPrevPos > 1) { + for (int ii = thisPrevPos + 1; ii < thisPos; ii++) { + DeltaExpression thisDelta = thisSequence.get(ii); + leftComplex = new DeltaComplex(thisDelta, leftComplex); + } + } + DeltaComplex rightComplex = null; + if (anotherPos - anotherPrevPos > 1) { + for (int jj = anotherPrevPos + 1; jj < anotherPos; jj++) { + DeltaExpression anotherDelta = anotherSequence.get(jj); + rightComplex = new DeltaComplex(anotherDelta, rightComplex); + } + } + if (leftComplex != null && rightComplex != null) { + deltaComplex = new DeltaComplex(new DeltaSum(leftComplex, rightComplex), deltaComplex); + } else if (leftComplex != null) { + deltaComplex = new DeltaComplex(leftComplex, deltaComplex); + } else if (rightComplex != null) { + deltaComplex = new DeltaComplex(rightComplex, deltaComplex); + } + deltaComplex = new DeltaComplex(delta, deltaComplex); + anotherPrevPos = anotherPos; + thisPrevPos = thisPos; + } + DeltaComplex leftComplex = null; + if (thisSequence.size() - thisPrevPos > 1) { + for (int ii = thisPrevPos + 1; ii < thisSequence.size(); ii++) { + DeltaExpression thisDelta = thisSequence.get(ii); + leftComplex = new DeltaComplex(thisDelta, leftComplex); + } + } + DeltaComplex rightComplex = null; + if (anotherSequence.size() - anotherPrevPos > 1) { + for (int jj = anotherPrevPos + 1; jj < anotherSequence.size(); jj++) { + DeltaExpression anotherDelta = anotherSequence.get(jj); + rightComplex = new DeltaComplex(anotherDelta, rightComplex); + } + } + if (leftComplex != null && rightComplex != null) { + deltaComplex = new DeltaComplex(new DeltaSum(leftComplex, rightComplex), deltaComplex); + } else if (leftComplex != null) { + deltaComplex = new DeltaComplex(leftComplex, deltaComplex); + } else if (rightComplex != null) { + deltaComplex = new DeltaComplex(rightComplex, deltaComplex); + } + this.frontierDelta = deltaComplex.frontierDelta; + this.subComplex = deltaComplex.subComplex; + return this; + } + + @Override + public DeltaComplex copy() { + if (subComplex == null) { + return new DeltaComplex(frontierDelta.copy()); + } + return new DeltaComplex(frontierDelta.copy(), subComplex.copy()); + } + + public String toString() { + return frontierDelta.toString() + (subComplex == null ? "" : " | " + subComplex.toString()); + } +} diff --git a/src/main/java/models/deltaAlgebra/DeltaExpression.java b/src/main/java/models/deltaAlgebra/DeltaExpression.java new file mode 100644 index 0000000..2b1b890 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaExpression.java @@ -0,0 +1,8 @@ +package models.deltaAlgebra; + +import java.util.List; + +abstract public class DeltaExpression { + abstract public List decompose(); + abstract public DeltaExpression copy(); +} diff --git a/src/main/java/models/deltaAlgebra/DeltaProduct.java b/src/main/java/models/deltaAlgebra/DeltaProduct.java new file mode 100644 index 0000000..e0883f2 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaProduct.java @@ -0,0 +1,43 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; + +public class DeltaProduct extends DeltaCombination { + private DeltaExpression left; + private DeltaExpression right; + + public DeltaProduct(DeltaExpression left, DeltaExpression right) { + this.left = left; + this.right = right; + } + + @Override + public List decompose() { + List deltas = new ArrayList<>(left.decompose()); + deltas.addAll(right.decompose()); + return deltas; + } + + @Override + public DeltaProduct copy() { + return new DeltaProduct(left.copy(), right.copy()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof DeltaProduct)) return false; + DeltaProduct another = (DeltaProduct) o; + return left.equals(another.left) && right.equals(another.right); + } + + @Override + public int hashCode() { + return left.hashCode() + right.hashCode(); + } + + public String toString() { + return left.toString() + " x " + right.toString(); + } +} diff --git a/src/main/java/models/deltaAlgebra/DeltaSimplex.java b/src/main/java/models/deltaAlgebra/DeltaSimplex.java new file mode 100644 index 0000000..e890c17 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaSimplex.java @@ -0,0 +1,64 @@ +package models.deltaAlgebra; + +import java.util.List; + +/** + * A composed closed delta + * + * @author Nitta + * + */public class DeltaSimplex extends DeltaExpression { + private Delta delta; + + public DeltaSimplex(Delta delta) { + this.delta = delta; + } + + public DeltaSum add(DeltaExpression expression) { + return new DeltaSum(this, expression); + } + + public DeltaProduct mul(DeltaExpression expression) { + return new DeltaProduct(this, expression); + } + + /** + * if this = d1 o d2 o ... o dn + * + * @return d1 | d2 | ... | dn + **/ + public DeltaComplex flatten() { + DeltaComplex flattenComplex = null; + for (PrimitiveDelta primDelta: delta.split().reversed()) { + flattenComplex = new DeltaComplex(new Delta(primDelta), flattenComplex); + } + return flattenComplex; + } + + @Override + public List decompose() { + return List.of(delta); + } + + @Override + public DeltaSimplex copy() { + return new DeltaSimplex(delta.copy()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof DeltaSimplex)) return false; + DeltaSimplex another = (DeltaSimplex) o; + return delta.equals(another.delta); + } + + @Override + public int hashCode() { + return delta.hashCode(); + } + + public String toString() { + return "tau_C(" + delta.toString() + ")"; + } +} diff --git a/src/main/java/models/deltaAlgebra/DeltaSum.java b/src/main/java/models/deltaAlgebra/DeltaSum.java new file mode 100644 index 0000000..fc41790 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/DeltaSum.java @@ -0,0 +1,60 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; + +public class DeltaSum extends DeltaCombination { + private List components; + + public DeltaSum(DeltaExpression left, DeltaExpression right) { + this.components = new ArrayList<>(); + this.components.add(left); + this.components.add(right); + } + + public DeltaSum(List components) { + this.components = components; + } + + public DeltaSum add(DeltaExpression expression) { + components.add(expression); + return this; + } + + @Override + public List decompose() { + List deltas = new ArrayList<>(); + for (DeltaExpression component : components) { + deltas.addAll(component.decompose()); + } + return deltas; + } + + @Override + public DeltaSum copy() { + return new DeltaSum(new ArrayList<>(components)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof DeltaSum)) return false; + DeltaSum another = (DeltaSum) o; + return components.equals(another.components); + } + + @Override + public int hashCode() { + return components.hashCode(); + } + + public String toString() { + String str = ""; + String operator = ""; + for (DeltaExpression component : components) { + str += operator + component.toString(); + operator = " + "; + } + return str; + } +} \ No newline at end of file diff --git a/src/main/java/models/deltaAlgebra/MultiplicityValue.java b/src/main/java/models/deltaAlgebra/MultiplicityValue.java new file mode 100644 index 0000000..46563b3 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/MultiplicityValue.java @@ -0,0 +1,23 @@ +package models.deltaAlgebra; + +public enum MultiplicityValue { + OneToOne, + OneToMany, + ManyToOne, + ManyToMany; + + public String toString() { + switch (this) { + case OneToOne: + return "1:1"; + case OneToMany: + return "1:*"; + case ManyToOne: + return "*:1"; + case ManyToMany: + return "*:*"; + default: + return ""; + } + } +} diff --git a/src/main/java/models/deltaAlgebra/ObjectNode.java b/src/main/java/models/deltaAlgebra/ObjectNode.java new file mode 100644 index 0000000..75dc2c8 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/ObjectNode.java @@ -0,0 +1,23 @@ +package models.deltaAlgebra; + +import models.Node; + +public class ObjectNode extends Node { + protected String name; + + public ObjectNode(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String toString() { + return name; + } +} diff --git a/src/main/java/models/deltaAlgebra/PrimitiveDelta.java b/src/main/java/models/deltaAlgebra/PrimitiveDelta.java new file mode 100644 index 0000000..9a85921 --- /dev/null +++ b/src/main/java/models/deltaAlgebra/PrimitiveDelta.java @@ -0,0 +1,38 @@ +package models.deltaAlgebra; + +import java.util.List; + +/** + * A primitive open/closed delta, which is a minimal program fragment to transfer a reference. + * + * @author Nitta + * + */ +abstract public class PrimitiveDelta { + protected String dataName; + + public PrimitiveDelta(String dataName) { + this.dataName = dataName; + } + + abstract public ObjectNode getCoordinator(); + + abstract public List getPullEdges(); + + abstract public List getPushEdges(); + + abstract public ReferenceEdge getDefinedEdge(); + + abstract public ObjectNode getDataType(); + + public String getDataName() { + return dataName; + } + + abstract public PrimitiveDelta copy(); + + @Override + public String toString() { + return "Delta[" + getDefinedEdge().getSource().toString() + "->" + getDefinedEdge().getDestination().toString() + "]"; + } +} diff --git a/src/main/java/models/deltaAlgebra/PrimitivePullDelta.java b/src/main/java/models/deltaAlgebra/PrimitivePullDelta.java new file mode 100644 index 0000000..59c17ff --- /dev/null +++ b/src/main/java/models/deltaAlgebra/PrimitivePullDelta.java @@ -0,0 +1,71 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PrimitivePullDelta extends PrimitiveDelta { + private ReferenceEdge pullEdge1 = null; + private ReferenceEdge pullEdge2 = null; + + public PrimitivePullDelta(ReferenceEdge pullEdge1, ReferenceEdge pullEdge2, String dataName) { + super(dataName); + this.pullEdge1 = pullEdge1; + this.pullEdge2 = pullEdge2; + } + + @Override + public ObjectNode getCoordinator() { + return (ObjectNode) pullEdge1.getSource(); + } + + @Override + public List getPullEdges() { + List pullEdges = new ArrayList<>(); + pullEdges.add(pullEdge1); + pullEdges.add(pullEdge2); + return pullEdges; + } + + @Override + public List getPushEdges() { + List pushEdges = new ArrayList<>(); + return pushEdges; + } + + @Override + public ReferenceEdge getDefinedEdge() { + return new ReferenceEdge((ObjectNode) pullEdge1.getSource(), (ObjectNode) pullEdge2.getDestination(), dataName, pullEdge2.getMultiplicity()); + } + + @Override + public ObjectNode getDataType() { + return (ObjectNode) pullEdge2.getDestination(); + } + + public ReferenceEdge getPullEdge1() { + return pullEdge1; + } + + public ReferenceEdge getPullEdge2() { + return pullEdge2; + } + + @Override + public PrimitivePullDelta copy() { + return new PrimitivePullDelta(pullEdge1, pullEdge2, dataName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof PrimitivePullDelta)) return false; + PrimitivePullDelta another = (PrimitivePullDelta) o; + return pullEdge1.equals(another.pullEdge1) && pullEdge2.equals(another.pullEdge2); + } + + @Override + public int hashCode() { + return Objects.hash(pullEdge1.hashCode(), pullEdge2.hashCode()); + } +} diff --git a/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java b/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java new file mode 100644 index 0000000..ded83ce --- /dev/null +++ b/src/main/java/models/deltaAlgebra/PrimitivePullPushDelta.java @@ -0,0 +1,71 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PrimitivePullPushDelta extends PrimitiveDelta { + private ReferenceEdge pullEdge = null; + private ReferenceEdge pushEdge = null; + + public PrimitivePullPushDelta(ReferenceEdge pullEdge, ReferenceEdge pushEdge, String dataName) { + super(dataName); + this.pullEdge = pullEdge; + this.pushEdge = pushEdge; + } + + @Override + public ObjectNode getCoordinator() { + return (ObjectNode) pushEdge.getSource(); + } + + @Override + public List getPullEdges() { + List pullEdges = new ArrayList<>(); + pullEdges.add(pullEdge); + return pullEdges; + } + + @Override + public List getPushEdges() { + List pushEdges = new ArrayList<>(); + pushEdges.add(pushEdge); + return pushEdges; + } + + @Override + public ReferenceEdge getDefinedEdge() { + return new ReferenceEdge((ObjectNode) pushEdge.getDestination(), (ObjectNode) pullEdge.getDestination(), dataName, pullEdge.getMultiplicity()); + } + + @Override + public ObjectNode getDataType() { + return (ObjectNode) pullEdge.getDestination(); + } + + public ReferenceEdge getPullEdge() { + return pullEdge; + } + + public ReferenceEdge getPushEdge() { + return pushEdge; + } + + @Override + public PrimitivePullPushDelta copy() { + return new PrimitivePullPushDelta(pullEdge, pushEdge, dataName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof PrimitivePullPushDelta)) return false; + PrimitivePullPushDelta another = (PrimitivePullPushDelta) o; + return pullEdge.equals(another.pullEdge) && pushEdge.equals(another.pushEdge); + } + + @Override + public int hashCode() { + return Objects.hash(pullEdge.hashCode(), pushEdge.hashCode()); + } +} diff --git a/src/main/java/models/deltaAlgebra/PrimitivePushDelta.java b/src/main/java/models/deltaAlgebra/PrimitivePushDelta.java new file mode 100644 index 0000000..4c5a2be --- /dev/null +++ b/src/main/java/models/deltaAlgebra/PrimitivePushDelta.java @@ -0,0 +1,71 @@ +package models.deltaAlgebra; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PrimitivePushDelta extends PrimitiveDelta { + private ReferenceEdge pushEdge1 = null; + private ReferenceEdge pushEdge2 = null; + + public PrimitivePushDelta(ReferenceEdge pushEdge1, ReferenceEdge pushEdge2, String dataName) { + super(dataName); + this.pushEdge1 = pushEdge1; + this.pushEdge2 = pushEdge2; + } + + @Override + public ObjectNode getCoordinator() { + return (ObjectNode) pushEdge1.getSource(); + } + + @Override + public List getPullEdges() { + List pullEdges = new ArrayList<>(); + return pullEdges; + } + + @Override + public List getPushEdges() { + List pushEdges = new ArrayList<>(); + pushEdges.add(pushEdge1); + pushEdges.add(pushEdge2); + return pushEdges; + } + + @Override + public ReferenceEdge getDefinedEdge() { + return new ReferenceEdge((ObjectNode) pushEdge2.getDestination(), (ObjectNode) pushEdge1.getSource(), dataName); + } + + @Override + public ObjectNode getDataType() { + return (ObjectNode) pushEdge1.getSource(); + } + + public ReferenceEdge getPushEdge1() { + return pushEdge1; + } + + public ReferenceEdge getPushEdge2() { + return pushEdge2; + } + + @Override + public PrimitivePushDelta copy() { + return new PrimitivePushDelta(pushEdge1, pushEdge2, dataName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof PrimitivePushDelta)) return false; + PrimitivePushDelta another = (PrimitivePushDelta) o; + return pushEdge1.equals(another.pushEdge1) && pushEdge2.equals(another.pushEdge2); + } + + @Override + public int hashCode() { + return Objects.hash(pushEdge1.hashCode(), pushEdge2.hashCode()); + } +} diff --git a/src/main/java/models/deltaAlgebra/ReferenceEdge.java b/src/main/java/models/deltaAlgebra/ReferenceEdge.java new file mode 100644 index 0000000..6ca3c2a --- /dev/null +++ b/src/main/java/models/deltaAlgebra/ReferenceEdge.java @@ -0,0 +1,71 @@ +package models.deltaAlgebra; + +import models.Edge; + +import java.util.Objects; + +public class ReferenceEdge extends Edge { + protected String name; + protected MultiplicityValue multiplicity; + protected String keyTypeName = null; + + public ReferenceEdge(ObjectNode src, ObjectNode dst, String name) { + super(src, dst); + this.name = name; + this.multiplicity = MultiplicityValue.OneToOne; + } + + public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, MultiplicityValue multiplicity) { + super(src, dst); + this.name = name; + this.multiplicity = multiplicity; + } + + public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, String keyTypeName) { + super(src, dst); + this.name = name; + this.multiplicity = MultiplicityValue.OneToMany; + this.keyTypeName = keyTypeName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public MultiplicityValue getMultiplicity() { + return multiplicity; + } + + public void setMultiplicity(MultiplicityValue multiplicity) { + this.multiplicity = multiplicity; + } + + public boolean toMany() { + return multiplicity == MultiplicityValue.OneToMany || multiplicity == MultiplicityValue.ManyToMany; + } + + public String getKeyTypeName() { + return keyTypeName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || !(o instanceof ReferenceEdge)) return false; + ReferenceEdge another = (ReferenceEdge) o; + if (!(another.getSource() instanceof ObjectNode) || !(another.getDestination() instanceof ObjectNode)) + return false; + ObjectNode src = (ObjectNode) another.getSource(); + ObjectNode dst = (ObjectNode) another.getDestination(); + return name.equals(another.name) && ((ObjectNode) source).getName().equals(src.getName()) && ((ObjectNode) destination).getName().equals(dst.getName()); + } + + @Override + public int hashCode() { + return Objects.hash(name.hashCode(), ((ObjectNode) source).getName().hashCode(), ((ObjectNode) destination).getName().hashCode()); + } +} \ No newline at end of file diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java b/src/main/java/models/objectOrientedTransfer/DataTransferContext.java index 32488cf..522a336 100644 --- a/src/main/java/models/objectOrientedTransfer/DataTransferContext.java +++ b/src/main/java/models/objectOrientedTransfer/DataTransferContext.java @@ -1,5 +1,8 @@ package models.objectOrientedTransfer; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; import parser.ArrayValue; import parser.JsonValue; import parser.StringValue; diff --git a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java index 312ce3b..65ba9b5 100644 --- a/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java +++ b/src/main/java/models/objectOrientedTransfer/DataTransferDesign.java @@ -4,6 +4,7 @@ import designPatternExtensions.MediatorInsertion; import designPatternExtensions.PresenterInsertion; +import models.deltaAlgebra.*; import parser.*; import parser.exceptions.ExpectedJsonValue; @@ -293,7 +294,7 @@ public void addTransferContext(DataTransferContext transferContext) throws IllegalRelationException { transferContexts.add(transferContext); - deltaComplex.mergeFront(createDefaultDeltaComlex(transferContext)); + deltaComplex.merge(createDefaultDeltaComlex(transferContext)); } public List getTransferContexts() { diff --git a/src/main/java/models/objectOrientedTransfer/Delta.java b/src/main/java/models/objectOrientedTransfer/Delta.java deleted file mode 100644 index 8f83631..0000000 --- a/src/main/java/models/objectOrientedTransfer/Delta.java +++ /dev/null @@ -1,96 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.ArrayList; -import java.util.List; - -/** - * A closed delta, which is executable on some preconditions. - * - * @author Nitta - * - */ -public class Delta { - private PrimitiveDelta bottomDelta = null; - private Delta subDelta = null; - - public Delta(PrimitiveDelta delta) { - bottomDelta = delta; - } - - public Delta(PrimitiveDelta bottomDelta, Delta subDelta) { - this.bottomDelta = bottomDelta; - this.subDelta = subDelta; - } - - public ObjectNode getCoordinator() { - if (subDelta == null) return bottomDelta.getCoordinator(); - return subDelta.getCoordinator(); - } - - public List getPullEdges() { - if (subDelta == null) return bottomDelta.getPullEdges(); - List pullEdges = new ArrayList<>(subDelta.getPullEdges()); - pullEdges.addAll(bottomDelta.getPullEdges()); - return pullEdges; - } - - public List getPushEdges() { - if (subDelta == null) return bottomDelta.getPushEdges(); - List pushEdges = new ArrayList<>(subDelta.getPushEdges()); - pushEdges.addAll(bottomDelta.getPushEdges()); - return pushEdges; - } - - /** - * binding composition - * (this o delta) - * - * @param delta - * @return this o delta - */ - public Delta combine(PrimitiveDelta delta) { - return new Delta(delta, this); - } - - /** - * binding composition - * (this o delta) - * - * @param delta - * @return this o delta - */ - public Delta combine(Delta delta) { - Delta preDelta = this.copy(); - for (PrimitiveDelta atomicDelta: delta.split()) { - preDelta = preDelta.combine(atomicDelta); - } - return preDelta; - } - - /** - * if this = d1 o d2 o ... o dn - * - * @return [d1, d2, ..., dn] - */ - public List split() { - if (subDelta == null) { - List atomicDeltaSequence = new ArrayList<>(); - atomicDeltaSequence.add(bottomDelta); - return atomicDeltaSequence; - } - List atomicDeltaSequence = subDelta.split(); - atomicDeltaSequence.add(bottomDelta); - return atomicDeltaSequence; - } - - public Delta copy() { - if (subDelta == null) { - return new Delta(bottomDelta.copy()); - } - 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 deleted file mode 100644 index a26c0d2..0000000 --- a/src/main/java/models/objectOrientedTransfer/DeltaComplex.java +++ /dev/null @@ -1,106 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.ArrayList; -import java.util.List; - -/** - * A dependency-composed closed delta - * - * @author Nitta - * - */ -public class DeltaComplex { - private Delta frontierDelta; - private DeltaComplex subComplex = null; - - public DeltaComplex(Delta delta) { - this.frontierDelta = delta; - } - - public DeltaComplex(Delta frontierDelta, DeltaComplex subComplex) { - this.frontierDelta = frontierDelta; - this.subComplex = subComplex; - } - - /** - * dependency chaining - * (this = delta | this) - * - * @param delta - */ - public void attach(Delta delta) { - this.subComplex = this.copy(); - this.frontierDelta = delta; - } - - /** - * if this = d1 | d2 | ... | dn - * and deltaComplex = c1 | c2 | ... | cm, - * this = c1 | c2 | ... | cm | d1 | d2 | ... | dn - */ - public void mergeFront(DeltaComplex deltaComplex) { - for (Delta delta: deltaComplex.split().reversed()) { - attach(delta); - } - } - - /** - * if this = d1 | d2 | ... | dn - * - * @return [d1, d2, ..., dn] - */ - public List split() { - if (subComplex == null) { - List deltaSequence = new ArrayList<>(); - deltaSequence.add(frontierDelta); - return deltaSequence; - } - List deltaSequence = subComplex.split(); - deltaSequence.add(0, frontierDelta); - return deltaSequence; - } - - /** - * if this = (d11 * d12 * ... * d1m1) | (d21 * d22 * ... * d2m2) | ... | (dn1 * dn2 * ... * dnmn) - * - * @return d11 | d12 | ... | d1m1 | d21 | d22 | ... | d2m2 | ... | dn1 | dn2 | ... | dnmn - **/ - public DeltaComplex flatten() { - DeltaComplex flattenComplex = subComplex; - if (flattenComplex != null) { - flattenComplex = flattenComplex.flatten(); - } - for (PrimitiveDelta primDelta: frontierDelta.split().reversed()) { - flattenComplex = new DeltaComplex(new Delta(primDelta), flattenComplex); - } - return flattenComplex; - } - - /** - * if this = d1 | d2 | ... | dn - * - * @return d1 * d2 * ... * dn - */ - public Delta collapse() { - Delta allDelta = null; - for (Delta delta: this.split()) { - if (allDelta == null) { - allDelta = delta; - } else { - allDelta = allDelta.combine(delta); - } - } - return allDelta; - } - - public DeltaComplex copy() { - if (subComplex == null) { - return new DeltaComplex(frontierDelta.copy()); - } - 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/MultiplicityValue.java b/src/main/java/models/objectOrientedTransfer/MultiplicityValue.java deleted file mode 100644 index 6af9ab1..0000000 --- a/src/main/java/models/objectOrientedTransfer/MultiplicityValue.java +++ /dev/null @@ -1,23 +0,0 @@ -package models.objectOrientedTransfer; - -public enum MultiplicityValue { - OneToOne, - OneToMany, - ManyToOne, - ManyToMany; - - public String toString() { - switch (this) { - case OneToOne: - return "1:1"; - case OneToMany: - return "1:*"; - case ManyToOne: - return "*:1"; - case ManyToMany: - return "*:*"; - default: - return ""; - } - } -} diff --git a/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java b/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java index cf8e86b..238185f 100644 --- a/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java +++ b/src/main/java/models/objectOrientedTransfer/ObjectHierarchy.java @@ -1,5 +1,8 @@ package models.objectOrientedTransfer; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/models/objectOrientedTransfer/ObjectNode.java b/src/main/java/models/objectOrientedTransfer/ObjectNode.java deleted file mode 100644 index 7d62d05..0000000 --- a/src/main/java/models/objectOrientedTransfer/ObjectNode.java +++ /dev/null @@ -1,23 +0,0 @@ -package models.objectOrientedTransfer; - -import models.Node; - -public class ObjectNode extends Node { - protected String name; - - public ObjectNode(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String toString() { - return name; - } -} diff --git a/src/main/java/models/objectOrientedTransfer/PrimitiveDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitiveDelta.java deleted file mode 100644 index 3c7099d..0000000 --- a/src/main/java/models/objectOrientedTransfer/PrimitiveDelta.java +++ /dev/null @@ -1,31 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.List; - -/** - * A primitive open/closed delta, which is a minimal program fragment to transfer a reference. - * - * @author Nitta - * - */ -abstract public class PrimitiveDelta { - protected String dataName; - - public PrimitiveDelta(String dataName) { - this.dataName = dataName; - } - - abstract public ObjectNode getCoordinator(); - - abstract public List getPullEdges(); - - abstract public List getPushEdges(); - - abstract public ObjectNode getDataType(); - - public String getDataName() { - return dataName; - } - - abstract public PrimitiveDelta copy(); -} diff --git a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java b/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java deleted file mode 100644 index 3b6d625..0000000 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullDelta.java +++ /dev/null @@ -1,56 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.ArrayList; -import java.util.List; - -public class PrimitivePullDelta extends PrimitiveDelta { - private ReferenceEdge pullEdge1 = null; - private ReferenceEdge pullEdge2 = null; - - public PrimitivePullDelta(ReferenceEdge pullEdge1, ReferenceEdge pullEdge2, String dataName) { - super(dataName); - this.pullEdge1 = pullEdge1; - this.pullEdge2 = pullEdge2; - } - - @Override - public ObjectNode getCoordinator() { - return (ObjectNode) pullEdge1.getSource(); - } - - @Override - public List getPullEdges() { - List pullEdges = new ArrayList<>(); - pullEdges.add(pullEdge1); - pullEdges.add(pullEdge2); - return pullEdges; - } - - @Override - public List getPushEdges() { - List pushEdges = new ArrayList<>(); - return pushEdges; - } - - @Override - public ObjectNode getDataType() { - return (ObjectNode) pullEdge2.getDestination(); - } - - public ReferenceEdge getPullEdge1() { - return pullEdge1; - } - - public ReferenceEdge getPullEdge2() { - return pullEdge2; - } - - public PrimitivePullDelta copy() { - 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 deleted file mode 100644 index 0e41d15..0000000 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePullPushDelta.java +++ /dev/null @@ -1,55 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.ArrayList; -import java.util.List; - -public class PrimitivePullPushDelta extends PrimitiveDelta { - private ReferenceEdge pullEdge = null; - private ReferenceEdge pushEdge = null; - - public PrimitivePullPushDelta(ReferenceEdge pullEdge, ReferenceEdge pushEdge, String dataName) { - super(dataName); - this.pullEdge = pullEdge; - this.pushEdge = pushEdge; - } - - @Override - public ObjectNode getCoordinator() { - return (ObjectNode) pushEdge.getSource(); - } - - @Override - public List getPullEdges() { - List pullEdges = new ArrayList<>(); - pullEdges.add(pullEdge); - return pullEdges; - } - - @Override - public List getPushEdges() { - List pushEdges = new ArrayList<>(); - pushEdges.add(pushEdge); - return pushEdges; - } - - @Override - public ObjectNode getDataType() { - return (ObjectNode) pullEdge.getDestination(); - } - - public ReferenceEdge getPullEdge() { - return pullEdge; - } - - public ReferenceEdge getPushEdge() { - return pushEdge; - } - - public PrimitivePullPushDelta copy() { - 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 deleted file mode 100644 index 14bbd4b..0000000 --- a/src/main/java/models/objectOrientedTransfer/PrimitivePushDelta.java +++ /dev/null @@ -1,56 +0,0 @@ -package models.objectOrientedTransfer; - -import java.util.ArrayList; -import java.util.List; - -public class PrimitivePushDelta extends PrimitiveDelta { - private ReferenceEdge pushEdge1 = null; - private ReferenceEdge pushEdge2 = null; - - public PrimitivePushDelta(ReferenceEdge pushEdge1, ReferenceEdge pushEdge2, String dataName) { - super(dataName); - this.pushEdge1 = pushEdge1; - this.pushEdge2 = pushEdge2; - } - - @Override - public ObjectNode getCoordinator() { - return (ObjectNode) pushEdge1.getSource(); - } - - @Override - public List getPullEdges() { - List pullEdges = new ArrayList<>(); - return pullEdges; - } - - @Override - public List getPushEdges() { - List pushEdges = new ArrayList<>(); - pushEdges.add(pushEdge1); - pushEdges.add(pushEdge2); - return pushEdges; - } - - @Override - public ObjectNode getDataType() { - return (ObjectNode) pushEdge1.getSource(); - } - - public ReferenceEdge getPushEdge1() { - return pushEdge1; - } - - public ReferenceEdge getPushEdge2() { - return pushEdge2; - } - - @Override - public PrimitivePushDelta copy() { - 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/ReferenceEdge.java b/src/main/java/models/objectOrientedTransfer/ReferenceEdge.java deleted file mode 100644 index 07e73f8..0000000 --- a/src/main/java/models/objectOrientedTransfer/ReferenceEdge.java +++ /dev/null @@ -1,52 +0,0 @@ -package models.objectOrientedTransfer; - -import models.Edge; - -public class ReferenceEdge extends Edge { - protected String name; - protected MultiplicityValue multiplicity; - protected String keyTypeName = null; - - public ReferenceEdge(ObjectNode src, ObjectNode dst, String name) { - super(src, dst); - this.name = name; - this.multiplicity = MultiplicityValue.OneToOne; - } - - public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, MultiplicityValue multiplicity) { - super(src, dst); - this.name = name; - this.multiplicity = multiplicity; - } - - public ReferenceEdge(ObjectNode src, ObjectNode dst, String name, String keyTypeName) { - super(src, dst); - this.name = name; - this.multiplicity = MultiplicityValue.OneToMany; - this.keyTypeName = keyTypeName; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public MultiplicityValue getMultiplicity() { - return multiplicity; - } - - public void setMultiplicity(MultiplicityValue multiplicity) { - this.multiplicity = multiplicity; - } - - public boolean toMany() { - return multiplicity == MultiplicityValue.OneToMany || multiplicity == MultiplicityValue.ManyToMany; - } - - public String getKeyTypeName() { - return keyTypeName; - } -} diff --git a/src/main/java/models/objectOrientedTransfer/Relation.java b/src/main/java/models/objectOrientedTransfer/Relation.java index dd21789..0f8d333 100644 --- a/src/main/java/models/objectOrientedTransfer/Relation.java +++ b/src/main/java/models/objectOrientedTransfer/Relation.java @@ -1,5 +1,9 @@ package models.objectOrientedTransfer; +import models.deltaAlgebra.MultiplicityValue; +import models.deltaAlgebra.ObjectNode; +import models.deltaAlgebra.ReferenceEdge; + import java.util.List; public class Relation { diff --git a/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java b/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java index 8a836ba..e0b09ec 100644 --- a/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java +++ b/src/main/java/models/objectOrientedTransfer/StatefulObjectNode.java @@ -1,6 +1,7 @@ package models.objectOrientedTransfer; import models.algebra.Symbol.Type; +import models.deltaAlgebra.ObjectNode; public class StatefulObjectNode extends ObjectNode { private Type stateType = null;