diff --git a/src/org/ntlab/deltaViewer/CollaborationObjectCallGraph.java b/src/org/ntlab/deltaViewer/CollaborationObjectCallGraph.java index fff5242..6f3a808 100644 --- a/src/org/ntlab/deltaViewer/CollaborationObjectCallGraph.java +++ b/src/org/ntlab/deltaViewer/CollaborationObjectCallGraph.java @@ -7,11 +7,14 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import java.util.stream.Collectors; import org.ntlab.deltaExtractor.ExtractedStructure; import org.ntlab.trace.MethodExecution; import org.ntlab.trace.MethodInvocation; +import org.ntlab.trace.ObjectReference; import org.ntlab.trace.Reference; import org.ntlab.trace.Statement; import org.ntlab.trace.TracePoint; @@ -25,12 +28,14 @@ private Set references = new HashSet<>(); private List startPoints = new ArrayList<>(); // Common ancestor point private List relatedPoints = new ArrayList<>(); + private SortedSet timeStamps = new TreeSet<>(); // List of time stamps of related points public CollaborationObjectCallGraph(ExtractedStructure e) { references.addAll(e.getDelta().getSrcSide()); references.addAll(e.getDelta().getDstSide()); startPoints.add(e.getCoordinator()); relatedPoints.add(e.getRelatedTracePoint().duplicate()); + timeStamps.add(getTimeStampOfRelatedPoint(e.getRelatedTracePoint(), e)); } @Override @@ -53,6 +58,11 @@ return null; } + @Override + public SortedSet getTimeStamps() { + return timeStamps; + } + /** * Merge ExtractedStructure not to overlap reference. * @@ -117,10 +127,12 @@ startPoints.clear(); startPoints.add(lca); - // Is it in time stamp order? TracePoint otherRelatedTp = e.getRelatedTracePoint().duplicate(); - relatedPoints.add(otherRelatedTp); - relatedPoints = sortTracePointByTimeStamp(relatedPoints); + long rpTimeStamp = getTimeStampOfRelatedPoint(otherRelatedTp, e); + int idx = timeStamps.headSet(rpTimeStamp).size(); + relatedPoints.add(idx, otherRelatedTp); + timeStamps.add(rpTimeStamp); +// relatedPoints = sortTracePointByTimeStamp(relatedPoints); } /** @@ -147,6 +159,23 @@ } return qTmp; } + + private Long getTimeStampOfRelatedPoint(TracePoint relatedTracePoint, ExtractedStructure e) { + ObjectReference targetObj = null; + if (e.getDelta().getDstSide().size() > 0) { + targetObj = e.getDelta().getDstSide().get(0).getDstObject(); + } else { + targetObj = new ObjectReference(e.getCoordinator().getThisObjId(), e.getCoordinator().getThisClassName()); + } + if (relatedTracePoint.isMethodEntry() && relatedTracePoint.getMethodExecution().getArguments().contains(targetObj)) { + return relatedTracePoint.getMethodExecution().getEntryTime(); + } + if (relatedTracePoint.getStatement() instanceof MethodInvocation) { + return ((MethodInvocation) relatedTracePoint.getStatement()).getCalledMethodExecution().getExitTime(); + } else { + return relatedTracePoint.getStatement().getTimeStamp(); + } + } /** * Sort TracePoint in time stamp order. diff --git a/src/org/ntlab/deltaViewer/CollaborationViewer.java b/src/org/ntlab/deltaViewer/CollaborationViewer.java index b2b0cf8..10fc087 100644 --- a/src/org/ntlab/deltaViewer/CollaborationViewer.java +++ b/src/org/ntlab/deltaViewer/CollaborationViewer.java @@ -99,12 +99,15 @@ if (numFrameAlias != null) { if (curFrameAlias != null) { - for (TracePoint rp: relatedPoints) { - if (curFrameAlias.getTimeStamp() < rp.getStatement().getTimeStamp() && rp.getStatement().getTimeStamp() < numFrameAlias.getTimeStamp()) { + int i = 0; + for (Long rpTime:objectCallGraph.getTimeStamps()) { + if (curFrameAlias.getTimeStamp() <= rpTime && rpTime < numFrameAlias.getTimeStamp()) { System.out.println("\r\n" + TAG + ": Last Animation."); + TracePoint rp = relatedPoints.get(i); doLastAnimation(numFrame, rp); return; } + i++; } } doAnimation(curFrame, numFrame); diff --git a/src/org/ntlab/deltaViewer/DeltaObjectCallGraph.java b/src/org/ntlab/deltaViewer/DeltaObjectCallGraph.java index b90d9f2..2983e6c 100644 --- a/src/org/ntlab/deltaViewer/DeltaObjectCallGraph.java +++ b/src/org/ntlab/deltaViewer/DeltaObjectCallGraph.java @@ -3,9 +3,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; import org.ntlab.deltaExtractor.ExtractedStructure; import org.ntlab.trace.MethodExecution; +import org.ntlab.trace.MethodInvocation; +import org.ntlab.trace.ObjectReference; import org.ntlab.trace.Reference; import org.ntlab.trace.TracePoint; @@ -13,12 +17,14 @@ private List references = new ArrayList<>(); private List startPoints = new ArrayList<>(); private List relatedPoints = new ArrayList<>(); + private SortedSet timeStamps = new TreeSet<>(); // List of time stamps of related points public DeltaObjectCallGraph(ExtractedStructure e) { references.addAll(e.getDelta().getSrcSide()); references.addAll(e.getDelta().getDstSide()); startPoints.add(e.getCoordinator()); relatedPoints.add(e.getRelatedTracePoint()); + timeStamps.add(getTimeStampOfRelatedPoint(e.getRelatedTracePoint(), e)); } @Override @@ -42,4 +48,26 @@ // TODO Auto-generated method stub return null; } + + @Override + public SortedSet getTimeStamps() { + return timeStamps; + } + + private Long getTimeStampOfRelatedPoint(TracePoint relatedTracePoint, ExtractedStructure e) { + ObjectReference targetObj = null; + if (e.getDelta().getDstSide().size() > 0) { + targetObj = e.getDelta().getDstSide().get(0).getDstObject(); + } else { + targetObj = new ObjectReference(e.getCoordinator().getThisObjId(), e.getCoordinator().getThisClassName()); + } + if (relatedTracePoint.isMethodEntry() && relatedTracePoint.getMethodExecution().getArguments().contains(targetObj)) { + return relatedTracePoint.getMethodExecution().getEntryTime(); + } + if (relatedTracePoint.getStatement() instanceof MethodInvocation) { + return ((MethodInvocation) relatedTracePoint.getStatement()).getCalledMethodExecution().getExitTime(); + } else { + return relatedTracePoint.getStatement().getTimeStamp(); + } + } } diff --git a/src/org/ntlab/deltaViewer/ForwardAliasCollector.java b/src/org/ntlab/deltaViewer/ForwardAliasCollector.java index f0d48e1..8782053 100644 --- a/src/org/ntlab/deltaViewer/ForwardAliasCollector.java +++ b/src/org/ntlab/deltaViewer/ForwardAliasCollector.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; import org.ntlab.deltaExtractor.Alias; import org.ntlab.deltaExtractor.Alias.AliasType; @@ -188,6 +190,7 @@ private List references = new ArrayList<>(); private List startPoints = new ArrayList<>(); private List relatedPoints = new ArrayList<>(); + private SortedSet timeStamps = new TreeSet<>(); // List of time stamps of related points public void addReference(Reference r) { if (!references.contains(r)) references.add(r); @@ -199,6 +202,7 @@ public void addRelatedPoint(TracePoint tp) { relatedPoints.add(tp); + timeStamps.add(tp.getStatement().getTimeStamp()); // Will not work when a formal parameter is passed and related to this object. } @Override @@ -220,6 +224,11 @@ public Map> getCallTree() { return null; } + + @Override + public SortedSet getTimeStamps() { + return null; + } } } diff --git a/src/org/ntlab/deltaViewer/IObjectCallGraph.java b/src/org/ntlab/deltaViewer/IObjectCallGraph.java index 91d7be5..8073ab5 100644 --- a/src/org/ntlab/deltaViewer/IObjectCallGraph.java +++ b/src/org/ntlab/deltaViewer/IObjectCallGraph.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.SortedSet; import org.ntlab.trace.MethodExecution; import org.ntlab.trace.Reference; @@ -17,6 +18,8 @@ List getStartPoints(); List getRelatedPoints(); + + SortedSet getTimeStamps(); Map> getCallTree(); }