Newer
Older
MagnetRON / src / tests / MagnetRONFrameTest.java
  1. package tests;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Dimension;
  5. import java.awt.HeadlessException;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11.  
  12. import javax.swing.JFrame;
  13.  
  14. import org.ntlab.deltaExtractor.Alias;
  15. import org.ntlab.deltaExtractor.DeltaExtractorJSON;
  16. import org.ntlab.deltaExtractor.ExtractedStructure;
  17. import org.ntlab.deltaExtractor.IAliasCollector;
  18. import org.ntlab.deltaExtractor.IAliasTracker;
  19. import org.ntlab.deltaViewer.CollaborationAliasCollector;
  20. import org.ntlab.deltaViewer.CollaborationLayout;
  21. import org.ntlab.deltaViewer.CollaborationObjectCallGraph;
  22. import org.ntlab.deltaViewer.CollaborationViewer;
  23. import org.ntlab.deltaViewer.DeltaAliasCollector;
  24. import org.ntlab.trace.MethodExecution;
  25. import org.ntlab.trace.ObjectReference;
  26. import org.ntlab.trace.Reference;
  27. import org.ntlab.trace.ThreadInstance;
  28. import org.ntlab.trace.TraceJSON;
  29. import org.ntlab.trace.TracePoint;
  30.  
  31. /**
  32. *
  33. *
  34. * @author Nitta Lab.
  35. */
  36. class MagnetRONFrameTest extends JFrame {
  37. private static final long serialVersionUID = -230702457071082574L;
  38.  
  39. // Delta Extract Type
  40. protected static final String CONTAINER_COMPONENT = "Container-Component";
  41. protected static final String CONTAINER_COMPONENT_COLLECTION = "Container-Component(Collection)";
  42. protected static final String THIS_ANOTHER = "This-Another";
  43.  
  44. private static Dimension DEFAULT_SIZE = new Dimension(1300, 700);
  45. private static String WINDOW_TITLE = "Delta Viewer";
  46.  
  47. private CollaborationViewer viewer = null;
  48. private boolean visible = false;
  49.  
  50. public MagnetRONFrameTest() {
  51. }
  52. public MagnetRONFrameTest(boolean visible) throws HeadlessException {
  53. super(WINDOW_TITLE);
  54. setSize(DEFAULT_SIZE);
  55. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  56. setLayout(new BorderLayout());
  57. this.viewer = new CollaborationViewer();
  58. getContentPane().add(viewer, BorderLayout.CENTER);
  59. pack();
  60. this.visible = true;
  61. }
  62.  
  63. public void startAnimation() {
  64. if (visible) {
  65. // Change Here!
  66. // String key = "ArgoUMLDelete";
  67. String key = "ArgoUMLSelect";
  68. // String key = "getterOverlap";
  69. // String key = "setterOverlap";
  70. Map<ExtractedStructure, IAliasCollector> extractedMultipleDeltas = extractMultipleDeltas(key);
  71. List<ExtractedStructure> eList = new ArrayList<>(extractedMultipleDeltas.keySet());
  72. List<IAliasCollector> dacList = new ArrayList<>(extractedMultipleDeltas.values());
  73. CollaborationObjectCallGraph cocg = null;
  74. CollaborationAliasCollector cac = null;
  75. for (ExtractedStructure e: eList) {
  76. if (cocg == null) {
  77. cocg = new CollaborationObjectCallGraph(e);
  78. } else {
  79. cocg.merge(e);
  80. }
  81. }
  82. for (IAliasCollector dac: dacList) {
  83. if (cac == null) {
  84. cac = new CollaborationAliasCollector(dac);
  85. } else {
  86. cac.merge(dac, null);
  87. }
  88. }
  89. // new Thread() {
  90. // public void run() {
  91. startCollectionViewer(cocg, cac);
  92. // }
  93. // }.start();
  94. }
  95. }
  96.  
  97. public Map<ExtractedStructure, IAliasCollector> extractMultipleDeltas(String key) {
  98. Map<ExtractedStructure, IAliasCollector> extractedMultipleDeltas = new HashMap<>();
  99. Map<String, String[]> argsMap = new HashMap<>();
  100. setArgmentsForDeltaExtract(argsMap);
  101. Map<String, List<String>> argsKeysMap = new HashMap<>();
  102. setArgsKeysForMultipleDeltasExtract(argsKeysMap, argsMap);
  103. List<String> argsKeys = argsKeysMap.get(key);
  104. String firstKey = argsKeys.get(0);
  105. if (firstKey.contains(",")) {
  106. String[] splitKeys = firstKey.split(",");
  107. firstKey = splitKeys[0];
  108. }
  109. TraceJSON trace = new TraceJSON(argsMap.get(firstKey)[4]);
  110. DeltaExtractorJSON s = new DeltaExtractorJSON(trace);
  111.  
  112. for (String argsKey: argsKeys) {
  113. int index = 0;
  114. if (argsKey.contains(",")) {
  115. String[] splitKeys = argsKey.split(",");
  116. argsKey = splitKeys[0];
  117. index = Integer.parseInt(splitKeys[splitKeys.length - 1]);
  118. }
  119. List<ExtractedStructure> eList = new ArrayList<>();
  120. List<IAliasCollector> dacList = new ArrayList<>();
  121. if (argsMap.get(argsKey)[5] == CONTAINER_COMPONENT || argsMap.get(argsKey)[5] == CONTAINER_COMPONENT_COLLECTION) {
  122. HashMap<String, ThreadInstance> threads = trace.getAllThreads();
  123.  
  124. if (threads.values().size() == 1) {
  125. ThreadInstance thread = threads.values().iterator().next(); // 最後のスレッドを見ているだけ…
  126. TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint();
  127. Reference reference = new Reference(argsMap.get(argsKey)[0], argsMap.get(argsKey)[1], argsMap.get(argsKey)[2], argsMap.get(argsKey)[3]);
  128. IAliasTracker dac = new DeltaAliasCollector();
  129. ExtractedStructure e = s.extract(reference, tp, dac);
  130. eList.add(e);
  131. dacList.add(dac);
  132. } else {
  133. for (ThreadInstance thread: threads.values()) {
  134. TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint();
  135. Reference reference = new Reference(argsMap.get(argsKey)[0], argsMap.get(argsKey)[1], argsMap.get(argsKey)[2], argsMap.get(argsKey)[3]);
  136. if (argsMap.get(argsKey)[5] == CONTAINER_COMPONENT_COLLECTION) {
  137. reference.setCollection(true);
  138. }
  139. // reference.setArray(true);
  140. // reference.setFinalLocal(true);
  141. // reference.setCreation(true);
  142. ExtractedStructure e = null;
  143. do {
  144. if (e == null) {
  145. IAliasTracker dac = new DeltaAliasCollector();
  146. e = s.extract(reference, tp, dac);
  147. System.out.println(e);
  148. if (e != null) {
  149. eList.add(e);
  150. dacList.add(dac);
  151. System.out.println("add" + eList.size() + ", " + dacList.size());
  152. System.out.println(e);
  153. }
  154. System.out.println("---------------------------");
  155. } else {
  156. tp = e.getRelatedTracePoint().duplicate();
  157. tp.stepBackOver();
  158. IAliasTracker dac = new DeltaAliasCollector();
  159. e = s.extract(reference, tp, dac);
  160. System.out.println(e);
  161. if (e != null) {
  162. eList.add(e);
  163. dacList.add(dac);
  164. System.out.println("add" + eList.size() + ", " + dacList.size());
  165. System.out.println(e);
  166. }
  167. System.out.println("---------------------------");
  168. }
  169. } while (e != null);
  170. }
  171. }
  172. } else {
  173. IAliasTracker dac = new DeltaAliasCollector();
  174. MethodExecution me = trace.getLastMethodExecution(argsMap.get(argsKey)[2]);
  175. Map<ObjectReference, TracePoint> refs = me.getObjectReferences(argsMap.get(argsKey)[3]);
  176. ObjectReference ref = refs.keySet().iterator().next();
  177. ExtractedStructure e = s.extract(refs.get(ref), ref, dac);
  178. eList.add(e);
  179. dacList.add(dac);
  180. }
  181. extractedMultipleDeltas.put(eList.get(index), dacList.get(index));
  182. }
  183. return extractedMultipleDeltas;
  184. }
  185. public void startCollectionViewer(CollaborationObjectCallGraph cocg, IAliasCollector cac) {
  186. List<Alias> aliasList = new ArrayList<>(cac.getAliasList());
  187. if(cocg != null) {
  188. List<TracePoint> relatedPoints = cocg.getRelatedPoints();
  189. TracePoint relatedPoint = relatedPoints.get(relatedPoints.size()-1);
  190. // if (srcSide.size() >= 1 && dstSide.size() >= 1) {
  191. // WINDOW_TITLE = "extract delta of:" + e.getDelta().getSrcSide().get(0).getDstClassName() + "(" + e.getDelta().getSrcSide().get(0).getDstObjectId() + ")" + " -> " + e.getDelta().getDstSide().get(0).getDstClassName() + "(" + e.getDelta().getDstSide().get(0).getDstObjectId() + ")";
  192. // setTitle(WINDOW_TITLE);
  193. // }
  194. }
  195. viewer.init(cocg, cac, new CollaborationLayout());
  196. viewer.initAnimation();
  197. for (int i = 0; i <= aliasList.size(); i++) {
  198. viewer.stepToAnimation(i);
  199. }
  200. }
  201.  
  202. private void setArgmentsForDeltaExtract(Map<String, String[]> map){
  203. // Samples of Multiple Deltas
  204. String[] getterOverlap1 = {null, null, "getterOverlap.F","getterOverlap.D", "traces/getterOverlap.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap1", getterOverlap1);
  205. String[] getterOverlap2 = {null, null, "getterOverlap.G","getterOverlap.D", "traces/getterOverlap.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap2", getterOverlap2);
  206. String[] setterOverlap1 = {null, null, "setterOverlap.F","setterOverlap.C", "traces/setterOverlap.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("setterOverlap1", setterOverlap1);
  207. String[] setterOverlap2 = {null, null, "setterOverlap.G","setterOverlap.C", "traces/setterOverlap.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("setterOverlap2", setterOverlap2);
  208. // MagnetRON Experiment
  209. String[] ArgoUMLDelete1 = {null, null, "public void org.argouml.uml.diagram.ui.ActionRemoveFromDiagram.actionPerformed(", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", THIS_ANOTHER}; map.put("ArgoUMLDelete1", ArgoUMLDelete1);// ArgoUML 削除機能1 (this to another)
  210. String[] ArgoUMLDelete2 = {"450474599", "1675174935", "java.util.Vector", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("ArgoUMLDelete2", ArgoUMLDelete2); // ArgoUML 削除機能2 (collection)
  211. String[] ArgoUMLSelect1 = {"125345735", "1672744985", "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.SelectionClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("ArgoUMLSelect1", ArgoUMLSelect1); // ArgoUML 選択機能 (collection)
  212. String[] ArgoUMLSelect2 = {"1672744985", "1675174935", "org.argouml.uml.diagram.static_structure.ui.SelectionClass", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLSelect2", ArgoUMLSelect2);// ArgoUML 選択機能2
  213. String[] JHotDrawTransform = {"176893671", "1952912699", "java.util.HashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawTransform", JHotDrawTransform); // JHotDraw 移動機能 (collection)
  214. String[] JHotDrawSelect1 = {"758826749", "1952912699", "org.jhotdraw.draw.tool.DefaultDragTracker", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("JHotDrawSelect1", JHotDrawSelect1); // JHotDraw 選択機能1
  215. String[] JHotDrawSelect2 = {"1378082106", "1952912699", "java.util.HashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect2", JHotDrawSelect2); // JHotDraw 選択機能2 (collection)
  216. String[] JHotDrawSelect3 = {"599587451", "758826749", "org.jhotdraw.draw.tool.DelegationSelectionTool", "org.jhotdraw.draw.tool.DefaultDragTracker", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("JHotDrawSelect3", JHotDrawSelect3); // JHotDraw 選択機能3 (collection)
  217. String[] JHotDrawSelect4 = {"1787265837", "1952912699", "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect4", JHotDrawSelect4); // JHotDraw 選択機能4 (collection)
  218. }
  219. private void setArgsKeysForMultipleDeltasExtract(Map<String, List<String>> argsKeysMap, Map<String, String[]> argsMap){
  220. // Samples of Multiple Deltas
  221. argsKeysMap.put("getterOverlap", new ArrayList<String>(Arrays.asList("getterOverlap2", "getterOverlap1")));
  222. argsKeysMap.put("setterOverlap", new ArrayList<String>(Arrays.asList("setterOverlap1", "setterOverlap2")));
  223. argsKeysMap.put("ArgoUMLDelete", new ArrayList<String>(Arrays.asList("ArgoUMLDelete1", "ArgoUMLDelete2")));
  224. argsKeysMap.put("ArgoUMLSelect", new ArrayList<String>(Arrays.asList("ArgoUMLSelect1", "ArgoUMLSelect2")));
  225. argsKeysMap.put("JHotDrawTransform", new ArrayList<String>(Arrays.asList("JHotDrawTransform")));
  226. argsKeysMap.put("JHotDrawSelect", new ArrayList<String>(Arrays.asList("JHotDrawSelect1,1", "JHotDrawSelect2", "JHotDrawSelect3,1", "JHotDrawSelect4")));
  227. }
  228. }