From 6a3db3047f3bca2e381995b355c1f4e7a02cceee Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 29 Jan 2026 00:39:49 +0100 Subject: [PATCH 01/34] Large Scale Change: Unused Imports removed - Automatic Deletion of all unnecessary imports in use-gui with Copilot --- .../java/org/tzi/use/gui/graphlayout/AllLayoutTypes.java | 1 - .../java/org/tzi/use/gui/mainFX/CreateObjectDialog.java | 3 --- .../org/tzi/use/gui/mainFX/ResizableInternalWindow.java | 3 --- .../src/main/java/org/tzi/use/gui/mainFX/ViewFrame.java | 8 -------- .../src/main/java/org/tzi/use/gui/utilFX/StatusBar.java | 5 ----- .../java/org/tzi/use/gui/views/diagrams/DiagramView.java | 1 - .../diagrams/behavior/communicationdiagram/BaseNode.java | 1 - .../communicationdiagram/CommunicationDiagram.java | 3 --- .../communicationdiagram/CommunicationDiagramEdge.java | 1 - .../communicationdiagram/ShowRelatedObjectsPanel.java | 1 - .../communicationdiagram/ShowRelatedObjectsWindow.java | 1 - .../gui/views/diagrams/classdiagram/ClassDiagramView.java | 1 - .../views/diagrams/objectdiagram/NewObjectDiagram.java | 2 -- .../gui/views/diagrams/statemachine/TransitionEdge.java | 1 - 14 files changed, 32 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/graphlayout/AllLayoutTypes.java b/use-gui/src/main/java/org/tzi/use/gui/graphlayout/AllLayoutTypes.java index 0bde83626..dfcceb1ab 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/graphlayout/AllLayoutTypes.java +++ b/use-gui/src/main/java/org/tzi/use/gui/graphlayout/AllLayoutTypes.java @@ -12,7 +12,6 @@ import org.tzi.use.uml.mm.MAssociationClassImpl; import org.tzi.use.uml.sys.MLinkObject; -import javax.swing.*; import java.util.*; diff --git a/use-gui/src/main/java/org/tzi/use/gui/mainFX/CreateObjectDialog.java b/use-gui/src/main/java/org/tzi/use/gui/mainFX/CreateObjectDialog.java index 506debcf4..f8c9f3ecf 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/mainFX/CreateObjectDialog.java +++ b/use-gui/src/main/java/org/tzi/use/gui/mainFX/CreateObjectDialog.java @@ -25,9 +25,6 @@ import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.layout.GridPane; diff --git a/use-gui/src/main/java/org/tzi/use/gui/mainFX/ResizableInternalWindow.java b/use-gui/src/main/java/org/tzi/use/gui/mainFX/ResizableInternalWindow.java index de3b5d064..b98e71112 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/mainFX/ResizableInternalWindow.java +++ b/use-gui/src/main/java/org/tzi/use/gui/mainFX/ResizableInternalWindow.java @@ -14,7 +14,6 @@ import javafx.geometry.Pos; import javafx.print.*; import javafx.scene.Cursor; -import javafx.scene.Node; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -28,10 +27,8 @@ import javafx.stage.FileChooser; import javafx.stage.Window; import org.tzi.use.gui.views.diagrams.DiagramType; -import org.tzi.use.gui.views.diagrams.DiagramView; import org.tzi.use.gui.views.diagrams.behavior.communicationdiagram.CommunicationDiagramView; import org.tzi.use.gui.views.diagrams.behavior.sequencediagram.SequenceDiagramView; -import org.tzi.use.gui.views.diagrams.classdiagram.ClassDiagram; import org.tzi.use.gui.views.diagrams.classdiagram.ClassDiagramView; import org.tzi.use.gui.views.diagrams.objectdiagram.NewObjectDiagramView; import org.tzi.use.gui.views.diagrams.statemachine.StateMachineDiagramView; diff --git a/use-gui/src/main/java/org/tzi/use/gui/mainFX/ViewFrame.java b/use-gui/src/main/java/org/tzi/use/gui/mainFX/ViewFrame.java index b025e041d..4e79eb05d 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/mainFX/ViewFrame.java +++ b/use-gui/src/main/java/org/tzi/use/gui/mainFX/ViewFrame.java @@ -5,22 +5,14 @@ import javafx.print.PrinterJob; import javafx.scene.Node; import javafx.scene.SnapshotParameters; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.layout.BorderPane; -import javafx.scene.layout.Region; import javafx.scene.paint.Color; -import javafx.scene.shape.Rectangle; -import javafx.scene.SnapshotResult; -import javafx.scene.transform.Scale; -import org.tzi.use.config.Options; import org.tzi.use.gui.views.View; import org.tzi.use.gui.viewsFX.PrintableView; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.io.InputStream; /** * A JavaFX container holding a view of a system state. diff --git a/use-gui/src/main/java/org/tzi/use/gui/utilFX/StatusBar.java b/use-gui/src/main/java/org/tzi/use/gui/utilFX/StatusBar.java index 732ca8494..530d586a7 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/utilFX/StatusBar.java +++ b/use-gui/src/main/java/org/tzi/use/gui/utilFX/StatusBar.java @@ -27,11 +27,6 @@ import javafx.scene.layout.BorderPane; import javafx.util.Duration; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - /** * A StatusBar consisting of a single line of text. diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/DiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/DiagramView.java index 7f238dc3d..4685e0f93 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/DiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/DiagramView.java @@ -45,7 +45,6 @@ import org.tzi.use.gui.views.diagrams.waypoints.WayPoint; import org.tzi.use.main.runtime.IRuntime; import org.tzi.use.runtime.gui.IPluginDiagramExtensionPoint; -import org.tzi.use.runtime.gui.impl.DiagramExtensionPoint; import org.tzi.use.runtime.gui.impl.StyleInfoProvider; import org.tzi.use.util.Log; import org.w3c.dom.Document; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/BaseNode.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/BaseNode.java index f95d7613b..9bc701390 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/BaseNode.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/BaseNode.java @@ -27,7 +27,6 @@ import org.tzi.use.gui.views.diagrams.DiagramOptionChangedListener; import org.tzi.use.gui.views.diagrams.DiagramOptions; -import org.tzi.use.gui.views.diagrams.behavior.shared.VisibleData; import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; import org.tzi.use.gui.views.diagrams.util.Util; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagram.java index dacf08d90..a70444f4e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagram.java @@ -43,9 +43,7 @@ import javafx.application.Platform; import javafx.embed.swing.SwingNode; import org.tzi.use.gui.main.ViewFrame; -import org.tzi.use.gui.mainFX.MainWindow; import org.tzi.use.gui.util.PersistHelper; -import org.tzi.use.gui.views.CommandView; import org.tzi.use.gui.views.diagrams.DiagramType; import org.tzi.use.gui.views.diagrams.DiagramView; import org.tzi.use.gui.views.diagrams.DiagramViewWithObjectNode; @@ -62,7 +60,6 @@ import org.tzi.use.gui.views.diagrams.event.ActionLoadLayout; import org.tzi.use.gui.views.diagrams.event.ActionSaveLayout; import org.tzi.use.gui.views.diagrams.event.DiagramInputHandling; -import org.tzi.use.gui.views.diagrams.objectdiagram.NewObjectDiagram; import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectNode; import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; import org.tzi.use.uml.ocl.value.ObjectValue; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagramEdge.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagramEdge.java index b59ccf071..eb55c3043 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagramEdge.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/CommunicationDiagramEdge.java @@ -29,7 +29,6 @@ import java.util.Iterator; import java.util.List; -import org.tzi.use.gui.views.diagrams.DiagramView; import org.tzi.use.gui.views.diagrams.edges.DirectedEdgeFactory; import org.tzi.use.gui.views.diagrams.elements.EdgeProperty; import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsPanel.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsPanel.java index 847266ce1..d1501e563 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsPanel.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsPanel.java @@ -19,7 +19,6 @@ package org.tzi.use.gui.views.diagrams.behavior.communicationdiagram; -import jnr.ffi.annotations.In; import org.tzi.use.gui.util.GridBagHelper; import javax.swing.*; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsWindow.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsWindow.java index 60e3c852c..7a051e9a2 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsWindow.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/behavior/communicationdiagram/ShowRelatedObjectsWindow.java @@ -19,7 +19,6 @@ package org.tzi.use.gui.views.diagrams.behavior.communicationdiagram; -import org.tzi.use.gui.util.GridBagHelper; import org.tzi.use.gui.views.diagrams.behavior.shared.CancelButton; import org.tzi.use.gui.views.diagrams.behavior.shared.OKButton; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/classdiagram/ClassDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/classdiagram/ClassDiagramView.java index 271e1de8c..6789301b0 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/classdiagram/ClassDiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/classdiagram/ClassDiagramView.java @@ -27,7 +27,6 @@ import org.tzi.use.gui.views.PrintableView; import org.tzi.use.gui.views.View; import org.tzi.use.main.runtime.IRuntime; -import org.tzi.use.runtime.gui.IPluginDiagramExtensionPoint; import org.tzi.use.uml.mm.*; import org.tzi.use.uml.mm.commonbehavior.communications.MSignal; import org.tzi.use.uml.ocl.type.EnumType; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 885d1477d..c45416f98 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -78,7 +78,6 @@ import org.tzi.use.gui.views.ObjectPropertiesView; import org.tzi.use.gui.views.diagrams.DiagramType; import org.tzi.use.gui.views.diagrams.DiagramViewWithObjectNode; -import org.tzi.use.gui.views.diagrams.classdiagram.ClassDiagram; import org.tzi.use.gui.views.diagrams.elements.AssociationName; import org.tzi.use.gui.views.diagrams.elements.DiamondNode; import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; @@ -97,7 +96,6 @@ import org.tzi.use.gui.views.diagrams.event.HighlightChangeListener; import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; import org.tzi.use.gui.xmlparser.LayoutTags; -import org.tzi.use.main.gui.Main; import org.tzi.use.uml.mm.MAssociation; import org.tzi.use.uml.mm.MAssociationClass; import org.tzi.use.uml.mm.MAssociationClassImpl; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/statemachine/TransitionEdge.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/statemachine/TransitionEdge.java index 80e7c1079..611531e6c 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/statemachine/TransitionEdge.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/statemachine/TransitionEdge.java @@ -18,7 +18,6 @@ */ package org.tzi.use.gui.views.diagrams.statemachine; -import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Point2D; import java.util.ArrayList; From be73a68bcef9ce681abd109538a5b2b1d24ced30 Mon Sep 17 00:00:00 2001 From: ahmed Date: Mon, 2 Feb 2026 00:05:24 +0100 Subject: [PATCH 02/34] refactor(gui/objectdiagram): modernize NewObjectDiagram for readability and consistency - Use diamond operator (<>) to reduce generic verbosity - Replace `size() > 0` checks with `isEmpty()` for clearer intent - Convert simple anonymous listeners to lambdas to reduce boilerplate - Remove redundant null checks before `instanceof` - Simplify ternary negation and other small readability fixes - Prepare code for follow-up refactors (extracting data structures, controllers) No behavioral changes intended; this is a mechanical cleanup to reduce cognitive load and prepare the file for safer, larger refactors. --- .../objectdiagram/NewObjectDiagram.java | 64 +++++++++---------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index c45416f98..6db39f072 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -129,7 +129,7 @@ public class NewObjectDiagram extends DiagramViewWithObjectNode implements Highl * edges. When hiding or showing objects the data is moved between the * fields {@link NewObjectDiagram#visibleData} and * {@link NewObjectDiagram#hiddenData}. - * + * * @author Lars Hamann */ public static class ObjectDiagramData implements DiagramData { @@ -139,24 +139,24 @@ public static class ObjectDiagramData implements DiagramData { */ public Map fObjectToNodeMap; /** - * + * */ public Map fBinaryLinkToEdgeMap; /** - * + * */ public Map fNaryLinkToDiamondNodeMap; /** - * + * */ public Map> fHalfLinkToEdgeMap; /** - * + * */ public Map fLinkObjectToNodeEdge; /** - * + * */ public ObjectDiagramData() { fObjectToNodeMap = new HashMap(); @@ -202,7 +202,7 @@ public Set getEdges() { /** * Copies all data to the target object - * + * * @param hiddenData */ public void copyTo(ObjectDiagramData target) { @@ -311,16 +311,16 @@ public void stateChanged(HighlightChangeEvent e) { } MModelElement elem = e.getModelElement(); - List edges = new ArrayList(); + List edges = new ArrayList<>(); boolean allEdgesSelected = true; // elem is an association - if (elem != null && elem instanceof MAssociation) { + if (elem instanceof MAssociation) { MAssociation assoc = (MAssociation) elem; int size = assoc.associationEnds().size(); Set links = fParent.system().state().linksOfAssociation(assoc).links(); - EdgeBase eb = null; + EdgeBase eb; if (size == 2) { for (MLink link : links) { @@ -341,8 +341,7 @@ public void stateChanged(HighlightChangeEvent e) { } } - // check all edges in the list if they are suppose to be selected - // or deselected. + // check all edges in the list if they are supposed to be selected for (EdgeBase edge : edges) { if (edge != null) { if (e.getHighlight()) { @@ -357,7 +356,7 @@ public void stateChanged(HighlightChangeEvent e) { } // elem is a class - if (elem != null && elem instanceof MClass) { + if (elem instanceof MClass) { for (MObject obj : fParent.system().state().objectsOfClass((MClass) elem)) { PlaceableNode node = visibleData.fObjectToNodeMap.get(obj); if (elem instanceof MAssociationClass) { @@ -388,11 +387,8 @@ public void showAll() { } } - /** - * Hides all currently visible elements. The diagram is not repainted! - */ public void hideAll() { - Set objects = new HashSet<>(this.visibleData.fObjectToNodeMap.keySet()); + Set objects = new HashSet<>(this.visibleData.fObjectToNodeMap.keySet()); objects.forEach(obj -> hideObject(obj)); } @@ -688,7 +684,7 @@ protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(Placeabl protected void addNAryLink(MLink link) { getRandomNextPosition(); - List linkedObjectNodes = new ArrayList(); + List linkedObjectNodes = new ArrayList<>(); for(MObject linkedObject : link.linkedObjects()) { linkedObjectNodes.add(visibleData.fObjectToNodeMap.get(linkedObject)); } @@ -834,11 +830,11 @@ protected void showOrHideNAryLink(MLink link, boolean show) { ObjectDiagramData source = (show ? hiddenData : visibleData); ObjectDiagramData target = (show ? visibleData : hiddenData); - DiamondNode node = source.fNaryLinkToDiamondNodeMap.get(link); + DiamondNode node = source.fNaryLinkToDiamondNodeMap.get(link); if (show){ if (node == null){ node = target.fNaryLinkToDiamondNodeMap.get(link); - } + } fGraph.add(node); } else { fGraph.remove(node); @@ -846,7 +842,7 @@ protected void showOrHideNAryLink(MLink link, boolean show) { target.fNaryLinkToDiamondNodeMap.put(link, node); source.fNaryLinkToDiamondNodeMap.remove(link); - + // connected to an "object link" if (link instanceof MLinkObject) { EdgeBase e = source.fLinkObjectToNodeEdge.get(link); @@ -1221,12 +1217,10 @@ protected PopupMenuInfo unionOfPopUpMenu() { || !hiddenData.fNaryLinkToDiamondNodeMap.isEmpty() || !hiddenData.fHalfLinkToEdgeMap.isEmpty() || !hiddenData.fLinkObjectToNodeEdge.isEmpty()) { final JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); - showAllObjects.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - showAll(); - showAllLinks(); - invalidateContent(true); - } + showAllObjects.addActionListener(ev -> { + showAll(); + showAllLinks(); + invalidateContent(true); }); popupMenu.insert(showAllObjects, pos++); @@ -1256,10 +1250,10 @@ public void actionPerformed(ActionEvent ev) { @Override public void actionPerformed(ActionEvent arg0) { - if (selectedLinks.size() > 0) { + if (!selectedLinks.isEmpty()) { selectedLinks.forEach(link -> hideLink(link)); } - if (selectedObjects.size() > 0) { + if (!selectedObjects.isEmpty()) { selectedObjects.forEach(obj -> hideObject(obj)); } repaint(); @@ -1294,7 +1288,7 @@ public void actionPerformed(ActionEvent e) { popupMenu.insert(new AbstractAction(labelGreyed + " " + node.name()) { @Override public void actionPerformed(ActionEvent e) { - node.setGreyed(node.isGreyed() ? false : true); + node.setGreyed(!node.isGreyed()); repaint(); } }, pos++); @@ -1302,13 +1296,13 @@ public void actionPerformed(ActionEvent e) { } else if (selectedObjects.size() > 1) { Set objToGreyIn = new HashSet<>(); selectedObjects.stream().filter(obj -> visibleData.fObjectToNodeMap.get(obj).isGreyed()) - .forEach(obj -> objToGreyIn.add(visibleData.fObjectToNodeMap.get(obj))); + .forEach(obj -> objToGreyIn.add(visibleData.fObjectToNodeMap.get(obj))); Set objToGreyOut = new HashSet<>(); selectedObjects.stream().filter(obj -> !visibleData.fObjectToNodeMap.get(obj).isGreyed()) - .forEach(obj -> objToGreyOut.add(visibleData.fObjectToNodeMap.get(obj))); + .forEach(obj -> objToGreyOut.add(visibleData.fObjectToNodeMap.get(obj))); - if (objToGreyIn.size() > 0) { + if (!objToGreyIn.isEmpty()) { popupMenu.insert(new AbstractAction("Grey in " + objToGreyIn.size() + " elements") { @Override @@ -1320,7 +1314,7 @@ public void actionPerformed(ActionEvent arg0) { } // Action for grey out more elements - if (objToGreyOut.size() > 0) { + if (!objToGreyOut.isEmpty()) { popupMenu.insert(new AbstractAction("Grey out " + objToGreyOut.size() + " elements") { @Override @@ -1381,7 +1375,7 @@ public void actionPerformed(ActionEvent arg0) { if (selectedObjects.size() == 1) { final MObject obj = exactlyOne(selectedObjects); - List sortedPSMs = new LinkedList( + List sortedPSMs = new LinkedList<> ( obj.cls().getAllOwnedProtocolStateMachines()); Collections.sort(sortedPSMs, new MNamedElementComparator()); From 4b1e06c762a73ffd25b8dfb1a976dcbc74e4adc5 Mon Sep 17 00:00:00 2001 From: ahmed Date: Tue, 3 Feb 2026 00:14:14 +0100 Subject: [PATCH 03/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20fix=20Map=20access,=20null-safety=20and=20minor=20c?= =?UTF-8?q?larity=20improvements=20-=20Fix=20broken=20Map=20access=20(use?= =?UTF-8?q?=20getLinkObjectToNodeEdge().get(link))=20which=20caused=20comp?= =?UTF-8?q?ile=20errors=20and=20broken=20restore/delete=20flows.=20-=20Add?= =?UTF-8?q?=20null=20checks=20before=20invoking=20methods=20on=20edges=20d?= =?UTF-8?q?uring=20restore=20and=20delete=20to=20avoid=20NPEs=20when=20lay?= =?UTF-8?q?out=20data=20is=20missing.=20-=20Change=20javaFxCall=20from=20b?= =?UTF-8?q?oxed=20Boolean=20to=20primitive=20boolean=20and=20update=20sett?= =?UTF-8?q?er=20for=20NPE=20safety=20and=20clarity.=20-=20Correct=20copyTo?= =?UTF-8?q?=20Javadoc=20param=20description.=20These=20are=20small,=20low-?= =?UTF-8?q?risk=20fixes=20to=20restore=20compileability=20and=20improve=20?= =?UTF-8?q?robustness=20and=20readability.=20No=20behavioral=20change=20ex?= =?UTF-8?q?pected.=20Co-authored-by:=20automated-refactor-agent=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectdiagram/NewObjectDiagram.java | 304 ++++++++---------- 1 file changed, 135 insertions(+), 169 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 6db39f072..01f45643a 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -133,37 +133,22 @@ public class NewObjectDiagram extends DiagramViewWithObjectNode implements Highl * @author Lars Hamann */ public static class ObjectDiagramData implements DiagramData { - /** - * Map from object instances to object nodes. It also includes link - * objects. - */ - public Map fObjectToNodeMap; - /** - * - */ - public Map fBinaryLinkToEdgeMap; - /** - * - */ - public Map fNaryLinkToDiamondNodeMap; - /** - * - */ - public Map> fHalfLinkToEdgeMap; - /** - * - */ - public Map fLinkObjectToNodeEdge; + // internal maps; keep them private and provide accessors + private final Map fObjectToNodeMap; + private final Map fBinaryLinkToEdgeMap; + private final Map fNaryLinkToDiamondNodeMap; + private final Map> fHalfLinkToEdgeMap; + private final Map fLinkObjectToNodeEdge; /** - * + * Creates an empty set of diagram data */ public ObjectDiagramData() { - fObjectToNodeMap = new HashMap(); - fBinaryLinkToEdgeMap = new HashMap(); - fNaryLinkToDiamondNodeMap = new HashMap(); - fHalfLinkToEdgeMap = new HashMap>(); - fLinkObjectToNodeEdge = new HashMap(); + fObjectToNodeMap = new HashMap<>(); + fBinaryLinkToEdgeMap = new HashMap<>(); + fNaryLinkToDiamondNodeMap = new HashMap<>(); + fHalfLinkToEdgeMap = new HashMap<>(); + fLinkObjectToNodeEdge = new HashMap<>(); } /** @@ -177,7 +162,7 @@ public boolean containsLink(MLink link) { @Override public Set getNodes() { - Set result = new HashSet(); + Set result = new HashSet<>(); result.addAll(this.fNaryLinkToDiamondNodeMap.values()); result.addAll(this.fObjectToNodeMap.values()); @@ -192,7 +177,7 @@ public boolean hasNodes() { @Override public Set getEdges() { - Set result = new HashSet(fBinaryLinkToEdgeMap.values()); + Set result = new HashSet<>(fBinaryLinkToEdgeMap.values()); result.addAll(fLinkObjectToNodeEdge.values()); for (Map.Entry> entry : fHalfLinkToEdgeMap.entrySet()) { result.addAll(entry.getValue()); @@ -203,7 +188,7 @@ public Set getEdges() { /** * Copies all data to the target object * - * @param hiddenData + * @param target the target ObjectDiagramData to copy the data into */ public void copyTo(ObjectDiagramData target) { target.fBinaryLinkToEdgeMap.putAll(this.fBinaryLinkToEdgeMap); @@ -223,6 +208,13 @@ public void clear() { this.fNaryLinkToDiamondNodeMap.clear(); this.fObjectToNodeMap.clear(); } + + // Accessors to preserve encapsulation + public Map getObjectToNodeMap() { return fObjectToNodeMap; } + public Map getBinaryLinkToEdgeMap() { return fBinaryLinkToEdgeMap; } + public Map getNaryLinkToDiamondNodeMap() { return fNaryLinkToDiamondNodeMap; } + public Map> getHalfLinkToEdgeMap() { return fHalfLinkToEdgeMap; } + public Map getLinkObjectToNodeEdge() { return fLinkObjectToNodeEdge; } } protected ObjectDiagramData visibleData = new ObjectDiagramData(); @@ -251,7 +243,7 @@ public void clear() { protected DiagramInputHandling inputHandling; - private static Boolean javaFxCall = false; + private static boolean javaFxCall = false; /** * Creates a new empty diagram. @@ -324,18 +316,18 @@ public void stateChanged(HighlightChangeEvent e) { if (size == 2) { for (MLink link : links) { - eb = visibleData.fBinaryLinkToEdgeMap.get(link); + eb = visibleData.getBinaryLinkToEdgeMap().get(link); if (elem instanceof MAssociationClass) { - eb = visibleData.fLinkObjectToNodeEdge.get(link); + eb = visibleData.getLinkObjectToNodeEdge().get(link); } edges.add(eb); } } else { for (MLink link : links) { - edges.addAll(visibleData.fHalfLinkToEdgeMap.get(link)); + edges.addAll(visibleData.getHalfLinkToEdgeMap().getOrDefault(link, Collections.emptyList())); if (elem instanceof MAssociationClass) { - eb = visibleData.fLinkObjectToNodeEdge.get(link); + eb = visibleData.getLinkObjectToNodeEdge().get(link); edges.add(eb); } } @@ -358,7 +350,7 @@ public void stateChanged(HighlightChangeEvent e) { // elem is a class if (elem instanceof MClass) { for (MObject obj : fParent.system().state().objectsOfClass((MClass) elem)) { - PlaceableNode node = visibleData.fObjectToNodeMap.get(obj); + PlaceableNode node = visibleData.getObjectToNodeMap().get(obj); if (elem instanceof MAssociationClass) { if (e.getHighlight() && allEdgesSelected) { fNodeSelection.add(node); @@ -382,13 +374,13 @@ public void stateChanged(HighlightChangeEvent e) { * Shows all hidden elements again */ public void showAll() { - while (!hiddenData.fObjectToNodeMap.isEmpty()) { - showObject(hiddenData.fObjectToNodeMap.keySet().iterator().next()); + while (!hiddenData.getObjectToNodeMap().isEmpty()) { + showObject(hiddenData.getObjectToNodeMap().keySet().iterator().next()); } } public void hideAll() { - Set objects = new HashSet<>(this.visibleData.fObjectToNodeMap.keySet()); + Set objects = new HashSet<>(this.visibleData.getObjectToNodeMap().keySet()); objects.forEach(obj -> hideObject(obj)); } @@ -396,7 +388,7 @@ public void hideAll() { * Hides all currently visible links. The diagram is not repainted! */ public void hideAllLinks() { - Set links = new HashSet<>(this.visibleData.fBinaryLinkToEdgeMap.keySet()); + Set links = new HashSet<>(this.visibleData.getBinaryLinkToEdgeMap().keySet()); for (MLink e : links) { hideBinaryLink(e); @@ -406,10 +398,10 @@ public void hideAllLinks() { // Hide HalfLinks // HalfLinks used by TernaryAssoc - links.addAll(this.visibleData.fHalfLinkToEdgeMap.keySet()); + links.addAll(this.visibleData.getHalfLinkToEdgeMap().keySet()); // Hide LinkObject - links.addAll(this.visibleData.fLinkObjectToNodeEdge.keySet()); + links.addAll(this.visibleData.getLinkObjectToNodeEdge().keySet()); for (MLink e : links) { hideLink(e); } @@ -417,7 +409,7 @@ public void hideAllLinks() { links.clear(); // Hide NaryLinks - links.addAll(this.visibleData.fNaryLinkToDiamondNodeMap.keySet()); + links.addAll(this.visibleData.getNaryLinkToDiamondNodeMap().keySet()); for (MLink e : links) { hideNAryLink(e); } @@ -451,7 +443,7 @@ public void addObject(MObject obj) { } fGraph.add(n); - visibleData.fObjectToNodeMap.put(obj, n); + visibleData.getObjectToNodeMap().put(obj, n); fLayouter = null; } @@ -462,7 +454,7 @@ public void addObject(MObject obj) { * The object to show */ public void showObject(MObject obj) { - if (visibleData.fObjectToNodeMap.containsKey(obj)) + if (visibleData.getObjectToNodeMap().containsKey(obj)) return; showOrHideObjectNode(obj, true); @@ -484,13 +476,13 @@ public void showObject(MObject obj) { if (link.linkedObjects().contains(obj) || (isLinkObject && link.equals(obj))) { boolean allVisible = true; for (MObject linkedO : link.linkedObjects()) { - if (!visibleData.fObjectToNodeMap.containsKey(linkedO)) { + if (!visibleData.getObjectToNodeMap().containsKey(linkedO)) { allVisible = false; break; } } - if (allVisible && (!isLinkObject || visibleData.fObjectToNodeMap.containsKey(obj))) + if (allVisible && (!isLinkObject || visibleData.getObjectToNodeMap().containsKey(obj))) showLink(link); } } @@ -500,10 +492,10 @@ public void showObject(MObject obj) { @Override public void moveObjectNode(MObject obj, int x, int y) { PlaceableNode node = null; - if (visibleData.fObjectToNodeMap.containsKey(obj)) { - node = visibleData.fObjectToNodeMap.get(obj); - } else if (hiddenData.fObjectToNodeMap.containsKey(obj)) { - node = hiddenData.fObjectToNodeMap.get(obj); + if (visibleData.getObjectToNodeMap().containsKey(obj)) { + node = visibleData.getObjectToNodeMap().get(obj); + } else if (hiddenData.getObjectToNodeMap().containsKey(obj)) { + node = hiddenData.getObjectToNodeMap().get(obj); } if (node != null) { node.moveToPosition(x, y); @@ -518,7 +510,7 @@ public void moveObjectNode(MObject obj, int x, int y) { */ public void hideObject(MObject obj) { // a hidden object should no longer be selected - ObjectNode removedNode = visibleData.fObjectToNodeMap.get(obj); + ObjectNode removedNode = visibleData.getObjectToNodeMap().get(obj); if(removedNode!=null) { fNodeSelection.remove(removedNode); } @@ -553,7 +545,7 @@ protected void showOrHideObjectNode(MObject obj, boolean show) { ObjectDiagramData source = (show ? hiddenData : visibleData); ObjectDiagramData target = (show ? visibleData : hiddenData); - ObjectNode n = source.fObjectToNodeMap.get(obj); + ObjectNode n = source.getObjectToNodeMap().get(obj); if (n != null) { if (show) @@ -561,8 +553,8 @@ protected void showOrHideObjectNode(MObject obj, boolean show) { else fGraph.remove(n); - source.fObjectToNodeMap.remove(obj); - target.fObjectToNodeMap.put(obj, n); + source.getObjectToNodeMap().remove(obj); + target.getObjectToNodeMap().put(obj, n); fLayouter = null; } @@ -575,11 +567,11 @@ public void deleteObject(MObject obj) { ObjectNode n; boolean isVisible; - if (visibleData.fObjectToNodeMap.containsKey(obj)) { - n = visibleData.fObjectToNodeMap.get(obj); + if (visibleData.getObjectToNodeMap().containsKey(obj)) { + n = visibleData.getObjectToNodeMap().get(obj); isVisible = true; } else { - n = hiddenData.fObjectToNodeMap.get(obj); + n = hiddenData.getObjectToNodeMap().get(obj); isVisible = false; } @@ -587,10 +579,10 @@ public void deleteObject(MObject obj) { lastKnownNodePositions.put(obj, n.getPosition()); if (isVisible) { fGraph.remove(n); - visibleData.fObjectToNodeMap.remove(obj); + visibleData.getObjectToNodeMap().remove(obj); fLayouter = null; } else { - hiddenData.fObjectToNodeMap.remove(obj); + hiddenData.getObjectToNodeMap().remove(obj); } n.dispose(); } @@ -620,19 +612,19 @@ protected void addBinaryLink(MLink link) { // object link if (link instanceof MLinkObject) { BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( - visibleData.fObjectToNodeMap.get(obj1), visibleData.fObjectToNodeMap.get(obj2), - linkEnd1, linkEnd2, visibleData.fObjectToNodeMap.get(link), this, + visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), + linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, link); if (lastKnownLinkPositions.containsKey(link)) { e.initialize(); - visibleData.fObjectToNodeMap.get(link).setStrategy(lastKnownLinkPositions.get(link)); + visibleData.getObjectToNodeMap().get(link).setStrategy(lastKnownLinkPositions.get(link)); lastKnownLinkPositions.remove(link); fGraph.addInitializedEdge(e); } else { fGraph.addEdge(e); } - visibleData.fLinkObjectToNodeEdge.put((MLinkObject) link, e); + visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } else { // binary link @@ -640,17 +632,17 @@ protected void addBinaryLink(MLink link) { ObjectNode node1; ObjectNode node2; - if (visibleData.fObjectToNodeMap.containsKey(obj1)) { - node1 = visibleData.fObjectToNodeMap.get(obj1); + if (visibleData.getObjectToNodeMap().containsKey(obj1)) { + node1 = visibleData.getObjectToNodeMap().get(obj1); } else { - node1 = hiddenData.fObjectToNodeMap.get(obj1); + node1 = hiddenData.getObjectToNodeMap().get(obj1); isHidden = true; } - if (visibleData.fObjectToNodeMap.containsKey(obj2)) { - node2 = visibleData.fObjectToNodeMap.get(obj2); + if (visibleData.getObjectToNodeMap().containsKey(obj2)) { + node2 = visibleData.getObjectToNodeMap().get(obj2); } else { - node2 = hiddenData.fObjectToNodeMap.get(obj2); + node2 = hiddenData.getObjectToNodeMap().get(obj2); isHidden = true; } @@ -662,10 +654,10 @@ protected void addBinaryLink(MLink link) { } if (isHidden) { - hiddenData.fBinaryLinkToEdgeMap.put(link, e); + hiddenData.getBinaryLinkToEdgeMap().put(link, e); } else { fGraph.addEdge(e); - visibleData.fBinaryLinkToEdgeMap.put(link, e); + visibleData.getBinaryLinkToEdgeMap().put(link, e); fLayouter = null; } } @@ -686,7 +678,7 @@ protected void addNAryLink(MLink link) { List linkedObjectNodes = new ArrayList<>(); for(MObject linkedObject : link.linkedObjects()) { - linkedObjectNodes.add(visibleData.fObjectToNodeMap.get(linkedObject)); + linkedObjectNodes.add(visibleData.getObjectToNodeMap().get(linkedObject)); } // n-ary link: create a diamond node and n edges to objects @@ -697,20 +689,20 @@ protected void addNAryLink(MLink link) { // connected to an "object link" if (link instanceof MLinkObject) { NAryAssociationClassOrObjectEdge e = NAryAssociationClassOrObjectEdge.create(node, - visibleData.fObjectToNodeMap.get(link), this, link.association(), true); + visibleData.getObjectToNodeMap().get(link), this, link.association(), true); fGraph.addEdge(e); - visibleData.fLinkObjectToNodeEdge.put((MLinkObject) link, e); + visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } // connected to a "normal" link - visibleData.fNaryLinkToDiamondNodeMap.put(link, node); + visibleData.getNaryLinkToDiamondNodeMap().put(link, node); List halfEdges = new ArrayList<>(); List edgeIds = new ArrayList<>(); for (MLinkEnd linkEnd : link.linkEnds()) { MObject obj = linkEnd.object(); - AssociationOrLinkPartEdge e = AssociationOrLinkPartEdge.create(node, visibleData.fObjectToNodeMap.get(obj), + AssociationOrLinkPartEdge e = AssociationOrLinkPartEdge.create(node, visibleData.getObjectToNodeMap().get(obj), linkEnd.associationEnd(), this, link.association(), link); if (link.isVirtual()) { @@ -719,17 +711,17 @@ protected void addNAryLink(MLink link) { fGraph.addEdge(e); halfEdges.add(e); - edgeIds.add(linkEnd.associationEnd().nameAsRolename()); + edgeIds.add(linkEnd.associationEnd().nameAsRolename()); } - if (visibleData.fLinkObjectToNodeEdge.get(link) != null) { - halfEdges.add(visibleData.fLinkObjectToNodeEdge.get(link)); + if (visibleData.getLinkObjectToNodeEdge().get(link) != null) { + halfEdges.add(visibleData.getLinkObjectToNodeEdge().get(link)); edgeIds.add(((MLinkObject) link).name()); } node.setHalfEdges(halfEdges, edgeIds); - visibleData.fHalfLinkToEdgeMap.put(link, halfEdges); + visibleData.getHalfLinkToEdgeMap().put(link, halfEdges); fLayouter = null; } @@ -776,7 +768,7 @@ public void hideLink(MLink link) { } // Hide Linkobject, if link has a linkobject - if (link instanceof MLinkObject && visibleData.fObjectToNodeMap.containsKey(link)) { + if (link instanceof MLinkObject && visibleData.getObjectToNodeMap().containsKey(link)) { hideObject((MObject) link); } } @@ -803,26 +795,26 @@ protected void showOrHideBinaryLink(MLink link, boolean show) { // object link if (link instanceof MLinkObject) { - EdgeBase e = source.fLinkObjectToNodeEdge.get(link); + EdgeBase e = source.getLinkObjectToNodeEdge().get(link); if (show && e != null) fGraph.addInitializedEdge(e); else if (e != null) fGraph.removeEdge(e); - source.fLinkObjectToNodeEdge.remove(link); - target.fLinkObjectToNodeEdge.put((MLinkObject) link, e); + source.getLinkObjectToNodeEdge().remove(link); + target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } else { // binary link - BinaryAssociationOrLinkEdge e = source.fBinaryLinkToEdgeMap.get(link); + BinaryAssociationOrLinkEdge e = source.getBinaryLinkToEdgeMap().get(link); if (show && e != null) { fGraph.addEdge(e); } else if (e != null) { fGraph.removeEdge(e); } - source.fBinaryLinkToEdgeMap.remove(link); - target.fBinaryLinkToEdgeMap.put(link, e); + source.getBinaryLinkToEdgeMap().remove(link); + target.getBinaryLinkToEdgeMap().put(link, e); } } @@ -886,13 +878,13 @@ public void deleteLink(MLink link) { ObjectDiagramData data; if (isLinkObject) { - isVisible = visibleData.fLinkObjectToNodeEdge.containsKey(link); + isVisible = visibleData.getLinkObjectToNodeEdge().containsKey(link); data = isVisible ? visibleData : hiddenData; - e = data.fLinkObjectToNodeEdge.get(link); + e = data.getLinkObjectToNodeEdge().get(link); } else { - isVisible = visibleData.fBinaryLinkToEdgeMap.containsKey(link); + isVisible = visibleData.getBinaryLinkToEdgeMap().containsKey(link); data = isVisible ? visibleData : hiddenData; - e = data.fBinaryLinkToEdgeMap.get(link); + e = data.getBinaryLinkToEdgeMap().get(link); } if (e == null) { @@ -900,17 +892,16 @@ public void deleteLink(MLink link) { } if (isLinkObject) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.fLinkObjectToNodeEdge - .get(link); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get(link); if (edge != null) { PlaceableNode objectNode = edge.getClassOrObjectNode(); lastKnownLinkPositions.put(link, objectNode.getStrategy()); } - data.fBinaryLinkToEdgeMap.remove(link); - data.fLinkObjectToNodeEdge.remove(link); + data.getBinaryLinkToEdgeMap().remove(link); + data.getLinkObjectToNodeEdge().remove(link); } else { - data.fBinaryLinkToEdgeMap.remove(link); + data.getBinaryLinkToEdgeMap().remove(link); } if (isVisible) { @@ -922,16 +913,16 @@ public void deleteLink(MLink link) { boolean isVisible; ObjectDiagramData data; - isVisible = visibleData.fNaryLinkToDiamondNodeMap.containsKey(link); + isVisible = visibleData.getNaryLinkToDiamondNodeMap().containsKey(link); data = isVisible ? visibleData : hiddenData; - DiamondNode n = data.fNaryLinkToDiamondNodeMap.get(link); + DiamondNode n = data.getNaryLinkToDiamondNodeMap().get(link); if (n == null) { throw new RuntimeException("no diamond node for n-ary link `" + link + "' in current state."); } - data.fNaryLinkToDiamondNodeMap.remove(link); - data.fHalfLinkToEdgeMap.remove(link); + data.getNaryLinkToDiamondNodeMap().remove(link); + data.getHalfLinkToEdgeMap().remove(link); if (isVisible) { fGraph.remove(n); @@ -941,12 +932,12 @@ public void deleteLink(MLink link) { n.dispose(); if (link instanceof MLinkObject) { - EdgeBase edge = data.fLinkObjectToNodeEdge.get(link); + EdgeBase edge = data.getLinkObjectToNodeEdge().get(link); if (edge != null) { lastKnownLinkPositions.put(link, ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); fGraph.removeEdge(edge); - data.fLinkObjectToNodeEdge.remove(link); + data.getLinkObjectToNodeEdge().remove(link); edge.dispose(); } } @@ -959,7 +950,7 @@ public void deleteLink(MLink link) { * @param obj */ public void updateObject(MInstance obj) { - ObjectNode node = visibleData.fObjectToNodeMap.get(obj); + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); if (node != null) invalidateNode(node); } @@ -1111,9 +1102,9 @@ protected PopupMenuInfo unionOfPopUpMenu() { // position for the popupMenu items int pos = 0; - final Set selectedObjectsOfAssociation = new HashSet(); - final Set selectedLinks = new HashSet(); - final List selectedObjects = new ArrayList(); + final Set selectedObjectsOfAssociation = new HashSet<>(); + final Set selectedLinks = new HashSet<>(); + final List selectedObjects = new ArrayList<>(); // Split selected nodes into model elements for (PlaceableNode node : fNodeSelection) { @@ -1213,9 +1204,9 @@ protected PopupMenuInfo unionOfPopUpMenu() { popupMenu.insert(new JSeparator(), pos++); } - if (!hiddenData.fObjectToNodeMap.isEmpty() || !hiddenData.fBinaryLinkToEdgeMap.isEmpty() - || !hiddenData.fNaryLinkToDiamondNodeMap.isEmpty() || !hiddenData.fHalfLinkToEdgeMap.isEmpty() - || !hiddenData.fLinkObjectToNodeEdge.isEmpty()) { + if (!hiddenData.getObjectToNodeMap().isEmpty() || !hiddenData.getBinaryLinkToEdgeMap().isEmpty() + || !hiddenData.getNaryLinkToDiamondNodeMap().isEmpty() || !hiddenData.getHalfLinkToEdgeMap().isEmpty() + || !hiddenData.getLinkObjectToNodeEdge().isEmpty()) { final JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); showAllObjects.addActionListener(ev -> { showAll(); @@ -1281,8 +1272,8 @@ public void actionPerformed(ActionEvent e) { // new Action for grey in/out if (selectedObjects.size() == 1) { MObject obj = selectedObjects.iterator().next(); - if (visibleData.fObjectToNodeMap.containsKey(obj)) { - ObjectNode node = visibleData.fObjectToNodeMap.get(obj); + if (visibleData.getObjectToNodeMap().containsKey(obj)) { + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); String labelGreyed = node.isGreyed() ? "Grey in" : "Grey out"; popupMenu.insert(new AbstractAction(labelGreyed + " " + node.name()) { @@ -1295,12 +1286,12 @@ public void actionPerformed(ActionEvent e) { } } else if (selectedObjects.size() > 1) { Set objToGreyIn = new HashSet<>(); - selectedObjects.stream().filter(obj -> visibleData.fObjectToNodeMap.get(obj).isGreyed()) - .forEach(obj -> objToGreyIn.add(visibleData.fObjectToNodeMap.get(obj))); + selectedObjects.stream().filter(obj -> visibleData.getObjectToNodeMap().get(obj).isGreyed()) + .forEach(obj -> objToGreyIn.add(visibleData.getObjectToNodeMap().get(obj))); Set objToGreyOut = new HashSet<>(); - selectedObjects.stream().filter(obj -> !visibleData.fObjectToNodeMap.get(obj).isGreyed()) - .forEach(obj -> objToGreyOut.add(visibleData.fObjectToNodeMap.get(obj))); + selectedObjects.stream().filter(obj -> !visibleData.getObjectToNodeMap().get(obj).isGreyed()) + .forEach(obj -> objToGreyOut.add(visibleData.getObjectToNodeMap().get(obj))); if (!objToGreyIn.isEmpty()) { popupMenu.insert(new AbstractAction("Grey in " + objToGreyIn.size() + " elements") { @@ -1339,33 +1330,28 @@ public void actionPerformed(ActionEvent arg0) { popupMenu.insert(showHideCrop, pos++); - if (fGraph.size() > 0 || !hiddenData.fObjectToNodeMap.isEmpty()) { - if (fGraph.size() > 0) { + if (!fGraph.isEmpty() || !hiddenData.getObjectToNodeMap().isEmpty()) { + if (!fGraph.isEmpty()) { popupMenu.insert(fSelection.getSubMenuHideObject(), pos++); } - if (!hiddenData.fObjectToNodeMap.isEmpty()) { + if (!hiddenData.getObjectToNodeMap().isEmpty()) { popupMenu.insert(fSelection.getSubMenuShowObject(), pos++); } } - if (!visibleData.fBinaryLinkToEdgeMap.isEmpty() || !visibleData.fHalfLinkToEdgeMap.isEmpty() - || !visibleData.fLinkObjectToNodeEdge.isEmpty() - || !visibleData.fNaryLinkToDiamondNodeMap.isEmpty()) { + if (!visibleData.getBinaryLinkToEdgeMap().isEmpty() || !visibleData.getHalfLinkToEdgeMap().isEmpty() + || !visibleData.getLinkObjectToNodeEdge().isEmpty() + || !visibleData.getNaryLinkToDiamondNodeMap().isEmpty()) { popupMenu.insert(fSelection.getSubMenuHideLinks(), pos++); } - if (!hiddenData.fBinaryLinkToEdgeMap.isEmpty() || !hiddenData.fHalfLinkToEdgeMap.isEmpty() - || !hiddenData.fLinkObjectToNodeEdge.isEmpty() || !hiddenData.fNaryLinkToDiamondNodeMap.isEmpty()) { + if (!hiddenData.getBinaryLinkToEdgeMap().isEmpty() || !hiddenData.getHalfLinkToEdgeMap().isEmpty() + || !hiddenData.getLinkObjectToNodeEdge().isEmpty() || !hiddenData.getNaryLinkToDiamondNodeMap().isEmpty()) { popupMenu.insert(fSelection.getSubMenuShowLinks(), pos++); } popupMenu.insert(new JSeparator(), pos++); - if (!visibleData.getEdges().isEmpty() || !hiddenData.getEdges().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuLinksByKind(), pos++); - - popupMenu.insert(new JSeparator(), pos++); - } if (!selectedObjects.isEmpty()) { final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); @@ -1375,7 +1361,7 @@ public void actionPerformed(ActionEvent arg0) { if (selectedObjects.size() == 1) { final MObject obj = exactlyOne(selectedObjects); - List sortedPSMs = new LinkedList<> ( + List sortedPSMs = new LinkedList<>( obj.cls().getAllOwnedProtocolStateMachines()); Collections.sort(sortedPSMs, new MNamedElementComparator()); @@ -1423,7 +1409,7 @@ public void itemStateChanged(ItemEvent ev) { * @return A HashSet of the none selected objects in the diagram. */ private Set getNoneSelectedNodes(Set selectedNodes) { - Set noneSelectedNodes = new HashSet(); + Set noneSelectedNodes = new HashSet<>(); Iterator it = fGraph.iterator(); while (it.hasNext()) { PlaceableNode o = it.next(); @@ -1599,7 +1585,7 @@ public void storePlacementInfos(PersistHelper helper, Element root) { protected void storePlacementInfos(PersistHelper helper, Element root, boolean visible) { ObjectDiagramData data = (visible ? visibleData : hiddenData); - for (ObjectNode n : data.fObjectToNodeMap.values()) { + for (ObjectNode n : data.getObjectToNodeMap().values()) { n.storePlacementInfo(helper, root, !visible); } @@ -1620,7 +1606,7 @@ protected void storePlacementInfos(PersistHelper helper, Element root, boolean v public void restorePlacementInfos(PersistHelper helper, int version) { if (version < 12) return; - Set hiddenObjects = new HashSet(); + Set hiddenObjects = new HashSet<>(); AutoPilot ap = new AutoPilot(helper.getNav()); // First restore edges to get possible new nodes, then nodes @@ -1658,8 +1644,8 @@ public void restorePlacementInfos(PersistHelper helper, int version) { } if (link != null) { - BinaryAssociationOrLinkEdge edge = visibleData.fBinaryLinkToEdgeMap.get(link); - edge.restorePlacementInfo(helper, version); + BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().get(link); + edge.restorePlacementInfo(helper, version); } } } @@ -1707,7 +1693,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { } if (link != null) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject)visibleData.fLinkObjectToNodeEdge.get(link); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject)visibleData.getLinkObjectToNodeEdge().get(link); edge.restorePlacementInfo(helper, version); } } @@ -1733,7 +1719,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { MObject obj = fParent.system().state().objectByName(name); // Could be deleted if (obj != null) { - ObjectNode node = visibleData.fObjectToNodeMap.get(obj); + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); node.restorePlacementInfo(helper, version); if (isHidden(helper, version)) hiddenObjects.add(obj); } @@ -1764,7 +1750,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { if (assoc == null) continue; // Get connected objects - List connectedObjects = new LinkedList(); + List connectedObjects = new LinkedList<>(); if (!helper.toFirstChild("connectedNode")) break; @@ -1832,7 +1818,7 @@ protected boolean isHidden(PersistHelper helper, int version) { @Override public Set getHiddenNodes() { - return new HashSet(hiddenData.fObjectToNodeMap.values()); + return new HashSet(hiddenData.getObjectToNodeMap().values()); } @Override @@ -1863,7 +1849,7 @@ protected void onClosing() { @Override public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.fObjectToNodeMap.values()) { + for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { n.stateChanged(e); } } @@ -1926,53 +1912,33 @@ public TreeMap> mapLinksToKindOfAssociation() { for (MLink link : links) { if (link.association().isDerived() || link.association().isUnion()) { if (!assocs.containsKey(derrivedLinks)) { - assocs.put(derrivedLinks, new ArrayList() { - { - add(link); - } - }); + assocs.put(derrivedLinks, new ArrayList() {{ add(link); }}); } else { assocs.get(derrivedLinks).add(link); } } else if (MAssociationClassImpl.class.isInstance(link.association())) { if (!assocs.containsKey(associationClass)) { - assocs.put(associationClass, new ArrayList() { - { - add(link); - } - }); + assocs.put(associationClass, new ArrayList() {{ add(link); }}); } else { assocs.get(associationClass).add(link); } } else if (MAssociation.class.isInstance(link.association()) && link.linkEnds().size() > 2) { if (!assocs.containsKey(nAryLinks)) { - assocs.put(nAryLinks, new ArrayList() { - { - add(link); - } - }); + assocs.put(nAryLinks, new ArrayList() {{ add(link); }}); } else { assocs.get(nAryLinks).add(link); } } else if (MAssociation.class.isInstance(link.association()) && link.association().associatedClasses().size() == 1 ) { if (!assocs.containsKey(reflexivLinks)) { - assocs.put(reflexivLinks, new ArrayList() { - { - add(link); - } - }); + assocs.put(reflexivLinks, new ArrayList() {{ add(link); }}); } else { assocs.get(reflexivLinks).add(link); } } else if (MAssociation.class.isInstance(link.association()) && link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { if (!assocs.containsKey(binaryLinks)) { - assocs.put(binaryLinks, new ArrayList() { - { - add(link); - } - }); + assocs.put(binaryLinks, new ArrayList() {{ add(link); }}); } else { assocs.get(binaryLinks).add(link); } @@ -2052,9 +2018,9 @@ public void showLink(List links) { * @return true, if link is hidden; else return false */ public boolean isHidden(MLink link) { - if (hiddenData.fBinaryLinkToEdgeMap.containsKey(link) || hiddenData.fHalfLinkToEdgeMap.containsKey(link) - || hiddenData.fLinkObjectToNodeEdge.containsKey(link) - || hiddenData.fNaryLinkToDiamondNodeMap.containsKey(link)) { + if (hiddenData.getBinaryLinkToEdgeMap().containsKey(link) || hiddenData.getHalfLinkToEdgeMap().containsKey(link) + || hiddenData.getLinkObjectToNodeEdge().containsKey(link) + || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link)) { return true; } else { return false; @@ -2087,7 +2053,7 @@ public int isHidden(List links) { return -1; } - public static void setJavaFxCall(Boolean javaFxCall) { + public static void setJavaFxCall(boolean javaFxCall) { NewObjectDiagram.javaFxCall = javaFxCall; } From d91a6d5f296607f69a18719e57c1c536f024697c Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 11 Feb 2026 15:32:18 +0100 Subject: [PATCH 04/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20small=20cleanups:=20replace=20double-brace=20initia?= =?UTF-8?q?lizers,=20use=20computeIfAbsent,=20lambdas=20&=20method=20refs,?= =?UTF-8?q?=20improve=20drop=20logging,=20minor=20readability=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectdiagram/NewObjectDiagram.java | 107 ++++++------------ 1 file changed, 36 insertions(+), 71 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 01f45643a..2103d891d 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -381,7 +381,7 @@ public void showAll() { public void hideAll() { Set objects = new HashSet<>(this.visibleData.getObjectToNodeMap().keySet()); - objects.forEach(obj -> hideObject(obj)); + objects.forEach(this::hideObject); } /** @@ -967,12 +967,7 @@ class ActionInsertLink extends AbstractAction { fParticipants = participants; StringBuilder txt = new StringBuilder("insert ("); - StringUtil.fmtSeq(txt, participants, ",", new IElementFormatter() { - @Override - public String format(MObject element) { - return element.name(); - } - }); + StringUtil.fmtSeq(txt, participants, ",", (MObject element) -> element.name()); txt.append(") into ").append(association.name()); @@ -1127,7 +1122,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { } // Just to be sure to delete an object only once - Set selectedObjectsSet = new HashSet(selectedObjects); + Set selectedObjectsSet = new HashSet<>(selectedObjects); // This text is reused often String selectedObjectsText = null; @@ -1242,10 +1237,10 @@ protected PopupMenuInfo unionOfPopUpMenu() { @Override public void actionPerformed(ActionEvent arg0) { if (!selectedLinks.isEmpty()) { - selectedLinks.forEach(link -> hideLink(link)); + selectedLinks.forEach(NewObjectDiagram.this::hideLink); } if (!selectedObjects.isEmpty()) { - selectedObjects.forEach(obj -> hideObject(obj)); + selectedObjects.forEach(NewObjectDiagram.this::hideObject); } repaint(); } @@ -1500,12 +1495,18 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { } dtde.dropComplete(true); } catch (IOException exception) { - exception.printStackTrace(); - System.err.println("Exception" + exception.getMessage()); + if (fLog != null) { + fLog.append("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); + } else { + System.err.println("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); + } dtde.dropComplete(false); } catch (UnsupportedFlavorException ufException) { - ufException.printStackTrace(); - System.err.println("Exception" + ufException.getMessage()); + if (fLog != null) { + fLog.append("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); + } else { + System.err.println("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); + } dtde.dropComplete(false); } } @@ -1640,7 +1641,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { .state() .linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), - Collections.>emptyList()); + Collections.emptyList()); } if (link != null) { @@ -1689,7 +1690,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { .state() .linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), - Collections.> emptyList()); + Collections.emptyList()); } if (link != null) { @@ -1774,8 +1775,8 @@ public void restorePlacementInfos(PersistHelper helper, int version) { continue; // n-ary links cannot be qualified therefore an empty list for the qualifer values is provided - MLink link = fParent.system().state().linkBetweenObjects(assoc, connectedObjects, Collections.>emptyList()); - + MLink link = fParent.system().state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); + // Could be deleted if (link != null) { DiamondNode node = visibleData.fNaryLinkToDiamondNodeMap.get(link); @@ -1889,14 +1890,14 @@ public void showLink(String linkName, List links) { * @return */ public TreeMap> mapLinksToKindOfAssociation() { - HashMap> assocs = new HashMap<>(); - final String derrivedLinks = "Derrived links"; + Map> assocs = new HashMap<>(); + final String derivedLinks = "Derived links"; final String associationClass = "Linkobjects"; final String nAryLinks = "N-Ary links"; - final String reflexivLinks = "Reflexiv links"; + final String reflexiveLinks = "Reflexive links"; final String binaryLinks = "Binary links"; final String aggregation = "Aggregations"; - final String compositon = "Compositons"; + final String composition = "Compositions"; for (MAssociation assoc : fParent.system().model().associations()) { @@ -1911,37 +1912,17 @@ public TreeMap> mapLinksToKindOfAssociation() { Set links = fParent.system().state().linksOfAssociation(assoc).links(); for (MLink link : links) { if (link.association().isDerived() || link.association().isUnion()) { - if (!assocs.containsKey(derrivedLinks)) { - assocs.put(derrivedLinks, new ArrayList() {{ add(link); }}); - } else { - assocs.get(derrivedLinks).add(link); - } + assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); } else if (MAssociationClassImpl.class.isInstance(link.association())) { - if (!assocs.containsKey(associationClass)) { - assocs.put(associationClass, new ArrayList() {{ add(link); }}); - } else { - assocs.get(associationClass).add(link); - } + assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); } else if (MAssociation.class.isInstance(link.association()) && link.linkEnds().size() > 2) { - if (!assocs.containsKey(nAryLinks)) { - assocs.put(nAryLinks, new ArrayList() {{ add(link); }}); - } else { - assocs.get(nAryLinks).add(link); - } + assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); } else if (MAssociation.class.isInstance(link.association()) - && link.association().associatedClasses().size() == 1 ) { - if (!assocs.containsKey(reflexivLinks)) { - assocs.put(reflexivLinks, new ArrayList() {{ add(link); }}); - } else { - assocs.get(reflexivLinks).add(link); - } + && link.association().associatedClasses().size() == 1) { + assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); } else if (MAssociation.class.isInstance(link.association()) && link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - if (!assocs.containsKey(binaryLinks)) { - assocs.put(binaryLinks, new ArrayList() {{ add(link); }}); - } else { - assocs.get(binaryLinks).add(link); - } + assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); } else { System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); } @@ -1954,38 +1935,22 @@ public TreeMap> mapLinksToKindOfAssociation() { Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); for (MLink agg : aggregations) { - if (!assocs.containsKey(aggregation)) { - assocs.put(aggregation, new ArrayList() { - { - add(agg); - } - }); - } else { - assocs.get(aggregation).add(agg); - } + assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); } break; - case 2: // Compositon + case 2: // Composition - // Get Compositon - Set compositons = fParent.system().state().linksOfAssociation(assoc).links(); + // Get Compositions + Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink comp : compositons) { - if (!assocs.containsKey(compositon)) { - assocs.put(compositon, new ArrayList() { - { - add(comp); - } - }); - } else { - assocs.get(compositon).add(comp); - } + for (MLink comp : compositions) { + assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); } break; } } - return new TreeMap>(assocs); + return new TreeMap<>(assocs); } From 260a5609b5f7fe2abc7804a59e3ae33732a19daa Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 11 Feb 2026 15:42:46 +0100 Subject: [PATCH 05/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20mark=20immutable=20fields=20and=20inner=20action=20?= =?UTF-8?q?fields=20as=20final=20(small=20cleanup)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectdiagram/NewObjectDiagram.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 2103d891d..6930fc23b 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -107,7 +107,6 @@ import org.tzi.use.uml.ocl.value.Value; import org.tzi.use.uml.sys.*; import org.tzi.use.util.StringUtil; -import org.tzi.use.util.StringUtil.IElementFormatter; import org.w3c.dom.Element; import com.ximpleware.AutoPilot; @@ -121,7 +120,6 @@ * @author Mark Richters * @author Lars Hamann */ -@SuppressWarnings("serial") public class NewObjectDiagram extends DiagramViewWithObjectNode implements HighlightChangeListener, SortChangeListener { /** @@ -217,31 +215,31 @@ public void clear() { public Map getLinkObjectToNodeEdge() { return fLinkObjectToNodeEdge; } } - protected ObjectDiagramData visibleData = new ObjectDiagramData(); + protected final ObjectDiagramData visibleData = new ObjectDiagramData(); - private ObjectDiagramData hiddenData = new ObjectDiagramData(); + private final ObjectDiagramData hiddenData = new ObjectDiagramData(); - private NewObjectDiagramView fParent; + private final NewObjectDiagramView fParent; /** * The position of the next object node. This is either set to a random * value or to a specific position when an object is created by drag & drop. */ - protected Point2D.Double nextNodePosition = new Point2D.Double(); + protected Point2D.Double nextNodePosition = new Point2D.Double(); /** * Last position of deleted nodes and links. In case of restoration, the * nodes (object nodes, linkobject nodes) are positioned as they were * before. Objects use {@link StrategyFixed}, so we just save the position. */ - private Map lastKnownNodePositions = new WeakHashMap<>(); - private Map lastKnownLinkPositions = new WeakHashMap<>(); + private final Map lastKnownNodePositions = new WeakHashMap<>(); + private final Map lastKnownLinkPositions = new WeakHashMap<>(); - protected ShowObjectPropertiesViewMouseListener showObjectPropertiesViewMouseListener = new ShowObjectPropertiesViewMouseListener(); + protected final ShowObjectPropertiesViewMouseListener showObjectPropertiesViewMouseListener = new ShowObjectPropertiesViewMouseListener(); - private ObjectSelection fSelection; + private final ObjectSelection fSelection; - protected DiagramInputHandling inputHandling; + protected final DiagramInputHandling inputHandling; private static boolean javaFxCall = false; @@ -959,15 +957,15 @@ public void updateObject(MInstance obj) { * Adds a new Link to the objectdiagram. */ class ActionInsertLink extends AbstractAction { - private MAssociation fAssociation; - private MObject[] fParticipants; + private final MAssociation fAssociation; + private final MObject[] fParticipants; ActionInsertLink(MAssociation association, MObject[] participants) { fAssociation = association; fParticipants = participants; StringBuilder txt = new StringBuilder("insert ("); - StringUtil.fmtSeq(txt, participants, ",", (MObject element) -> element.name()); + StringUtil.fmtSeq(txt, participants, ",", MObject::name); txt.append(") into ").append(association.name()); @@ -983,7 +981,7 @@ public void actionPerformed(ActionEvent e) { * Deletes a Link from the object diagram. */ class ActionDeleteLink extends AbstractAction { - private MLink link; + private final MLink link; ActionDeleteLink(MLink link) { this.link = link; @@ -1016,7 +1014,7 @@ public void actionPerformed(ActionEvent e) { * Deletes the selected objects. */ class ActionDelete extends AbstractAction { - private Set fObjects; + private final Set fObjects; ActionDelete(String text, Set objects) { super(text); @@ -1033,7 +1031,7 @@ public void actionPerformed(ActionEvent e) { * Show properties of objects */ class ActionShowProperties extends AbstractAction { - private MObject fObject; + private final MObject fObject; ActionShowProperties(String text, MObject object) { super(text); From b91a5a291cf879614cab739ad2315fed1f6a1eef Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 11 Feb 2026 15:48:24 +0100 Subject: [PATCH 06/34] =?UTF-8?q?fix(gui):=20AssociationOrLinkPartEdge=20?= =?UTF-8?q?=E2=80=94=20use=20getter=20for=20visibleData=20object=20map=20t?= =?UTF-8?q?o=20avoid=20private-field=20access?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagrams/elements/edges/AssociationOrLinkPartEdge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java index 67d7a579a..7f8c0e201 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java @@ -230,7 +230,7 @@ public boolean adjacentObjectNodeGreyed() { List adjacentObjects = getLink().linkedObjects(); for (MObject adjacentObject : adjacentObjects) { - ObjectNode node = visibleData.fObjectToNodeMap.get(adjacentObject); + ObjectNode node = visibleData.getObjectToNodeMap().get(adjacentObject); if(node.isGreyed()) { return true; } From 1f256296296a21361b450fe5d32ab65bc439d882 Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 11 Feb 2026 16:02:10 +0100 Subject: [PATCH 07/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20safety=20and=20modernization:=20safe=20map=20access?= =?UTF-8?q?es,=20use=20List.sort,=20use=20fLog.println,=20lambdas=20and=20?= =?UTF-8?q?small=20readability=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectdiagram/NewObjectDiagram.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 6930fc23b..e706bfee3 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1356,7 +1356,7 @@ public void actionPerformed(ActionEvent arg0) { List sortedPSMs = new LinkedList<>( obj.cls().getAllOwnedProtocolStateMachines()); - Collections.sort(sortedPSMs, new MNamedElementComparator()); + sortedPSMs.sort(new MNamedElementComparator()); for (MProtocolStateMachine psm : sortedPSMs) { showProtocolStateMachine.setEnabled(true); @@ -1381,12 +1381,9 @@ public ActionListener setStateMachine(MProtocolStateMachine sm, MObject instance } final JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", getOptions().isShowStates()); - showStates.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent ev) { - getOptions().setShowStates(ev.getStateChange() == ItemEvent.SELECTED); - invalidateContent(true); - } + showStates.addItemListener(ev -> { + getOptions().setShowStates(ev.getStateChange() == ItemEvent.SELECTED); + invalidateContent(true); }); popupMenu.insert(showStates, pos + 3); @@ -1494,14 +1491,14 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { dtde.dropComplete(true); } catch (IOException exception) { if (fLog != null) { - fLog.append("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); + fLog.println("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); } else { System.err.println("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); } dtde.dropComplete(false); } catch (UnsupportedFlavorException ufException) { if (fLog != null) { - fLog.append("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); + fLog.println("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); } else { System.err.println("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); } @@ -1780,7 +1777,7 @@ public void restorePlacementInfos(PersistHelper helper, int version) { DiamondNode node = visibleData.fNaryLinkToDiamondNodeMap.get(link); helper.toParent(); node.restorePlacementInfo(helper, version); - } + } } } catch (XPathEvalException e) { fLog.append(e.getMessage()); From a841dbd9edbe078ce364aa78f764e015d9f582f6 Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 12 Feb 2026 22:34:19 +0100 Subject: [PATCH 08/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20cleanups=20&=20warnings=20fixes=20=C3=84nderungen:?= =?UTF-8?q?=20-=20Map-safety=20&=20Null-Checks=20=20=20-=20Ersetzte=20unsi?= =?UTF-8?q?chere=20Map.get()-Aufrufe=20durch=20computeIfPresent=20/=20null?= =?UTF-8?q?-checks.=20=20=20-=20Entfernte=20doppelte=20containsKey/get-Kom?= =?UTF-8?q?binationen.=20-=20Listener=20&=20Event-Handling=20=20=20-=20Ent?= =?UTF-8?q?fernt=20unbenutztes=20Feld/innere=20Klasse=20ShowObjectProperti?= =?UTF-8?q?esViewMouseListener.=20=20=20-=20Vereinfacht=20MouseListener=20?= =?UTF-8?q?mit=20Pattern=20Matching=20(instanceof).=20-=20Data=20&=20API?= =?UTF-8?q?=20=20=20-=20Vereinheitlichte=20Handhabung=20sichtbarer/verborg?= =?UTF-8?q?ener=20Daten=20via=20ObjectDiagramData-Accessoren.=20=20=20-=20?= =?UTF-8?q?getVisibleData/getHiddenData=20abgestimmt.=20=20=20-=20getDefau?= =?UTF-8?q?ltLayoutFileSuffix=20gesetzt.=20-=20Readability=20&=20Helpers?= =?UTF-8?q?=20=20=20-=20createAction=20Helper=20eingef=C3=BChrt,=20Boilerp?= =?UTF-8?q?late=20reduziert.=20=20=20-=20getLinkByValue=20implementiert=20?= =?UTF-8?q?(Restore/layouter=20Hilfsmethode).=20-=20Analyzer=20&=20Warning?= =?UTF-8?q?s=20=20=20-=20@SuppressWarnings(unused)=20wo=20sinnvoll=20(z.B.?= =?UTF-8?q?=20isHidden=20Persist-Helper=20Version).=20=20=20-=20Weitere=20?= =?UTF-8?q?Konsistenz-=20und=20Null-Sicherheits-Fixes.=20Keine=20API-Break?= =?UTF-8?q?ing=20=C3=84nderungen;=20low-risk=20Refactorings=20zur=20Verbes?= =?UTF-8?q?serung=20der=20Lesbarkeit=20und=20Analysehygiene.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/tzi/use/util/Debug.java | 33 + use-gui/src/main/java/module-info.java | 4 + .../edges/AssociationOrLinkPartEdge.java | 8 +- .../objectdiagram/NewObjectDiagram.java | 1041 ++++++++--------- 4 files changed, 553 insertions(+), 533 deletions(-) create mode 100644 use-core/src/main/java/org/tzi/use/util/Debug.java diff --git a/use-core/src/main/java/org/tzi/use/util/Debug.java b/use-core/src/main/java/org/tzi/use/util/Debug.java new file mode 100644 index 000000000..efc80d8c9 --- /dev/null +++ b/use-core/src/main/java/org/tzi/use/util/Debug.java @@ -0,0 +1,33 @@ +package org.tzi.use.util; + +/** + * Small debug helper to enable conditional debug output without polluting + * the normal test/golden outputs. Activate by setting system property + * -Duse.debug=true or environment variable USE_DEBUG=true. + */ +public final class Debug { + private Debug() {} + + public static boolean enabled() { + try { + String p = System.getProperty("use.debug"); + if (p != null) return "true".equalsIgnoreCase(p); + String e = System.getenv("USE_DEBUG"); + return "true".equalsIgnoreCase(e); + } catch (Throwable t) { + return false; + } + } + + public static void log(String s) { + if (enabled()) { + try { + // Try to write to USE protocol (preferred for integration tests) + org.tzi.use.util.USEWriter.getInstance().protocol("[USE-DEBUG] " + s); + } catch (Throwable ignore) { + // fallback to stderr + System.err.println("[USE-DEBUG] " + s); + } + } + } +} diff --git a/use-gui/src/main/java/module-info.java b/use-gui/src/main/java/module-info.java index 454e2590e..c073fda2a 100644 --- a/use-gui/src/main/java/module-info.java +++ b/use-gui/src/main/java/module-info.java @@ -31,4 +31,8 @@ exports org.tzi.use.gui.views.diagrams.behavior.shared to com.google.common; exports org.tzi.use.gui.views.selection to com.google.common; exports org.tzi.use.gui.views.diagrams.statemachine to com.google.common; + exports org.tzi.use.gui.views.diagrams.elements; + exports org.tzi.use.gui.views.diagrams.elements.edges; + exports org.tzi.use.gui.views.diagrams.event; + exports org.tzi.use.gui.views.selection.objectselection; } \ No newline at end of file diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java index 7f8c0e201..3b35485a1 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java @@ -231,7 +231,7 @@ public boolean adjacentObjectNodeGreyed() { List adjacentObjects = getLink().linkedObjects(); for (MObject adjacentObject : adjacentObjects) { ObjectNode node = visibleData.getObjectToNodeMap().get(adjacentObject); - if(node.isGreyed()) { + if (node != null && node.isGreyed()) { return true; } } @@ -365,8 +365,7 @@ public void drawProperties(Graphics2D g) { public static AssociationOrLinkPartEdge create(PlaceableNode source, PlaceableNode target, MAssociationEnd targetEnd, DiagramView diagram, MAssociation assoc, MLink link) { - AssociationOrLinkPartEdge edge = new AssociationOrLinkPartEdge(source, target, targetEnd, diagram, assoc, link); - return edge; + return new AssociationOrLinkPartEdge(source, target, targetEnd, diagram, assoc, link); } /** @@ -375,8 +374,7 @@ public static AssociationOrLinkPartEdge create(PlaceableNode source, public static AssociationOrLinkPartEdge create(PlaceableNode source, PlaceableNode target, String name, MAssociationEnd targetEnd, DiagramView diagram, MAssociation assoc, MLink link) { - AssociationOrLinkPartEdge edge = new AssociationOrLinkPartEdge(source, target, name, targetEnd, diagram, assoc, link); - return edge; + return new AssociationOrLinkPartEdge(source, target, name, targetEnd, diagram, assoc, link); } @Override diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index e706bfee3..ca9d107e1 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -32,7 +32,6 @@ import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; @@ -43,7 +42,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -150,12 +148,17 @@ public ObjectDiagramData() { } /** - * @param link - * @return + * Checks whether this diagram data contains the given link. + * + * @param link the link to test + * @return true if this data contains an edge or node representing the link */ public boolean containsLink(MLink link) { - return fBinaryLinkToEdgeMap.containsKey(link) || fNaryLinkToDiamondNodeMap.containsKey(link) - || fLinkObjectToNodeEdge.containsKey(link); + boolean has = fBinaryLinkToEdgeMap.containsKey(link) || fNaryLinkToDiamondNodeMap.containsKey(link); + if (!has && link instanceof MLinkObject) { + has = fLinkObjectToNodeEdge.containsKey((MLinkObject) link); + } + return has; } @Override @@ -188,6 +191,7 @@ public Set getEdges() { * * @param target the target ObjectDiagramData to copy the data into */ + @SuppressWarnings("unused") public void copyTo(ObjectDiagramData target) { target.fBinaryLinkToEdgeMap.putAll(this.fBinaryLinkToEdgeMap); target.fHalfLinkToEdgeMap.putAll(this.fHalfLinkToEdgeMap); @@ -208,11 +212,25 @@ public void clear() { } // Accessors to preserve encapsulation - public Map getObjectToNodeMap() { return fObjectToNodeMap; } - public Map getBinaryLinkToEdgeMap() { return fBinaryLinkToEdgeMap; } - public Map getNaryLinkToDiamondNodeMap() { return fNaryLinkToDiamondNodeMap; } - public Map> getHalfLinkToEdgeMap() { return fHalfLinkToEdgeMap; } - public Map getLinkObjectToNodeEdge() { return fLinkObjectToNodeEdge; } + public Map getObjectToNodeMap() { + return fObjectToNodeMap; + } + + public Map getBinaryLinkToEdgeMap() { + return fBinaryLinkToEdgeMap; + } + + public Map getNaryLinkToDiamondNodeMap() { + return fNaryLinkToDiamondNodeMap; + } + + public Map> getHalfLinkToEdgeMap() { + return fHalfLinkToEdgeMap; + } + + public Map getLinkObjectToNodeEdge() { + return fLinkObjectToNodeEdge; + } } protected final ObjectDiagramData visibleData = new ObjectDiagramData(); @@ -225,7 +243,7 @@ public void clear() { * The position of the next object node. This is either set to a random * value or to a specific position when an object is created by drag & drop. */ - protected Point2D.Double nextNodePosition = new Point2D.Double(); + protected Point2D.Double nextNodePosition = new Point2D.Double(); /** * Last position of deleted nodes and links. In case of restoration, the @@ -235,12 +253,13 @@ public void clear() { private final Map lastKnownNodePositions = new WeakHashMap<>(); private final Map lastKnownLinkPositions = new WeakHashMap<>(); - protected final ShowObjectPropertiesViewMouseListener showObjectPropertiesViewMouseListener = new ShowObjectPropertiesViewMouseListener(); + // show object properties listener is attached inline in constructor (no field required) private final ObjectSelection fSelection; protected final DiagramInputHandling inputHandling; + @SuppressWarnings("unused") private static boolean javaFxCall = false; /** @@ -271,7 +290,18 @@ protected NewObjectDiagram(NewObjectDiagramView parent, PrintWriter log, ObjDiag fParent.addKeyListener(inputHandling); addMouseListener(inputHandling); - addMouseListener(showObjectPropertiesViewMouseListener); + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + PlaceableNode pickedObjectNode = findNode(e.getX(), e.getY()); + if (pickedObjectNode instanceof ObjectNode on) { + ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); + v.selectObject(on.object().name()); + } + } + } + }); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { @@ -288,10 +318,6 @@ public ObjDiagramOptions getOptions() { return (ObjDiagramOptions) super.getOptions(); } - public ObjectSelection getObjectSelection() { - return this.fSelection; - } - /** * Displays objects of the selected class in the modelbrowser. */ @@ -305,28 +331,34 @@ public void stateChanged(HighlightChangeEvent e) { boolean allEdgesSelected = true; // elem is an association - if (elem instanceof MAssociation) { - MAssociation assoc = (MAssociation) elem; + if (elem instanceof MAssociation assoc) { int size = assoc.associationEnds().size(); Set links = fParent.system().state().linksOfAssociation(assoc).links(); - EdgeBase eb; + EdgeBase ed; if (size == 2) { for (MLink link : links) { - eb = visibleData.getBinaryLinkToEdgeMap().get(link); if (elem instanceof MAssociationClass) { - eb = visibleData.getLinkObjectToNodeEdge().get(link); + if (link instanceof MLinkObject) { + ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + } else { + ed = visibleData.getBinaryLinkToEdgeMap().get(link); + } + } else { + ed = visibleData.getBinaryLinkToEdgeMap().get(link); } - edges.add(eb); + edges.add(ed); } } else { for (MLink link : links) { edges.addAll(visibleData.getHalfLinkToEdgeMap().getOrDefault(link, Collections.emptyList())); if (elem instanceof MAssociationClass) { - eb = visibleData.getLinkObjectToNodeEdge().get(link); - edges.add(eb); + if (link instanceof MLinkObject) { + ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + edges.add(ed); + } } } } @@ -386,7 +418,7 @@ public void hideAll() { * Hides all currently visible links. The diagram is not repainted! */ public void hideAllLinks() { - Set links = new HashSet<>(this.visibleData.getBinaryLinkToEdgeMap().keySet()); + Set links = new HashSet<>(this.visibleData.getBinaryLinkToEdgeMap().keySet()); for (MLink e : links) { hideBinaryLink(e); @@ -447,9 +479,8 @@ public void addObject(MObject obj) { /** * Shows an already hidden object again - * - * @param obj - * The object to show + * + * @param obj The object to show */ public void showObject(MObject obj) { if (visibleData.getObjectToNodeMap().containsKey(obj)) @@ -502,17 +533,16 @@ public void moveObjectNode(MObject obj, int x, int y) { /** * Hides an object in the diagram - * - * @param obj - * The MObject to hide + * + * @param obj The MObject to hide */ public void hideObject(MObject obj) { // a hidden object should no longer be selected ObjectNode removedNode = visibleData.getObjectToNodeMap().get(obj); - if(removedNode!=null) { + if (removedNode != null) { fNodeSelection.remove(removedNode); } - + showOrHideObjectNode(obj, false); // Hide all links the object participates in @@ -526,8 +556,7 @@ public void hideObject(MObject obj) { MLinkSet links = fParent.system().state().linksOfAssociation(assoc); // TODO: Not very fast! for (MLink link : links.links()) { - if (link.linkedObjects().contains(obj) - || (link instanceof MLinkObject && ((MLinkObject) link).equals(obj))) { + if (link.linkedObjects().contains(obj) || (link instanceof MLinkObject && link.equals(obj))) { hideLink(link); } } @@ -597,85 +626,11 @@ public void addLink(MLink link) { } } - protected void addBinaryLink(MLink link) { - MAssociation assoc = link.association(); - - MLinkEnd linkEnd1 = link.linkEnd(assoc.associationEnds().get(0)); - MLinkEnd linkEnd2 = link.linkEnd(assoc.associationEnds().get(1)); - - MObject obj1 = linkEnd1.object(); - MObject obj2 = linkEnd2.object(); - // TODO: Create link edge factory. - - // object link - if (link instanceof MLinkObject) { - BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( - visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), - linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, - link); - - if (lastKnownLinkPositions.containsKey(link)) { - e.initialize(); - visibleData.getObjectToNodeMap().get(link).setStrategy(lastKnownLinkPositions.get(link)); - lastKnownLinkPositions.remove(link); - fGraph.addInitializedEdge(e); - } else { - fGraph.addEdge(e); - } - visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - fLayouter = null; - } else { - // binary link - boolean isHidden = false; - ObjectNode node1; - ObjectNode node2; - - if (visibleData.getObjectToNodeMap().containsKey(obj1)) { - node1 = visibleData.getObjectToNodeMap().get(obj1); - } else { - node1 = hiddenData.getObjectToNodeMap().get(obj1); - isHidden = true; - } - - if (visibleData.getObjectToNodeMap().containsKey(obj2)) { - node2 = visibleData.getObjectToNodeMap().get(obj2); - } else { - node2 = hiddenData.getObjectToNodeMap().get(obj2); - isHidden = true; - } - - BinaryAssociationOrLinkEdge e = createBinaryAssociationOrLinkEdge(node1, node2, linkEnd1, - linkEnd2, this, link); - - if (link.isVirtual()) { - e.setDashed(true); - } - - if (isHidden) { - hiddenData.getBinaryLinkToEdgeMap().put(link, e); - } else { - fGraph.addEdge(e); - visibleData.getBinaryLinkToEdgeMap().put(link, e); - fLayouter = null; - } - } - } - - /** - * This part is a separate method for easier inheritance. - * - * @author Andreas Kaestner - */ - protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(PlaceableNode source, PlaceableNode target, - MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { - return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); - } - protected void addNAryLink(MLink link) { getRandomNextPosition(); - + List linkedObjectNodes = new ArrayList<>(); - for(MObject linkedObject : link.linkedObjects()) { + for (MObject linkedObject : link.linkedObjects()) { linkedObjectNodes.add(visibleData.getObjectToNodeMap().get(linkedObject)); } @@ -709,12 +664,19 @@ protected void addNAryLink(MLink link) { fGraph.addEdge(e); halfEdges.add(e); - edgeIds.add(linkEnd.associationEnd().nameAsRolename()); + edgeIds.add(linkEnd.associationEnd().nameAsRolename()); } - if (visibleData.getLinkObjectToNodeEdge().get(link) != null) { - halfEdges.add(visibleData.getLinkObjectToNodeEdge().get(link)); - edgeIds.add(((MLinkObject) link).name()); + // If there is an associated link-object edge, add it once (avoid duplicate map access) + { + EdgeBase linkObjEdge = null; + if (link instanceof MLinkObject) { + linkObjEdge = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + } + if (linkObjEdge != null) { + halfEdges.add(linkObjEdge); + edgeIds.add(((MLinkObject) link).name()); + } } node.setHalfEdges(halfEdges, edgeIds); @@ -725,8 +687,8 @@ protected void addNAryLink(MLink link) { /** * Show one link. The diagram is not repainted! - * - * @param link + * + * @param link the link to show */ public void showLink(MLink link) { if (visibleData.containsLink(link)) @@ -752,8 +714,8 @@ public void showLink(MLink link) { /** * Hide one link. The diagram is not repainted! - * - * @param link + * + * @param link the link to hide */ public void hideLink(MLink link) { if (hiddenData.containsLink(link)) @@ -793,13 +755,13 @@ protected void showOrHideBinaryLink(MLink link, boolean show) { // object link if (link instanceof MLinkObject) { - EdgeBase e = source.getLinkObjectToNodeEdge().get(link); + EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); if (show && e != null) fGraph.addInitializedEdge(e); else if (e != null) fGraph.removeEdge(e); - source.getLinkObjectToNodeEdge().remove(link); + source.getLinkObjectToNodeEdge().remove((MLinkObject) link); target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } else { @@ -820,22 +782,22 @@ protected void showOrHideNAryLink(MLink link, boolean show) { ObjectDiagramData source = (show ? hiddenData : visibleData); ObjectDiagramData target = (show ? visibleData : hiddenData); - DiamondNode node = source.fNaryLinkToDiamondNodeMap.get(link); - if (show){ - if (node == null){ - node = target.fNaryLinkToDiamondNodeMap.get(link); + DiamondNode node = source.getNaryLinkToDiamondNodeMap().get(link); + if (show) { + if (node == null) { + node = target.getNaryLinkToDiamondNodeMap().get(link); } fGraph.add(node); } else { fGraph.remove(node); } - target.fNaryLinkToDiamondNodeMap.put(link, node); - source.fNaryLinkToDiamondNodeMap.remove(link); - + target.getNaryLinkToDiamondNodeMap().put(link, node); + source.getNaryLinkToDiamondNodeMap().remove(link); + // connected to an "object link" if (link instanceof MLinkObject) { - EdgeBase e = source.fLinkObjectToNodeEdge.get(link); + EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); if (e != null) { if (show) @@ -843,13 +805,13 @@ protected void showOrHideNAryLink(MLink link, boolean show) { else fGraph.removeEdge(e); - source.fLinkObjectToNodeEdge.remove(link); - target.fLinkObjectToNodeEdge.put((MLinkObject) link, e); + source.getLinkObjectToNodeEdge().remove((MLinkObject) link); + target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } } - List halfEdges = source.fHalfLinkToEdgeMap.get(link); + List halfEdges = source.getHalfLinkToEdgeMap().get(link); if (halfEdges != null) { for (EdgeBase edge : halfEdges) { @@ -859,26 +821,26 @@ protected void showOrHideNAryLink(MLink link, boolean show) { fGraph.removeEdge(edge); } - source.fHalfLinkToEdgeMap.remove(link); - target.fHalfLinkToEdgeMap.put(link, halfEdges); + source.getHalfLinkToEdgeMap().remove(link); + target.getHalfLinkToEdgeMap().put(link, halfEdges); } fLayouter = null; } /** - * Removes a link from the diagram. + * Deletes a link from the diagram. */ public void deleteLink(MLink link) { if (link.linkEnds().size() == 2) { - EdgeBase e = null; + EdgeBase e; // initialize later based on visibility boolean isVisible; boolean isLinkObject = link instanceof MLinkObject; ObjectDiagramData data; if (isLinkObject) { - isVisible = visibleData.getLinkObjectToNodeEdge().containsKey(link); + isVisible = visibleData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link); data = isVisible ? visibleData : hiddenData; - e = data.getLinkObjectToNodeEdge().get(link); + e = data.getLinkObjectToNodeEdge().get((MLinkObject) link); } else { isVisible = visibleData.getBinaryLinkToEdgeMap().containsKey(link); data = isVisible ? visibleData : hiddenData; @@ -890,14 +852,14 @@ public void deleteLink(MLink link) { } if (isLinkObject) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get(link); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get((MLinkObject) link); if (edge != null) { PlaceableNode objectNode = edge.getClassOrObjectNode(); lastKnownLinkPositions.put(link, objectNode.getStrategy()); } data.getBinaryLinkToEdgeMap().remove(link); - data.getLinkObjectToNodeEdge().remove(link); + data.getLinkObjectToNodeEdge().remove((MLinkObject) link); } else { data.getBinaryLinkToEdgeMap().remove(link); } @@ -930,12 +892,12 @@ public void deleteLink(MLink link) { n.dispose(); if (link instanceof MLinkObject) { - EdgeBase edge = data.getLinkObjectToNodeEdge().get(link); + EdgeBase edge = data.getLinkObjectToNodeEdge().get((MLinkObject) link); if (edge != null) { lastKnownLinkPositions.put(link, ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); fGraph.removeEdge(edge); - data.getLinkObjectToNodeEdge().remove(link); + data.getLinkObjectToNodeEdge().remove((MLinkObject) link); edge.dispose(); } } @@ -944,13 +906,15 @@ public void deleteLink(MLink link) { /** * Forces the object node to update its content. - * - * @param obj + * + * @param obj the MInstance whose node should be refreshed */ public void updateObject(MInstance obj) { - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - if (node != null) + // Use computeIfPresent with an explicit cast of the key to the Map's key type (MObject) + visibleData.getObjectToNodeMap().computeIfPresent((MObject) obj, (k, node) -> { invalidateNode(node); + return node; // keep the existing mapping + }); } /** @@ -1030,7 +994,8 @@ public void actionPerformed(ActionEvent e) { /** * Show properties of objects */ - class ActionShowProperties extends AbstractAction { + @SuppressWarnings("unused") + static class ActionShowProperties extends AbstractAction { private final MObject fObject; ActionShowProperties(String text, MObject object) { @@ -1039,8 +1004,8 @@ class ActionShowProperties extends AbstractAction { } public void actionPerformed(ActionEvent e) { - if (MainWindow.getJavaFxCall()){ - Platform.runLater(()->{ + if (MainWindow.getJavaFxCall()) { + Platform.runLater(() -> { // to create an instance of a SwingNode, which is used to hold the Swing-Components SwingNode swingNode = new SwingNode(); @@ -1069,22 +1034,6 @@ public void actionPerformed(ActionEvent e) { } } - private class ShowObjectPropertiesViewMouseListener extends MouseAdapter { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - // mouse over node? - PlaceableNode pickedObjectNode = findNode(e.getX(), e.getY()); - if (pickedObjectNode instanceof ObjectNode) { - ObjectNode obj = (ObjectNode) pickedObjectNode; - ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); - v.selectObject(obj.object().name()); - } - } - } - } - /** * Creates and shows popup menu if mouse event is the trigger for popups. */ @@ -1111,8 +1060,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { } for (EdgeBase selectedEdge : fEdgeSelection) { - if (selectedEdge instanceof LinkEdge) { - LinkEdge aEdge = (LinkEdge) selectedEdge; + if (selectedEdge instanceof LinkEdge aEdge) { MLink link = aEdge.getLink(); selectedLinks.add(link); selectedObjectsOfAssociation.addAll(link.linkedObjects()); @@ -1125,7 +1073,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { // This text is reused often String selectedObjectsText = null; if (selectedObjects.size() == 1) { - selectedObjectsText = "'" + selectedObjects.get(0).name() + "'"; + selectedObjectsText = "'" + exactlyOne(selectedObjects).name() + "'"; } else if (selectedObjects.size() > 1) { selectedObjectsText = selectedObjects.size() + " objects"; } @@ -1134,8 +1082,8 @@ protected PopupMenuInfo unionOfPopUpMenu() { // A single object can be edited if (selectedObjects.size() == 1) { popupMenu.insert( - new ActionShowProperties("Edit properties of " + selectedObjectsText, selectedObjects.get(0)), - pos++); + new ActionShowProperties("Edit properties of " + selectedObjectsText, exactlyOne(selectedObjects)), + pos++); } // A single object or multiple objects can be deleted. @@ -1230,22 +1178,18 @@ protected PopupMenuInfo unionOfPopUpMenu() { } // New Action for Hide - popupMenu.insert(new AbstractAction(labelHide) { - - @Override - public void actionPerformed(ActionEvent arg0) { - if (!selectedLinks.isEmpty()) { - selectedLinks.forEach(NewObjectDiagram.this::hideLink); - } - if (!selectedObjects.isEmpty()) { - selectedObjects.forEach(NewObjectDiagram.this::hideObject); - } - repaint(); + popupMenu.insert(createAction(labelHide, arg0 -> { + if (!selectedLinks.isEmpty()) { + selectedLinks.forEach(NewObjectDiagram.this::hideLink); } - }, pos++); + if (!selectedObjects.isEmpty()) { + selectedObjects.forEach(NewObjectDiagram.this::hideObject); + } + repaint(); + }), pos++); // new Action for crop - Set objectsToHide = new HashSet<>(selectedObjects); + Set objectsToHide = new HashSet<>(selectedObjects); selectedLinks.forEach(link -> { if (link instanceof MLinkObject) { objectsToHide.add((MLinkObject) link); @@ -1254,132 +1198,83 @@ public void actionPerformed(ActionEvent arg0) { } }); - final String label = labelCrop; - popupMenu.insert(new AbstractAction(labelCrop) { - @Override - public void actionPerformed(ActionEvent e) { - getAction(label, getNoneSelectedNodes(objectsToHide)).actionPerformed(e); - } - }, pos++); + final String labelCropFinal = labelCrop; // ensure effectively final + popupMenu.insert(createAction(labelCrop, e -> getAction(labelCropFinal, getNoneSelectedNodes(objectsToHide)).actionPerformed(e)), pos++); - // new Action for grey in/out + // new Action for gray in/out (single) if (selectedObjects.size() == 1) { - MObject obj = selectedObjects.iterator().next(); - if (visibleData.getObjectToNodeMap().containsKey(obj)) { - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - String labelGreyed = node.isGreyed() ? "Grey in" : "Grey out"; - - popupMenu.insert(new AbstractAction(labelGreyed + " " + node.name()) { - @Override - public void actionPerformed(ActionEvent e) { - node.setGreyed(!node.isGreyed()); - repaint(); - } - }, pos++); + MObject obj = exactlyOne(selectedObjects); + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + if (node != null) { + String labelGreyed = node.isGreyed() ? "Gray in" : "Gray out"; + + popupMenu.insert(createAction(labelGreyed + " " + node.name(), e -> { + node.setGreyed(!node.isGreyed()); + repaint(); + }), pos++); } } else if (selectedObjects.size() > 1) { Set objToGreyIn = new HashSet<>(); - selectedObjects.stream().filter(obj -> visibleData.getObjectToNodeMap().get(obj).isGreyed()) - .forEach(obj -> objToGreyIn.add(visibleData.getObjectToNodeMap().get(obj))); - Set objToGreyOut = new HashSet<>(); - selectedObjects.stream().filter(obj -> !visibleData.getObjectToNodeMap().get(obj).isGreyed()) - .forEach(obj -> objToGreyOut.add(visibleData.getObjectToNodeMap().get(obj))); + for (MObject so : selectedObjects) { + ObjectNode n = visibleData.getObjectToNodeMap().get(so); + if (n != null) { + if (n.isGreyed()) objToGreyIn.add(n); + else objToGreyOut.add(n); + } + } + // gray in if (!objToGreyIn.isEmpty()) { - popupMenu.insert(new AbstractAction("Grey in " + objToGreyIn.size() + " elements") { - - @Override - public void actionPerformed(ActionEvent arg0) { - objToGreyIn.forEach(obj -> obj.setGreyed(false)); - repaint(); - } - }, pos++); + popupMenu.insert(createAction("Gray in " + objToGreyIn.size() + " elements", arg0 -> { + objToGreyIn.forEach(n -> n.setGreyed(false)); + repaint(); + }), pos++); } - // Action for grey out more elements + // gray out if (!objToGreyOut.isEmpty()) { - popupMenu.insert(new AbstractAction("Grey out " + objToGreyOut.size() + " elements") { - - @Override - public void actionPerformed(ActionEvent arg0) { - objToGreyOut.forEach(obj -> obj.setGreyed(true)); - repaint(); - } - }, pos++); + popupMenu.insert(createAction("Gray out " + objToGreyOut.size() + " elements", arg0 -> { + objToGreyOut.forEach(n -> n.setGreyed(true)); + repaint(); + }), pos++); } } - popupMenu.insert(new JSeparator(), pos++); } + popupMenu.insert(new JSeparator(), pos++); - final JMenu showHideCrop = new JMenu("Show/hide/crop objects"); + final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); + showProtocolStateMachine.setEnabled(false); + popupMenu.insert(showProtocolStateMachine, pos++); - if (!selectedObjects.isEmpty()) { - showHideCrop.add(fSelection.getSelectedObjectPathView("By path length...", selectedObjectsSet)); - } + if (selectedObjects.size() == 1) { + final MObject obj = exactlyOne(selectedObjects); - showHideCrop.add(fSelection.getSelectionWithOCLViewAction()); - showHideCrop.add(fSelection.getSelectionObjectView()); + List sortedPSMs = new LinkedList<>( + obj.cls().getAllOwnedProtocolStateMachines()); + sortedPSMs.sort(new MNamedElementComparator()); - popupMenu.insert(showHideCrop, pos++); + for (MProtocolStateMachine psm : sortedPSMs) { + showProtocolStateMachine.setEnabled(true); + final JMenuItem showGivenPSM = new JMenuItem(psm.name()); + showGivenPSM.addActionListener(new ActionListener() { + private MProtocolStateMachine sm; - if (!fGraph.isEmpty() || !hiddenData.getObjectToNodeMap().isEmpty()) { - if (!fGraph.isEmpty()) { - popupMenu.insert(fSelection.getSubMenuHideObject(), pos++); - } + public void actionPerformed(ActionEvent ev) { + MainWindow.instance().showStateMachineView(sm, obj); + } - if (!hiddenData.getObjectToNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuShowObject(), pos++); + public ActionListener setStateMachine(MProtocolStateMachine sm) { + this.sm = sm; + return this; + } + }.setStateMachine(psm)); + showProtocolStateMachine.add(showGivenPSM); } } - if (!visibleData.getBinaryLinkToEdgeMap().isEmpty() || !visibleData.getHalfLinkToEdgeMap().isEmpty() - || !visibleData.getLinkObjectToNodeEdge().isEmpty() - || !visibleData.getNaryLinkToDiamondNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuHideLinks(), pos++); - } - - if (!hiddenData.getBinaryLinkToEdgeMap().isEmpty() || !hiddenData.getHalfLinkToEdgeMap().isEmpty() - || !hiddenData.getLinkObjectToNodeEdge().isEmpty() || !hiddenData.getNaryLinkToDiamondNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuShowLinks(), pos++); - } - popupMenu.insert(new JSeparator(), pos++); - if (!selectedObjects.isEmpty()) { - final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); - showProtocolStateMachine.setEnabled(false); - popupMenu.insert(showProtocolStateMachine, pos++); - - if (selectedObjects.size() == 1) { - final MObject obj = exactlyOne(selectedObjects); - - List sortedPSMs = new LinkedList<>( - obj.cls().getAllOwnedProtocolStateMachines()); - sortedPSMs.sort(new MNamedElementComparator()); - - for (MProtocolStateMachine psm : sortedPSMs) { - showProtocolStateMachine.setEnabled(true); - final JMenuItem showGivenPSM = new JMenuItem(psm.name()); - showGivenPSM.addActionListener(new ActionListener() { - protected MProtocolStateMachine sm; - - public void actionPerformed(ActionEvent ev) { - MainWindow.instance().showStateMachineView(sm, obj); - } - - public ActionListener setStateMachine(MProtocolStateMachine sm, MObject instance) { - this.sm = sm; - return this; - } - }.setStateMachine(psm, obj)); - showProtocolStateMachine.add(showGivenPSM); - } - } - - popupMenu.insert(new JSeparator(), pos++); - } - final JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", getOptions().isShowStates()); showStates.addItemListener(ev -> { getOptions().setShowStates(ev.getStateChange() == ItemEvent.SELECTED); @@ -1393,16 +1288,13 @@ public ActionListener setStateMachine(MProtocolStateMachine sm, MObject instance /** * Finds all nodes which are not selected. - * - * @param selectedNodes - * Nodes which are selected at this point in the diagram. + * + * @param selectedNodes Nodes which are selected at this point in the diagram. * @return A HashSet of the none selected objects in the diagram. */ private Set getNoneSelectedNodes(Set selectedNodes) { Set noneSelectedNodes = new HashSet<>(); - Iterator it = fGraph.iterator(); - while (it.hasNext()) { - PlaceableNode o = it.next(); + for (PlaceableNode o : fGraph) { if (o instanceof ObjectNode) { MObject obj = ((ObjectNode) o).object(); if (!selectedNodes.contains(obj)) { @@ -1460,11 +1352,11 @@ private void displayObjectInfo(MObject obj, MouseEvent e) { } /** - * + * * Accepts a drag of a class from the ModelBrowser. A new object of this * class will be created. - * - * @param dtde + * + * @param dtde the drop event provided by the DnD subsystem */ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { @@ -1508,9 +1400,8 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { /** * Checks if the object info window should be displayed. - * - * @param e - * MouseEvent + * + * @param e MouseEvent */ public void mayBeShowObjectInfo(MouseEvent e) { if (fNodeSelection.size() == 1) { @@ -1544,11 +1435,11 @@ private int[] radixConversion(int number, int base, int maxDigits) { private boolean isCompleteObjectCombination(int[] c, int base) { for (int i = 0; i < base; ++i) { boolean found = false; - for (int j = 0; j < c.length; ++j) { - if (c[j] == i) { - found = true; - break; - } + for (int v : c) { + if (v == i) { + found = true; + break; + } } if (!found) return false; @@ -1585,15 +1476,15 @@ protected void storePlacementInfos(PersistHelper helper, Element root, boolean v n.storePlacementInfo(helper, root, !visible); } - for (PlaceableNode n : data.fNaryLinkToDiamondNodeMap.values()) { + for (PlaceableNode n : data.getNaryLinkToDiamondNodeMap().values()) { n.storePlacementInfo(helper, root, !visible); } - for (EdgeBase e : data.fBinaryLinkToEdgeMap.values()) { + for (EdgeBase e : data.getBinaryLinkToEdgeMap().values()) { e.storePlacementInfo(helper, root, !visible); } - for (EdgeBase e : data.fLinkObjectToNodeEdge.values()) { + for (EdgeBase e : data.getLinkObjectToNodeEdge().values()) { e.storePlacementInfo(helper, root, !visible); } } @@ -1601,260 +1492,192 @@ protected void storePlacementInfos(PersistHelper helper, Element root, boolean v @Override public void restorePlacementInfos(PersistHelper helper, int version) { if (version < 12) return; - + Set hiddenObjects = new HashSet<>(); + + // delegate to smaller, well-scoped helpers + restoreBinaryEdges(helper, version, hiddenObjects); + restoreNodeEdges(helper, version, hiddenObjects); + restoreDiamondNodes(helper, version, hiddenObjects); + + // Hide elements collected during restore + hideElementsInDiagram(hiddenObjects); + } + + // Helper: restore binary association edges placement info + @SuppressWarnings("unused") + private void restoreBinaryEdges(PersistHelper helper, int version, Set hiddenObjects) { AutoPilot ap = new AutoPilot(helper.getNav()); - - // First restore edges to get possible new nodes, then nodes helper.getNav().push(); - try { - // Restore edges ap.selectXPath("./edge[@type='BinaryEdge']"); - try { - while (ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); String sourceObjectName = helper.getElementStringValue("source"); String targetObjectName = helper.getElementStringValue("target"); - + MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); MObject targetObject = fParent.system().state().objectByName(targetObjectName); - + // Could be deleted if (assoc != null && sourceObject != null && targetObject != null) { MLink link; - if (assoc.hasQualifiedEnds()) { String linkValue = helper.getElementStringValue("linkValue"); link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); } else { - // No qualifier values are present. - link = fParent - .system() - .state() - .linkBetweenObjects(assoc, - Arrays.asList(sourceObject, targetObject), - Collections.emptyList()); + link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); } - if (link != null) { BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().get(link); - edge.restorePlacementInfo(helper, version); + if (edge != null) { + edge.restorePlacementInfo(helper, version); + } } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - ap.resetXPath(); - helper.getNav().pop(); - + } + + // Helper: restore node-edge (link objects / node edges) + @SuppressWarnings("unused") + private void restoreNodeEdges(PersistHelper helper, int version, Set hiddenObjects) { + AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { - // Restore edges ap.selectXPath("./edge[@type='NodeEdge']"); - try { - while(ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); String sourceObjectName = helper.getElementStringValue("source"); String targetObjectName = helper.getElementStringValue("target"); - + MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); MObject targetObject = fParent.system().state().objectByName(targetObjectName); - + // Could be deleted if (assoc != null && sourceObject != null && targetObject != null) { MLink link; - if (assoc.hasQualifiedEnds()) { String linkValue = helper.getElementStringValue("linkValue"); link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); } else { - // No qualifier values are present. - link = fParent - .system() - .state() - .linkBetweenObjects(assoc, - Arrays.asList(sourceObject, targetObject), - Collections.emptyList()); + link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); } - if (link != null) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject)visibleData.getLinkObjectToNodeEdge().get(link); - edge.restorePlacementInfo(helper, version); + if (link instanceof MLinkObject linkObj) { + EdgeBase tmp = visibleData.getLinkObjectToNodeEdge().get(linkObj); + if (tmp instanceof BinaryAssociationClassOrObject edge) { + edge.restorePlacementInfo(helper, version); + } + } } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - helper.getNav().pop(); - ap.resetXPath(); - + } + + // Helper: restore diamond nodes (n-ary links) + private void restoreDiamondNodes(PersistHelper helper, int version, Set hiddenObjects) { + AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { ap.selectXPath("./node[@type='Object']"); - try { - while(ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MObject obj = fParent.system().state().objectByName(name); - // Could be deleted if (obj != null) { ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - node.restorePlacementInfo(helper, version); - if (isHidden(helper, version)) hiddenObjects.add(obj); + if (node != null) { + node.restorePlacementInfo(helper, version); + if (isHidden(helper, version)) hiddenObjects.add(obj); + } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - - helper.getNav().pop(); - ap.resetXPath(); - + + // now diamond nodes (separate xpath) + ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { - // Restore diamond nodes ap.selectXPath("./node[@type='DiamondNode']"); - try { while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); - - // Renamed or deleted if (assoc == null) continue; - - // Get connected objects List connectedObjects = new LinkedList<>(); - if (!helper.toFirstChild("connectedNode")) - break; - + if (!helper.toFirstChild("connectedNode")) continue; String objectName = helper.getElementStringValue(); MObject obj = fParent.system().state().objectByName(objectName); - - if (obj != null) - connectedObjects.add(obj); - + if (obj != null) connectedObjects.add(obj); while (helper.toNextSibling("connectedNode")) { objectName = helper.getElementStringValue(); obj = fParent.system().state().objectByName(objectName); - - if (obj != null) { - connectedObjects.add(obj); - } + if (obj != null) connectedObjects.add(obj); } - - // Modified - if (assoc.associationEnds().size() != connectedObjects.size()) - continue; - - // n-ary links cannot be qualified therefore an empty list for the qualifer values is provided + if (assoc.associationEnds().size() != connectedObjects.size()) continue; MLink link = fParent.system().state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); - - // Could be deleted if (link != null) { - DiamondNode node = visibleData.fNaryLinkToDiamondNodeMap.get(link); - helper.toParent(); - node.restorePlacementInfo(helper, version); + DiamondNode node = visibleData.getNaryLinkToDiamondNodeMap().get(link); + if (node != null) { + helper.toParent(); + node.restorePlacementInfo(helper, version); + } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); - } - helper.getNav().pop(); - ap.resetXPath(); - - // Hide elements - hideElementsInDiagram(hiddenObjects); - } - - protected MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { - Set links = fParent.system().state().linkBetweenObjects(assoc, objects); - if (links.size() == 1) { - return links.iterator().next(); - } else { - for (MLink aLink : links) { - if (aLink.toString().equals(linkValue)) { - return aLink; - } - } - } - return null; - } - - protected boolean isHidden(PersistHelper helper, int version) { - return helper.getElementBooleanValue(LayoutTags.HIDDEN); - } - - @Override - public Set getHiddenNodes() { - return new HashSet(hiddenData.getObjectToNodeMap().values()); - } - - @Override - public ObjectDiagramData getVisibleData() { - return visibleData; - } - - @Override - public DiagramData getHiddenData() { - return hiddenData; - } - - @Override - protected String getDefaultLayoutFileSuffix() { - // No default layout - return null; - } - - @Override - protected void onClosing() { - if (!javaFxCall) { - super.onClosing(); - } - fParent.getModelBrowser().removeHighlightChangeListener(this); - fParent.removeKeyListener(inputHandling); - ModelBrowserSorting.getInstance().removeSortChangeListener(this); - } - - @Override - public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { - n.stateChanged(e); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } } /** * Hide link using name of link - * - * @param linkName - * @param links + * + * @param linkName the association (link) name to hide + * @param links the list of links to examine */ public void hideLink(String linkName, List links) { for (MLink link : links) { @@ -1867,9 +1690,9 @@ public void hideLink(String linkName, List links) { /** * Show link using name of link - * - * @param linkName - * @param links + * + * @param linkName the association (link) name to show + * @param links the list of links to examine */ public void showLink(String linkName, List links) { for (MLink link : links) { @@ -1880,14 +1703,14 @@ public void showLink(String linkName, List links) { } /** - * Map links to kind of assoziation. Used for show/hide-links-by-kind - * - * @return + * Map links to kind of association. Used for show/hide-links-by-kind + * + * @return a sorted map from kind label to links */ public TreeMap> mapLinksToKindOfAssociation() { Map> assocs = new HashMap<>(); final String derivedLinks = "Derived links"; - final String associationClass = "Linkobjects"; + final String associationClass = "Link objects"; final String nAryLinks = "N-Ary links"; final String reflexiveLinks = "Reflexive links"; final String binaryLinks = "Binary links"; @@ -1897,52 +1720,56 @@ public TreeMap> mapLinksToKindOfAssociation() { for (MAssociation assoc : fParent.system().model().associations()) { /* - * aggregationKind = 0, other + * aggregationKind = 0, other * aggregationKind = 1, aggreation * aggregationKind = 2, composition */ int kind = assoc.aggregationKind(); switch (kind) { - case 0: - Set links = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink link : links) { - if (link.association().isDerived() || link.association().isUnion()) { - assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociationClassImpl.class.isInstance(link.association())) { - assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) && link.linkEnds().size() > 2) { - assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) - && link.association().associatedClasses().size() == 1) { - assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) && link.linkedObjects().size() == 2 - && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); - } else { - System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); - } + case 0: + Set links = fParent.system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { + MAssociation linkAssoc = link.association(); + if (linkAssoc == null) continue; + if (linkAssoc.isDerived() || linkAssoc.isUnion()) { + assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); + } else if (linkAssoc instanceof MAssociationClassImpl) { + assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); + } else if (linkAssoc.associationEnds().size() > 2) { + assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); + } else if (linkAssoc.associatedClasses().size() == 1) { + assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); + } else if (link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { + assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); + } else { + if (fLog != null) { + fLog.println("ERROR: NO MATCH IN ASSOC-KIND"); + } else { + System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); + } + } - } - break; - case 1: // Aggregation + } + break; + case 1: // Aggregation - // Get aggregations - Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); + // Get aggregations + Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink agg : aggregations) { - assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); - } - break; + for (MLink agg : aggregations) { + assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); + } + break; - case 2: // Composition + case 2: // Composition - // Get Compositions - Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); + // Get Compositions + Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink comp : compositions) { - assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); - } - break; + for (MLink comp : compositions) { + assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); + } + break; } } return new TreeMap<>(assocs); @@ -1951,8 +1778,8 @@ public TreeMap> mapLinksToKindOfAssociation() { /** * Hide all links of list links - * - * @param links + * + * @param links list of links to hide */ public void hideLink(List links) { for (MLink link : links) { @@ -1962,8 +1789,8 @@ public void hideLink(List links) { /** * Show all links of list links - * - * @param links + * + * @param links list of links to show */ public void showLink(List links) { for (MLink link : links) { @@ -1973,25 +1800,22 @@ public void showLink(List links) { /** * Check if a link is hidden - * - * @param link - * @return true, if link is hidden; else return false + * + * @param link the link instance to check + * @return true if the provided link is currently hidden; otherwise false */ public boolean isHidden(MLink link) { - if (hiddenData.getBinaryLinkToEdgeMap().containsKey(link) || hiddenData.getHalfLinkToEdgeMap().containsKey(link) - || hiddenData.getLinkObjectToNodeEdge().containsKey(link) - || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link)) { - return true; - } else { - return false; - } + return hiddenData.getBinaryLinkToEdgeMap().containsKey(link) + || hiddenData.getHalfLinkToEdgeMap().containsKey(link) + || (link instanceof MLinkObject && hiddenData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link)) + || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link); } /** - * - * @param links - * @return 0, if all Links are hidden 1, if all links are shown 2, if there - * are hidden and shown links + * Determine whether the provided list of links is hidden, visible or mixed. + * + * @param links collection of links to evaluate + * @return 0 if all links are hidden, 1 if all links are shown, 2 if mixed, -1 if none present */ public int isHidden(List links) { boolean existHiddenLink = false; @@ -2017,4 +1841,165 @@ public static void setJavaFxCall(boolean javaFxCall) { NewObjectDiagram.javaFxCall = javaFxCall; } + @Override + public ObjectDiagramData getVisibleData() { + return visibleData; + } + + @Override + public ObjectDiagramData getHiddenData() { + return hiddenData; + } + + /** + * Restore helper to determine hidden state for items when restoring layout. + * Mirrors the implementation used in ClassDiagram to remain consistent across diagrams. + */ + @SuppressWarnings("unused") + protected boolean isHidden(PersistHelper helper, int version) { + // The 'version' parameter is reserved for future format-specific logic. + return helper.getElementBooleanValue(LayoutTags.HIDDEN); + } + + /** + * Finds a link for the given association that connects the provided objects and + * matches the serialized linkValue. This method reverses what BinaryAssociationOrLinkEdge.storeAdditionalInfo + * wrote using link.toString(). It prefers exact object-list match and the string representation. + */ + private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { + if (assoc == null || objects == null || linkValue == null) { + return null; + } + + Set candidates = fParent.system().state().linksOfAssociation(assoc).links(); + for (MLink l : candidates) { + // first ensure the linked objects match the expected ordering/collection + List linked = l.linkedObjects(); + if (linked.size() == objects.size()) { + boolean sameObjects = true; + for (int i = 0; i < linked.size(); i++) { + if (!linked.get(i).equals(objects.get(i))) { + sameObjects = false; + break; + } + } + if (!sameObjects) continue; + + // compare the string representation stored by the edge + if (linkValue.equals(l.toString())) { + return l; + } + } + } + return null; + } + + @Override + public Set getHiddenNodes() { + return hiddenData.getNodes(); + } + + @Override + protected String getDefaultLayoutFileSuffix() { + // Use a dedicated suffix for object diagram default layouts (consistent with other diagrams) + return "_objdia.clt"; + } + + + @Override + public void stateChanged(SortChangeEvent e) { + for (ObjectNode n : this.visibleData.fObjectToNodeMap.values()) { + n.stateChanged(e); + } + } + + /** + * A kleine Helfermethode zum Erstellen von Actions mit weniger Boilerplate-Code. + * + * @param text Der Text der Action. + * @param listener Der ActionListener, der die Action ausführt. + * @return Die erstellte Action. + */ + private Action createAction(String text, ActionListener listener) { + return new AbstractAction(text) { + @Override + public void actionPerformed(ActionEvent e) { + listener.actionPerformed(e); + } + }; + } + + protected void addBinaryLink(MLink link) { + MAssociation assoc = link.association(); + + MLinkEnd linkEnd1 = link.linkEnd(assoc.associationEnds().get(0)); + MLinkEnd linkEnd2 = link.linkEnd(assoc.associationEnds().get(1)); + + MObject obj1 = linkEnd1.object(); + MObject obj2 = linkEnd2.object(); + + // object link + if (link instanceof MLinkObject) { + BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( + visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), + linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, + link); + + if (lastKnownLinkPositions.containsKey(link)) { + e.initialize(); + ObjectNode linkObjNode = visibleData.getObjectToNodeMap().get(link); + if (linkObjNode != null) { + linkObjNode.setStrategy(lastKnownLinkPositions.get(link)); + } + lastKnownLinkPositions.remove(link); + fGraph.addInitializedEdge(e); + } else { + fGraph.addEdge(e); + } + visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); + fLayouter = null; + } else { + // binary link + boolean isHidden = false; + ObjectNode node1; + ObjectNode node2; + + if (visibleData.getObjectToNodeMap().containsKey(obj1)) { + node1 = visibleData.getObjectToNodeMap().get(obj1); + } else { + node1 = hiddenData.getObjectToNodeMap().get(obj1); + isHidden = true; + } + + if (visibleData.getObjectToNodeMap().containsKey(obj2)) { + node2 = visibleData.getObjectToNodeMap().get(obj2); + } else { + node2 = hiddenData.getObjectToNodeMap().get(obj2); + isHidden = true; + } + + BinaryAssociationOrLinkEdge e = createBinaryAssociationOrLinkEdge(node1, node2, linkEnd1, + linkEnd2, this, link); + + if (link.isVirtual()) { + e.setDashed(true); + } + + if (isHidden) { + hiddenData.getBinaryLinkToEdgeMap().put(link, e); + } else { + fGraph.addEdge(e); + visibleData.getBinaryLinkToEdgeMap().put(link, e); + fLayouter = null; + } + } + } + + /** + * Factory hook for creating binary link edges. Kept as a protected method to allow easy overriding in subclasses. + */ + protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(PlaceableNode source, PlaceableNode target, + MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { + return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); + } } From 6b351e808e63eccc02525b402d3b4908932d5b67 Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 12 Feb 2026 22:34:19 +0100 Subject: [PATCH 09/34] =?UTF-8?q?refactor(gui):=20NewObjectDiagram=20?= =?UTF-8?q?=E2=80=94=20cleanups=20&=20warnings=20fixes=20=C3=84nderungen:?= =?UTF-8?q?=20-=20Map-safety=20&=20Null-Checks=20=20=20-=20Ersetzte=20unsi?= =?UTF-8?q?chere=20Map.get()-Aufrufe=20durch=20computeIfPresent=20/=20null?= =?UTF-8?q?-checks.=20=20=20-=20Entfernte=20doppelte=20containsKey/get-Kom?= =?UTF-8?q?binationen.=20-=20Listener=20&=20Event-Handling=20=20=20-=20Ent?= =?UTF-8?q?fernt=20unbenutztes=20Feld/innere=20Klasse=20ShowObjectProperti?= =?UTF-8?q?esViewMouseListener.=20=20=20-=20Vereinfacht=20MouseListener=20?= =?UTF-8?q?mit=20Pattern=20Matching=20(instanceof).=20-=20Data=20&=20API?= =?UTF-8?q?=20=20=20-=20Vereinheitlichte=20Handhabung=20sichtbarer/verborg?= =?UTF-8?q?ener=20Daten=20via=20ObjectDiagramData-Accessoren.=20=20=20-=20?= =?UTF-8?q?getVisibleData/getHiddenData=20abgestimmt.=20=20=20-=20getDefau?= =?UTF-8?q?ltLayoutFileSuffix=20gesetzt.=20-=20Readability=20&=20Helpers?= =?UTF-8?q?=20=20=20-=20createAction=20Helper=20eingef=C3=BChrt,=20Boilerp?= =?UTF-8?q?late=20reduziert.=20=20=20-=20getLinkByValue=20implementiert=20?= =?UTF-8?q?(Restore/layouter=20Hilfsmethode).=20-=20Analyzer=20&=20Warning?= =?UTF-8?q?s=20=20=20-=20@SuppressWarnings(unused)=20wo=20sinnvoll=20(z.B.?= =?UTF-8?q?=20isHidden=20Persist-Helper=20Version).=20=20=20-=20Weitere=20?= =?UTF-8?q?Konsistenz-=20und=20Null-Sicherheits-Fixes.=20Keine=20API-Break?= =?UTF-8?q?ing=20=C3=84nderungen;=20low-risk=20Refactorings=20zur=20Verbes?= =?UTF-8?q?serung=20der=20Lesbarkeit=20und=20Analysehygiene.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- use-gui/src/main/java/module-info.java | 4 + .../edges/AssociationOrLinkPartEdge.java | 8 +- .../objectdiagram/NewObjectDiagram.java | 1041 ++++++++--------- 3 files changed, 520 insertions(+), 533 deletions(-) diff --git a/use-gui/src/main/java/module-info.java b/use-gui/src/main/java/module-info.java index 454e2590e..c073fda2a 100644 --- a/use-gui/src/main/java/module-info.java +++ b/use-gui/src/main/java/module-info.java @@ -31,4 +31,8 @@ exports org.tzi.use.gui.views.diagrams.behavior.shared to com.google.common; exports org.tzi.use.gui.views.selection to com.google.common; exports org.tzi.use.gui.views.diagrams.statemachine to com.google.common; + exports org.tzi.use.gui.views.diagrams.elements; + exports org.tzi.use.gui.views.diagrams.elements.edges; + exports org.tzi.use.gui.views.diagrams.event; + exports org.tzi.use.gui.views.selection.objectselection; } \ No newline at end of file diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java index 7f8c0e201..3b35485a1 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/elements/edges/AssociationOrLinkPartEdge.java @@ -231,7 +231,7 @@ public boolean adjacentObjectNodeGreyed() { List adjacentObjects = getLink().linkedObjects(); for (MObject adjacentObject : adjacentObjects) { ObjectNode node = visibleData.getObjectToNodeMap().get(adjacentObject); - if(node.isGreyed()) { + if (node != null && node.isGreyed()) { return true; } } @@ -365,8 +365,7 @@ public void drawProperties(Graphics2D g) { public static AssociationOrLinkPartEdge create(PlaceableNode source, PlaceableNode target, MAssociationEnd targetEnd, DiagramView diagram, MAssociation assoc, MLink link) { - AssociationOrLinkPartEdge edge = new AssociationOrLinkPartEdge(source, target, targetEnd, diagram, assoc, link); - return edge; + return new AssociationOrLinkPartEdge(source, target, targetEnd, diagram, assoc, link); } /** @@ -375,8 +374,7 @@ public static AssociationOrLinkPartEdge create(PlaceableNode source, public static AssociationOrLinkPartEdge create(PlaceableNode source, PlaceableNode target, String name, MAssociationEnd targetEnd, DiagramView diagram, MAssociation assoc, MLink link) { - AssociationOrLinkPartEdge edge = new AssociationOrLinkPartEdge(source, target, name, targetEnd, diagram, assoc, link); - return edge; + return new AssociationOrLinkPartEdge(source, target, name, targetEnd, diagram, assoc, link); } @Override diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index e706bfee3..ca9d107e1 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -32,7 +32,6 @@ import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; @@ -43,7 +42,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -150,12 +148,17 @@ public ObjectDiagramData() { } /** - * @param link - * @return + * Checks whether this diagram data contains the given link. + * + * @param link the link to test + * @return true if this data contains an edge or node representing the link */ public boolean containsLink(MLink link) { - return fBinaryLinkToEdgeMap.containsKey(link) || fNaryLinkToDiamondNodeMap.containsKey(link) - || fLinkObjectToNodeEdge.containsKey(link); + boolean has = fBinaryLinkToEdgeMap.containsKey(link) || fNaryLinkToDiamondNodeMap.containsKey(link); + if (!has && link instanceof MLinkObject) { + has = fLinkObjectToNodeEdge.containsKey((MLinkObject) link); + } + return has; } @Override @@ -188,6 +191,7 @@ public Set getEdges() { * * @param target the target ObjectDiagramData to copy the data into */ + @SuppressWarnings("unused") public void copyTo(ObjectDiagramData target) { target.fBinaryLinkToEdgeMap.putAll(this.fBinaryLinkToEdgeMap); target.fHalfLinkToEdgeMap.putAll(this.fHalfLinkToEdgeMap); @@ -208,11 +212,25 @@ public void clear() { } // Accessors to preserve encapsulation - public Map getObjectToNodeMap() { return fObjectToNodeMap; } - public Map getBinaryLinkToEdgeMap() { return fBinaryLinkToEdgeMap; } - public Map getNaryLinkToDiamondNodeMap() { return fNaryLinkToDiamondNodeMap; } - public Map> getHalfLinkToEdgeMap() { return fHalfLinkToEdgeMap; } - public Map getLinkObjectToNodeEdge() { return fLinkObjectToNodeEdge; } + public Map getObjectToNodeMap() { + return fObjectToNodeMap; + } + + public Map getBinaryLinkToEdgeMap() { + return fBinaryLinkToEdgeMap; + } + + public Map getNaryLinkToDiamondNodeMap() { + return fNaryLinkToDiamondNodeMap; + } + + public Map> getHalfLinkToEdgeMap() { + return fHalfLinkToEdgeMap; + } + + public Map getLinkObjectToNodeEdge() { + return fLinkObjectToNodeEdge; + } } protected final ObjectDiagramData visibleData = new ObjectDiagramData(); @@ -225,7 +243,7 @@ public void clear() { * The position of the next object node. This is either set to a random * value or to a specific position when an object is created by drag & drop. */ - protected Point2D.Double nextNodePosition = new Point2D.Double(); + protected Point2D.Double nextNodePosition = new Point2D.Double(); /** * Last position of deleted nodes and links. In case of restoration, the @@ -235,12 +253,13 @@ public void clear() { private final Map lastKnownNodePositions = new WeakHashMap<>(); private final Map lastKnownLinkPositions = new WeakHashMap<>(); - protected final ShowObjectPropertiesViewMouseListener showObjectPropertiesViewMouseListener = new ShowObjectPropertiesViewMouseListener(); + // show object properties listener is attached inline in constructor (no field required) private final ObjectSelection fSelection; protected final DiagramInputHandling inputHandling; + @SuppressWarnings("unused") private static boolean javaFxCall = false; /** @@ -271,7 +290,18 @@ protected NewObjectDiagram(NewObjectDiagramView parent, PrintWriter log, ObjDiag fParent.addKeyListener(inputHandling); addMouseListener(inputHandling); - addMouseListener(showObjectPropertiesViewMouseListener); + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + PlaceableNode pickedObjectNode = findNode(e.getX(), e.getY()); + if (pickedObjectNode instanceof ObjectNode on) { + ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); + v.selectObject(on.object().name()); + } + } + } + }); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { @@ -288,10 +318,6 @@ public ObjDiagramOptions getOptions() { return (ObjDiagramOptions) super.getOptions(); } - public ObjectSelection getObjectSelection() { - return this.fSelection; - } - /** * Displays objects of the selected class in the modelbrowser. */ @@ -305,28 +331,34 @@ public void stateChanged(HighlightChangeEvent e) { boolean allEdgesSelected = true; // elem is an association - if (elem instanceof MAssociation) { - MAssociation assoc = (MAssociation) elem; + if (elem instanceof MAssociation assoc) { int size = assoc.associationEnds().size(); Set links = fParent.system().state().linksOfAssociation(assoc).links(); - EdgeBase eb; + EdgeBase ed; if (size == 2) { for (MLink link : links) { - eb = visibleData.getBinaryLinkToEdgeMap().get(link); if (elem instanceof MAssociationClass) { - eb = visibleData.getLinkObjectToNodeEdge().get(link); + if (link instanceof MLinkObject) { + ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + } else { + ed = visibleData.getBinaryLinkToEdgeMap().get(link); + } + } else { + ed = visibleData.getBinaryLinkToEdgeMap().get(link); } - edges.add(eb); + edges.add(ed); } } else { for (MLink link : links) { edges.addAll(visibleData.getHalfLinkToEdgeMap().getOrDefault(link, Collections.emptyList())); if (elem instanceof MAssociationClass) { - eb = visibleData.getLinkObjectToNodeEdge().get(link); - edges.add(eb); + if (link instanceof MLinkObject) { + ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + edges.add(ed); + } } } } @@ -386,7 +418,7 @@ public void hideAll() { * Hides all currently visible links. The diagram is not repainted! */ public void hideAllLinks() { - Set links = new HashSet<>(this.visibleData.getBinaryLinkToEdgeMap().keySet()); + Set links = new HashSet<>(this.visibleData.getBinaryLinkToEdgeMap().keySet()); for (MLink e : links) { hideBinaryLink(e); @@ -447,9 +479,8 @@ public void addObject(MObject obj) { /** * Shows an already hidden object again - * - * @param obj - * The object to show + * + * @param obj The object to show */ public void showObject(MObject obj) { if (visibleData.getObjectToNodeMap().containsKey(obj)) @@ -502,17 +533,16 @@ public void moveObjectNode(MObject obj, int x, int y) { /** * Hides an object in the diagram - * - * @param obj - * The MObject to hide + * + * @param obj The MObject to hide */ public void hideObject(MObject obj) { // a hidden object should no longer be selected ObjectNode removedNode = visibleData.getObjectToNodeMap().get(obj); - if(removedNode!=null) { + if (removedNode != null) { fNodeSelection.remove(removedNode); } - + showOrHideObjectNode(obj, false); // Hide all links the object participates in @@ -526,8 +556,7 @@ public void hideObject(MObject obj) { MLinkSet links = fParent.system().state().linksOfAssociation(assoc); // TODO: Not very fast! for (MLink link : links.links()) { - if (link.linkedObjects().contains(obj) - || (link instanceof MLinkObject && ((MLinkObject) link).equals(obj))) { + if (link.linkedObjects().contains(obj) || (link instanceof MLinkObject && link.equals(obj))) { hideLink(link); } } @@ -597,85 +626,11 @@ public void addLink(MLink link) { } } - protected void addBinaryLink(MLink link) { - MAssociation assoc = link.association(); - - MLinkEnd linkEnd1 = link.linkEnd(assoc.associationEnds().get(0)); - MLinkEnd linkEnd2 = link.linkEnd(assoc.associationEnds().get(1)); - - MObject obj1 = linkEnd1.object(); - MObject obj2 = linkEnd2.object(); - // TODO: Create link edge factory. - - // object link - if (link instanceof MLinkObject) { - BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( - visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), - linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, - link); - - if (lastKnownLinkPositions.containsKey(link)) { - e.initialize(); - visibleData.getObjectToNodeMap().get(link).setStrategy(lastKnownLinkPositions.get(link)); - lastKnownLinkPositions.remove(link); - fGraph.addInitializedEdge(e); - } else { - fGraph.addEdge(e); - } - visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - fLayouter = null; - } else { - // binary link - boolean isHidden = false; - ObjectNode node1; - ObjectNode node2; - - if (visibleData.getObjectToNodeMap().containsKey(obj1)) { - node1 = visibleData.getObjectToNodeMap().get(obj1); - } else { - node1 = hiddenData.getObjectToNodeMap().get(obj1); - isHidden = true; - } - - if (visibleData.getObjectToNodeMap().containsKey(obj2)) { - node2 = visibleData.getObjectToNodeMap().get(obj2); - } else { - node2 = hiddenData.getObjectToNodeMap().get(obj2); - isHidden = true; - } - - BinaryAssociationOrLinkEdge e = createBinaryAssociationOrLinkEdge(node1, node2, linkEnd1, - linkEnd2, this, link); - - if (link.isVirtual()) { - e.setDashed(true); - } - - if (isHidden) { - hiddenData.getBinaryLinkToEdgeMap().put(link, e); - } else { - fGraph.addEdge(e); - visibleData.getBinaryLinkToEdgeMap().put(link, e); - fLayouter = null; - } - } - } - - /** - * This part is a separate method for easier inheritance. - * - * @author Andreas Kaestner - */ - protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(PlaceableNode source, PlaceableNode target, - MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { - return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); - } - protected void addNAryLink(MLink link) { getRandomNextPosition(); - + List linkedObjectNodes = new ArrayList<>(); - for(MObject linkedObject : link.linkedObjects()) { + for (MObject linkedObject : link.linkedObjects()) { linkedObjectNodes.add(visibleData.getObjectToNodeMap().get(linkedObject)); } @@ -709,12 +664,19 @@ protected void addNAryLink(MLink link) { fGraph.addEdge(e); halfEdges.add(e); - edgeIds.add(linkEnd.associationEnd().nameAsRolename()); + edgeIds.add(linkEnd.associationEnd().nameAsRolename()); } - if (visibleData.getLinkObjectToNodeEdge().get(link) != null) { - halfEdges.add(visibleData.getLinkObjectToNodeEdge().get(link)); - edgeIds.add(((MLinkObject) link).name()); + // If there is an associated link-object edge, add it once (avoid duplicate map access) + { + EdgeBase linkObjEdge = null; + if (link instanceof MLinkObject) { + linkObjEdge = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + } + if (linkObjEdge != null) { + halfEdges.add(linkObjEdge); + edgeIds.add(((MLinkObject) link).name()); + } } node.setHalfEdges(halfEdges, edgeIds); @@ -725,8 +687,8 @@ protected void addNAryLink(MLink link) { /** * Show one link. The diagram is not repainted! - * - * @param link + * + * @param link the link to show */ public void showLink(MLink link) { if (visibleData.containsLink(link)) @@ -752,8 +714,8 @@ public void showLink(MLink link) { /** * Hide one link. The diagram is not repainted! - * - * @param link + * + * @param link the link to hide */ public void hideLink(MLink link) { if (hiddenData.containsLink(link)) @@ -793,13 +755,13 @@ protected void showOrHideBinaryLink(MLink link, boolean show) { // object link if (link instanceof MLinkObject) { - EdgeBase e = source.getLinkObjectToNodeEdge().get(link); + EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); if (show && e != null) fGraph.addInitializedEdge(e); else if (e != null) fGraph.removeEdge(e); - source.getLinkObjectToNodeEdge().remove(link); + source.getLinkObjectToNodeEdge().remove((MLinkObject) link); target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } else { @@ -820,22 +782,22 @@ protected void showOrHideNAryLink(MLink link, boolean show) { ObjectDiagramData source = (show ? hiddenData : visibleData); ObjectDiagramData target = (show ? visibleData : hiddenData); - DiamondNode node = source.fNaryLinkToDiamondNodeMap.get(link); - if (show){ - if (node == null){ - node = target.fNaryLinkToDiamondNodeMap.get(link); + DiamondNode node = source.getNaryLinkToDiamondNodeMap().get(link); + if (show) { + if (node == null) { + node = target.getNaryLinkToDiamondNodeMap().get(link); } fGraph.add(node); } else { fGraph.remove(node); } - target.fNaryLinkToDiamondNodeMap.put(link, node); - source.fNaryLinkToDiamondNodeMap.remove(link); - + target.getNaryLinkToDiamondNodeMap().put(link, node); + source.getNaryLinkToDiamondNodeMap().remove(link); + // connected to an "object link" if (link instanceof MLinkObject) { - EdgeBase e = source.fLinkObjectToNodeEdge.get(link); + EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); if (e != null) { if (show) @@ -843,13 +805,13 @@ protected void showOrHideNAryLink(MLink link, boolean show) { else fGraph.removeEdge(e); - source.fLinkObjectToNodeEdge.remove(link); - target.fLinkObjectToNodeEdge.put((MLinkObject) link, e); + source.getLinkObjectToNodeEdge().remove((MLinkObject) link); + target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } } - List halfEdges = source.fHalfLinkToEdgeMap.get(link); + List halfEdges = source.getHalfLinkToEdgeMap().get(link); if (halfEdges != null) { for (EdgeBase edge : halfEdges) { @@ -859,26 +821,26 @@ protected void showOrHideNAryLink(MLink link, boolean show) { fGraph.removeEdge(edge); } - source.fHalfLinkToEdgeMap.remove(link); - target.fHalfLinkToEdgeMap.put(link, halfEdges); + source.getHalfLinkToEdgeMap().remove(link); + target.getHalfLinkToEdgeMap().put(link, halfEdges); } fLayouter = null; } /** - * Removes a link from the diagram. + * Deletes a link from the diagram. */ public void deleteLink(MLink link) { if (link.linkEnds().size() == 2) { - EdgeBase e = null; + EdgeBase e; // initialize later based on visibility boolean isVisible; boolean isLinkObject = link instanceof MLinkObject; ObjectDiagramData data; if (isLinkObject) { - isVisible = visibleData.getLinkObjectToNodeEdge().containsKey(link); + isVisible = visibleData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link); data = isVisible ? visibleData : hiddenData; - e = data.getLinkObjectToNodeEdge().get(link); + e = data.getLinkObjectToNodeEdge().get((MLinkObject) link); } else { isVisible = visibleData.getBinaryLinkToEdgeMap().containsKey(link); data = isVisible ? visibleData : hiddenData; @@ -890,14 +852,14 @@ public void deleteLink(MLink link) { } if (isLinkObject) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get(link); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get((MLinkObject) link); if (edge != null) { PlaceableNode objectNode = edge.getClassOrObjectNode(); lastKnownLinkPositions.put(link, objectNode.getStrategy()); } data.getBinaryLinkToEdgeMap().remove(link); - data.getLinkObjectToNodeEdge().remove(link); + data.getLinkObjectToNodeEdge().remove((MLinkObject) link); } else { data.getBinaryLinkToEdgeMap().remove(link); } @@ -930,12 +892,12 @@ public void deleteLink(MLink link) { n.dispose(); if (link instanceof MLinkObject) { - EdgeBase edge = data.getLinkObjectToNodeEdge().get(link); + EdgeBase edge = data.getLinkObjectToNodeEdge().get((MLinkObject) link); if (edge != null) { lastKnownLinkPositions.put(link, ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); fGraph.removeEdge(edge); - data.getLinkObjectToNodeEdge().remove(link); + data.getLinkObjectToNodeEdge().remove((MLinkObject) link); edge.dispose(); } } @@ -944,13 +906,15 @@ public void deleteLink(MLink link) { /** * Forces the object node to update its content. - * - * @param obj + * + * @param obj the MInstance whose node should be refreshed */ public void updateObject(MInstance obj) { - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - if (node != null) + // Use computeIfPresent with an explicit cast of the key to the Map's key type (MObject) + visibleData.getObjectToNodeMap().computeIfPresent((MObject) obj, (k, node) -> { invalidateNode(node); + return node; // keep the existing mapping + }); } /** @@ -1030,7 +994,8 @@ public void actionPerformed(ActionEvent e) { /** * Show properties of objects */ - class ActionShowProperties extends AbstractAction { + @SuppressWarnings("unused") + static class ActionShowProperties extends AbstractAction { private final MObject fObject; ActionShowProperties(String text, MObject object) { @@ -1039,8 +1004,8 @@ class ActionShowProperties extends AbstractAction { } public void actionPerformed(ActionEvent e) { - if (MainWindow.getJavaFxCall()){ - Platform.runLater(()->{ + if (MainWindow.getJavaFxCall()) { + Platform.runLater(() -> { // to create an instance of a SwingNode, which is used to hold the Swing-Components SwingNode swingNode = new SwingNode(); @@ -1069,22 +1034,6 @@ public void actionPerformed(ActionEvent e) { } } - private class ShowObjectPropertiesViewMouseListener extends MouseAdapter { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - // mouse over node? - PlaceableNode pickedObjectNode = findNode(e.getX(), e.getY()); - if (pickedObjectNode instanceof ObjectNode) { - ObjectNode obj = (ObjectNode) pickedObjectNode; - ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); - v.selectObject(obj.object().name()); - } - } - } - } - /** * Creates and shows popup menu if mouse event is the trigger for popups. */ @@ -1111,8 +1060,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { } for (EdgeBase selectedEdge : fEdgeSelection) { - if (selectedEdge instanceof LinkEdge) { - LinkEdge aEdge = (LinkEdge) selectedEdge; + if (selectedEdge instanceof LinkEdge aEdge) { MLink link = aEdge.getLink(); selectedLinks.add(link); selectedObjectsOfAssociation.addAll(link.linkedObjects()); @@ -1125,7 +1073,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { // This text is reused often String selectedObjectsText = null; if (selectedObjects.size() == 1) { - selectedObjectsText = "'" + selectedObjects.get(0).name() + "'"; + selectedObjectsText = "'" + exactlyOne(selectedObjects).name() + "'"; } else if (selectedObjects.size() > 1) { selectedObjectsText = selectedObjects.size() + " objects"; } @@ -1134,8 +1082,8 @@ protected PopupMenuInfo unionOfPopUpMenu() { // A single object can be edited if (selectedObjects.size() == 1) { popupMenu.insert( - new ActionShowProperties("Edit properties of " + selectedObjectsText, selectedObjects.get(0)), - pos++); + new ActionShowProperties("Edit properties of " + selectedObjectsText, exactlyOne(selectedObjects)), + pos++); } // A single object or multiple objects can be deleted. @@ -1230,22 +1178,18 @@ protected PopupMenuInfo unionOfPopUpMenu() { } // New Action for Hide - popupMenu.insert(new AbstractAction(labelHide) { - - @Override - public void actionPerformed(ActionEvent arg0) { - if (!selectedLinks.isEmpty()) { - selectedLinks.forEach(NewObjectDiagram.this::hideLink); - } - if (!selectedObjects.isEmpty()) { - selectedObjects.forEach(NewObjectDiagram.this::hideObject); - } - repaint(); + popupMenu.insert(createAction(labelHide, arg0 -> { + if (!selectedLinks.isEmpty()) { + selectedLinks.forEach(NewObjectDiagram.this::hideLink); } - }, pos++); + if (!selectedObjects.isEmpty()) { + selectedObjects.forEach(NewObjectDiagram.this::hideObject); + } + repaint(); + }), pos++); // new Action for crop - Set objectsToHide = new HashSet<>(selectedObjects); + Set objectsToHide = new HashSet<>(selectedObjects); selectedLinks.forEach(link -> { if (link instanceof MLinkObject) { objectsToHide.add((MLinkObject) link); @@ -1254,132 +1198,83 @@ public void actionPerformed(ActionEvent arg0) { } }); - final String label = labelCrop; - popupMenu.insert(new AbstractAction(labelCrop) { - @Override - public void actionPerformed(ActionEvent e) { - getAction(label, getNoneSelectedNodes(objectsToHide)).actionPerformed(e); - } - }, pos++); + final String labelCropFinal = labelCrop; // ensure effectively final + popupMenu.insert(createAction(labelCrop, e -> getAction(labelCropFinal, getNoneSelectedNodes(objectsToHide)).actionPerformed(e)), pos++); - // new Action for grey in/out + // new Action for gray in/out (single) if (selectedObjects.size() == 1) { - MObject obj = selectedObjects.iterator().next(); - if (visibleData.getObjectToNodeMap().containsKey(obj)) { - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - String labelGreyed = node.isGreyed() ? "Grey in" : "Grey out"; - - popupMenu.insert(new AbstractAction(labelGreyed + " " + node.name()) { - @Override - public void actionPerformed(ActionEvent e) { - node.setGreyed(!node.isGreyed()); - repaint(); - } - }, pos++); + MObject obj = exactlyOne(selectedObjects); + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + if (node != null) { + String labelGreyed = node.isGreyed() ? "Gray in" : "Gray out"; + + popupMenu.insert(createAction(labelGreyed + " " + node.name(), e -> { + node.setGreyed(!node.isGreyed()); + repaint(); + }), pos++); } } else if (selectedObjects.size() > 1) { Set objToGreyIn = new HashSet<>(); - selectedObjects.stream().filter(obj -> visibleData.getObjectToNodeMap().get(obj).isGreyed()) - .forEach(obj -> objToGreyIn.add(visibleData.getObjectToNodeMap().get(obj))); - Set objToGreyOut = new HashSet<>(); - selectedObjects.stream().filter(obj -> !visibleData.getObjectToNodeMap().get(obj).isGreyed()) - .forEach(obj -> objToGreyOut.add(visibleData.getObjectToNodeMap().get(obj))); + for (MObject so : selectedObjects) { + ObjectNode n = visibleData.getObjectToNodeMap().get(so); + if (n != null) { + if (n.isGreyed()) objToGreyIn.add(n); + else objToGreyOut.add(n); + } + } + // gray in if (!objToGreyIn.isEmpty()) { - popupMenu.insert(new AbstractAction("Grey in " + objToGreyIn.size() + " elements") { - - @Override - public void actionPerformed(ActionEvent arg0) { - objToGreyIn.forEach(obj -> obj.setGreyed(false)); - repaint(); - } - }, pos++); + popupMenu.insert(createAction("Gray in " + objToGreyIn.size() + " elements", arg0 -> { + objToGreyIn.forEach(n -> n.setGreyed(false)); + repaint(); + }), pos++); } - // Action for grey out more elements + // gray out if (!objToGreyOut.isEmpty()) { - popupMenu.insert(new AbstractAction("Grey out " + objToGreyOut.size() + " elements") { - - @Override - public void actionPerformed(ActionEvent arg0) { - objToGreyOut.forEach(obj -> obj.setGreyed(true)); - repaint(); - } - }, pos++); + popupMenu.insert(createAction("Gray out " + objToGreyOut.size() + " elements", arg0 -> { + objToGreyOut.forEach(n -> n.setGreyed(true)); + repaint(); + }), pos++); } } - popupMenu.insert(new JSeparator(), pos++); } + popupMenu.insert(new JSeparator(), pos++); - final JMenu showHideCrop = new JMenu("Show/hide/crop objects"); + final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); + showProtocolStateMachine.setEnabled(false); + popupMenu.insert(showProtocolStateMachine, pos++); - if (!selectedObjects.isEmpty()) { - showHideCrop.add(fSelection.getSelectedObjectPathView("By path length...", selectedObjectsSet)); - } + if (selectedObjects.size() == 1) { + final MObject obj = exactlyOne(selectedObjects); - showHideCrop.add(fSelection.getSelectionWithOCLViewAction()); - showHideCrop.add(fSelection.getSelectionObjectView()); + List sortedPSMs = new LinkedList<>( + obj.cls().getAllOwnedProtocolStateMachines()); + sortedPSMs.sort(new MNamedElementComparator()); - popupMenu.insert(showHideCrop, pos++); + for (MProtocolStateMachine psm : sortedPSMs) { + showProtocolStateMachine.setEnabled(true); + final JMenuItem showGivenPSM = new JMenuItem(psm.name()); + showGivenPSM.addActionListener(new ActionListener() { + private MProtocolStateMachine sm; - if (!fGraph.isEmpty() || !hiddenData.getObjectToNodeMap().isEmpty()) { - if (!fGraph.isEmpty()) { - popupMenu.insert(fSelection.getSubMenuHideObject(), pos++); - } + public void actionPerformed(ActionEvent ev) { + MainWindow.instance().showStateMachineView(sm, obj); + } - if (!hiddenData.getObjectToNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuShowObject(), pos++); + public ActionListener setStateMachine(MProtocolStateMachine sm) { + this.sm = sm; + return this; + } + }.setStateMachine(psm)); + showProtocolStateMachine.add(showGivenPSM); } } - if (!visibleData.getBinaryLinkToEdgeMap().isEmpty() || !visibleData.getHalfLinkToEdgeMap().isEmpty() - || !visibleData.getLinkObjectToNodeEdge().isEmpty() - || !visibleData.getNaryLinkToDiamondNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuHideLinks(), pos++); - } - - if (!hiddenData.getBinaryLinkToEdgeMap().isEmpty() || !hiddenData.getHalfLinkToEdgeMap().isEmpty() - || !hiddenData.getLinkObjectToNodeEdge().isEmpty() || !hiddenData.getNaryLinkToDiamondNodeMap().isEmpty()) { - popupMenu.insert(fSelection.getSubMenuShowLinks(), pos++); - } - popupMenu.insert(new JSeparator(), pos++); - if (!selectedObjects.isEmpty()) { - final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); - showProtocolStateMachine.setEnabled(false); - popupMenu.insert(showProtocolStateMachine, pos++); - - if (selectedObjects.size() == 1) { - final MObject obj = exactlyOne(selectedObjects); - - List sortedPSMs = new LinkedList<>( - obj.cls().getAllOwnedProtocolStateMachines()); - sortedPSMs.sort(new MNamedElementComparator()); - - for (MProtocolStateMachine psm : sortedPSMs) { - showProtocolStateMachine.setEnabled(true); - final JMenuItem showGivenPSM = new JMenuItem(psm.name()); - showGivenPSM.addActionListener(new ActionListener() { - protected MProtocolStateMachine sm; - - public void actionPerformed(ActionEvent ev) { - MainWindow.instance().showStateMachineView(sm, obj); - } - - public ActionListener setStateMachine(MProtocolStateMachine sm, MObject instance) { - this.sm = sm; - return this; - } - }.setStateMachine(psm, obj)); - showProtocolStateMachine.add(showGivenPSM); - } - } - - popupMenu.insert(new JSeparator(), pos++); - } - final JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", getOptions().isShowStates()); showStates.addItemListener(ev -> { getOptions().setShowStates(ev.getStateChange() == ItemEvent.SELECTED); @@ -1393,16 +1288,13 @@ public ActionListener setStateMachine(MProtocolStateMachine sm, MObject instance /** * Finds all nodes which are not selected. - * - * @param selectedNodes - * Nodes which are selected at this point in the diagram. + * + * @param selectedNodes Nodes which are selected at this point in the diagram. * @return A HashSet of the none selected objects in the diagram. */ private Set getNoneSelectedNodes(Set selectedNodes) { Set noneSelectedNodes = new HashSet<>(); - Iterator it = fGraph.iterator(); - while (it.hasNext()) { - PlaceableNode o = it.next(); + for (PlaceableNode o : fGraph) { if (o instanceof ObjectNode) { MObject obj = ((ObjectNode) o).object(); if (!selectedNodes.contains(obj)) { @@ -1460,11 +1352,11 @@ private void displayObjectInfo(MObject obj, MouseEvent e) { } /** - * + * * Accepts a drag of a class from the ModelBrowser. A new object of this * class will be created. - * - * @param dtde + * + * @param dtde the drop event provided by the DnD subsystem */ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { @@ -1508,9 +1400,8 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { /** * Checks if the object info window should be displayed. - * - * @param e - * MouseEvent + * + * @param e MouseEvent */ public void mayBeShowObjectInfo(MouseEvent e) { if (fNodeSelection.size() == 1) { @@ -1544,11 +1435,11 @@ private int[] radixConversion(int number, int base, int maxDigits) { private boolean isCompleteObjectCombination(int[] c, int base) { for (int i = 0; i < base; ++i) { boolean found = false; - for (int j = 0; j < c.length; ++j) { - if (c[j] == i) { - found = true; - break; - } + for (int v : c) { + if (v == i) { + found = true; + break; + } } if (!found) return false; @@ -1585,15 +1476,15 @@ protected void storePlacementInfos(PersistHelper helper, Element root, boolean v n.storePlacementInfo(helper, root, !visible); } - for (PlaceableNode n : data.fNaryLinkToDiamondNodeMap.values()) { + for (PlaceableNode n : data.getNaryLinkToDiamondNodeMap().values()) { n.storePlacementInfo(helper, root, !visible); } - for (EdgeBase e : data.fBinaryLinkToEdgeMap.values()) { + for (EdgeBase e : data.getBinaryLinkToEdgeMap().values()) { e.storePlacementInfo(helper, root, !visible); } - for (EdgeBase e : data.fLinkObjectToNodeEdge.values()) { + for (EdgeBase e : data.getLinkObjectToNodeEdge().values()) { e.storePlacementInfo(helper, root, !visible); } } @@ -1601,260 +1492,192 @@ protected void storePlacementInfos(PersistHelper helper, Element root, boolean v @Override public void restorePlacementInfos(PersistHelper helper, int version) { if (version < 12) return; - + Set hiddenObjects = new HashSet<>(); + + // delegate to smaller, well-scoped helpers + restoreBinaryEdges(helper, version, hiddenObjects); + restoreNodeEdges(helper, version, hiddenObjects); + restoreDiamondNodes(helper, version, hiddenObjects); + + // Hide elements collected during restore + hideElementsInDiagram(hiddenObjects); + } + + // Helper: restore binary association edges placement info + @SuppressWarnings("unused") + private void restoreBinaryEdges(PersistHelper helper, int version, Set hiddenObjects) { AutoPilot ap = new AutoPilot(helper.getNav()); - - // First restore edges to get possible new nodes, then nodes helper.getNav().push(); - try { - // Restore edges ap.selectXPath("./edge[@type='BinaryEdge']"); - try { - while (ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); String sourceObjectName = helper.getElementStringValue("source"); String targetObjectName = helper.getElementStringValue("target"); - + MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); MObject targetObject = fParent.system().state().objectByName(targetObjectName); - + // Could be deleted if (assoc != null && sourceObject != null && targetObject != null) { MLink link; - if (assoc.hasQualifiedEnds()) { String linkValue = helper.getElementStringValue("linkValue"); link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); } else { - // No qualifier values are present. - link = fParent - .system() - .state() - .linkBetweenObjects(assoc, - Arrays.asList(sourceObject, targetObject), - Collections.emptyList()); + link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); } - if (link != null) { BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().get(link); - edge.restorePlacementInfo(helper, version); + if (edge != null) { + edge.restorePlacementInfo(helper, version); + } } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - ap.resetXPath(); - helper.getNav().pop(); - + } + + // Helper: restore node-edge (link objects / node edges) + @SuppressWarnings("unused") + private void restoreNodeEdges(PersistHelper helper, int version, Set hiddenObjects) { + AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { - // Restore edges ap.selectXPath("./edge[@type='NodeEdge']"); - try { - while(ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); String sourceObjectName = helper.getElementStringValue("source"); String targetObjectName = helper.getElementStringValue("target"); - + MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); MObject targetObject = fParent.system().state().objectByName(targetObjectName); - + // Could be deleted if (assoc != null && sourceObject != null && targetObject != null) { MLink link; - if (assoc.hasQualifiedEnds()) { String linkValue = helper.getElementStringValue("linkValue"); link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); } else { - // No qualifier values are present. - link = fParent - .system() - .state() - .linkBetweenObjects(assoc, - Arrays.asList(sourceObject, targetObject), - Collections.emptyList()); + link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); } - if (link != null) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject)visibleData.getLinkObjectToNodeEdge().get(link); - edge.restorePlacementInfo(helper, version); + if (link instanceof MLinkObject linkObj) { + EdgeBase tmp = visibleData.getLinkObjectToNodeEdge().get(linkObj); + if (tmp instanceof BinaryAssociationClassOrObject edge) { + edge.restorePlacementInfo(helper, version); + } + } } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - helper.getNav().pop(); - ap.resetXPath(); - + } + + // Helper: restore diamond nodes (n-ary links) + private void restoreDiamondNodes(PersistHelper helper, int version, Set hiddenObjects) { + AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { ap.selectXPath("./node[@type='Object']"); - try { - while(ap.evalXPath() != -1) { + while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MObject obj = fParent.system().state().objectByName(name); - // Could be deleted if (obj != null) { ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - node.restorePlacementInfo(helper, version); - if (isHidden(helper, version)) hiddenObjects.add(obj); + if (node != null) { + node.restorePlacementInfo(helper, version); + if (isHidden(helper, version)) hiddenObjects.add(obj); + } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } - - helper.getNav().pop(); - ap.resetXPath(); - + + // now diamond nodes (separate xpath) + ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { - // Restore diamond nodes ap.selectXPath("./node[@type='DiamondNode']"); - try { while (ap.evalXPath() != -1) { String name = helper.getElementStringValue("name"); MAssociation assoc = fParent.system().model().getAssociation(name); - - // Renamed or deleted if (assoc == null) continue; - - // Get connected objects List connectedObjects = new LinkedList<>(); - if (!helper.toFirstChild("connectedNode")) - break; - + if (!helper.toFirstChild("connectedNode")) continue; String objectName = helper.getElementStringValue(); MObject obj = fParent.system().state().objectByName(objectName); - - if (obj != null) - connectedObjects.add(obj); - + if (obj != null) connectedObjects.add(obj); while (helper.toNextSibling("connectedNode")) { objectName = helper.getElementStringValue(); obj = fParent.system().state().objectByName(objectName); - - if (obj != null) { - connectedObjects.add(obj); - } + if (obj != null) connectedObjects.add(obj); } - - // Modified - if (assoc.associationEnds().size() != connectedObjects.size()) - continue; - - // n-ary links cannot be qualified therefore an empty list for the qualifer values is provided + if (assoc.associationEnds().size() != connectedObjects.size()) continue; MLink link = fParent.system().state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); - - // Could be deleted if (link != null) { - DiamondNode node = visibleData.fNaryLinkToDiamondNodeMap.get(link); - helper.toParent(); - node.restorePlacementInfo(helper, version); + DiamondNode node = visibleData.getNaryLinkToDiamondNodeMap().get(link); + if (node != null) { + helper.toParent(); + node.restorePlacementInfo(helper, version); + } } } - } catch (XPathEvalException e) { - fLog.append(e.getMessage()); - } catch (NavException e) { - fLog.append(e.getMessage()); + } catch (XPathEvalException | NavException e) { + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); } } catch (XPathParseException e) { - fLog.append(e.getMessage()); - } - helper.getNav().pop(); - ap.resetXPath(); - - // Hide elements - hideElementsInDiagram(hiddenObjects); - } - - protected MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { - Set links = fParent.system().state().linkBetweenObjects(assoc, objects); - if (links.size() == 1) { - return links.iterator().next(); - } else { - for (MLink aLink : links) { - if (aLink.toString().equals(linkValue)) { - return aLink; - } - } - } - return null; - } - - protected boolean isHidden(PersistHelper helper, int version) { - return helper.getElementBooleanValue(LayoutTags.HIDDEN); - } - - @Override - public Set getHiddenNodes() { - return new HashSet(hiddenData.getObjectToNodeMap().values()); - } - - @Override - public ObjectDiagramData getVisibleData() { - return visibleData; - } - - @Override - public DiagramData getHiddenData() { - return hiddenData; - } - - @Override - protected String getDefaultLayoutFileSuffix() { - // No default layout - return null; - } - - @Override - protected void onClosing() { - if (!javaFxCall) { - super.onClosing(); - } - fParent.getModelBrowser().removeHighlightChangeListener(this); - fParent.removeKeyListener(inputHandling); - ModelBrowserSorting.getInstance().removeSortChangeListener(this); - } - - @Override - public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { - n.stateChanged(e); + if (fLog != null) fLog.println(e.getMessage()); + else System.err.println(e.getMessage()); + } finally { + ap.resetXPath(); + helper.getNav().pop(); } } /** * Hide link using name of link - * - * @param linkName - * @param links + * + * @param linkName the association (link) name to hide + * @param links the list of links to examine */ public void hideLink(String linkName, List links) { for (MLink link : links) { @@ -1867,9 +1690,9 @@ public void hideLink(String linkName, List links) { /** * Show link using name of link - * - * @param linkName - * @param links + * + * @param linkName the association (link) name to show + * @param links the list of links to examine */ public void showLink(String linkName, List links) { for (MLink link : links) { @@ -1880,14 +1703,14 @@ public void showLink(String linkName, List links) { } /** - * Map links to kind of assoziation. Used for show/hide-links-by-kind - * - * @return + * Map links to kind of association. Used for show/hide-links-by-kind + * + * @return a sorted map from kind label to links */ public TreeMap> mapLinksToKindOfAssociation() { Map> assocs = new HashMap<>(); final String derivedLinks = "Derived links"; - final String associationClass = "Linkobjects"; + final String associationClass = "Link objects"; final String nAryLinks = "N-Ary links"; final String reflexiveLinks = "Reflexive links"; final String binaryLinks = "Binary links"; @@ -1897,52 +1720,56 @@ public TreeMap> mapLinksToKindOfAssociation() { for (MAssociation assoc : fParent.system().model().associations()) { /* - * aggregationKind = 0, other + * aggregationKind = 0, other * aggregationKind = 1, aggreation * aggregationKind = 2, composition */ int kind = assoc.aggregationKind(); switch (kind) { - case 0: - Set links = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink link : links) { - if (link.association().isDerived() || link.association().isUnion()) { - assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociationClassImpl.class.isInstance(link.association())) { - assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) && link.linkEnds().size() > 2) { - assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) - && link.association().associatedClasses().size() == 1) { - assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); - } else if (MAssociation.class.isInstance(link.association()) && link.linkedObjects().size() == 2 - && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); - } else { - System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); - } + case 0: + Set links = fParent.system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { + MAssociation linkAssoc = link.association(); + if (linkAssoc == null) continue; + if (linkAssoc.isDerived() || linkAssoc.isUnion()) { + assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); + } else if (linkAssoc instanceof MAssociationClassImpl) { + assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); + } else if (linkAssoc.associationEnds().size() > 2) { + assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); + } else if (linkAssoc.associatedClasses().size() == 1) { + assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); + } else if (link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { + assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); + } else { + if (fLog != null) { + fLog.println("ERROR: NO MATCH IN ASSOC-KIND"); + } else { + System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); + } + } - } - break; - case 1: // Aggregation + } + break; + case 1: // Aggregation - // Get aggregations - Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); + // Get aggregations + Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink agg : aggregations) { - assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); - } - break; + for (MLink agg : aggregations) { + assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); + } + break; - case 2: // Composition + case 2: // Composition - // Get Compositions - Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); + // Get Compositions + Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink comp : compositions) { - assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); - } - break; + for (MLink comp : compositions) { + assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); + } + break; } } return new TreeMap<>(assocs); @@ -1951,8 +1778,8 @@ public TreeMap> mapLinksToKindOfAssociation() { /** * Hide all links of list links - * - * @param links + * + * @param links list of links to hide */ public void hideLink(List links) { for (MLink link : links) { @@ -1962,8 +1789,8 @@ public void hideLink(List links) { /** * Show all links of list links - * - * @param links + * + * @param links list of links to show */ public void showLink(List links) { for (MLink link : links) { @@ -1973,25 +1800,22 @@ public void showLink(List links) { /** * Check if a link is hidden - * - * @param link - * @return true, if link is hidden; else return false + * + * @param link the link instance to check + * @return true if the provided link is currently hidden; otherwise false */ public boolean isHidden(MLink link) { - if (hiddenData.getBinaryLinkToEdgeMap().containsKey(link) || hiddenData.getHalfLinkToEdgeMap().containsKey(link) - || hiddenData.getLinkObjectToNodeEdge().containsKey(link) - || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link)) { - return true; - } else { - return false; - } + return hiddenData.getBinaryLinkToEdgeMap().containsKey(link) + || hiddenData.getHalfLinkToEdgeMap().containsKey(link) + || (link instanceof MLinkObject && hiddenData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link)) + || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link); } /** - * - * @param links - * @return 0, if all Links are hidden 1, if all links are shown 2, if there - * are hidden and shown links + * Determine whether the provided list of links is hidden, visible or mixed. + * + * @param links collection of links to evaluate + * @return 0 if all links are hidden, 1 if all links are shown, 2 if mixed, -1 if none present */ public int isHidden(List links) { boolean existHiddenLink = false; @@ -2017,4 +1841,165 @@ public static void setJavaFxCall(boolean javaFxCall) { NewObjectDiagram.javaFxCall = javaFxCall; } + @Override + public ObjectDiagramData getVisibleData() { + return visibleData; + } + + @Override + public ObjectDiagramData getHiddenData() { + return hiddenData; + } + + /** + * Restore helper to determine hidden state for items when restoring layout. + * Mirrors the implementation used in ClassDiagram to remain consistent across diagrams. + */ + @SuppressWarnings("unused") + protected boolean isHidden(PersistHelper helper, int version) { + // The 'version' parameter is reserved for future format-specific logic. + return helper.getElementBooleanValue(LayoutTags.HIDDEN); + } + + /** + * Finds a link for the given association that connects the provided objects and + * matches the serialized linkValue. This method reverses what BinaryAssociationOrLinkEdge.storeAdditionalInfo + * wrote using link.toString(). It prefers exact object-list match and the string representation. + */ + private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { + if (assoc == null || objects == null || linkValue == null) { + return null; + } + + Set candidates = fParent.system().state().linksOfAssociation(assoc).links(); + for (MLink l : candidates) { + // first ensure the linked objects match the expected ordering/collection + List linked = l.linkedObjects(); + if (linked.size() == objects.size()) { + boolean sameObjects = true; + for (int i = 0; i < linked.size(); i++) { + if (!linked.get(i).equals(objects.get(i))) { + sameObjects = false; + break; + } + } + if (!sameObjects) continue; + + // compare the string representation stored by the edge + if (linkValue.equals(l.toString())) { + return l; + } + } + } + return null; + } + + @Override + public Set getHiddenNodes() { + return hiddenData.getNodes(); + } + + @Override + protected String getDefaultLayoutFileSuffix() { + // Use a dedicated suffix for object diagram default layouts (consistent with other diagrams) + return "_objdia.clt"; + } + + + @Override + public void stateChanged(SortChangeEvent e) { + for (ObjectNode n : this.visibleData.fObjectToNodeMap.values()) { + n.stateChanged(e); + } + } + + /** + * A kleine Helfermethode zum Erstellen von Actions mit weniger Boilerplate-Code. + * + * @param text Der Text der Action. + * @param listener Der ActionListener, der die Action ausführt. + * @return Die erstellte Action. + */ + private Action createAction(String text, ActionListener listener) { + return new AbstractAction(text) { + @Override + public void actionPerformed(ActionEvent e) { + listener.actionPerformed(e); + } + }; + } + + protected void addBinaryLink(MLink link) { + MAssociation assoc = link.association(); + + MLinkEnd linkEnd1 = link.linkEnd(assoc.associationEnds().get(0)); + MLinkEnd linkEnd2 = link.linkEnd(assoc.associationEnds().get(1)); + + MObject obj1 = linkEnd1.object(); + MObject obj2 = linkEnd2.object(); + + // object link + if (link instanceof MLinkObject) { + BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( + visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), + linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, + link); + + if (lastKnownLinkPositions.containsKey(link)) { + e.initialize(); + ObjectNode linkObjNode = visibleData.getObjectToNodeMap().get(link); + if (linkObjNode != null) { + linkObjNode.setStrategy(lastKnownLinkPositions.get(link)); + } + lastKnownLinkPositions.remove(link); + fGraph.addInitializedEdge(e); + } else { + fGraph.addEdge(e); + } + visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); + fLayouter = null; + } else { + // binary link + boolean isHidden = false; + ObjectNode node1; + ObjectNode node2; + + if (visibleData.getObjectToNodeMap().containsKey(obj1)) { + node1 = visibleData.getObjectToNodeMap().get(obj1); + } else { + node1 = hiddenData.getObjectToNodeMap().get(obj1); + isHidden = true; + } + + if (visibleData.getObjectToNodeMap().containsKey(obj2)) { + node2 = visibleData.getObjectToNodeMap().get(obj2); + } else { + node2 = hiddenData.getObjectToNodeMap().get(obj2); + isHidden = true; + } + + BinaryAssociationOrLinkEdge e = createBinaryAssociationOrLinkEdge(node1, node2, linkEnd1, + linkEnd2, this, link); + + if (link.isVirtual()) { + e.setDashed(true); + } + + if (isHidden) { + hiddenData.getBinaryLinkToEdgeMap().put(link, e); + } else { + fGraph.addEdge(e); + visibleData.getBinaryLinkToEdgeMap().put(link, e); + fLayouter = null; + } + } + } + + /** + * Factory hook for creating binary link edges. Kept as a protected method to allow easy overriding in subclasses. + */ + protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(PlaceableNode source, PlaceableNode target, + MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { + return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); + } } From 82ca193dd38d12cdf2d90c044a4449fa79612dcc Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:05:30 +0100 Subject: [PATCH 10/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java | 1 - 1 file changed, 1 deletion(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index ca9d107e1..d45c66211 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1505,7 +1505,6 @@ public void restorePlacementInfos(PersistHelper helper, int version) { } // Helper: restore binary association edges placement info - @SuppressWarnings("unused") private void restoreBinaryEdges(PersistHelper helper, int version, Set hiddenObjects) { AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); From 62e2e26b7c6e6f49dedbcf835c37184add076cce Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:08:22 +0100 Subject: [PATCH 11/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../gui/views/diagrams/objectdiagram/NewObjectDiagram.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index d45c66211..eac63dfea 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -675,8 +675,8 @@ protected void addNAryLink(MLink link) { } if (linkObjEdge != null) { halfEdges.add(linkObjEdge); - edgeIds.add(((MLinkObject) link).name()); - } + edgeIds.add(((MLinkObject) link).name()); + } } node.setHalfEdges(halfEdges, edgeIds); From fbcd4fe37fc1e811cde39c4ae6d317a2cfb7ca8f Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:08:38 +0100 Subject: [PATCH 12/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../views/diagrams/objectdiagram/NewObjectDiagram.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index eac63dfea..e4d1d7e8c 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1913,11 +1913,11 @@ public void stateChanged(SortChangeEvent e) { } /** - * A kleine Helfermethode zum Erstellen von Actions mit weniger Boilerplate-Code. + * A small helper method for creating {@link Action} instances with less boilerplate code. * - * @param text Der Text der Action. - * @param listener Der ActionListener, der die Action ausführt. - * @return Die erstellte Action. + * @param text The text of the action. + * @param listener The {@link ActionListener} that executes the action. + * @return The created action. */ private Action createAction(String text, ActionListener listener) { return new AbstractAction(text) { From 4dd78cedf13aaf7c9b329a97841d9bebc0bda0ae Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:10:36 +0100 Subject: [PATCH 13/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java | 1 - 1 file changed, 1 deletion(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index e4d1d7e8c..f02411064 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1854,7 +1854,6 @@ public ObjectDiagramData getHiddenData() { * Restore helper to determine hidden state for items when restoring layout. * Mirrors the implementation used in ClassDiagram to remain consistent across diagrams. */ - @SuppressWarnings("unused") protected boolean isHidden(PersistHelper helper, int version) { // The 'version' parameter is reserved for future format-specific logic. return helper.getElementBooleanValue(LayoutTags.HIDDEN); From 921182ee46c9b96ec607d54b5ad2596c15dfff81 Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:10:50 +0100 Subject: [PATCH 14/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index f02411064..0dd0e23e7 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1906,7 +1906,7 @@ protected String getDefaultLayoutFileSuffix() { @Override public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.fObjectToNodeMap.values()) { + for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { n.stateChanged(e); } } From 1a699c97f080a23ecafd590a19d3cee84557fdfa Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 20:11:02 +0100 Subject: [PATCH 15/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java | 1 - 1 file changed, 1 deletion(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 0dd0e23e7..4b87b2cbb 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -994,7 +994,6 @@ public void actionPerformed(ActionEvent e) { /** * Show properties of objects */ - @SuppressWarnings("unused") static class ActionShowProperties extends AbstractAction { private final MObject fObject; From 84e59c0023118b12c797402582851e7a24713c8c Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 18 Feb 2026 20:54:14 +0100 Subject: [PATCH 16/34] Harden getLinkByValue in NewObjectDiagram: null-safety, List.equals, Objects.equals; suppress unused warnings --- .../objectdiagram/NewObjectDiagram.java | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 4b87b2cbb..247a4d357 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -48,6 +48,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.WeakHashMap; +import java.util.Objects; import javax.swing.AbstractAction; import javax.swing.Action; @@ -1864,30 +1865,50 @@ protected boolean isHidden(PersistHelper helper, int version) { * wrote using link.toString(). It prefers exact object-list match and the string representation. */ private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { - if (assoc == null || objects == null || linkValue == null) { + // defensive preconditions + if (assoc == null || objects == null) { return null; } - Set candidates = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink l : candidates) { - // first ensure the linked objects match the expected ordering/collection + Set allLinks = fParent.system().state().linksOfAssociation(assoc).links(); + if (allLinks == null || allLinks.isEmpty()) { + return null; + } + + // First, collect all links that connect exactly the given objects (in order). + List matchingLinks = new ArrayList<>(); + for (MLink l : allLinks) { + if (l == null) continue; List linked = l.linkedObjects(); - if (linked.size() == objects.size()) { - boolean sameObjects = true; - for (int i = 0; i < linked.size(); i++) { - if (!linked.get(i).equals(objects.get(i))) { - sameObjects = false; - break; - } - } - if (!sameObjects) continue; + if (linked == null || linked.size() != objects.size()) continue; - // compare the string representation stored by the edge - if (linkValue.equals(l.toString())) { - return l; - } + // Use List.equals which performs element-wise, null-safe comparisons + if (linked.equals(objects)) { + matchingLinks.add(l); + } + } + + // No link connects exactly these objects. + if (matchingLinks.isEmpty()) { + return null; + } + + // Single candidate: return it directly without relying on toString(). + if (matchingLinks.size() == 1) { + return matchingLinks.getFirst(); + } + + // Multiple candidates: use linkValue (if available) to disambiguate. + if (linkValue == null) { + return null; + } + + for (MLink l : matchingLinks) { + if (Objects.equals(linkValue, l == null ? null : l.toString())) { + return l; } } + return null; } From 4b6617cd28ef65c99c5c4b25130da696f0bcb31a Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 21:12:01 +0100 Subject: [PATCH 17/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../objectdiagram/NewObjectDiagram.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 247a4d357..9c15b9347 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1880,10 +1880,38 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l for (MLink l : allLinks) { if (l == null) continue; List linked = l.linkedObjects(); - if (linked == null || linked.size() != objects.size()) continue; + * (optionally) matches the serialized linkValue. This method reverses what + * BinaryAssociationOrLinkEdge.storeAdditionalInfo wrote using link.toString(). + * + * If there is exactly one link connecting the given objects, that link is + * returned without checking linkValue (robust against toString() changes). + * If multiple links connect the same objects, linkValue is used to + * disambiguate via link.toString(). + */ + private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { + if (assoc == null || objects == null) { + return null; + } + + Set allLinks = fParent.system().state().linksOfAssociation(assoc).links(); + + // First, collect all links that connect exactly the given objects (in order). + List matchingLinks = new ArrayList<>(); + for (MLink l : allLinks) { + List linked = l.linkedObjects(); + if (linked.size() != objects.size()) { + continue; + } + + boolean sameObjects = true; + for (int i = 0; i < linked.size(); i++) { + if (!linked.get(i).equals(objects.get(i))) { + sameObjects = false; + break; + } + } - // Use List.equals which performs element-wise, null-safe comparisons - if (linked.equals(objects)) { + if (sameObjects) { matchingLinks.add(l); } } @@ -1895,7 +1923,7 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l // Single candidate: return it directly without relying on toString(). if (matchingLinks.size() == 1) { - return matchingLinks.getFirst(); + return matchingLinks.get(0); } // Multiple candidates: use linkValue (if available) to disambiguate. @@ -1904,7 +1932,7 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l } for (MLink l : matchingLinks) { - if (Objects.equals(linkValue, l == null ? null : l.toString())) { + if (linkValue.equals(l.toString())) { return l; } } From 662eaa38994b4bbc90fccd49c5e7d9cb5a5acf72 Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 21:15:49 +0100 Subject: [PATCH 18/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../views/diagrams/objectdiagram/NewObjectDiagram.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 9c15b9347..6afe3d50d 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -1947,11 +1947,11 @@ public Set getHiddenNodes() { @Override protected String getDefaultLayoutFileSuffix() { - // Use a dedicated suffix for object diagram default layouts (consistent with other diagrams) - return "_objdia.clt"; + // Returning null preserves the historic behavior: object diagrams do not + // auto-load/auto-save a default layout via DiagramView.getDefaultLayoutFile(). + // Introducing a non-null suffix here would be a user-visible persistence change. + return null; } - - @Override public void stateChanged(SortChangeEvent e) { for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { From 212e224ff24b4b0f331edb62717e258667b9fd30 Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 21:18:55 +0100 Subject: [PATCH 19/34] Update use-gui/src/main/java/module-info.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- use-gui/src/main/java/module-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/use-gui/src/main/java/module-info.java b/use-gui/src/main/java/module-info.java index c073fda2a..06d7efda6 100644 --- a/use-gui/src/main/java/module-info.java +++ b/use-gui/src/main/java/module-info.java @@ -34,5 +34,5 @@ exports org.tzi.use.gui.views.diagrams.elements; exports org.tzi.use.gui.views.diagrams.elements.edges; exports org.tzi.use.gui.views.diagrams.event; - exports org.tzi.use.gui.views.selection.objectselection; + exports org.tzi.use.gui.views.selection.objectselection to com.google.common; } \ No newline at end of file From e509b8fa210ffa77df91e20883e688e719e3a4a4 Mon Sep 17 00:00:00 2001 From: ahmedkha79 Date: Wed, 18 Feb 2026 21:21:02 +0100 Subject: [PATCH 20/34] Update use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../views/diagrams/objectdiagram/NewObjectDiagram.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 6afe3d50d..1910c9d43 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -911,8 +911,13 @@ public void deleteLink(MLink link) { * @param obj the MInstance whose node should be refreshed */ public void updateObject(MInstance obj) { - // Use computeIfPresent with an explicit cast of the key to the Map's key type (MObject) - visibleData.getObjectToNodeMap().computeIfPresent((MObject) obj, (k, node) -> { + // Only update if the instance is actually an MObject to avoid ClassCastException + if (!(obj instanceof MObject)) { + return; + } + + MObject mObj = (MObject) obj; + visibleData.getObjectToNodeMap().computeIfPresent(mObj, (k, node) -> { invalidateNode(node); return node; // keep the existing mapping }); From b82bb6a1457d357f9944aefddc55c9432aee571e Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 18 Feb 2026 22:14:12 +0100 Subject: [PATCH 21/34] Hotfix: Consolidate and harden getLinkByValue in NewObjectDiagram (null-safety, defensive checks) --- .../objectdiagram/NewObjectDiagram.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 1910c9d43..5b8a42091 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -912,12 +912,11 @@ public void deleteLink(MLink link) { */ public void updateObject(MInstance obj) { // Only update if the instance is actually an MObject to avoid ClassCastException - if (!(obj instanceof MObject)) { + if (!(obj instanceof MObject mObj)) { return; } - MObject mObj = (MObject) obj; - visibleData.getObjectToNodeMap().computeIfPresent(mObj, (k, node) -> { + visibleData.getObjectToNodeMap().computeIfPresent(mObj, (k, node) -> { invalidateNode(node); return node; // keep the existing mapping }); @@ -1866,51 +1865,45 @@ protected boolean isHidden(PersistHelper helper, int version) { /** * Finds a link for the given association that connects the provided objects and - * matches the serialized linkValue. This method reverses what BinaryAssociationOrLinkEdge.storeAdditionalInfo - * wrote using link.toString(). It prefers exact object-list match and the string representation. - */ - private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { - // defensive preconditions - if (assoc == null || objects == null) { - return null; - } - - Set allLinks = fParent.system().state().linksOfAssociation(assoc).links(); - if (allLinks == null || allLinks.isEmpty()) { - return null; - } - - // First, collect all links that connect exactly the given objects (in order). - List matchingLinks = new ArrayList<>(); - for (MLink l : allLinks) { - if (l == null) continue; - List linked = l.linkedObjects(); * (optionally) matches the serialized linkValue. This method reverses what * BinaryAssociationOrLinkEdge.storeAdditionalInfo wrote using link.toString(). - * * If there is exactly one link connecting the given objects, that link is * returned without checking linkValue (robust against toString() changes). * If multiple links connect the same objects, linkValue is used to * disambiguate via link.toString(). */ private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { + // defensive preconditions if (assoc == null || objects == null) { return null; } - Set allLinks = fParent.system().state().linksOfAssociation(assoc).links(); + // Retrieve all links for the association in a defensive manner + Set allLinks; + try { + allLinks = fParent.system().state().linksOfAssociation(assoc).links(); + } catch (Exception ex) { + // In case state or linksOfAssociation returns unexpectedly (defensive) + if (fLog != null) fLog.println(ex.getMessage()); + else System.err.println(ex.getMessage()); + return null; + } + if (allLinks == null || allLinks.isEmpty()) { + return null; + } // First, collect all links that connect exactly the given objects (in order). List matchingLinks = new ArrayList<>(); for (MLink l : allLinks) { + if (l == null) continue; List linked = l.linkedObjects(); - if (linked.size() != objects.size()) { - continue; - } + if (linked == null || linked.size() != objects.size()) continue; boolean sameObjects = true; for (int i = 0; i < linked.size(); i++) { - if (!linked.get(i).equals(objects.get(i))) { + MObject a = linked.get(i); + MObject b = objects.get(i); + if (!Objects.equals(a, b)) { sameObjects = false; break; } @@ -1928,7 +1921,7 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l // Single candidate: return it directly without relying on toString(). if (matchingLinks.size() == 1) { - return matchingLinks.get(0); + return matchingLinks.getFirst(); } // Multiple candidates: use linkValue (if available) to disambiguate. @@ -1937,7 +1930,14 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l } for (MLink l : matchingLinks) { - if (linkValue.equals(l.toString())) { + if (l == null) continue; + String s = null; + try { + s = l.toString(); + } catch (Exception ex) { + // ignore toString exceptions defensively + } + if (Objects.equals(linkValue, s)) { return l; } } From b0e0c22f081ed7c71271811b82979c5efdb194b1 Mon Sep 17 00:00:00 2001 From: ahmed Date: Sun, 1 Mar 2026 17:14:01 +0100 Subject: [PATCH 22/34] =?UTF-8?q?Added=20MVP=20scaffold=20for=20the=20obje?= =?UTF-8?q?ct=20diagram=20(package=20org.tzi.use.gui.views.diagrams.object?= =?UTF-8?q?diagram)=20Presenter:=20NewObjectDiagramPresenter=20Model:=20Ob?= =?UTF-8?q?jectDiagramModel=20View/Presenter=20contracts=20(INew*/IObject*?= =?UTF-8?q?=20interfaces)=20Persistence/auxiliary=20contracts:=20Placement?= =?UTF-8?q?Repository,=20ContextMenuProvider,=20ApplicationController=20No?= =?UTF-8?q?-op=20adapters:=20NullPlacementRepository,=20NullContextMenuPro?= =?UTF-8?q?vider,=20NullApplicationController=20Helper:=20DiagramCanvas=20?= =?UTF-8?q?and=20related=20small=20helpers=20Motivation:=20Decouple=20view?= =?UTF-8?q?=20rendering=20from=20presentation=20and=20model=20logic=20to?= =?UTF-8?q?=20remove=20bidirectional=20dependencies=20between=20diagram=20?= =?UTF-8?q?and=20view=20and=20to=20prepare=20an=20incremental=20refactorin?= =?UTF-8?q?g=20towards=20MVP.=20Make=20future=20refactorings=20safer=20by?= =?UTF-8?q?=20introducing=20clear=20contracts=20and=20temporary=20Null?= =?UTF-8?q?=E2=80=91Adapters=20so=20behavior=20remains=20unchanged.=20Beha?= =?UTF-8?q?vioural=20note:=20This=20commit=20wires=20the=20new=20presenter?= =?UTF-8?q?/model=20into=20the=20existing=20NewObjectDiagram/NewObjectDiag?= =?UTF-8?q?ramView=20using=20Null=20adapters=20=E2=80=94=20intentionally?= =?UTF-8?q?=20preserves=20existing=20runtime=20behavior.=20No=20domain=20l?= =?UTF-8?q?ogic=20moved=20yet;=20this=20is=20scaffolding=20for=20the=20fol?= =?UTF-8?q?low-up=20steps.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objectdiagram/ApplicationController.java | 17 ++ .../objectdiagram/ContextMenuProvider.java | 12 + .../diagrams/objectdiagram/DiagramCanvas.java | 33 +++ .../INewObjectDiagramPresenter.java | 21 ++ .../objectdiagram/INewObjectDiagramView.java | 11 + .../IObjectDiagramPresenter.java | 12 + .../objectdiagram/IObjectDiagramView.java | 11 + .../objectdiagram/NewObjectDiagram.java | 245 +++++++++++++----- .../NewObjectDiagramPresenter.java | 89 +++++++ .../objectdiagram/NewObjectDiagramView.java | 172 +++++++----- .../NullApplicationController.java | 27 ++ .../NullContextMenuProvider.java | 15 ++ .../NullPlacementRepository.java | 18 ++ .../objectdiagram/ObjectDiagramModel.java | 106 ++++++++ .../objectdiagram/PlacementRepository.java | 12 + 15 files changed, 673 insertions(+), 128 deletions(-) create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java new file mode 100644 index 000000000..86d8d08ac --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java @@ -0,0 +1,17 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.sys.MLink; +import java.util.List; + +/** + * Boundary for executing application/system commands. + * Methods are minimal and will be expanded during migration. + */ +public interface ApplicationController { + void createObject(String className); + void insertLink(MAssociation association, List participants); + void deleteLink(MLink link); +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java new file mode 100644 index 000000000..f391db9e7 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java @@ -0,0 +1,12 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JPopupMenu; +import java.awt.event.MouseEvent; + +/** + * Builds context menus and routes callbacks to the presenter. + */ +public interface ContextMenuProvider { + JPopupMenu buildMenu(MouseEvent triggerEvent, NewObjectDiagramPresenter presenter); +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java new file mode 100644 index 000000000..749ed7eb4 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java @@ -0,0 +1,33 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import java.awt.Graphics; + +/** + * Placeholder canvas implementing the view interface. Rendering will be migrated later. + */ +public class DiagramCanvas extends JComponent implements INewObjectDiagramView { + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + // actual rendering logic will be migrated from NewObjectDiagram + } + + @Override + public void showPopup(JPopupMenu popup) { + popup.show(this, getWidth() / 2, getHeight() / 2); + } + + @Override + public void refresh() { + revalidate(); + repaint(); + } + + @Override + public void setStatus(String status) { + // status handling will be delegated by the higher-level view + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java new file mode 100644 index 000000000..b31fb96bc --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java @@ -0,0 +1,21 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.uml.sys.events.*; +import org.tzi.use.uml.sys.MObject; + +/** Minimal presenter contract for the object diagram MVP. */ +public interface INewObjectDiagramPresenter { + void onRequestPopup(); + void onAddObject(Value value); + void onRefreshRequested(); + void onCreateObject(String clsName); + + // System event hooks (currently no-op implementations) + default void onTransition(TransitionEvent e) {} + default void onObjectCreated(MObject obj) {} + default void onObjectDestroyed(MObject obj) {} + default void onAttributeAssigned(AttributeAssignedEvent e) {} + default void onLinkInserted(LinkInsertedEvent e) {} + default void onLinkDeleted(LinkDeletedEvent e) {} +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java new file mode 100644 index 000000000..228dde01d --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java @@ -0,0 +1,11 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JPopupMenu; + +/** Minimal view contract for the object diagram MVP. */ +public interface INewObjectDiagramView { + void showPopup(JPopupMenu popup); + void refresh(); + void setStatus(String status); +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java new file mode 100644 index 000000000..edcac56c2 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java @@ -0,0 +1,12 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.ocl.value.Value; + +/** Minimal presenter contract for the object diagram MVP. */ +public interface IObjectDiagramPresenter { + void onRequestPopup(); + void onAddObject(Value value); + void onRefreshRequested(); + void onCreateObject(String clsName); +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java new file mode 100644 index 000000000..954399cd7 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java @@ -0,0 +1,11 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JPopupMenu; + +/** Minimal view contract for the object diagram MVP. */ +public interface IObjectDiagramView { + void showPopup(JPopupMenu popup); + void refresh(); + void setStatus(String status); +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 5b8a42091..79e20ea24 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -239,6 +239,7 @@ public Map getLinkObjectToNodeEdge() { private final ObjectDiagramData hiddenData = new ObjectDiagramData(); private final NewObjectDiagramView fParent; + private ObjectDiagramModel model; // optional mirror of visible/hidden state /** * The position of the next object node. This is either set to a random @@ -263,6 +264,79 @@ public Map getLinkObjectToNodeEdge() { @SuppressWarnings("unused") private static boolean javaFxCall = false; + /** Presenter reference for incremental MVP refactor. */ + private INewObjectDiagramPresenter presenter; + + public void setPresenter(INewObjectDiagramPresenter presenter) { + this.presenter = presenter; + if (presenter instanceof NewObjectDiagramPresenter p) { + this.model = p.getModel(); + } + } + + public INewObjectDiagramPresenter getPresenter() { + return presenter; + } + + /** Mirror visible node into model if present. */ + private void modelAddVisibleNode(MObject obj, PlaceableNode node) { + if (model != null) { + model.getVisibleNodes().put(obj, node); + model.getHiddenNodes().remove(obj); + } + } + + private void modelMoveNodeToHidden(MObject obj, PlaceableNode node) { + if (model != null) { + model.getHiddenNodes().put(obj, node); + model.getVisibleNodes().remove(obj); + } + } + + private void modelRemoveNode(MObject obj) { + if (model != null) { + model.getVisibleNodes().remove(obj); + model.getHiddenNodes().remove(obj); + } + } + + private void modelAddVisibleBinaryEdge(MLink link, EdgeBase edge) { + if (model != null) { + model.getVisibleBinaryEdges().put(link, edge); + model.getHiddenBinaryEdges().remove(link); + } + } + + private void modelAddVisibleNaryEdge(MLink link, EdgeBase edge) { + if (model != null) { + model.getVisibleNaryEdges().put(link, edge); + model.getHiddenNaryEdges().remove(link); + } + } + + private void modelMoveBinaryEdgeToHidden(MLink link, EdgeBase edge) { + if (model != null) { + model.getHiddenBinaryEdges().put(link, edge); + model.getVisibleBinaryEdges().remove(link); + } + } + + private void modelMoveNaryEdgeToHidden(MLink link, EdgeBase edge) { + if (model != null) { + model.getHiddenNaryEdges().put(link, edge); + model.getVisibleNaryEdges().remove(link); + } + } + + private void modelRemoveEdge(MLink link) { + if (model != null) { + model.getVisibleBinaryEdges().remove(link); + model.getHiddenBinaryEdges().remove(link); + model.getVisibleNaryEdges().remove(link); + model.getHiddenNaryEdges().remove(link); + } + } + /** * Creates a new empty diagram. */ @@ -475,6 +549,7 @@ public void addObject(MObject obj) { fGraph.add(n); visibleData.getObjectToNodeMap().put(obj, n); + modelAddVisibleNode(obj, n); fLayouter = null; } @@ -583,6 +658,11 @@ protected void showOrHideObjectNode(MObject obj, boolean show) { source.getObjectToNodeMap().remove(obj); target.getObjectToNodeMap().put(obj, n); + if (show) { + modelAddVisibleNode(obj, n); + } else { + modelMoveNodeToHidden(obj, n); + } fLayouter = null; } @@ -608,9 +688,11 @@ public void deleteObject(MObject obj) { if (isVisible) { fGraph.remove(n); visibleData.getObjectToNodeMap().remove(obj); + modelRemoveNode(obj); fLayouter = null; } else { hiddenData.getObjectToNodeMap().remove(obj); + modelRemoveNode(obj); } n.dispose(); } @@ -764,69 +846,83 @@ else if (e != null) source.getLinkObjectToNodeEdge().remove((MLinkObject) link); target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - fLayouter = null; - } else { - // binary link - BinaryAssociationOrLinkEdge e = source.getBinaryLinkToEdgeMap().get(link); - - if (show && e != null) { - fGraph.addEdge(e); - } else if (e != null) { - fGraph.removeEdge(e); - } - source.getBinaryLinkToEdgeMap().remove(link); - target.getBinaryLinkToEdgeMap().put(link, e); - } - } - - protected void showOrHideNAryLink(MLink link, boolean show) { - ObjectDiagramData source = (show ? hiddenData : visibleData); - ObjectDiagramData target = (show ? visibleData : hiddenData); - - DiamondNode node = source.getNaryLinkToDiamondNodeMap().get(link); - if (show) { - if (node == null) { - node = target.getNaryLinkToDiamondNodeMap().get(link); - } - fGraph.add(node); - } else { - fGraph.remove(node); - } - target.getNaryLinkToDiamondNodeMap().put(link, node); - source.getNaryLinkToDiamondNodeMap().remove(link); - - - // connected to an "object link" - if (link instanceof MLinkObject) { - EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); - - if (e != null) { - if (show) - fGraph.addEdge(e); - else - fGraph.removeEdge(e); - - source.getLinkObjectToNodeEdge().remove((MLinkObject) link); - target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - fLayouter = null; - } - } - - List halfEdges = source.getHalfLinkToEdgeMap().get(link); - - if (halfEdges != null) { - for (EdgeBase edge : halfEdges) { - if (show) - fGraph.addEdge(edge); - else - fGraph.removeEdge(edge); - } - - source.getHalfLinkToEdgeMap().remove(link); - target.getHalfLinkToEdgeMap().put(link, halfEdges); - } - fLayouter = null; - } + if (e != null) { + if (show) { + modelAddVisibleBinaryEdge(link, e); + } else { + modelMoveBinaryEdgeToHidden(link, e); + } + } + fLayouter = null; + } else { + // binary link + BinaryAssociationOrLinkEdge e = source.getBinaryLinkToEdgeMap().get(link); + + if (show && e != null) { + fGraph.addEdge(e); + modelAddVisibleBinaryEdge(link, e); + } else if (e != null) { + fGraph.removeEdge(e); + modelMoveBinaryEdgeToHidden(link, e); + } + source.getBinaryLinkToEdgeMap().remove(link); + target.getBinaryLinkToEdgeMap().put(link, e); + } + } + + protected void showOrHideNAryLink(MLink link, boolean show) { + ObjectDiagramData source = (show ? hiddenData : visibleData); + ObjectDiagramData target = (show ? visibleData : hiddenData); + + DiamondNode node = source.getNaryLinkToDiamondNodeMap().get(link); + if (show) { + if (node == null) { + node = target.getNaryLinkToDiamondNodeMap().get(link); + } + fGraph.add(node); + } else { + fGraph.remove(node); + } + target.getNaryLinkToDiamondNodeMap().put(link, node); + source.getNaryLinkToDiamondNodeMap().remove(link); + + + // connected to an "object link" + if (link instanceof MLinkObject) { + EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); + + if (e != null) { + if (show) + fGraph.addEdge(e); + else + fGraph.removeEdge(e); + + source.getLinkObjectToNodeEdge().remove((MLinkObject) link); + target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); + if (show) { + modelAddVisibleBinaryEdge(link, e); + } else { + modelMoveBinaryEdgeToHidden(link, e); + } + fLayouter = null; + } + } + + List halfEdges = source.getHalfLinkToEdgeMap().get(link); + + if (halfEdges != null) { + for (EdgeBase edge : halfEdges) { + if (show) + fGraph.addEdge(edge); + else + fGraph.removeEdge(edge); + } + + source.getHalfLinkToEdgeMap().remove(link); + target.getHalfLinkToEdgeMap().put(link, halfEdges); + } + fLayouter = null; + } /** * Deletes a link from the diagram. @@ -867,7 +963,8 @@ public void deleteLink(MLink link) { if (isVisible) { fGraph.removeEdge(e); - fLayouter = null; + modelRemoveEdge(link); + fLayouter = null; } e.dispose(); } else { // n-ary association @@ -887,7 +984,8 @@ public void deleteLink(MLink link) { if (isVisible) { fGraph.remove(n); - fLayouter = null; + modelRemoveEdge(link); + fLayouter = null; } n.dispose(); @@ -899,7 +997,8 @@ public void deleteLink(MLink link) { ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); fGraph.removeEdge(edge); data.getLinkObjectToNodeEdge().remove((MLinkObject) link); - edge.dispose(); + modelRemoveEdge(link); + edge.dispose(); } } } @@ -1381,8 +1480,12 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { nextNodePosition.y = p.getY(); } String clsName = s.substring(6); - fParent.createObject(clsName); - } + if (presenter != null) { + presenter.onCreateObject(clsName); + } else { + fParent.createObject(clsName); + } + } } dtde.dropComplete(true); } catch (IOException exception) { @@ -1959,7 +2062,7 @@ protected String getDefaultLayoutFileSuffix() { } @Override public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { + for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { n.stateChanged(e); } } @@ -2038,9 +2141,11 @@ protected void addBinaryLink(MLink link) { if (isHidden) { hiddenData.getBinaryLinkToEdgeMap().put(link, e); + modelMoveBinaryEdgeToHidden(link, e); } else { fGraph.addEdge(e); visibleData.getBinaryLinkToEdgeMap().put(link, e); + modelAddVisibleBinaryEdge(link, e); fLayouter = null; } } @@ -2050,7 +2155,7 @@ protected void addBinaryLink(MLink link) { * Factory hook for creating binary link edges. Kept as a protected method to allow easy overriding in subclasses. */ protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(PlaceableNode source, PlaceableNode target, - MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { + MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java new file mode 100644 index 000000000..ba749529c --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java @@ -0,0 +1,89 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; +import org.tzi.use.uml.sys.events.AttributeAssignedEvent; +import org.tzi.use.uml.sys.events.LinkDeletedEvent; +import org.tzi.use.uml.sys.events.LinkInsertedEvent; +import org.tzi.use.uml.sys.events.TransitionEvent; +import org.tzi.use.uml.sys.MObject; + +/** + * MVP presenter for the object diagram. Currently a skeleton with no logic; wiring will be added incrementally. + */ +public class NewObjectDiagramPresenter implements INewObjectDiagramPresenter { + + private final INewObjectDiagramView view; + private final ObjectDiagramModel model; + private final PlacementRepository placementRepository; + private final ApplicationController applicationController; + private final ContextMenuProvider contextMenuProvider; + + public NewObjectDiagramPresenter(INewObjectDiagramView view, + ObjectDiagramModel model, + PlacementRepository placementRepository, + ApplicationController applicationController, + ContextMenuProvider contextMenuProvider) { + this.view = view; + this.model = model; + this.placementRepository = placementRepository; + this.applicationController = applicationController; + this.contextMenuProvider = contextMenuProvider; + } + + @Override + public void onRequestPopup() { + // will be implemented when ContextMenuProvider is wired + } + + @Override + public void onAddObject(Value value) { + // will be implemented during migration + } + + @Override + public void onRefreshRequested() { + // will be implemented during migration + } + + @Override + public void onCreateObject(String clsName) { + if (applicationController != null) { + applicationController.createObject(clsName); + } + } + + @Override + public void onTransition(TransitionEvent e) { + // hook for future logic + } + + @Override + public void onObjectCreated(MObject obj) { + // hook for future logic + } + + @Override + public void onObjectDestroyed(MObject obj) { + // hook for future logic + } + + @Override + public void onAttributeAssigned(AttributeAssignedEvent e) { + // hook for future logic + } + + @Override + public void onLinkInserted(LinkInsertedEvent e) { + // hook for future logic + } + + @Override + public void onLinkDeleted(LinkDeletedEvent e) { + // hook for future logic + } + + public ObjectDiagramModel getModel() { + return model; + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java index 6ea170aa3..70cb74a05 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java @@ -31,6 +31,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JPopupMenu; import org.tzi.use.gui.main.MainWindow; @@ -70,7 +71,7 @@ */ @SuppressWarnings("serial") public class NewObjectDiagramView extends JPanel - implements View, PrintableView, SortChangeListener { + implements View, PrintableView, SortChangeListener, INewObjectDiagramView { protected final MSystem fSystem; protected final MainWindow fMainWindow; @@ -94,13 +95,23 @@ public NewObjectDiagramView(MainWindow mainWindow, MSystem system) { } public void initDiagram(boolean loadDefaultLayout, ObjDiagramOptions opt) { - if (opt == null) - fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter()); - else - fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter(), new ObjDiagramOptions(opt)); - - fObjectDiagram.setStatusBar(fMainWindow.statusBar()); - this.removeAll(); + if (opt == null) + fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter()); + else + fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter(), new ObjDiagramOptions(opt)); + + // wire MVP skeleton with no-op services (no behavior change) + ObjectDiagramModel model = new ObjectDiagramModel(); + NewObjectDiagramPresenter presenter = new NewObjectDiagramPresenter( + this, + model, + new NullPlacementRepository(), + new NullApplicationController(), + new NullContextMenuProvider()); + fObjectDiagram.setPresenter(presenter); + + fObjectDiagram.setStatusBar(fMainWindow.statusBar()); + this.removeAll(); add( new JScrollPane(fObjectDiagram) ); initState(); } @@ -151,55 +162,73 @@ private void initState() { @Subscribe public void onTransition(TransitionEvent e) { - fObjectDiagram.updateObject(e.getSource()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onObjectCeated(ObjectCreatedEvent e) { - if (e.getCreatedObject() instanceof MLink) { - return; - } + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onTransition(e); + } + fObjectDiagram.updateObject(e.getSource()); + fObjectDiagram.invalidateContent(true); + } + + @Subscribe + public void onObjectCeated(ObjectCreatedEvent e) { + if (e.getCreatedObject() instanceof MLink) { + return; + } + + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onObjectCreated(e.getCreatedObject()); + } + fObjectDiagram.addObject(e.getCreatedObject()); + fObjectDiagram.invalidateContent(true); + } + + @Subscribe + public void onObjectDestroyed(ObjectDestroyedEvent e) { + if (e.getDestroyedObject() instanceof MLink) { + return; + } + + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onObjectDestroyed(e.getDestroyedObject()); + } + fObjectDiagram.deleteObject(e.getDestroyedObject()); + fObjectDiagram.invalidateContent(true); + } + + @Subscribe + public void onAttributeAssigned(AttributeAssignedEvent e) { + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onAttributeAssigned(e); + } + fObjectDiagram.updateObject(e.getObject()); + fObjectDiagram.invalidateContent(true); + } + + @Subscribe + public void onLinkCeated(LinkInsertedEvent e) { + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onLinkInserted(e); + } + if (e.getAssociation() instanceof MAssociationClass) { + fObjectDiagram.addObject((MLinkObject)e.getLink()); + } + fObjectDiagram.addLink(e.getLink()); + fObjectDiagram.invalidateContent(true); + } + + @Subscribe + public void onLinkDeleted(LinkDeletedEvent e) { + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onLinkDeleted(e); + } + if (e.getAssociation() instanceof MAssociationClass) { + fObjectDiagram.deleteObject((MLinkObject)e.getLink()); + } + + fObjectDiagram.deleteLink(e.getLink()); + fObjectDiagram.invalidateContent(true); + } - fObjectDiagram.addObject(e.getCreatedObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onObjectDestroyed(ObjectDestroyedEvent e) { - if (e.getDestroyedObject() instanceof MLink) { - return; - } - - fObjectDiagram.deleteObject(e.getDestroyedObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onAttributeAssigned(AttributeAssignedEvent e) { - fObjectDiagram.updateObject(e.getObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onLinkCeated(LinkInsertedEvent e) { - if (e.getAssociation() instanceof MAssociationClass) { - fObjectDiagram.addObject((MLinkObject)e.getLink()); - } - fObjectDiagram.addLink(e.getLink()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onLinkDeleted(LinkDeletedEvent e) { - if (e.getAssociation() instanceof MAssociationClass) { - fObjectDiagram.deleteObject((MLinkObject)e.getLink()); - } - - fObjectDiagram.deleteLink(e.getLink()); - fObjectDiagram.invalidateContent(true); - } - /** * After the occurence of an event the view is updated. */ @@ -257,8 +286,8 @@ void insertLink(MAssociation association, MObject[] objects) { } catch (MSystemException e) { JOptionPane.showMessageDialog( fMainWindow, - e.getMessage(), - "Error", + e.getMessage(), + "Error", JOptionPane.ERROR_MESSAGE); } } @@ -333,4 +362,31 @@ public float getContentHeight() { public float getContentWidth() { return fObjectDiagram.getPreferredSize().width; } + + @Override + public void showPopup(JPopupMenu popup) { + if (fObjectDiagram != null) { + popup.show(fObjectDiagram, fObjectDiagram.getWidth() / 2, fObjectDiagram.getHeight() / 2); + } else { + popup.show(this, getWidth() / 2, getHeight() / 2); + } + } + + @Override + public void refresh() { + if (fObjectDiagram != null) { + fObjectDiagram.invalidateContent(true); + fObjectDiagram.repaint(); + } else { + revalidate(); + repaint(); + } + } + + @Override + public void setStatus(String status) { + if (fMainWindow != null && fMainWindow.statusBar() != null) { + fMainWindow.statusBar().showTmpMessage(status); + } + } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java new file mode 100644 index 000000000..b852fbf7c --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java @@ -0,0 +1,27 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MObject; +import java.util.List; + +/** + * No-op controller used during incremental migration. + */ +public class NullApplicationController implements ApplicationController { + @Override + public void createObject(String className) { + // no-op + } + + @Override + public void insertLink(MAssociation association, List participants) { + // no-op + } + + @Override + public void deleteLink(MLink link) { + // no-op + } +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java new file mode 100644 index 000000000..9269a46ca --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java @@ -0,0 +1,15 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JPopupMenu; +import java.awt.event.MouseEvent; + +/** + * No-op context menu provider used during incremental migration. + */ +public class NullContextMenuProvider implements ContextMenuProvider { + @Override + public JPopupMenu buildMenu(MouseEvent triggerEvent, NewObjectDiagramPresenter presenter) { + return new JPopupMenu(); + } +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java new file mode 100644 index 000000000..92cabe547 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java @@ -0,0 +1,18 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; + +/** + * No-op placement repository used during incremental migration. + */ +public class NullPlacementRepository implements PlacementRepository { + @Override + public void storeLayout(ObjectDiagramModel model) { + // no-op + } + + @Override + public void restoreLayout(ObjectDiagramModel model) { + // no-op + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java new file mode 100644 index 000000000..4c7a708fe --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java @@ -0,0 +1,106 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; +import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MLinkObject; +import org.tzi.use.uml.sys.MObject; + +/** + * Skeleton for the object diagram domain model. Holds visible/hidden graph data. + * This is intentionally minimal and not yet wired; follow-up steps will migrate + * state from {@link NewObjectDiagram} into this model. + */ +public class ObjectDiagramModel { + + /** listeners for future change events */ + public interface Listener { + default void onNodeAdded(MObject obj, PlaceableNode node) {} + default void onNodeRemoved(MObject obj) {} + default void onLinkAdded(MLink link, EdgeBase edge) {} + default void onLinkRemoved(MLink link) {} + default void onStateChanged() {} + } + + private final Set listeners = new HashSet<>(); + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + // Visible/hidden state mirrors existing ObjectDiagramData; to be populated incrementally + private final Map visibleNodes = new HashMap<>(); + private final Map visibleBinaryEdges = new HashMap<>(); + private final Map visibleNaryEdges = new HashMap<>(); + + private final Map hiddenNodes = new HashMap<>(); + private final Map hiddenBinaryEdges = new HashMap<>(); + private final Map hiddenNaryEdges = new HashMap<>(); + + // Accessors (read-only views for now) + public Map getVisibleNodes() { + return visibleNodes; + } + + public Map getVisibleBinaryEdges() { + return visibleBinaryEdges; + } + + public Map getVisibleNaryEdges() { + return visibleNaryEdges; + } + + public Map getHiddenNodes() { + return hiddenNodes; + } + + public Map getHiddenBinaryEdges() { + return hiddenBinaryEdges; + } + + public Map getHiddenNaryEdges() { + return hiddenNaryEdges; + } + + /** + * Placeholder query for later migration: map links to kind of association. + */ + public Map> mapLinksToKindOfAssociation(List associations, Map> linksByAssoc) { + return Map.of(); + } + + /** + * Placeholder for later migration: resolve a link by value/class combination. + */ + public MLink getLinkByValue(MLink candidate, String value) { + return candidate; + } + + /** + * Placeholder for later migration: check hidden state of a link. + */ + public boolean isHidden(MLink link) { + return hiddenBinaryEdges.containsKey(link) + || hiddenNaryEdges.containsKey(link) + || (link instanceof MLinkObject ml) && hiddenNodes.containsKey(ml); + } + + /** + * Placeholder for later migration: check hidden state of a node. + */ + public boolean isHidden(MObject obj) { + return hiddenNodes.containsKey(obj); + } +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java new file mode 100644 index 000000000..9e77657c4 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java @@ -0,0 +1,12 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; + +/** + * Persistence boundary for diagram layouts/placements. + * Implementation will handle IO; kept minimal for MVP wiring. + */ +public interface PlacementRepository { + void storeLayout(ObjectDiagramModel model); + void restoreLayout(ObjectDiagramModel model); +} From 231aec01846f47f3c2f9258fdc350f491538ba95 Mon Sep 17 00:00:00 2001 From: ahmed Date: Tue, 3 Mar 2026 20:24:49 +0100 Subject: [PATCH 23/34] =?UTF-8?q?Added/updated=20Presenter=20and=20Model?= =?UTF-8?q?=20scaffolding=20for=20the=20object=20diagram.=20Decoupled=20vi?= =?UTF-8?q?ew/canvas=20from=20domain=20orchestration;=20forwarder/adapters?= =?UTF-8?q?=20(Null*=20adapters)=20used=20to=20keep=20behavior=20stable=20?= =?UTF-8?q?during=20migration.=20Added=20PlantUML=20documentation=20for=20?= =?UTF-8?q?current=20and=20target=20MVP=20architecture.=20Introduced/kept?= =?UTF-8?q?=20PlacementRepository=20contract=20for=20persistence=20hooks?= =?UTF-8?q?=20and=20ContextMenuProvider=20contract=20for=20menu=20callback?= =?UTF-8?q?s.=20Kept=20temporary=20fallbacks=20(Null=20adapters=20/=20no?= =?UTF-8?q?=E2=80=91op=20providers)=20so=20runtime=20behavior=20remains=20?= =?UTF-8?q?unchanged=20while=20refactoring=20proceeds.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagrams/event/DiagramInputHandling.java | 151 +- .../objectdiagram/ApplicationController.java | 8 +- .../objectdiagram/ContextMenuProvider.java | 12 +- .../DefaultApplicationController.java | 98 + .../DefaultContextMenuProvider.java | 123 ++ .../DefaultPlacementRepository.java | 251 +++ .../diagrams/objectdiagram/DiagramCanvas.java | 2 +- .../objectdiagram/DiagramContext.java | 28 + .../objectdiagram/NewObjectDiagram.java | 1708 +++++------------ .../objectdiagram/NewObjectDiagramModel.java | 231 +++ .../NewObjectDiagramPresenter.java | 131 +- .../NewObjectDiagramPresenterImpl.java | 380 ++++ ...agramView.java => NewObjectDiagramUI.java} | 3 +- .../objectdiagram/NewObjectDiagramView.java | 304 +-- .../ObjectDiagramInteractor.java | 27 + .../objectdiagram/PlacementRepository.java | 20 +- .../objectselection/ObjectSelection.java | 18 +- 17 files changed, 1899 insertions(+), 1596 deletions(-) create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramContext.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java rename use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/{INewObjectDiagramView.java => NewObjectDiagramUI.java} (85%) create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java index 73886e94c..a4d0e1257 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java @@ -149,13 +149,11 @@ public void mousePressed(MouseEvent e) { // untouched). In any case this click may be used to // start dragging selected items. if (!(pickedObjectNode instanceof ResizeNode) && !fNodeSelection.isSelected(pickedObjectNode)) { - // clear selection fNodeSelection.clear(); fEdgeSelection.clear(); - // add this component as the only selected item fNodeSelection.add(pickedObjectNode); fDiagram.repaint(); - } + } // subsequent dragging events will move selected items if (pickedObjectNode instanceof ResizeNode) { resizeNode = (ResizeNode)pickedObjectNode; @@ -165,22 +163,20 @@ public void mousePressed(MouseEvent e) { fDragMode = DragMode.DRAG_ITEMS; resizeNode = null; } - + fDragStart = e.getPoint(); } else if (pickedEdge != null) { if (!fEdgeSelection.isSelected(pickedEdge)) { - // clear selection - fNodeSelection.clear(); - fEdgeSelection.clear(); - // add this component as the only selected item - fEdgeSelection.add(pickedEdge); - fDiagram.repaint(); - } - } else { + fNodeSelection.clear(); + fEdgeSelection.clear(); + fEdgeSelection.add(pickedEdge); + fDiagram.repaint(); + } + } else { // click in background, clear selection fNodeSelection.clear(); fEdgeSelection.clear(); - + // init selection rectangle selectionRectangle = fDiagram.createSelectionBox(e.getPoint()); fDiagram.add(selectionRectangle); @@ -196,7 +192,7 @@ public void mousePressed(MouseEvent e) { fNodeSelection.remove( pickedObjectNode ); else fNodeSelection.add( pickedObjectNode ); - + fDiagram.repaint(); } else if (pickedEdge != null) { @@ -205,14 +201,14 @@ else if (pickedEdge != null) { fEdgeSelection.remove(pickedEdge); else fEdgeSelection.add( pickedEdge ); - + fDiagram.repaint(); } else { // additive selection rectangle selectionRectangle = fDiagram.createSelectionBox(e.getPoint()); fDiagram.add(selectionRectangle); - + fDiagram.repaint(); } break; @@ -270,8 +266,11 @@ public void mouseEntered(MouseEvent e) { @Override public void mouseExited(MouseEvent e) { - if (fDiagram.getStatusBar() != null) - fDiagram.getStatusBar().clearMessage(); + if (fDiagram instanceof NewObjectDiagram objDiag) { + objDiag.onPointerExited(); + } else if (fDiagram.getStatusBar() != null) { + fDiagram.getStatusBar().clearMessage(); + } } @Override @@ -299,10 +298,10 @@ public synchronized void mouseDragged(MouseEvent e) { int dy = p.y - fDragStart.y; moveSelectedObjects(dx, dy); - - fDragStart = p; - } - + + fDragStart = p; + } + if (fDragMode == DragMode.RESIZE_ITEM) { resizeSelectedObjects(e.getPoint()); } @@ -356,65 +355,6 @@ protected void moveSelectedObjects(int dx, int dy) { } @Override - public void mouseMoved(MouseEvent e) { - if (fDiagram.getStatusBar() != null) - fDiagram.getStatusBar().showMessage("[x=" + e.getPoint().getX() + ", y=" + e.getPoint().getY() + "] ", BorderLayout.EAST); - - PlaceableNode targetNode = null; - - // We allow selected nodes to change the mouse cursor - for (PlaceableNode n : fNodeSelection) { - if (n.occupies(e.getX(), e.getY())) { - targetNode = n; - } else { - targetNode = n.getRelatedNode(e.getX(), e.getY()); - } - - if (targetNode != null) { - fDiagram.setCursor(targetNode.getCursor()); - return; - } - } - - fDiagram.setCursor(Cursor.getDefaultCursor()); - } - - // implementation of interface DragTargetListener - @Override - public void dragEnter(DropTargetDragEvent dtde) { - //Log.trace(this, "dragEnter"); - dtde.acceptDrag(DnDConstants.ACTION_MOVE); - } - - @Override - public void dragOver(DropTargetDragEvent dtde) { - //Log.trace(this, "dragOver"); - dtde.acceptDrag(DnDConstants.ACTION_MOVE); - } - - @Override - public void dropActionChanged(DropTargetDragEvent dtde) { - //Log.trace(this, "dropActionChanged"); - dtde.acceptDrag(DnDConstants.ACTION_MOVE); - } - - @Override - public void dragExit(DropTargetEvent dte) { - //Log.trace(this, "dragExit"); - } - - /** - * Accepts a drag of a class from the ModelBrowser. A new object of this - * class will be created. - */ - @Override - public void drop(DropTargetDropEvent dtde) { - if ( fDiagram instanceof NewObjectDiagram ) { - ((NewObjectDiagram) fDiagram).dropObjectFromModelBrowser( dtde ); - } - } - - @Override public void keyTyped(KeyEvent e) { } @Override @@ -450,4 +390,53 @@ public void keyPressed(KeyEvent e) { @Override public void keyReleased(KeyEvent e) { } + + @Override + public void mouseMoved(MouseEvent e) { + if (fDiagram instanceof NewObjectDiagram objDiag) { + objDiag.onPointerMoved(e.getPoint()); + } else if (fDiagram.getStatusBar() != null) { + fDiagram.getStatusBar() + .showMessage("[x=" + e.getPoint().getX() + ", y=" + e.getPoint().getY() + "] ", BorderLayout.EAST); + } + + PlaceableNode targetNode = null; + for (PlaceableNode n : fNodeSelection) { + targetNode = n.occupies(e.getX(), e.getY()) ? n : n.getRelatedNode(e.getX(), e.getY()); + if (targetNode != null) { + fDiagram.setCursor(targetNode.getCursor()); + return; + } + } + fDiagram.setCursor(Cursor.getDefaultCursor()); + } + + @Override + public void dragEnter(DropTargetDragEvent dtde) { + dtde.acceptDrag(DnDConstants.ACTION_MOVE); + } + + @Override + public void dragOver(DropTargetDragEvent dtde) { + dtde.acceptDrag(DnDConstants.ACTION_MOVE); + } + + @Override + public void dropActionChanged(DropTargetDragEvent dtde) { + dtde.acceptDrag(DnDConstants.ACTION_MOVE); + } + + @Override + public void dragExit(DropTargetEvent dte) { + // no-op + } + + @Override + public void drop(DropTargetDropEvent dtde) { + if (fDiagram instanceof NewObjectDiagram objDiag) { + objDiag.dropObjectFromModelBrowser(dtde); + } else { + dtde.rejectDrop(); + } + } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java index 86d8d08ac..52dc60230 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java @@ -4,6 +4,9 @@ import org.tzi.use.uml.mm.MAssociation; import org.tzi.use.uml.sys.MLink; import java.util.List; +import java.util.Set; + +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjDiagramOptions; /** * Boundary for executing application/system commands. @@ -13,5 +16,8 @@ public interface ApplicationController { void createObject(String className); void insertLink(MAssociation association, List participants); void deleteLink(MLink link); + void deleteObjects(Set objects); + void resetDiagram(ObjDiagramOptions options); + /** Open object properties UI for the given object. */ + void showObjectProperties(String objectName); } - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java index f391db9e7..9577fc02f 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java @@ -1,12 +1,18 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; import javax.swing.JPopupMenu; -import java.awt.event.MouseEvent; +import java.util.Set; +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.sys.MLink; /** * Builds context menus and routes callbacks to the presenter. */ public interface ContextMenuProvider { - JPopupMenu buildMenu(MouseEvent triggerEvent, NewObjectDiagramPresenter presenter); + void enhanceMenu(JPopupMenu popupMenu, + ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects); } - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java new file mode 100644 index 000000000..6fcc06fa0 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java @@ -0,0 +1,98 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.gui.main.MainWindow; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.sys.MSystem; +import org.tzi.use.uml.sys.MSystemException; +import org.tzi.use.uml.sys.soil.MLinkDeletionStatement; +import org.tzi.use.uml.sys.soil.MLinkInsertionStatement; +import org.tzi.use.uml.sys.soil.MObjectDestructionStatement; +import org.tzi.use.uml.sys.soil.MSequenceStatement; + +import javax.swing.JOptionPane; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.tzi.use.gui.views.ObjectPropertiesView; +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjDiagramOptions; + +/** + * Default bridge to execute domain commands against the USE system. + * Keeps UI concerns (dialogs) minimal and delegates heavy UI (qualifier input) to QualifierInputView when needed. + */ +class DefaultApplicationController implements ApplicationController { + private final MainWindow mainWindow; + private final MSystem system; + private final DiagramContext diagramContext; + + DefaultApplicationController(MainWindow mainWindow, MSystem system, DiagramContext diagramContext) { + this.mainWindow = mainWindow; + this.system = system; + this.diagramContext = diagramContext; + } + + @Override + public void createObject(String className) { + MainWindow.instance().createObject(className); + } + + @Override + public void insertLink(MAssociation association, List participants) { + MObject[] objects = participants.toArray(new MObject[0]); + if (association.hasQualifiedEnds()) { + QualifierInputView input = new QualifierInputView(mainWindow, system, association, objects); + input.setLocationRelativeTo(mainWindow); + input.setVisible(true); + return; + } + + try { + system.execute(new MLinkInsertionStatement(association, objects, Collections.>emptyList())); + } catch (MSystemException e) { + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } + + @Override + public void deleteLink(MLink link) { + try { + system.execute(new MLinkDeletionStatement(link)); + } catch (MSystemException e) { + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } + + @Override + public void deleteObjects(Set objects) { + MSequenceStatement sequence = new MSequenceStatement(); + for (MObject obj : objects) { + sequence.appendStatement(new MObjectDestructionStatement(obj.value())); + } + if (sequence.isEmpty()) { + return; + } + try { + system.execute(sequence.simplify()); + } catch (MSystemException e) { + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } + + @Override + public void resetDiagram(ObjDiagramOptions options) { + if (diagramContext != null) { + diagramContext.resetDiagram(options); + } + } + + @Override + public void showObjectProperties(String objectName) { + ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); + v.selectObject(objectName); + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java new file mode 100644 index 000000000..672a0c345 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -0,0 +1,123 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import javax.swing.JPopupMenu; +import javax.swing.JMenuItem; +import javax.swing.JCheckBoxMenuItem; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MLinkObject; + +/** + * Default context menu provider used when no plugin provides a specialized menu. + */ +public class DefaultContextMenuProvider implements ContextMenuProvider { + @Override + public void enhanceMenu(JPopupMenu popupMenu, + ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects) { + if (popupMenu == null || presenter == null) { + return; + } + + String summary = String.format("Selected objects: %d, selected links: %d", + selectedObjects.size(), + selectedLinks.size()); + JMenuItem summaryItem = new JMenuItem("Selection overview"); + summaryItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + presenter.onStatusMessage(summary); + } + }); + popupMenu.insert(summaryItem, 0); + + JMenuItem expandItem = new JMenuItem("Refresh selection"); + expandItem.addActionListener(ev -> { + presenter.onStatusMessage("Refreshing selection overview"); + presenter.onRefreshRequested(); + }); + popupMenu.insert(expandItem, 1); + + // Hide selected items + if (!selectedObjects.isEmpty() || !selectedLinks.isEmpty()) { + JMenuItem hideItem = new JMenuItem("Hide selected"); + hideItem.addActionListener(ev -> { + presenter.onHideLinks(selectedLinks); + presenter.onHideObjects(selectedObjects); + presenter.onStatusMessage("Selected elements hidden"); + }); + popupMenu.insert(hideItem, 2); + } + + // Crop selection -> hide everything in selection (objects + link endpoints) + if (!selectedObjects.isEmpty() || !selectedLinks.isEmpty()) { + JMenuItem cropItem = new JMenuItem("Crop selection"); + cropItem.addActionListener(ev -> { + Set objectsToHide = new HashSet<>(selectedObjects); + selectedLinks.forEach(link -> { + if (link instanceof MLinkObject) { + objectsToHide.add((MLinkObject) link); + } else { + objectsToHide.addAll(link.linkedObjects()); + } + }); + presenter.onCropSelection(objectsToHide); + presenter.onStatusMessage("Cropped selection"); + }); + popupMenu.insert(cropItem, 3); + } + + // Show hidden elements + JMenuItem showHidden = new JMenuItem("Show hidden elements"); + showHidden.addActionListener(ev -> { + presenter.onShowHiddenElements(); + presenter.onStatusMessage("Showing hidden elements"); + }); + popupMenu.insert(showHidden, 4); + + // Toggle show states + JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", diagram != null && diagram.isShowStates()); + showStates.addActionListener(ev -> presenter.onToggleShowStates(showStates.isSelected())); + popupMenu.insert(showStates, 5); + + // Gray in/out + if (!selectedObjects.isEmpty()) { + Set selection = selectedObjects; + int greyed = 0; + int visible = 0; + for (MObject obj : selection) { + if (diagram != null && diagram.isGreyed(obj)) { + greyed++; + } else { + visible++; + } + } + if (greyed > 0) { + JMenuItem grayIn = new JMenuItem("Gray in selected" + (greyed > 1 ? " (" + greyed + ")" : "")); + grayIn.addActionListener(ev -> presenter.onGrayIn(selection)); + popupMenu.insert(grayIn, 6); + } + if (visible > 0) { + JMenuItem grayOut = new JMenuItem("Gray out selected" + (visible > 1 ? " (" + visible + ")" : "")); + grayOut.addActionListener(ev -> presenter.onGrayOut(selection)); + popupMenu.insert(grayOut, 7); + } + } + + // Hide/show all links + JMenuItem hideAllLinks = new JMenuItem("Hide all links"); + hideAllLinks.addActionListener(ev -> presenter.onHideAllLinks()); + popupMenu.insert(hideAllLinks, 8); + + JMenuItem showAllLinks = new JMenuItem("Show all links"); + showAllLinks.addActionListener(ev -> presenter.onShowAllLinks()); + popupMenu.insert(showAllLinks, 9); + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java new file mode 100644 index 000000000..4d288cd72 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java @@ -0,0 +1,251 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import com.ximpleware.AutoPilot; +import com.ximpleware.NavException; +import com.ximpleware.XPathEvalException; +import com.ximpleware.XPathParseException; +import org.tzi.use.gui.util.PersistHelper; +import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectNode; +import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; +import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationClassOrObject; +import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationOrLinkEdge; +import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; +import org.tzi.use.gui.views.diagrams.elements.edges.NAryAssociationClassOrObjectEdge; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.mm.MNamedElementComparator; +import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; +import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.uml.sys.*; +import org.w3c.dom.Element; + +import java.util.*; + +class DefaultPlacementRepository implements PlacementRepository { + + @Override + public void storeLayout(NewObjectDiagramModel model, + PersistHelper helper, + Element root) { + storePlacementInfos(helper, root, model.getVisibleData(), true); + storePlacementInfos(helper, root, model.getHiddenData(), false); + } + + private void storePlacementInfos(PersistHelper helper, Element root, NewObjectDiagram.ObjectDiagramData data, boolean visible) { + for (ObjectNode n : data.getObjectToNodeMap().values()) { + n.storePlacementInfo(helper, root, !visible); + } + + for (PlaceableNode n : data.getNaryLinkToDiamondNodeMap().values()) { + n.storePlacementInfo(helper, root, !visible); + } + + for (EdgeBase e : data.getBinaryLinkToEdgeMap().values()) { + e.storePlacementInfo(helper, root, !visible); + } + + for (EdgeBase e : data.getLinkObjectToNodeEdge().values()) { + e.storePlacementInfo(helper, root, !visible); + } + } + + @Override + public Set restoreLayout(NewObjectDiagramModel model, + PersistHelper helper, + int version, + MSystem system) { + Set hiddenObjects = new HashSet<>(); + if (version < 12) return hiddenObjects; + restoreBinaryEdges(helper, version, system, model.getVisibleData()); + restoreNodeEdges(helper, version, system, model.getVisibleData()); + restoreDiamondNodes(helper, version, system, model.getVisibleData(), hiddenObjects); + return hiddenObjects; + } + + private void restoreBinaryEdges(PersistHelper helper, int version, MSystem system, NewObjectDiagram.ObjectDiagramData visibleData) { + AutoPilot ap = new AutoPilot(helper.getNav()); + helper.getNav().push(); + try { + ap.selectXPath("./edge[@type='BinaryEdge']"); + while (ap.evalXPath() != -1) { + String name = helper.getElementStringValue("name"); + MAssociation assoc = system.model().getAssociation(name); + String sourceObjectName = helper.getElementStringValue("source"); + String targetObjectName = helper.getElementStringValue("target"); + + MObject sourceObject = system.state().objectByName(sourceObjectName); + MObject targetObject = system.state().objectByName(targetObjectName); + + if (assoc != null && sourceObject != null && targetObject != null) { + MLink link = resolveLink(helper, assoc, sourceObject, targetObject, system); + if (link != null) { + BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().get(link); + if (edge != null) { + edge.restorePlacementInfo(helper, version); + } + } + } + } + } catch (XPathEvalException | NavException | XPathParseException e) { + // ignore layout restore issues to keep robust + } finally { + ap.resetXPath(); + helper.getNav().pop(); + } + } + + private void restoreNodeEdges(PersistHelper helper, int version, MSystem system, NewObjectDiagram.ObjectDiagramData visibleData) { + AutoPilot ap = new AutoPilot(helper.getNav()); + helper.getNav().push(); + try { + ap.selectXPath("./edge[@type='NodeEdge']"); + while (ap.evalXPath() != -1) { + String name = helper.getElementStringValue("name"); + MAssociation assoc = system.model().getAssociation(name); + String sourceObjectName = helper.getElementStringValue("source"); + String targetObjectName = helper.getElementStringValue("target"); + + MObject sourceObject = system.state().objectByName(sourceObjectName); + MObject targetObject = system.state().objectByName(targetObjectName); + + if (assoc != null && sourceObject != null && targetObject != null) { + MLink link = resolveLink(helper, assoc, sourceObject, targetObject, system); + if (link != null && link instanceof MLinkObject linkObj) { + EdgeBase tmp = visibleData.getLinkObjectToNodeEdge().get(linkObj); + if (tmp instanceof BinaryAssociationClassOrObject edge) { + edge.restorePlacementInfo(helper, version); + } + } + } + } + } catch (XPathEvalException | NavException | XPathParseException e) { + // ignore layout restore issues to keep robust + } finally { + ap.resetXPath(); + helper.getNav().pop(); + } + } + + private void restoreDiamondNodes(PersistHelper helper, int version, MSystem system, + NewObjectDiagram.ObjectDiagramData visibleData, + Set hiddenObjects) { + AutoPilot ap = new AutoPilot(helper.getNav()); + helper.getNav().push(); + try { + ap.selectXPath("./node[@type='Object']"); + while (ap.evalXPath() != -1) { + String name = helper.getElementStringValue("name"); + MObject obj = system.state().objectByName(name); + if (obj != null) { + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + if (node != null) { + node.restorePlacementInfo(helper, version); + if (helper.getElementBooleanValue(org.tzi.use.gui.xmlparser.LayoutTags.HIDDEN)) { + hiddenObjects.add(obj); + } + } + } + } + } catch (XPathEvalException | NavException | XPathParseException e) { + // ignore + } finally { + ap.resetXPath(); + helper.getNav().pop(); + } + + ap = new AutoPilot(helper.getNav()); + helper.getNav().push(); + try { + ap.selectXPath("./node[@type='DiamondNode']"); + while (ap.evalXPath() != -1) { + String name = helper.getElementStringValue("name"); + MAssociation assoc = system.model().getAssociation(name); + if (assoc == null) continue; + List connectedObjects = new LinkedList<>(); + if (!helper.toFirstChild("connectedNode")) continue; + String objectName = helper.getElementStringValue(); + MObject obj = system.state().objectByName(objectName); + if (obj != null) connectedObjects.add(obj); + while (helper.toNextSibling("connectedNode")) { + objectName = helper.getElementStringValue(); + obj = system.state().objectByName(objectName); + if (obj != null) connectedObjects.add(obj); + } + if (assoc.associationEnds().size() != connectedObjects.size()) continue; + MLink link = system.state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); + if (link != null) { + var node = visibleData.getNaryLinkToDiamondNodeMap().get(link); + if (node != null) { + helper.toParent(); + node.restorePlacementInfo(helper, version); + } + } + } + } catch (XPathEvalException | NavException | XPathParseException e) { + // ignore + } finally { + ap.resetXPath(); + helper.getNav().pop(); + } + } + + private MLink resolveLink(PersistHelper helper, MAssociation assoc, MObject source, MObject target, MSystem system) { + if (assoc.hasQualifiedEnds()) { + String linkValue = helper.getElementStringValue("linkValue"); + return getLinkByValue(assoc, Arrays.asList(source, target), linkValue, system); + } + return system.state().linkBetweenObjects(assoc, Arrays.asList(source, target), Collections.emptyList()); + } + + private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue, MSystem system) { + if (assoc == null || objects == null) { + return null; + } + Set allLinks; + try { + allLinks = system.state().linksOfAssociation(assoc).links(); + } catch (Exception ex) { + return null; + } + if (allLinks == null || allLinks.isEmpty()) { + return null; + } + List matchingLinks = new ArrayList<>(); + for (MLink l : allLinks) { + if (l == null) continue; + List linked = l.linkedObjects(); + if (linked == null || linked.size() != objects.size()) continue; + boolean sameObjects = true; + for (int i = 0; i < linked.size(); i++) { + if (!Objects.equals(linked.get(i), objects.get(i))) { + sameObjects = false; + break; + } + } + if (sameObjects) { + matchingLinks.add(l); + } + } + if (matchingLinks.isEmpty()) { + return null; + } + if (matchingLinks.size() == 1) { + return matchingLinks.getFirst(); + } + if (linkValue == null) { + return null; + } + for (MLink l : matchingLinks) { + if (l == null) continue; + String s = null; + try { + s = l.toString(); + } catch (Exception ignored) { + } + if (Objects.equals(linkValue, s)) { + return l; + } + } + return null; + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java index 749ed7eb4..afce245f6 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java @@ -7,7 +7,7 @@ /** * Placeholder canvas implementing the view interface. Rendering will be migrated later. */ -public class DiagramCanvas extends JComponent implements INewObjectDiagramView { +public class DiagramCanvas extends JComponent implements NewObjectDiagramUI { @Override protected void paintComponent(Graphics g) { diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramContext.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramContext.java new file mode 100644 index 000000000..b4b155159 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramContext.java @@ -0,0 +1,28 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.gui.main.ModelBrowser; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.sys.MSystem; + +import java.awt.event.KeyListener; +import java.awt.Font; +import java.util.Set; + +/** + * Minimal host context for the object diagram to reduce direct coupling to the view. + */ +public interface DiagramContext { + MSystem system(); + ModelBrowser getModelBrowser(); + boolean isSelectedView(); + void addKeyListener(KeyListener listener); + Font getFont(); + void setFont(Font font); + void createObject(String className); + void insertLink(MAssociation association, MObject[] objects); + void deleteLink(MLink link); + void deleteObjects(Set objects); + void resetDiagram(ObjDiagramOptions options); +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index 79e20ea24..c23eb0556 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -19,7 +19,6 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; -import static org.tzi.use.util.collections.CollectionUtil.exactlyOne; import java.awt.*; import java.awt.datatransfer.DataFlavor; @@ -31,7 +30,6 @@ import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; -import java.awt.event.ItemEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; @@ -39,43 +37,32 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.WeakHashMap; -import java.util.Objects; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Box; -import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; -import javax.swing.JSeparator; import javax.swing.JWindow; import javax.swing.SwingUtilities; import javax.swing.border.Border; -import javafx.application.Platform; -import javafx.embed.swing.SwingNode; import org.tzi.use.gui.main.MainWindow; +import org.tzi.use.gui.main.ModelBrowser; import org.tzi.use.gui.main.ModelBrowserSorting; -import org.tzi.use.gui.main.ModelBrowserSorting.SortChangeEvent; import org.tzi.use.gui.main.ModelBrowserSorting.SortChangeListener; -import org.tzi.use.gui.main.ViewFrame; import org.tzi.use.gui.util.PersistHelper; import org.tzi.use.gui.views.ObjectPropertiesView; -import org.tzi.use.gui.views.diagrams.DiagramType; import org.tzi.use.gui.views.diagrams.DiagramViewWithObjectNode; import org.tzi.use.gui.views.diagrams.elements.AssociationName; import org.tzi.use.gui.views.diagrams.elements.DiamondNode; @@ -87,39 +74,28 @@ import org.tzi.use.gui.views.diagrams.elements.edges.LinkEdge; import org.tzi.use.gui.views.diagrams.elements.edges.NAryAssociationClassOrObjectEdge; import org.tzi.use.gui.views.diagrams.elements.positioning.PositionStrategy; -import org.tzi.use.gui.views.diagrams.elements.positioning.StrategyFixed; import org.tzi.use.gui.views.diagrams.event.ActionLoadLayout; import org.tzi.use.gui.views.diagrams.event.ActionSaveLayout; import org.tzi.use.gui.views.diagrams.event.DiagramInputHandling; import org.tzi.use.gui.views.diagrams.event.HighlightChangeEvent; import org.tzi.use.gui.views.diagrams.event.HighlightChangeListener; import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; -import org.tzi.use.gui.xmlparser.LayoutTags; import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MAssociationClass; -import org.tzi.use.uml.mm.MAssociationClassImpl; import org.tzi.use.uml.mm.MAttribute; import org.tzi.use.uml.mm.MClass; import org.tzi.use.uml.mm.MModelElement; -import org.tzi.use.uml.mm.MNamedElementComparator; -import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; import org.tzi.use.uml.ocl.value.Value; import org.tzi.use.uml.sys.*; import org.tzi.use.util.StringUtil; import org.w3c.dom.Element; -import com.ximpleware.AutoPilot; -import com.ximpleware.NavException; -import com.ximpleware.XPathEvalException; -import com.ximpleware.XPathParseException; - /** * A panel drawing UML object diagrams. * * @author Mark Richters * @author Lars Hamann */ -public class NewObjectDiagram extends DiagramViewWithObjectNode implements HighlightChangeListener, SortChangeListener { +public class NewObjectDiagram extends DiagramViewWithObjectNode implements HighlightChangeListener, SortChangeListener, ObjectDiagramInteractor { /** * This class saves needed information about visible or hidden nodes and @@ -234,12 +210,16 @@ public Map getLinkObjectToNodeEdge() { } } - protected final ObjectDiagramData visibleData = new ObjectDiagramData(); + private ObjectDiagramData visibleData = new ObjectDiagramData(); - private final ObjectDiagramData hiddenData = new ObjectDiagramData(); + private ObjectDiagramData hiddenData = new ObjectDiagramData(); - private final NewObjectDiagramView fParent; - private ObjectDiagramModel model; // optional mirror of visible/hidden state + private final DiagramContext context; + private final NewObjectDiagramView view; + private final ModelBrowser modelBrowser; + private NewObjectDiagramModel model; + private MSystem system; + private final java.util.function.BooleanSupplier isSelectedView; /** * The position of the next object node. This is either set to a random @@ -247,112 +227,56 @@ public Map getLinkObjectToNodeEdge() { */ protected Point2D.Double nextNodePosition = new Point2D.Double(); - /** - * Last position of deleted nodes and links. In case of restoration, the - * nodes (object nodes, linkobject nodes) are positioned as they were - * before. Objects use {@link StrategyFixed}, so we just save the position. - */ - private final Map lastKnownNodePositions = new WeakHashMap<>(); - private final Map lastKnownLinkPositions = new WeakHashMap<>(); - // show object properties listener is attached inline in constructor (no field required) private final ObjectSelection fSelection; protected final DiagramInputHandling inputHandling; - @SuppressWarnings("unused") private static boolean javaFxCall = false; /** Presenter reference for incremental MVP refactor. */ - private INewObjectDiagramPresenter presenter; + private NewObjectDiagramPresenter presenter; - public void setPresenter(INewObjectDiagramPresenter presenter) { + private MSystem system() { + return system; + } + + public void setPresenter(NewObjectDiagramPresenter presenter) { this.presenter = presenter; - if (presenter instanceof NewObjectDiagramPresenter p) { + if (presenter instanceof NewObjectDiagramPresenterImpl p) { this.model = p.getModel(); + this.system = p.getSystem(); } + rebindModelData(); } - public INewObjectDiagramPresenter getPresenter() { + public NewObjectDiagramPresenter getPresenter() { return presenter; } - /** Mirror visible node into model if present. */ - private void modelAddVisibleNode(MObject obj, PlaceableNode node) { - if (model != null) { - model.getVisibleNodes().put(obj, node); - model.getHiddenNodes().remove(obj); - } - } - - private void modelMoveNodeToHidden(MObject obj, PlaceableNode node) { - if (model != null) { - model.getHiddenNodes().put(obj, node); - model.getVisibleNodes().remove(obj); - } - } - - private void modelRemoveNode(MObject obj) { - if (model != null) { - model.getVisibleNodes().remove(obj); - model.getHiddenNodes().remove(obj); - } - } - - private void modelAddVisibleBinaryEdge(MLink link, EdgeBase edge) { - if (model != null) { - model.getVisibleBinaryEdges().put(link, edge); - model.getHiddenBinaryEdges().remove(link); - } - } - - private void modelAddVisibleNaryEdge(MLink link, EdgeBase edge) { - if (model != null) { - model.getVisibleNaryEdges().put(link, edge); - model.getHiddenNaryEdges().remove(link); - } - } - - private void modelMoveBinaryEdgeToHidden(MLink link, EdgeBase edge) { - if (model != null) { - model.getHiddenBinaryEdges().put(link, edge); - model.getVisibleBinaryEdges().remove(link); - } - } - - private void modelMoveNaryEdgeToHidden(MLink link, EdgeBase edge) { - if (model != null) { - model.getHiddenNaryEdges().put(link, edge); - model.getVisibleNaryEdges().remove(link); - } - } - - private void modelRemoveEdge(MLink link) { - if (model != null) { - model.getVisibleBinaryEdges().remove(link); - model.getHiddenBinaryEdges().remove(link); - model.getVisibleNaryEdges().remove(link); - model.getHiddenNaryEdges().remove(link); - } - } - /** * Creates a new empty diagram. */ - NewObjectDiagram(NewObjectDiagramView parent, PrintWriter log) { + NewObjectDiagram(DiagramContext parent, PrintWriter log) { this(parent, log, new ObjDiagramOptions()); } - protected NewObjectDiagram(NewObjectDiagramView parent, PrintWriter log, ObjDiagramOptions options) { + protected NewObjectDiagram(DiagramContext parent, PrintWriter log, ObjDiagramOptions options) { super(options, log); this.getRandomNextPosition(); - fParent = parent; - // FIXME: Handle fonts! - parent.setFont(getFont()); + context = parent; + view = (parent instanceof NewObjectDiagramView v) ? v : null; + this.system = parent.system(); + this.modelBrowser = parent.getModelBrowser(); + this.isSelectedView = parent::isSelectedView; + this.model = new NewObjectDiagramModel(); + rebindModelData(); + + // Font is component-local; no context propagation needed - fSelection = new ObjectSelection(this, parent.system()); + fSelection = new ObjectSelection(this, system()); fActionSaveLayout = new ActionSaveLayout("USE object diagram layout", "olt", this); @@ -360,9 +284,9 @@ protected NewObjectDiagram(NewObjectDiagramView parent, PrintWriter log, ObjDiag inputHandling = new DiagramInputHandling(fNodeSelection, fEdgeSelection, this); - fParent.getModelBrowser().addHighlightChangeListener(this); + modelBrowser.addHighlightChangeListener(this); ModelBrowserSorting.getInstance().addSortChangeListener(this); - fParent.addKeyListener(inputHandling); + addKeyListener(inputHandling); addMouseListener(inputHandling); addMouseListener(new MouseAdapter() { @@ -393,86 +317,73 @@ public ObjDiagramOptions getOptions() { return (ObjDiagramOptions) super.getOptions(); } + @Override + public void setShowStates(boolean show) { + getOptions().setShowStates(show); + invalidateContent(true); + } + + @Override + public boolean isShowStates() { + return getOptions().isShowStates(); + } + + @Override + public void setGreyed(MObject obj, boolean greyed) { + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + if (node != null) { + node.setGreyed(greyed); + repaint(); + } + } + + @Override + public boolean isGreyed(MObject obj) { + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + return node != null && node.isGreyed(); + } + /** * Displays objects of the selected class in the modelbrowser. */ public void stateChanged(HighlightChangeEvent e) { - if (!fParent.isSelectedView()) { + if (presenter != null) { + presenter.onHighlightChange(e); return; } + handleHighlightChange(e); + } - MModelElement elem = e.getModelElement(); - List edges = new ArrayList<>(); - boolean allEdgesSelected = true; - - // elem is an association - if (elem instanceof MAssociation assoc) { - int size = assoc.associationEnds().size(); - - Set links = fParent.system().state().linksOfAssociation(assoc).links(); - EdgeBase ed; + /** Shared highlight handler used by presenter or direct fallback. */ + public void handleHighlightChange(HighlightChangeEvent e) { + if (e == null || !isSelectedView.getAsBoolean()) { + return; + } - if (size == 2) { - for (MLink link : links) { - if (elem instanceof MAssociationClass) { - if (link instanceof MLinkObject) { - ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); - } else { - ed = visibleData.getBinaryLinkToEdgeMap().get(link); - } - } else { - ed = visibleData.getBinaryLinkToEdgeMap().get(link); - } - edges.add(ed); - } - } else { - for (MLink link : links) { - edges.addAll(visibleData.getHalfLinkToEdgeMap().getOrDefault(link, Collections.emptyList())); + MModelElement elem = e.getModelElement(); + Set selectedObjects = new HashSet<>(); + Set selectedLinks = new HashSet<>(); - if (elem instanceof MAssociationClass) { - if (link instanceof MLinkObject) { - ed = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); - edges.add(ed); - } - } - } - } + if (elem instanceof MAssociation assoc) { + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); + selectedLinks.addAll(links); + } - // check all edges in the list if they are supposed to be selected - for (EdgeBase edge : edges) { - if (edge != null) { - if (e.getHighlight()) { - fEdgeSelection.add(edge); - allEdgesSelected = true; - } else { - fEdgeSelection.remove(edge); - allEdgesSelected = false; - } - } - } - } + if (elem instanceof MClass) { + Set objs = presenter != null ? presenter.fetchObjectsOfClass((MClass) elem) + : system().state().objectsOfClass((MClass) elem); + selectedObjects.addAll(objs); + } - // elem is a class - if (elem instanceof MClass) { - for (MObject obj : fParent.system().state().objectsOfClass((MClass) elem)) { - PlaceableNode node = visibleData.getObjectToNodeMap().get(obj); - if (elem instanceof MAssociationClass) { - if (e.getHighlight() && allEdgesSelected) { - fNodeSelection.add(node); - } else { - fNodeSelection.remove(node); - } - } else { - if (e.getHighlight()) { - fNodeSelection.add(node); - } else { - fNodeSelection.remove(node); - } - } - } - } + if (!e.getHighlight()) { + selectedObjects.clear(); + selectedLinks.clear(); + } - invalidateContent(true); + model.replaceSelection(selectedObjects, selectedLinks); + applySelectionFromModel(); + invalidateContent(true); } /** @@ -526,22 +437,30 @@ public void hideAllLinks() { * Shows all currently invisible links. The diagram is not repainted! */ public void showAllLinks() { - for (MAssociation assoc : fParent.system().model().associations()) { - showLink(new ArrayList<>(fParent.system().state().linksOfAssociation(assoc).links())); - } + Collection assocs = presenter != null ? presenter.fetchAllAssociations() + : system().model().associations(); + for (MAssociation assoc : assocs) { + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { + showLink(link); + } + } } /** * Adds an object to the diagram. */ + @Override public void addObject(MObject obj) { - ObjectNode n = new ObjectNode(obj, fParent, getOptions()); + ObjectNode n = new ObjectNode(obj, view, getOptions()); n.setMinWidth(minClassNodeWidth); n.setMinHeight(minClassNodeHeight); - if (lastKnownNodePositions.containsKey(obj)) { - n.moveToPosition(lastKnownNodePositions.get(obj)); - lastKnownNodePositions.remove(obj); + Map nodeCache = nodePositionCache(); + if (nodeCache.containsKey(obj)) { + n.moveToPosition(nodeCache.get(obj)); + nodeCache.remove(obj); } else { n.setPosition(nextNodePosition); getRandomNextPosition(); @@ -549,7 +468,7 @@ public void addObject(MObject obj) { fGraph.add(n); visibleData.getObjectToNodeMap().put(obj, n); - modelAddVisibleNode(obj, n); + // state stored in model via visibleData reference fLayouter = null; } @@ -575,9 +494,10 @@ public void showObject(MObject obj) { // Show all links the object participates in, // when all other objects are visible, too. for (MAssociation assoc : assocs) { - MLinkSet links = fParent.system().state().linksOfAssociation(assoc); + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); // TODO: Not very fast! - for (MLink link : links.links()) { + for (MLink link : links) { if (link.linkedObjects().contains(obj) || (isLinkObject && link.equals(obj))) { boolean allVisible = true; for (MObject linkedO : link.linkedObjects()) { @@ -616,22 +536,22 @@ public void hideObject(MObject obj) { // a hidden object should no longer be selected ObjectNode removedNode = visibleData.getObjectToNodeMap().get(obj); if (removedNode != null) { - fNodeSelection.remove(removedNode); + Set remainingObjects = new HashSet<>(model.getSelectedObjects()); + remainingObjects.remove(obj); + model.replaceSelection(remainingObjects, model.getSelectedLinks()); + applySelectionFromModel(); } showOrHideObjectNode(obj, false); - // Hide all links the object participates in Set assocs = obj.cls().allAssociations(); - if (obj instanceof MLinkObject) { assocs.add((MAssociation) obj.cls()); } - for (MAssociation assoc : assocs) { - MLinkSet links = fParent.system().state().linksOfAssociation(assoc); - // TODO: Not very fast! - for (MLink link : links.links()) { + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { if (link.linkedObjects().contains(obj) || (link instanceof MLinkObject && link.equals(obj))) { hideLink(link); } @@ -645,33 +565,23 @@ public void hideObject(MObject obj) { * Shows an already hidden class. */ protected void showOrHideObjectNode(MObject obj, boolean show) { - ObjectDiagramData source = (show ? hiddenData : visibleData); - ObjectDiagramData target = (show ? visibleData : hiddenData); - - ObjectNode n = source.getObjectToNodeMap().get(obj); - + ObjectNode n = (show ? hiddenData : visibleData).getObjectToNodeMap().get(obj); if (n != null) { - if (show) + if (show) { fGraph.add(n); - else + } else { fGraph.remove(n); - - source.getObjectToNodeMap().remove(obj); - target.getObjectToNodeMap().put(obj, n); - if (show) { - modelAddVisibleNode(obj, n); - } else { - modelMoveNodeToHidden(obj, n); - } - - fLayouter = null; + } + model.moveObject(obj, show); } } /** * Deletes an object from the diagram. */ + @Override public void deleteObject(MObject obj) { + ObjectNode n; boolean isVisible; @@ -684,15 +594,13 @@ public void deleteObject(MObject obj) { } if (n != null) { - lastKnownNodePositions.put(obj, n.getPosition()); + nodePositionCache().put(obj, n.getPosition()); if (isVisible) { fGraph.remove(n); visibleData.getObjectToNodeMap().remove(obj); - modelRemoveNode(obj); fLayouter = null; } else { hiddenData.getObjectToNodeMap().remove(obj); - modelRemoveNode(obj); } n.dispose(); } @@ -701,6 +609,7 @@ public void deleteObject(MObject obj) { /** * Adds a link to the diagram. */ + @Override public void addLink(MLink link) { if (link.linkEnds().size() == 2) { addBinaryLink(link); @@ -833,172 +742,120 @@ protected void hideNAryLink(MLink link) { } protected void showOrHideBinaryLink(MLink link, boolean show) { - ObjectDiagramData source = (show ? hiddenData : visibleData); - ObjectDiagramData target = (show ? visibleData : hiddenData); - // object link - if (link instanceof MLinkObject) { - EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); - if (show && e != null) - fGraph.addInitializedEdge(e); - else if (e != null) - fGraph.removeEdge(e); - - source.getLinkObjectToNodeEdge().remove((MLinkObject) link); - target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - if (e != null) { - if (show) { - modelAddVisibleBinaryEdge(link, e); - } else { - modelMoveBinaryEdgeToHidden(link, e); - } - } - fLayouter = null; - } else { - // binary link - BinaryAssociationOrLinkEdge e = source.getBinaryLinkToEdgeMap().get(link); - - if (show && e != null) { - fGraph.addEdge(e); - modelAddVisibleBinaryEdge(link, e); - } else if (e != null) { - fGraph.removeEdge(e); - modelMoveBinaryEdgeToHidden(link, e); - } - source.getBinaryLinkToEdgeMap().remove(link); - target.getBinaryLinkToEdgeMap().put(link, e); - } - } - - protected void showOrHideNAryLink(MLink link, boolean show) { - ObjectDiagramData source = (show ? hiddenData : visibleData); - ObjectDiagramData target = (show ? visibleData : hiddenData); - - DiamondNode node = source.getNaryLinkToDiamondNodeMap().get(link); - if (show) { - if (node == null) { - node = target.getNaryLinkToDiamondNodeMap().get(link); - } - fGraph.add(node); - } else { - fGraph.remove(node); - } - target.getNaryLinkToDiamondNodeMap().put(link, node); - source.getNaryLinkToDiamondNodeMap().remove(link); - - - // connected to an "object link" - if (link instanceof MLinkObject) { - EdgeBase e = source.getLinkObjectToNodeEdge().get((MLinkObject) link); - - if (e != null) { - if (show) - fGraph.addEdge(e); - else - fGraph.removeEdge(e); - - source.getLinkObjectToNodeEdge().remove((MLinkObject) link); - target.getLinkObjectToNodeEdge().put((MLinkObject) link, e); - if (show) { - modelAddVisibleBinaryEdge(link, e); - } else { - modelMoveBinaryEdgeToHidden(link, e); - } - fLayouter = null; - } - } + if (link instanceof MLinkObject ml) { + EdgeBase e = model.moveLinkObjectEdge(ml, show); + if (e != null) { + if (show) { + fGraph.addInitializedEdge(e); + } else { + fGraph.removeEdge(e); + } + fLayouter = null; + } + } else { + BinaryAssociationOrLinkEdge e = model.moveBinaryLink(link, show); + if (e != null) { + if (show) { + fGraph.addEdge(e); + } else { + fGraph.removeEdge(e); + } + fLayouter = null; + } + } + } - List halfEdges = source.getHalfLinkToEdgeMap().get(link); + protected void showOrHideNAryLink(MLink link, boolean show) { + DiamondNode node = model.moveNaryLinkNode(link, show); + if (node != null) { + if (show) { + fGraph.add(node); + } else { + fGraph.remove(node); + } + } - if (halfEdges != null) { - for (EdgeBase edge : halfEdges) { - if (show) - fGraph.addEdge(edge); - else - fGraph.removeEdge(edge); - } + if (link instanceof MLinkObject ml) { + EdgeBase e = model.moveLinkObjectEdge(ml, show); + if (e != null) { + if (show) { + fGraph.addEdge(e); + } else { + fGraph.removeEdge(e); + } + fLayouter = null; + } + } - source.getHalfLinkToEdgeMap().remove(link); - target.getHalfLinkToEdgeMap().put(link, halfEdges); - } - fLayouter = null; - } + List halfEdges = model.moveHalfEdges(link, show); + if (halfEdges != null) { + for (EdgeBase edge : halfEdges) { + if (show) { + fGraph.addEdge(edge); + } else { + fGraph.removeEdge(edge); + } + } + } + fLayouter = null; + } /** * Deletes a link from the diagram. */ + @Override public void deleteLink(MLink link) { if (link.linkEnds().size() == 2) { - EdgeBase e; // initialize later based on visibility - boolean isVisible; + boolean wasVisible = visibleData.containsLink(link); boolean isLinkObject = link instanceof MLinkObject; - ObjectDiagramData data; - - if (isLinkObject) { - isVisible = visibleData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link); - data = isVisible ? visibleData : hiddenData; - e = data.getLinkObjectToNodeEdge().get((MLinkObject) link); - } else { - isVisible = visibleData.getBinaryLinkToEdgeMap().containsKey(link); - data = isVisible ? visibleData : hiddenData; - e = data.getBinaryLinkToEdgeMap().get(link); - } + EdgeBase e = isLinkObject ? model.popLinkObjectEdge((MLinkObject) link) : model.popBinaryLink(link); if (e == null) { return; } - if (isLinkObject) { - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) data.getLinkObjectToNodeEdge().get((MLinkObject) link); - if (edge != null) { - PlaceableNode objectNode = edge.getClassOrObjectNode(); - lastKnownLinkPositions.put(link, objectNode.getStrategy()); - } - - data.getBinaryLinkToEdgeMap().remove(link); - data.getLinkObjectToNodeEdge().remove((MLinkObject) link); - } else { - data.getBinaryLinkToEdgeMap().remove(link); + if (isLinkObject && e instanceof BinaryAssociationClassOrObject edge) { + PlaceableNode objectNode = edge.getClassOrObjectNode(); + linkPositionCache().put(link, objectNode.getStrategy()); } - if (isVisible) { + if (wasVisible) { fGraph.removeEdge(e); - modelRemoveEdge(link); - fLayouter = null; + fLayouter = null; } e.dispose(); } else { // n-ary association - boolean isVisible; - ObjectDiagramData data; - - isVisible = visibleData.getNaryLinkToDiamondNodeMap().containsKey(link); - data = isVisible ? visibleData : hiddenData; - DiamondNode n = data.getNaryLinkToDiamondNodeMap().get(link); + boolean wasVisible = visibleData.getNaryLinkToDiamondNodeMap().containsKey(link); + DiamondNode n = model.popNaryLinkNode(link); if (n == null) { throw new RuntimeException("no diamond node for n-ary link `" + link + "' in current state."); } - data.getNaryLinkToDiamondNodeMap().remove(link); - data.getHalfLinkToEdgeMap().remove(link); + model.popHalfEdges(link).forEach(edge -> { + if (wasVisible) { + fGraph.removeEdge(edge); + } + edge.dispose(); + }); - if (isVisible) { + if (wasVisible) { fGraph.remove(n); - modelRemoveEdge(link); - fLayouter = null; + fLayouter = null; } n.dispose(); if (link instanceof MLinkObject) { - EdgeBase edge = data.getLinkObjectToNodeEdge().get((MLinkObject) link); + EdgeBase edge = model.popLinkObjectEdge((MLinkObject) link); if (edge != null) { - lastKnownLinkPositions.put(link, + linkPositionCache().put(link, ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); - fGraph.removeEdge(edge); - data.getLinkObjectToNodeEdge().remove((MLinkObject) link); - modelRemoveEdge(link); - edge.dispose(); + if (wasVisible) { + fGraph.removeEdge(edge); + } + edge.dispose(); } } } @@ -1025,143 +882,124 @@ public void updateObject(MInstance obj) { * Adds a new Link to the objectdiagram. */ class ActionInsertLink extends AbstractAction { - private final MAssociation fAssociation; - private final MObject[] fParticipants; + private final MAssociation fAssociation; + private final MObject[] fParticipants; - ActionInsertLink(MAssociation association, MObject[] participants) { - fAssociation = association; - fParticipants = participants; + ActionInsertLink(MAssociation association, MObject[] participants) { + fAssociation = association; + fParticipants = participants; - StringBuilder txt = new StringBuilder("insert ("); - StringUtil.fmtSeq(txt, participants, ",", MObject::name); + StringBuilder txt = new StringBuilder("insert ("); + StringUtil.fmtSeq(txt, participants, ",", MObject::name); - txt.append(") into ").append(association.name()); + txt.append(") into ").append(association.name()); - putValue(Action.NAME, txt.toString()); - } + putValue(Action.NAME, txt.toString()); + } - public void actionPerformed(ActionEvent e) { - fParent.insertLink(fAssociation, fParticipants); - } - } + public void actionPerformed(ActionEvent e) { + if (presenter != null) { + presenter.onInsertLink(fAssociation, Arrays.asList(fParticipants)); + } + } + } /** * Deletes a Link from the object diagram. */ class ActionDeleteLink extends AbstractAction { - private final MLink link; - - ActionDeleteLink(MLink link) { - this.link = link; - MObject[] participants = link.linkedObjectsAsArray(); - StringBuilder txt = new StringBuilder("delete ("); - - for (int i = 0; i < participants.length; ++i) { - if (i > 0) { - txt.append(","); - } - txt.append(participants[i].name()); - if (!link.getQualifier().isEmpty() && !link.getQualifier().get(i).isEmpty()) { - txt.append("{"); - StringUtil.fmtSeq(txt, link.getQualifier().get(i), ","); - txt.append("}"); - } - } - txt.append(") from ").append(link.association().name()); - - putValue(Action.NAME, txt.toString()); - } - - public void actionPerformed(ActionEvent e) { - fParent.deleteLink(link); - fEdgeSelection.clear(); - } - } + private final MLink link; + + ActionDeleteLink(MLink link) { + this.link = link; + MObject[] participants = link.linkedObjectsAsArray(); + StringBuilder txt = new StringBuilder("delete ("); + + for (int i = 0; i < participants.length; ++i) { + if (i > 0) { + txt.append(","); + } + txt.append(participants[i].name()); + if (!link.getQualifier().isEmpty() && !link.getQualifier().get(i).isEmpty()) { + txt.append("{"); + StringUtil.fmtSeq(txt, link.getQualifier().get(i), ","); + txt.append("}"); + } + } + txt.append(") from ").append(link.association().name()); + + putValue(Action.NAME, txt.toString()); + } + + public void actionPerformed(ActionEvent e) { + if (presenter != null) { + presenter.onDeleteLink(link); + } + fEdgeSelection.clear(); + } + } /** * Deletes the selected objects. */ class ActionDelete extends AbstractAction { - private final Set fObjects; + private final Set fObjects; - ActionDelete(String text, Set objects) { - super(text); - fObjects = objects; - } + ActionDelete(String text, Set objects) { + super(text); + fObjects = objects; + } - public void actionPerformed(ActionEvent e) { - fParent.deleteObjects(fObjects); + public void actionPerformed(ActionEvent e) { + if (presenter != null) { + presenter.onDeleteObjects(fObjects); + } fNodeSelection.clear(); } - } + } /** * Show properties of objects */ - static class ActionShowProperties extends AbstractAction { - private final MObject fObject; - - ActionShowProperties(String text, MObject object) { - super(text); - fObject = object; - } - - public void actionPerformed(ActionEvent e) { - if (MainWindow.getJavaFxCall()) { - Platform.runLater(() -> { - // to create an instance of a SwingNode, which is used to hold the Swing-Components - SwingNode swingNode = new SwingNode(); - - // Create the ClassInvariantView and the enclosing ViewFrame in the javaFX DesktopPane - ObjectPropertiesView opv = new ObjectPropertiesView(MainWindow.instance(), org.tzi.use.gui.mainFX.MainWindow.getInstance().getSession().system()); - opv.selectObject(fObject.name()); //selecting the focused Object - - ViewFrame f = new ViewFrame("Object properties", opv, "ObjectProperties.gif"); + class ActionShowProperties extends AbstractAction { + private final MObject fObject; - // Set up the SwingNode content - JComponent c = (JComponent) f.getContentPane(); - c.setLayout(new BorderLayout()); - c.add(opv, BorderLayout.CENTER); - - // Add the Swing component to the SwingNode - swingNode.setContent(c); - swingNode.setCache(false); //This helps ensure the image is re‐drawn more directly, often yielding a crisper result. + ActionShowProperties(String text, MObject object) { + super(text); + fObject = object; + } - // creating the new Window with the swingNode - org.tzi.use.gui.mainFX.MainWindow.getInstance().createNewWindow("Object properties", swingNode, DiagramType.OBJECT_PROPERTIES_VIEW); - }); - } else { - ObjectPropertiesView v = MainWindow.instance().showObjectPropertiesView(); - v.selectObject(fObject.name()); - } - } - } + public void actionPerformed(ActionEvent e) { + if (presenter != null) { + presenter.onShowObjectProperties(fObject); + } + } + } /** * Creates and shows popup menu if mouse event is the trigger for popups. */ protected PopupMenuInfo unionOfPopUpMenu() { - // create the popup menu PopupMenuInfo popupInfo = super.unionOfPopUpMenu(); - JPopupMenu popupMenu = popupInfo.popupMenu; + if (presenter == null) { + return popupInfo; + } - // position for the popupMenu items - int pos = 0; - final Set selectedObjectsOfAssociation = new HashSet<>(); - final Set selectedLinks = new HashSet<>(); - final List selectedObjects = new ArrayList<>(); + JPopupMenu popupMenu = popupInfo.popupMenu; + Set selectedObjectsOfAssociation = new HashSet<>(); + Set selectedLinks = new HashSet<>(); + Set selectedObjects = new HashSet<>(); - // Split selected nodes into model elements + // collect selections for (PlaceableNode node : fNodeSelection) { - if (node instanceof ObjectNode) { - selectedObjects.add(((ObjectNode) node).object()); - } else if (node instanceof AssociationName) { - MLink link = ((AssociationName) node).getLink(); + if (node instanceof ObjectNode on) { + selectedObjects.add(on.object()); + } else if (node instanceof AssociationName name) { + MLink link = name.getLink(); selectedObjectsOfAssociation.addAll(link.linkedObjects()); selectedLinks.add(link); } } - for (EdgeBase selectedEdge : fEdgeSelection) { if (selectedEdge instanceof LinkEdge aEdge) { MLink link = aEdge.getLink(); @@ -1170,222 +1008,8 @@ protected PopupMenuInfo unionOfPopUpMenu() { } } - // Just to be sure to delete an object only once - Set selectedObjectsSet = new HashSet<>(selectedObjects); - - // This text is reused often - String selectedObjectsText = null; - if (selectedObjects.size() == 1) { - selectedObjectsText = "'" + exactlyOne(selectedObjects).name() + "'"; - } else if (selectedObjects.size() > 1) { - selectedObjectsText = selectedObjects.size() + " objects"; - } - - if (!selectedObjects.isEmpty()) { - // A single object can be edited - if (selectedObjects.size() == 1) { - popupMenu.insert( - new ActionShowProperties("Edit properties of " + selectedObjectsText, exactlyOne(selectedObjects)), - pos++); - } - - // A single object or multiple objects can be deleted. - popupMenu.insert(new ActionDelete("Destroy " + selectedObjectsText, selectedObjectsSet), pos++); - popupMenu.insert(new JSeparator(), pos++); - } - - // Possible links between objects - if (!selectedObjects.isEmpty()) { - int m = selectedObjects.size(); - boolean addedInsertLinkAction = false; - - for (MAssociation assoc : fParent.system().model().associations()) { - if (assoc.isReadOnly()) - continue; - - int n = assoc.associationEnds().size(); - // More objects then ends selected - if (m > n) - continue; - - int pow = 1; - for (int i = 0; i < n; ++i) - pow *= m; - - for (int i = 0; i < pow; ++i) { - MObject[] l = new MObject[n]; - MClass[] c = new MClass[n]; - int[] digits = radixConversion(i, m, n); - - if (!isCompleteObjectCombination(digits, m)) - continue; - - for (int j = 0; j < n; ++j) { - l[j] = selectedObjects.get(digits[j]); - c[j] = l[j].cls(); - } - - if (!assoc.isAssignableFrom(c)) - continue; - - Set links = fParent.linksBetweenObjects(assoc, l); - if (links.isEmpty() || assoc.hasQualifiedEnds()) { - popupMenu.insert(new ActionInsertLink(assoc, l), pos++); - addedInsertLinkAction = true; - } - - if (!links.isEmpty()) { - for (MLink link : links) { - popupMenu.insert(new ActionDeleteLink(link), pos++); - addedInsertLinkAction = true; - } - } - } - - } - - if (addedInsertLinkAction) - popupMenu.insert(new JSeparator(), pos++); - } - - if (!hiddenData.getObjectToNodeMap().isEmpty() || !hiddenData.getBinaryLinkToEdgeMap().isEmpty() - || !hiddenData.getNaryLinkToDiamondNodeMap().isEmpty() || !hiddenData.getHalfLinkToEdgeMap().isEmpty() - || !hiddenData.getLinkObjectToNodeEdge().isEmpty()) { - final JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); - showAllObjects.addActionListener(ev -> { - showAll(); - showAllLinks(); - invalidateContent(true); - }); - - popupMenu.insert(showAllObjects, pos++); - popupMenu.insert(new JSeparator(), pos++); - } - - // Hide / crop / show links - if (!selectedLinks.isEmpty() || !selectedObjects.isEmpty() || !selectedObjectsOfAssociation.isEmpty()) { - String labelHide = ""; - String labelCrop = ""; - - int size = selectedLinks.size() + selectedObjects.size(); - - if (size > 1) { - labelHide = "Hide " + size + " elements"; - labelCrop = "Crop " + size + " elements"; - } else if (selectedLinks.size() == 1) { - labelHide = "Hide " + fSelection.formatLinkName(selectedLinks.iterator().next()); - labelCrop = "Crop " + fSelection.formatLinkName(selectedLinks.iterator().next()); - } else if (selectedObjects.size() == 1) { - labelHide = "Hide " + selectedObjects.listIterator().next().name(); - labelCrop = "Crop " + selectedObjects.listIterator().next().name(); - } - - // New Action for Hide - popupMenu.insert(createAction(labelHide, arg0 -> { - if (!selectedLinks.isEmpty()) { - selectedLinks.forEach(NewObjectDiagram.this::hideLink); - } - if (!selectedObjects.isEmpty()) { - selectedObjects.forEach(NewObjectDiagram.this::hideObject); - } - repaint(); - }), pos++); - - // new Action for crop - Set objectsToHide = new HashSet<>(selectedObjects); - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject) { - objectsToHide.add((MLinkObject) link); - } else { - objectsToHide.addAll(link.linkedObjects()); - } - }); - - final String labelCropFinal = labelCrop; // ensure effectively final - popupMenu.insert(createAction(labelCrop, e -> getAction(labelCropFinal, getNoneSelectedNodes(objectsToHide)).actionPerformed(e)), pos++); - - // new Action for gray in/out (single) - if (selectedObjects.size() == 1) { - MObject obj = exactlyOne(selectedObjects); - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - if (node != null) { - String labelGreyed = node.isGreyed() ? "Gray in" : "Gray out"; - - popupMenu.insert(createAction(labelGreyed + " " + node.name(), e -> { - node.setGreyed(!node.isGreyed()); - repaint(); - }), pos++); - } - } else if (selectedObjects.size() > 1) { - Set objToGreyIn = new HashSet<>(); - Set objToGreyOut = new HashSet<>(); - for (MObject so : selectedObjects) { - ObjectNode n = visibleData.getObjectToNodeMap().get(so); - if (n != null) { - if (n.isGreyed()) objToGreyIn.add(n); - else objToGreyOut.add(n); - } - } - - // gray in - if (!objToGreyIn.isEmpty()) { - popupMenu.insert(createAction("Gray in " + objToGreyIn.size() + " elements", arg0 -> { - objToGreyIn.forEach(n -> n.setGreyed(false)); - repaint(); - }), pos++); - } - - // gray out - if (!objToGreyOut.isEmpty()) { - popupMenu.insert(createAction("Gray out " + objToGreyOut.size() + " elements", arg0 -> { - objToGreyOut.forEach(n -> n.setGreyed(true)); - repaint(); - }), pos++); - } - } - } - popupMenu.insert(new JSeparator(), pos++); - - final JMenu showProtocolStateMachine = new JMenu("Show protocol state machine..."); - showProtocolStateMachine.setEnabled(false); - popupMenu.insert(showProtocolStateMachine, pos++); - - if (selectedObjects.size() == 1) { - final MObject obj = exactlyOne(selectedObjects); - - List sortedPSMs = new LinkedList<>( - obj.cls().getAllOwnedProtocolStateMachines()); - sortedPSMs.sort(new MNamedElementComparator()); - - for (MProtocolStateMachine psm : sortedPSMs) { - showProtocolStateMachine.setEnabled(true); - final JMenuItem showGivenPSM = new JMenuItem(psm.name()); - showGivenPSM.addActionListener(new ActionListener() { - private MProtocolStateMachine sm; - - public void actionPerformed(ActionEvent ev) { - MainWindow.instance().showStateMachineView(sm, obj); - } - - public ActionListener setStateMachine(MProtocolStateMachine sm) { - this.sm = sm; - return this; - } - }.setStateMachine(psm)); - showProtocolStateMachine.add(showGivenPSM); - } - } - - popupMenu.insert(new JSeparator(), pos++); - - final JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", getOptions().isShowStates()); - showStates.addItemListener(ev -> { - getOptions().setShowStates(ev.getStateChange() == ItemEvent.SELECTED); - invalidateContent(true); - }); - - popupMenu.insert(showStates, pos + 3); - + presenter.onPopupMenuPrepared(popupMenu, selectedObjects, selectedLinks, selectedObjectsOfAssociation); + presenter.onStatusMessage("Object diagram context menu opened"); return popupInfo; } @@ -1425,7 +1049,7 @@ private void displayObjectInfo(MObject obj, MouseEvent e) { Box attrBox = Box.createVerticalBox(); Box valueBox = Box.createVerticalBox(); - MObjectState objState = obj.state(fParent.system().state()); + MObjectState objState = obj.state(system().state()); Map attributeValueMap = objState.attributeValueMap(); for (Map.Entry entry : attributeValueMap.entrySet()) { @@ -1462,47 +1086,32 @@ private void displayObjectInfo(MObject obj, MouseEvent e) { * @param dtde the drop event provided by the DnD subsystem */ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { - - try { - dtde.acceptDrop(DnDConstants.ACTION_MOVE); - Transferable transferable = dtde.getTransferable(); - - // we accept only Strings - if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { - String s = (String) transferable.getTransferData(DataFlavor.stringFlavor); - - if (s.startsWith("CLASS-")) { - Point p = dtde.getLocation(); - if (isDoAutoLayout()) { - getRandomNextPosition(); - } else { - nextNodePosition.x = p.getX(); - nextNodePosition.y = p.getY(); - } - String clsName = s.substring(6); + try { + dtde.acceptDrop(DnDConstants.ACTION_MOVE); + Transferable transferable = dtde.getTransferable(); + if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { + String s = (String) transferable.getTransferData(DataFlavor.stringFlavor); + if (s.startsWith("CLASS-")) { + Point p = dtde.getLocation(); + if (isDoAutoLayout()) { + getRandomNextPosition(); + } else { + nextNodePosition.x = p.getX(); + nextNodePosition.y = p.getY(); + } + String clsName = s.substring(6); if (presenter != null) { presenter.onCreateObject(clsName); - } else { - fParent.createObject(clsName); } } - } - dtde.dropComplete(true); - } catch (IOException exception) { - if (fLog != null) { - fLog.println("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); - } else { - System.err.println("IOException in dropObjectFromModelBrowser: " + exception.getMessage()); - } - dtde.dropComplete(false); - } catch (UnsupportedFlavorException ufException) { - if (fLog != null) { - fLog.println("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); - } else { - System.err.println("UnsupportedFlavorException in dropObjectFromModelBrowser: " + ufException.getMessage()); - } - dtde.dropComplete(false); - } + } + dtde.dropComplete(true); + } catch (IOException | UnsupportedFlavorException ex) { + if (fLog != null) { + fLog.println(ex.getClass().getSimpleName() + " in dropObjectFromModelBrowser: " + ex.getMessage()); + } + dtde.dropComplete(false); + } } /** @@ -1540,7 +1149,7 @@ private int[] radixConversion(int number, int base, int maxDigits) { } private boolean isCompleteObjectCombination(int[] c, int base) { - for (int i = 0; i < base; ++i) { + for (int i = 0; i < base; i++) { boolean found = false; for (int v : c) { if (v == i) { @@ -1566,512 +1175,41 @@ protected void getRandomNextPosition() { @Override public void resetLayout() { - fParent.initDiagram(false, (ObjDiagramOptions) fOpt); - fParent.validate(); - } - - @Override - public void storePlacementInfos(PersistHelper helper, Element root) { - storePlacementInfos(helper, root, true); - storePlacementInfos(helper, root, false); - } - - protected void storePlacementInfos(PersistHelper helper, Element root, boolean visible) { - ObjectDiagramData data = (visible ? visibleData : hiddenData); - - for (ObjectNode n : data.getObjectToNodeMap().values()) { - n.storePlacementInfo(helper, root, !visible); - } - - for (PlaceableNode n : data.getNaryLinkToDiamondNodeMap().values()) { - n.storePlacementInfo(helper, root, !visible); - } - - for (EdgeBase e : data.getBinaryLinkToEdgeMap().values()) { - e.storePlacementInfo(helper, root, !visible); - } - - for (EdgeBase e : data.getLinkObjectToNodeEdge().values()) { - e.storePlacementInfo(helper, root, !visible); - } - } - - @Override - public void restorePlacementInfos(PersistHelper helper, int version) { - if (version < 12) return; - - Set hiddenObjects = new HashSet<>(); - - // delegate to smaller, well-scoped helpers - restoreBinaryEdges(helper, version, hiddenObjects); - restoreNodeEdges(helper, version, hiddenObjects); - restoreDiamondNodes(helper, version, hiddenObjects); - - // Hide elements collected during restore - hideElementsInDiagram(hiddenObjects); - } - - // Helper: restore binary association edges placement info - private void restoreBinaryEdges(PersistHelper helper, int version, Set hiddenObjects) { - AutoPilot ap = new AutoPilot(helper.getNav()); - helper.getNav().push(); - try { - ap.selectXPath("./edge[@type='BinaryEdge']"); - try { - while (ap.evalXPath() != -1) { - String name = helper.getElementStringValue("name"); - MAssociation assoc = fParent.system().model().getAssociation(name); - String sourceObjectName = helper.getElementStringValue("source"); - String targetObjectName = helper.getElementStringValue("target"); - - MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); - MObject targetObject = fParent.system().state().objectByName(targetObjectName); - - // Could be deleted - if (assoc != null && sourceObject != null && targetObject != null) { - MLink link; - if (assoc.hasQualifiedEnds()) { - String linkValue = helper.getElementStringValue("linkValue"); - link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); - } else { - link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); - } - if (link != null) { - BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().get(link); - if (edge != null) { - edge.restorePlacementInfo(helper, version); - } - } - } - } - } catch (XPathEvalException | NavException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } - } catch (XPathParseException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } finally { - ap.resetXPath(); - helper.getNav().pop(); - } - } - - // Helper: restore node-edge (link objects / node edges) - @SuppressWarnings("unused") - private void restoreNodeEdges(PersistHelper helper, int version, Set hiddenObjects) { - AutoPilot ap = new AutoPilot(helper.getNav()); - helper.getNav().push(); - try { - ap.selectXPath("./edge[@type='NodeEdge']"); - try { - while (ap.evalXPath() != -1) { - String name = helper.getElementStringValue("name"); - MAssociation assoc = fParent.system().model().getAssociation(name); - String sourceObjectName = helper.getElementStringValue("source"); - String targetObjectName = helper.getElementStringValue("target"); - - MObject sourceObject = fParent.system().state().objectByName(sourceObjectName); - MObject targetObject = fParent.system().state().objectByName(targetObjectName); - - // Could be deleted - if (assoc != null && sourceObject != null && targetObject != null) { - MLink link; - if (assoc.hasQualifiedEnds()) { - String linkValue = helper.getElementStringValue("linkValue"); - link = getLinkByValue(assoc, Arrays.asList(sourceObject, targetObject), linkValue); - } else { - link = fParent.system().state().linkBetweenObjects(assoc, Arrays.asList(sourceObject, targetObject), Collections.emptyList()); - } - if (link != null) { - if (link instanceof MLinkObject linkObj) { - EdgeBase tmp = visibleData.getLinkObjectToNodeEdge().get(linkObj); - if (tmp instanceof BinaryAssociationClassOrObject edge) { - edge.restorePlacementInfo(helper, version); - } - } - } - } - } - } catch (XPathEvalException | NavException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } - } catch (XPathParseException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } finally { - ap.resetXPath(); - helper.getNav().pop(); - } - } - - // Helper: restore diamond nodes (n-ary links) - private void restoreDiamondNodes(PersistHelper helper, int version, Set hiddenObjects) { - AutoPilot ap = new AutoPilot(helper.getNav()); - helper.getNav().push(); - try { - ap.selectXPath("./node[@type='Object']"); - try { - while (ap.evalXPath() != -1) { - String name = helper.getElementStringValue("name"); - MObject obj = fParent.system().state().objectByName(name); - if (obj != null) { - ObjectNode node = visibleData.getObjectToNodeMap().get(obj); - if (node != null) { - node.restorePlacementInfo(helper, version); - if (isHidden(helper, version)) hiddenObjects.add(obj); - } - } - } - } catch (XPathEvalException | NavException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } - } catch (XPathParseException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } finally { - ap.resetXPath(); - helper.getNav().pop(); - } - - // now diamond nodes (separate xpath) - ap = new AutoPilot(helper.getNav()); - helper.getNav().push(); - try { - ap.selectXPath("./node[@type='DiamondNode']"); - try { - while (ap.evalXPath() != -1) { - String name = helper.getElementStringValue("name"); - MAssociation assoc = fParent.system().model().getAssociation(name); - if (assoc == null) continue; - List connectedObjects = new LinkedList<>(); - if (!helper.toFirstChild("connectedNode")) continue; - String objectName = helper.getElementStringValue(); - MObject obj = fParent.system().state().objectByName(objectName); - if (obj != null) connectedObjects.add(obj); - while (helper.toNextSibling("connectedNode")) { - objectName = helper.getElementStringValue(); - obj = fParent.system().state().objectByName(objectName); - if (obj != null) connectedObjects.add(obj); - } - if (assoc.associationEnds().size() != connectedObjects.size()) continue; - MLink link = fParent.system().state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); - if (link != null) { - DiamondNode node = visibleData.getNaryLinkToDiamondNodeMap().get(link); - if (node != null) { - helper.toParent(); - node.restorePlacementInfo(helper, version); - } - } - } - } catch (XPathEvalException | NavException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } - } catch (XPathParseException e) { - if (fLog != null) fLog.println(e.getMessage()); - else System.err.println(e.getMessage()); - } finally { - ap.resetXPath(); - helper.getNav().pop(); - } - } - - /** - * Hide link using name of link - * - * @param linkName the association (link) name to hide - * @param links the list of links to examine - */ - public void hideLink(String linkName, List links) { - for (MLink link : links) { - if (linkName.equals(link.association().toString())) { - hideLink(link); - } - } - - } - - /** - * Show link using name of link - * - * @param linkName the association (link) name to show - * @param links the list of links to examine - */ - public void showLink(String linkName, List links) { - for (MLink link : links) { - if (linkName.equals(link.association().toString())) { - showLink(link); - } - } - } - - /** - * Map links to kind of association. Used for show/hide-links-by-kind - * - * @return a sorted map from kind label to links - */ - public TreeMap> mapLinksToKindOfAssociation() { - Map> assocs = new HashMap<>(); - final String derivedLinks = "Derived links"; - final String associationClass = "Link objects"; - final String nAryLinks = "N-Ary links"; - final String reflexiveLinks = "Reflexive links"; - final String binaryLinks = "Binary links"; - final String aggregation = "Aggregations"; - final String composition = "Compositions"; - - for (MAssociation assoc : fParent.system().model().associations()) { - - /* - * aggregationKind = 0, other - * aggregationKind = 1, aggreation - * aggregationKind = 2, composition - */ - int kind = assoc.aggregationKind(); - switch (kind) { - case 0: - Set links = fParent.system().state().linksOfAssociation(assoc).links(); - for (MLink link : links) { - MAssociation linkAssoc = link.association(); - if (linkAssoc == null) continue; - if (linkAssoc.isDerived() || linkAssoc.isUnion()) { - assocs.computeIfAbsent(derivedLinks, k -> new ArrayList<>()).add(link); - } else if (linkAssoc instanceof MAssociationClassImpl) { - assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); - } else if (linkAssoc.associationEnds().size() > 2) { - assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); - } else if (linkAssoc.associatedClasses().size() == 1) { - assocs.computeIfAbsent(reflexiveLinks, k -> new ArrayList<>()).add(link); - } else if (link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); - } else { - if (fLog != null) { - fLog.println("ERROR: NO MATCH IN ASSOC-KIND"); - } else { - System.err.println("ERROR: NO MATCH IN ASSOC-KIND"); - } - } - - } - break; - case 1: // Aggregation - - // Get aggregations - Set aggregations = fParent.system().state().linksOfAssociation(assoc).links(); - - for (MLink agg : aggregations) { - assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(agg); - } - break; - - case 2: // Composition - - // Get Compositions - Set compositions = fParent.system().state().linksOfAssociation(assoc).links(); - - for (MLink comp : compositions) { - assocs.computeIfAbsent(composition, k -> new ArrayList<>()).add(comp); - } - break; - } - } - return new TreeMap<>(assocs); - - } - - /** - * Hide all links of list links - * - * @param links list of links to hide - */ - public void hideLink(List links) { - for (MLink link : links) { - hideLink(link); - } - } - - /** - * Show all links of list links - * - * @param links list of links to show - */ - public void showLink(List links) { - for (MLink link : links) { - showLink(link); - } - } - - /** - * Check if a link is hidden - * - * @param link the link instance to check - * @return true if the provided link is currently hidden; otherwise false - */ - public boolean isHidden(MLink link) { - return hiddenData.getBinaryLinkToEdgeMap().containsKey(link) - || hiddenData.getHalfLinkToEdgeMap().containsKey(link) - || (link instanceof MLinkObject && hiddenData.getLinkObjectToNodeEdge().containsKey((MLinkObject) link)) - || hiddenData.getNaryLinkToDiamondNodeMap().containsKey(link); - } - - /** - * Determine whether the provided list of links is hidden, visible or mixed. - * - * @param links collection of links to evaluate - * @return 0 if all links are hidden, 1 if all links are shown, 2 if mixed, -1 if none present - */ - public int isHidden(List links) { - boolean existHiddenLink = false; - boolean existShownLink = false; - for (MLink link : links) { - if (isHidden(link)) { - existHiddenLink = true; - } else { - existShownLink = true; - } - } - if (existHiddenLink && existShownLink) { - return 2; - } else if (existShownLink) { - return 1; - } else if (existHiddenLink) { - return 0; + if (presenter != null) { + presenter.onResetDiagram((ObjDiagramOptions) fOpt); + } else { + context.resetDiagram((ObjDiagramOptions) fOpt); } - return -1; - } - - public static void setJavaFxCall(boolean javaFxCall) { - NewObjectDiagram.javaFxCall = javaFxCall; } @Override - public ObjectDiagramData getVisibleData() { - return visibleData; - } - - @Override - public ObjectDiagramData getHiddenData() { - return hiddenData; - } - - /** - * Restore helper to determine hidden state for items when restoring layout. - * Mirrors the implementation used in ClassDiagram to remain consistent across diagrams. - */ - protected boolean isHidden(PersistHelper helper, int version) { - // The 'version' parameter is reserved for future format-specific logic. - return helper.getElementBooleanValue(LayoutTags.HIDDEN); - } - - /** - * Finds a link for the given association that connects the provided objects and - * (optionally) matches the serialized linkValue. This method reverses what - * BinaryAssociationOrLinkEdge.storeAdditionalInfo wrote using link.toString(). - * If there is exactly one link connecting the given objects, that link is - * returned without checking linkValue (robust against toString() changes). - * If multiple links connect the same objects, linkValue is used to - * disambiguate via link.toString(). - */ - private MLink getLinkByValue(MAssociation assoc, List objects, String linkValue) { - // defensive preconditions - if (assoc == null || objects == null) { - return null; - } - - // Retrieve all links for the association in a defensive manner - Set allLinks; - try { - allLinks = fParent.system().state().linksOfAssociation(assoc).links(); - } catch (Exception ex) { - // In case state or linksOfAssociation returns unexpectedly (defensive) - if (fLog != null) fLog.println(ex.getMessage()); - else System.err.println(ex.getMessage()); - return null; - } - if (allLinks == null || allLinks.isEmpty()) { - return null; - } - - // First, collect all links that connect exactly the given objects (in order). - List matchingLinks = new ArrayList<>(); - for (MLink l : allLinks) { - if (l == null) continue; - List linked = l.linkedObjects(); - if (linked == null || linked.size() != objects.size()) continue; - - boolean sameObjects = true; - for (int i = 0; i < linked.size(); i++) { - MObject a = linked.get(i); - MObject b = objects.get(i); - if (!Objects.equals(a, b)) { - sameObjects = false; - break; - } - } - - if (sameObjects) { - matchingLinks.add(l); - } - } - - // No link connects exactly these objects. - if (matchingLinks.isEmpty()) { - return null; - } - - // Single candidate: return it directly without relying on toString(). - if (matchingLinks.size() == 1) { - return matchingLinks.getFirst(); - } - - // Multiple candidates: use linkValue (if available) to disambiguate. - if (linkValue == null) { - return null; - } - - for (MLink l : matchingLinks) { - if (l == null) continue; - String s = null; - try { - s = l.toString(); - } catch (Exception ex) { - // ignore toString exceptions defensively - } - if (Objects.equals(linkValue, s)) { - return l; - } - } - - return null; - } + public void storePlacementInfos(PersistHelper helper, Element root) { + if (presenter != null) { + presenter.onStoreLayout(helper, root, model); + } + } - @Override - public Set getHiddenNodes() { - return hiddenData.getNodes(); - } + @Override + public void restorePlacementInfos(PersistHelper helper, int version) { + if (presenter != null) { + Set hidden = presenter.onRestoreLayout(helper, version, model, system()); + if (hidden != null && !hidden.isEmpty()) { + hideElementsInDiagram(hidden); + } + } + } - @Override - protected String getDefaultLayoutFileSuffix() { - // Returning null preserves the historic behavior: object diagrams do not - // auto-load/auto-save a default layout via DiagramView.getDefaultLayoutFile(). - // Introducing a non-null suffix here would be a user-visible persistence change. - return null; - } - @Override - public void stateChanged(SortChangeEvent e) { - for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { - n.stateChanged(e); - } - } + @Override + protected String getDefaultLayoutFileSuffix() { + // Object diagrams do not auto-load/save a default layout file. + return null; + } /** * A small helper method for creating {@link Action} instances with less boilerplate code. * * @param text The text of the action. - * @param listener The {@link ActionListener} that executes the action. + * @param listener The {@link.ActionListener} that executes the action. * @return The created action. */ private Action createAction(String text, ActionListener listener) { @@ -2099,17 +1237,13 @@ protected void addBinaryLink(MLink link) { linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, link); - if (lastKnownLinkPositions.containsKey(link)) { - e.initialize(); - ObjectNode linkObjNode = visibleData.getObjectToNodeMap().get(link); - if (linkObjNode != null) { - linkObjNode.setStrategy(lastKnownLinkPositions.get(link)); - } - lastKnownLinkPositions.remove(link); - fGraph.addInitializedEdge(e); - } else { - fGraph.addEdge(e); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + if (edge != null) { + PlaceableNode objectNode = edge.getClassOrObjectNode(); + linkPositionCache().put(link, objectNode.getStrategy()); } + + fGraph.addEdge(e); visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); fLayouter = null; } else { @@ -2141,11 +1275,9 @@ protected void addBinaryLink(MLink link) { if (isHidden) { hiddenData.getBinaryLinkToEdgeMap().put(link, e); - modelMoveBinaryEdgeToHidden(link, e); } else { fGraph.addEdge(e); visibleData.getBinaryLinkToEdgeMap().put(link, e); - modelAddVisibleBinaryEdge(link, e); fLayouter = null; } } @@ -2158,4 +1290,164 @@ protected BinaryAssociationOrLinkEdge createBinaryAssociationOrLinkEdge(Placeabl MLinkEnd sourceEnd, MLinkEnd targetEnd, NewObjectDiagram diagram, MLink link) { return BinaryAssociationOrLinkEdge.create(source, target, sourceEnd, targetEnd, diagram, link); } -} + + @Override + public ObjectDiagramData getHiddenData() { + return hiddenData; + } + + @Override + public ObjectDiagramData getVisibleData() { + return visibleData; + } + + @Override + public Set getHiddenNodes() { + return hiddenData.getNodes(); + } + + /** Used by JavaFX caller to toggle FX-mode behavior. */ + public static void setJavaFxCall(boolean value) { + javaFxCall = value; + } + + /** Sort change from ModelBrowserSorting. */ + @Override + public void stateChanged(ModelBrowserSorting.SortChangeEvent e) { + for (ObjectNode n : this.visibleData.getObjectToNodeMap().values()) { + n.stateChanged(e); + } + } + + /** Check if a link is currently hidden. */ + public boolean isHidden(MLink link) { + return hiddenData.containsLink(link); + } + + /** + * Returns 0 if all links visible, 1 if all hidden, 2 if mixed. + */ + public int isHidden(List links) { + boolean anyVisible = false; + boolean anyHidden = false; + for (MLink l : links) { + if (isHidden(l)) { + anyHidden = true; + } else { + anyVisible = true; + } + if (anyHidden && anyVisible) { + return 2; + } + } + if (anyHidden) { + return 1; + } + return 0; + } + + /** Group links by association name for ObjectSelection needs. */ + public Map> mapLinksToKindOfAssociation(List links) { + Map> result = new HashMap<>(); + for (MLink link : links) { + String key = link.association().name(); + result.computeIfAbsent(key, k -> new ArrayList<>()).add(link); + } + return result; + } + + /** Legacy overload: collects all links grouped by association. */ + public TreeMap> mapLinksToKindOfAssociation() { + TreeMap> result = new TreeMap<>(); + Collection assocs = presenter != null ? presenter.fetchAllAssociations() + : system().model().associations(); + for (MAssociation assoc : assocs) { + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { + result.computeIfAbsent(assoc.name(), k -> new ArrayList<>()).add(link); + } + } + return result; + } + + /** Hide all given links. */ + public void hideLink(List links) { + for (MLink link : links) { + hideLink(link); + } + } + + /** Show all given links. */ + public void showLink(List links) { + for (MLink link : links) { + showLink(link); + } + } + + private Map nodePositionCache() { + return model.getLastKnownNodePositions(); + } + + private Map linkPositionCache() { + return model.getLastKnownLinkPositions(); + } + + /** Ensure diagram uses the current model as single source of truth. */ + private void rebindModelData() { + if (this.model == null) { + this.model = new NewObjectDiagramModel(); + } + this.visibleData = model.getVisibleData(); + this.hiddenData = model.getHiddenData(); + applySelectionFromModel(); + } + + /** Apply selection from model to local selection sets for rendering. */ + private void applySelectionFromModel() { + fNodeSelection.clear(); + fEdgeSelection.clear(); + for (MObject obj : model.getSelectedObjects()) { + ObjectNode node = visibleData.getObjectToNodeMap().get(obj); + if (node != null) { + fNodeSelection.add(node); + } + } + for (MLink link : model.getSelectedLinks()) { + EdgeBase edge = visibleData.getBinaryLinkToEdgeMap().get(link); + if (edge != null) { + fEdgeSelection.add(edge); + } + if (link instanceof MLinkObject ml) { + EdgeBase linkObjEdge = visibleData.getLinkObjectToNodeEdge().get(ml); + if (linkObjEdge != null) { + fEdgeSelection.add(linkObjEdge); + } + } + List halfEdges = visibleData.getHalfLinkToEdgeMap().get(link); + if (halfEdges != null) { + fEdgeSelection.addAll(halfEdges); + } + DiamondNode node = visibleData.getNaryLinkToDiamondNodeMap().get(link); + if (node != null) { + fNodeSelection.add(node); + } + } + } + + public void onPointerMoved(Point p) { + if (presenter != null) { + presenter.onStatusMessage("[x=" + p.getX() + ", y=" + p.getY() + "]"); + } else if (getStatusBar() != null) { + getStatusBar().showMessage("[x=" + p.getX() + ", y=" + p.getY() + "] ", BorderLayout.EAST); + } + } + + public void onPointerExited() { + if (presenter != null) { + presenter.onStatusMessage(""); + } else if (getStatusBar() != null) { + getStatusBar().clearMessage(); + } + } + } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java new file mode 100644 index 000000000..c17f37622 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java @@ -0,0 +1,231 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import java.awt.geom.Point2D; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.List; +import java.util.ArrayList; + +import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; +import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; +import org.tzi.use.gui.views.diagrams.elements.positioning.PositionStrategy; +import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationOrLinkEdge; +import org.tzi.use.gui.views.diagrams.elements.edges.NAryAssociationClassOrObjectEdge; +import org.tzi.use.gui.views.diagrams.elements.DiamondNode; +import org.tzi.use.gui.views.diagrams.objectdiagram.NewObjectDiagram.ObjectDiagramData; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MLinkObject; +import org.tzi.use.uml.sys.MObject; + +/** + * Skeleton for the object diagram domain model. Holds visible/hidden graph data. + * This is intentionally minimal and not yet wired; follow-up steps will migrate + * state from {@link NewObjectDiagram} into this model. + */ +public class NewObjectDiagramModel { + + /** listeners for future change events */ + public interface Listener { + default void onNodeAdded(MObject obj, PlaceableNode node) {} + default void onNodeRemoved(MObject obj) {} + default void onLinkAdded(MLink link, EdgeBase edge) {} + default void onLinkRemoved(MLink link) {} + default void onStateChanged() {} + } + + private final Set listeners = new HashSet<>(); + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + private final ObjectDiagramData visibleData = new ObjectDiagramData(); + private final ObjectDiagramData hiddenData = new ObjectDiagramData(); + + // caches for last known positions, moved from diagram into model + private final Map lastKnownNodePositions = new WeakHashMap<>(); + private final Map lastKnownLinkPositions = new WeakHashMap<>(); + + /** tracked selection/highlight state to centralize UI state */ + private final Set selectedObjects = new HashSet<>(); + private final Set selectedLinks = new HashSet<>(); + private final Map highlightedObjects = new HashMap<>(); + private final Map highlightedLinks = new HashMap<>(); + + public ObjectDiagramData getVisibleData() { + return visibleData; + } + + public ObjectDiagramData getHiddenData() { + return hiddenData; + } + + public Map getLastKnownNodePositions() { + return lastKnownNodePositions; + } + + public Map getLastKnownLinkPositions() { + return lastKnownLinkPositions; + } + + public Set getSelectedObjects() { + return Collections.unmodifiableSet(selectedObjects); + } + + public Set getSelectedLinks() { + return Collections.unmodifiableSet(selectedLinks); + } + + /** Clear all stored state (visible/hidden and caches). */ + public void reset() { + visibleData.clear(); + hiddenData.clear(); + lastKnownNodePositions.clear(); + lastKnownLinkPositions.clear(); + selectedObjects.clear(); + selectedLinks.clear(); + highlightedObjects.clear(); + highlightedLinks.clear(); + } + + public boolean isHidden(MLink link) { + return hiddenData.containsLink(link) + || (link instanceof MLinkObject ml && hiddenData.getObjectToNodeMap().containsKey(ml)); + } + + public boolean isHidden(MObject obj) { + return hiddenData.getObjectToNodeMap().containsKey(obj); + } + + /** Move object node from hidden to visible or vice versa. */ + public void moveObject(MObject obj, boolean toVisible) { + ObjectDiagramData source = toVisible ? hiddenData : visibleData; + ObjectDiagramData target = toVisible ? visibleData : hiddenData; + var node = source.getObjectToNodeMap().remove(obj); + if (node != null) { + target.getObjectToNodeMap().put(obj, node); + } + } + + public BinaryAssociationOrLinkEdge moveBinaryLink(MLink link, boolean toVisible) { + ObjectDiagramData source = toVisible ? hiddenData : visibleData; + ObjectDiagramData target = toVisible ? visibleData : hiddenData; + BinaryAssociationOrLinkEdge edge = source.getBinaryLinkToEdgeMap().remove(link); + if (edge != null) { + target.getBinaryLinkToEdgeMap().put(link, edge); + } + return edge; + } + + public EdgeBase moveLinkObjectEdge(MLinkObject link, boolean toVisible) { + ObjectDiagramData source = toVisible ? hiddenData : visibleData; + ObjectDiagramData target = toVisible ? visibleData : hiddenData; + EdgeBase edge = source.getLinkObjectToNodeEdge().remove(link); + if (edge != null) { + target.getLinkObjectToNodeEdge().put(link, edge); + } + return edge; + } + + public DiamondNode moveNaryLinkNode(MLink link, boolean toVisible) { + ObjectDiagramData source = toVisible ? hiddenData : visibleData; + ObjectDiagramData target = toVisible ? visibleData : hiddenData; + DiamondNode node = source.getNaryLinkToDiamondNodeMap().remove(link); + if (node != null) { + target.getNaryLinkToDiamondNodeMap().put(link, node); + } + return node; + } + + public List moveHalfEdges(MLink link, boolean toVisible) { + ObjectDiagramData source = toVisible ? hiddenData : visibleData; + ObjectDiagramData target = toVisible ? visibleData : hiddenData; + List edges = source.getHalfLinkToEdgeMap().remove(link); + if (edges != null) { + target.getHalfLinkToEdgeMap().put(link, edges); + } + return edges == null ? List.of() : edges; + } + + public BinaryAssociationOrLinkEdge popBinaryLink(MLink link) { + BinaryAssociationOrLinkEdge edge = visibleData.getBinaryLinkToEdgeMap().remove(link); + if (edge == null) { + edge = hiddenData.getBinaryLinkToEdgeMap().remove(link); + } + return edge; + } + + public EdgeBase popLinkObjectEdge(MLinkObject link) { + EdgeBase edge = visibleData.getLinkObjectToNodeEdge().remove(link); + if (edge == null) { + edge = hiddenData.getLinkObjectToNodeEdge().remove(link); + } + return edge; + } + + public DiamondNode popNaryLinkNode(MLink link) { + DiamondNode node = visibleData.getNaryLinkToDiamondNodeMap().remove(link); + if (node == null) { + node = hiddenData.getNaryLinkToDiamondNodeMap().remove(link); + } + return node; + } + + public List popHalfEdges(MLink link) { + List edges = visibleData.getHalfLinkToEdgeMap().remove(link); + if (edges == null) { + edges = hiddenData.getHalfLinkToEdgeMap().remove(link); + } + return edges == null ? new ArrayList<>() : edges; + } + + public ObjectNode popObject(MObject obj) { + ObjectNode node = visibleData.getObjectToNodeMap().remove(obj); + if (node == null) { + node = hiddenData.getObjectToNodeMap().remove(obj); + } + return node; + } + + public void replaceSelection(Set objects, Set links) { + selectedObjects.clear(); + selectedLinks.clear(); + if (objects != null) { + selectedObjects.addAll(objects); + } + if (links != null) { + selectedLinks.addAll(links); + } + notifyStateChanged(); + } + + public boolean isHighlighted(MObject obj) { + return highlightedObjects.getOrDefault(obj, Boolean.FALSE); + } + + public boolean isHighlighted(MLink link) { + return highlightedLinks.getOrDefault(link, Boolean.FALSE); + } + + public void setHighlighted(MObject obj, boolean value) { + highlightedObjects.put(obj, value); + notifyStateChanged(); + } + + public void setHighlighted(MLink link, boolean value) { + highlightedLinks.put(link, value); + notifyStateChanged(); + } + + private void notifyStateChanged() { + listeners.forEach(Listener::onStateChanged); + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java index ba749529c..761cf8868 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java @@ -1,89 +1,90 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; +import org.tzi.use.gui.views.diagrams.event.HighlightChangeEvent; import org.tzi.use.uml.ocl.value.Value; -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; import org.tzi.use.uml.sys.events.AttributeAssignedEvent; import org.tzi.use.uml.sys.events.LinkDeletedEvent; import org.tzi.use.uml.sys.events.LinkInsertedEvent; import org.tzi.use.uml.sys.events.TransitionEvent; import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.gui.util.PersistHelper; +import org.tzi.use.uml.sys.MSystem; +import org.w3c.dom.Element; +import javax.swing.*; +import java.util.Collection; +import java.util.List; +import java.util.Set; /** - * MVP presenter for the object diagram. Currently a skeleton with no logic; wiring will be added incrementally. + * Presenter boundary for the object diagram (MVP, passive view). + * Responsibilities: translate UI/input into model/system mutations, listen to system events, + * and push UI updates via the view; keep UI components free of system logic. */ -public class NewObjectDiagramPresenter implements INewObjectDiagramPresenter { +public interface NewObjectDiagramPresenter { + void onRequestPopup(); + void onAddObject(Value value); + void onRefreshRequested(); + void onCreateObject(String clsName); + void onResetDiagram(ObjDiagramOptions options); + void onHighlightChange(HighlightChangeEvent e); - private final INewObjectDiagramView view; - private final ObjectDiagramModel model; - private final PlacementRepository placementRepository; - private final ApplicationController applicationController; - private final ContextMenuProvider contextMenuProvider; + default void onTransition(TransitionEvent e) {} + default void onObjectCreated(MObject obj) {} + default void onObjectDestroyed(MObject obj) {} + default void onAttributeAssigned(AttributeAssignedEvent e) {} + default void onLinkInserted(LinkInsertedEvent e) {} + default void onLinkDeleted(LinkDeletedEvent e) {} - public NewObjectDiagramPresenter(INewObjectDiagramView view, - ObjectDiagramModel model, - PlacementRepository placementRepository, - ApplicationController applicationController, - ContextMenuProvider contextMenuProvider) { - this.view = view; - this.model = model; - this.placementRepository = placementRepository; - this.applicationController = applicationController; - this.contextMenuProvider = contextMenuProvider; - } + default void onPopupMenuPrepared(JPopupMenu menu, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects) {} + default void onStatusMessage(String status) {} - @Override - public void onRequestPopup() { - // will be implemented when ContextMenuProvider is wired - } + default void onInsertLink(MAssociation association, List participants) {} + default void onDeleteLink(MLink link) {} + default void onDeleteObjects(Set objects) {} - @Override - public void onAddObject(Value value) { - // will be implemented during migration - } + /** Notify presenter that selection changed in the diagram. */ + default void onSelectionChanged(Set selectedObjects, Set selectedLinks) {} - @Override - public void onRefreshRequested() { - // will be implemented during migration - } + /** Notify presenter that the current selection was dragged by the given delta. */ + default void onDragSelectionMoved(int dx, int dy) {} - @Override - public void onCreateObject(String clsName) { - if (applicationController != null) { - applicationController.createObject(clsName); - } - } + /** Show properties for the given object. */ + default void onShowObjectProperties(MObject object) {} - @Override - public void onTransition(TransitionEvent e) { - // hook for future logic - } + /** Fetch links of an association from the model/state. */ + default Set fetchLinksOfAssociation(MAssociation association) { return Set.of(); } - @Override - public void onObjectCreated(MObject obj) { - // hook for future logic - } + /** Fetch all objects of the given class from the state. */ + default Set fetchObjectsOfClass(MClass cls) { return Set.of(); } - @Override - public void onObjectDestroyed(MObject obj) { - // hook for future logic - } + /** Fetch all associations of the current model. */ + default Collection fetchAllAssociations() { return Set.of(); } - @Override - public void onAttributeAssigned(AttributeAssignedEvent e) { - // hook for future logic - } + default void onHideLinks(Collection links) {} + default void onHideObjects(Collection objects) {} + default void onHideAllLinks() {} + default void onShowAllLinks() {} + default void onShowHiddenElements() {} + default void onCropSelection(Collection objectsToHide) {} + default void onGrayOut(Collection objects) {} + default void onGrayIn(Collection objects) {} + default void onToggleShowStates(boolean show) {} - @Override - public void onLinkInserted(LinkInsertedEvent e) { - // hook for future logic - } + default void onStoreLayout(PersistHelper helper, + Element root, + NewObjectDiagramModel model) {} + default Set onRestoreLayout(PersistHelper helper, + int version, + NewObjectDiagramModel model, + MSystem system) { return Set.of(); } - @Override - public void onLinkDeleted(LinkDeletedEvent e) { - // hook for future logic - } + /** Lifecycle hook to release resources (e.g., event bus). */ + default void detach() {} + } - public ObjectDiagramModel getModel() { - return model; - } -} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java new file mode 100644 index 000000000..956c14e43 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java @@ -0,0 +1,380 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.uml.sys.events.AttributeAssignedEvent; +import org.tzi.use.uml.sys.events.LinkDeletedEvent; +import org.tzi.use.uml.sys.events.LinkInsertedEvent; +import org.tzi.use.uml.sys.events.TransitionEvent; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MLinkObject; +import org.tzi.use.uml.sys.MObject; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.sys.MSystem; +import com.google.common.eventbus.Subscribe; + +import javax.swing.JPopupMenu; +import java.util.Collection; +import java.util.Set; +import java.util.List; +import org.tzi.use.gui.util.PersistHelper; +import org.w3c.dom.Element; +import org.tzi.use.gui.views.diagrams.event.HighlightChangeEvent; + +/** + * MVP presenter for the object diagram. Currently a skeleton with no logic; wiring will be added incrementally. + */ +public class NewObjectDiagramPresenterImpl implements NewObjectDiagramPresenter { + + private final NewObjectDiagramUI view; + private final ObjectDiagramInteractor diagram; + private final NewObjectDiagramModel model; + private final ApplicationController applicationController; + private final ContextMenuProvider contextMenuProvider; + private final PlacementRepository placementRepository; + private final MSystem system; + + public NewObjectDiagramPresenterImpl(NewObjectDiagramUI view, + ObjectDiagramInteractor diagram, + NewObjectDiagramModel model, + ApplicationController applicationController, + ContextMenuProvider contextMenuProvider, + PlacementRepository placementRepository, + MSystem system) { + this.view = view; + this.diagram = diagram; + this.model = model; + this.applicationController = applicationController; + this.contextMenuProvider = contextMenuProvider; + this.placementRepository = placementRepository; + this.system = system; + if (this.system != null) { + this.system.getEventBus().register(this); + } + } + + @Override + public void onRequestPopup() { + // will be implemented when ContextMenuProvider is wired + } + + @Override + public void onAddObject(Value value) { + // will be implemented during migration + } + + @Override + public void onRefreshRequested() { + refreshDiagram(true); + onStatusMessage("Diagram refreshed"); + } + + @Override + public void onCreateObject(String clsName) { + if (applicationController != null) { + applicationController.createObject(clsName); + onStatusMessage("Create object: " + clsName); + } + } + + @Override + public void onResetDiagram(ObjDiagramOptions options) { + if (applicationController != null) { + applicationController.resetDiagram(options); + } + if (model != null) { + model.reset(); + } + refreshDiagram(true); + onStatusMessage("Diagram reset"); + } + + @Override + public void onHighlightChange(HighlightChangeEvent e) { + if (diagram instanceof NewObjectDiagram diag && e != null) { + diag.handleHighlightChange(e); + } + } + + @Override + @Subscribe + public void onTransition(TransitionEvent e) { + if (diagram == null || e == null) { + return; + } + diagram.updateObject(e.getSource()); + refreshDiagram(true); + } + + private void refreshDiagram(boolean fullLayout) { + if (diagram != null) { + diagram.invalidateContent(fullLayout); + } + if (view != null) { + view.refresh(); + } + } + + @Override + @Subscribe + public void onObjectCreated(MObject obj) { + if (diagram == null || obj == null || obj instanceof MLink) { + return; + } + diagram.addObject(obj); + refreshDiagram(true); + } + + @Override + @Subscribe + public void onObjectDestroyed(MObject obj) { + if (diagram == null || obj == null || obj instanceof MLink) { + return; + } + diagram.deleteObject(obj); + refreshDiagram(true); + } + + @Override + @Subscribe + public void onAttributeAssigned(AttributeAssignedEvent e) { + if (diagram == null || e == null || e.getObject() == null) { + return; + } + diagram.updateObject(e.getObject()); + refreshDiagram(true); + } + + @Override + @Subscribe + public void onLinkInserted(LinkInsertedEvent e) { + if (diagram == null || e == null) { + return; + } + MLink link = e.getLink(); + if (link == null) { + return; + } + if (link instanceof MLinkObject linkObject) { + diagram.addObject(linkObject); + } + diagram.addLink(link); + refreshDiagram(true); + } + + @Override + @Subscribe + public void onLinkDeleted(LinkDeletedEvent e) { + if (diagram == null || e == null) { + return; + } + MLink link = e.getLink(); + if (link == null) { + return; + } + if (link instanceof MLinkObject linkObject) { + diagram.deleteObject(linkObject); + } + diagram.deleteLink(link); + refreshDiagram(true); + } + + @Override + public void onPopupMenuPrepared(JPopupMenu menu, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects) { + if (contextMenuProvider != null && menu != null) { + contextMenuProvider.enhanceMenu(menu, diagram, this, + selectedObjects, selectedLinks, selectedAssocObjects); + } + } + + @Override + public void onStatusMessage(String status) { + if (view != null && status != null) { + view.setStatus(status); + } + } + + @Override + public void onInsertLink(MAssociation association, List participants) { + if (applicationController != null) { + applicationController.insertLink(association, participants); + } else if (view instanceof NewObjectDiagramView v) { + v.insertLink(association, participants.toArray(new MObject[0])); + } + } + + @Override + public void onDeleteLink(MLink link) { + if (applicationController != null) { + applicationController.deleteLink(link); + } else if (view instanceof NewObjectDiagramView v) { + v.deleteLink(link); + } + } + + @Override + public void onDeleteObjects(Set objects) { + if (applicationController != null) { + applicationController.deleteObjects(objects); + } else if (view instanceof NewObjectDiagramView v) { + v.deleteObjects(objects); + } + } + + @Override + public void onShowObjectProperties(MObject object) { + if (applicationController != null && object != null) { + applicationController.showObjectProperties(object.name()); + } + } + + @Override + public Set fetchLinksOfAssociation(MAssociation association) { + if (association == null || system == null) { + return Set.of(); + } + return system.state().linksOfAssociation(association).links(); + } + + @Override + public Set fetchObjectsOfClass(MClass cls) { + if (cls == null || system == null) { + return Set.of(); + } + return system.state().objectsOfClass(cls); + } + + @Override + public Collection fetchAllAssociations() { + if (system == null) { + return Set.of(); + } + return system.model().associations(); + } + + @Override + public void onHideLinks(Collection links) { + if (diagram == null || links == null) { + return; + } + links.forEach(diagram::hideLink); + refreshDiagram(true); + } + + @Override + public void onHideObjects(Collection objects) { + if (diagram == null || objects == null) { + return; + } + objects.forEach(diagram::hideObject); + refreshDiagram(true); + } + + @Override + public void onHideAllLinks() { + if (diagram == null) { + return; + } + diagram.hideAllLinks(); + refreshDiagram(true); + } + + @Override + public void onShowAllLinks() { + if (diagram == null) { + return; + } + diagram.showAllLinks(); + refreshDiagram(true); + } + + @Override + public void onShowHiddenElements() { + if (diagram == null) { + return; + } + diagram.showAll(); + diagram.showAllLinks(); + refreshDiagram(true); + } + + @Override + public void onCropSelection(Collection objectsToHide) { + if (diagram == null || objectsToHide == null) { + return; + } + objectsToHide.forEach(diagram::hideObject); + refreshDiagram(true); + } + + @Override + public void onGrayOut(Collection objects) { + if (diagram == null || objects == null) { + return; + } + objects.forEach(obj -> diagram.setGreyed(obj, true)); + refreshDiagram(false); + } + + @Override + public void onGrayIn(Collection objects) { + if (diagram == null || objects == null) { + return; + } + objects.forEach(obj -> diagram.setGreyed(obj, false)); + refreshDiagram(false); + } + + @Override + public void onToggleShowStates(boolean show) { + if (diagram == null) { + return; + } + diagram.setShowStates(show); + refreshDiagram(true); + } + + @Override + public void onStoreLayout(PersistHelper helper, + Element root, + NewObjectDiagramModel model) { + if (placementRepository != null && helper != null && root != null) { + placementRepository.storeLayout(model, helper, root); + } + } + + @Override + public Set onRestoreLayout(PersistHelper helper, + int version, + NewObjectDiagramModel model, + MSystem system) { + if (placementRepository != null && helper != null) { + return placementRepository.restoreLayout(model, helper, version, system); + } + return Set.of(); + } + + public NewObjectDiagramModel getModel() { + return model; + } + + MSystem getSystem() { + return system; + } + + @Override + public void detach() { + if (system != null) { + try { + system.getEventBus().unregister(this); + } catch (Exception ignored) { + // ignore if already unregistered + } + } + // ensure diagram refresh stops referencing this presenter + refreshDiagram(false); + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramUI.java similarity index 85% rename from use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java rename to use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramUI.java index 228dde01d..cd5f848b8 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramUI.java @@ -3,9 +3,8 @@ import javax.swing.JPopupMenu; /** Minimal view contract for the object diagram MVP. */ -public interface INewObjectDiagramView { +public interface NewObjectDiagramUI { void showPopup(JPopupMenu popup); void refresh(); void setStatus(String status); } - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java index 70cb74a05..fc71b2170 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java @@ -21,19 +21,17 @@ import java.awt.BorderLayout; import java.awt.Graphics2D; +import java.awt.Font; +import java.awt.event.KeyListener; import java.awt.print.PageFormat; import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.Set; import javax.swing.JComponent; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JPopupMenu; - import org.tzi.use.gui.main.MainWindow; import org.tzi.use.gui.main.ModelBrowser; import org.tzi.use.gui.main.ModelBrowserSorting; @@ -42,28 +40,11 @@ import org.tzi.use.gui.views.PrintableView; import org.tzi.use.gui.views.View; import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MAssociationClass; -import org.tzi.use.uml.mm.MClass; -import org.tzi.use.uml.ocl.value.Value; import org.tzi.use.uml.sys.MLink; -import org.tzi.use.uml.sys.MLinkObject; import org.tzi.use.uml.sys.MObject; import org.tzi.use.uml.sys.MSystem; -import org.tzi.use.uml.sys.MSystemException; -import org.tzi.use.uml.sys.events.AttributeAssignedEvent; -import org.tzi.use.uml.sys.events.LinkDeletedEvent; -import org.tzi.use.uml.sys.events.LinkInsertedEvent; -import org.tzi.use.uml.sys.events.ObjectCreatedEvent; -import org.tzi.use.uml.sys.events.ObjectDestroyedEvent; -import org.tzi.use.uml.sys.events.TransitionEvent; -import org.tzi.use.uml.sys.soil.MLinkDeletionStatement; -import org.tzi.use.uml.sys.soil.MLinkInsertionStatement; -import org.tzi.use.uml.sys.soil.MObjectDestructionStatement; -import org.tzi.use.uml.sys.soil.MSequenceStatement; - -import com.google.common.eventbus.Subscribe; -/** +/** * A graph showing an object diagram with objects and links in the * current system state. * @@ -71,10 +52,11 @@ */ @SuppressWarnings("serial") public class NewObjectDiagramView extends JPanel - implements View, PrintableView, SortChangeListener, INewObjectDiagramView { + implements View, PrintableView, SortChangeListener, NewObjectDiagramUI, DiagramContext { protected final MSystem fSystem; protected final MainWindow fMainWindow; + private ApplicationController appController; protected NewObjectDiagram fObjectDiagram; public static int viewcount = 0; @@ -85,7 +67,6 @@ public NewObjectDiagramView(MainWindow mainWindow, MSystem system) { fSystem.registerRequiresAllDerivedValues(); ModelBrowserSorting.getInstance().addSortChangeListener( this ); - fSystem.getEventBus().register(this); setLayout(new BorderLayout()); @@ -100,50 +81,31 @@ public void initDiagram(boolean loadDefaultLayout, ObjDiagramOptions opt) { else fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter(), new ObjDiagramOptions(opt)); - // wire MVP skeleton with no-op services (no behavior change) - ObjectDiagramModel model = new ObjectDiagramModel(); - NewObjectDiagramPresenter presenter = new NewObjectDiagramPresenter( - this, - model, - new NullPlacementRepository(), - new NullApplicationController(), - new NullContextMenuProvider()); - fObjectDiagram.setPresenter(presenter); - - fObjectDiagram.setStatusBar(fMainWindow.statusBar()); - this.removeAll(); - add( new JScrollPane(fObjectDiagram) ); - initState(); - } - - /** - * Returns the model browser. - */ - public ModelBrowser getModelBrowser() { - return fMainWindow.getModelBrowser(); - } - - /** - * The managed diagram - * @return - */ + // wire MVP skeleton with basic placement persistence + NewObjectDiagramModel model = new NewObjectDiagramModel(); + PlacementRepository placementRepository = new DefaultPlacementRepository(); + + NewObjectDiagramPresenterImpl presenter = new NewObjectDiagramPresenterImpl( + this, + fObjectDiagram, + model, + appController = new DefaultApplicationController(fMainWindow, fSystem, this), + new DefaultContextMenuProvider(), + placementRepository, + fSystem); + fObjectDiagram.setPresenter(presenter); + + fObjectDiagram.setStatusBar(fMainWindow.statusBar()); + this.removeAll(); + add( new JScrollPane(fObjectDiagram) ); + initState(); + } + + /** The managed diagram. */ public NewObjectDiagram getDiagram() { - return this.fObjectDiagram; - } - - /** - * Determines if this is the selected view. - * @return true if it is the selected view, otherwise - * false - */ - public boolean isSelectedView() { - if ( fMainWindow.getSelectedView() != null ) { - return fMainWindow.getSelectedView().equals( this ); - } - return false; - } - - + return this.fObjectDiagram; + } + /** * Does a full update of the view. */ @@ -160,167 +122,48 @@ private void initState() { viewcount++; } - @Subscribe - public void onTransition(TransitionEvent e) { - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onTransition(e); - } - fObjectDiagram.updateObject(e.getSource()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onObjectCeated(ObjectCreatedEvent e) { - if (e.getCreatedObject() instanceof MLink) { - return; - } - - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onObjectCreated(e.getCreatedObject()); - } - fObjectDiagram.addObject(e.getCreatedObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onObjectDestroyed(ObjectDestroyedEvent e) { - if (e.getDestroyedObject() instanceof MLink) { - return; - } - - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onObjectDestroyed(e.getDestroyedObject()); - } - fObjectDiagram.deleteObject(e.getDestroyedObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onAttributeAssigned(AttributeAssignedEvent e) { - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onAttributeAssigned(e); - } - fObjectDiagram.updateObject(e.getObject()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onLinkCeated(LinkInsertedEvent e) { - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onLinkInserted(e); - } - if (e.getAssociation() instanceof MAssociationClass) { - fObjectDiagram.addObject((MLinkObject)e.getLink()); - } - fObjectDiagram.addLink(e.getLink()); - fObjectDiagram.invalidateContent(true); - } - - @Subscribe - public void onLinkDeleted(LinkDeletedEvent e) { - if (fObjectDiagram.getPresenter() != null) { - fObjectDiagram.getPresenter().onLinkDeleted(e); + // legacy helpers removed; use public DiagramContext methods below + + @Override public MSystem system() { return fSystem; } + @Override public ModelBrowser getModelBrowser() { return fMainWindow.getModelBrowser(); } + @Override public boolean isSelectedView() { return fMainWindow.getSelectedView() != null && fMainWindow.getSelectedView().equals(this); } + @Override public void addKeyListener(KeyListener l) { super.addKeyListener(l); } + @Override public Font getFont() { return super.getFont(); } + @Override public void setFont(Font font) { super.setFont(font); } + @Override public void createObject(String className) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onCreateObject(className); + } else { + MainWindow.instance().createObject(className); } - if (e.getAssociation() instanceof MAssociationClass) { - fObjectDiagram.deleteObject((MLinkObject)e.getLink()); - } - - fObjectDiagram.deleteLink(e.getLink()); - fObjectDiagram.invalidateContent(true); - } - - /** - * After the occurence of an event the view is updated. - */ - @Override - public void stateChanged( SortChangeEvent e ) { - fObjectDiagram.invalidateContent(true); - } - - /** - * Returns the set of all associations that exist between the - * specified classes. - * - * @return Set(MAssociation) - */ - Set getAllAssociationsBetweenClasses(Set classes) { - return fSystem.model().getAllAssociationsBetweenClasses(classes); - } - - /** - * Returns true if there is a link of the specified association - * connecting the given set of objects. - */ - Set linksBetweenObjects(MAssociation assoc, MObject[] objects) { - return fSystem.state().linkBetweenObjects(assoc, Arrays.asList(objects)); - } - - /** - * Executes a command for deleting a link between selected - * objects. - */ - void deleteLink(MLink link) { - try { - fSystem.execute( - new MLinkDeletionStatement(link)); - } catch (MSystemException e) { - JOptionPane.showMessageDialog( - fMainWindow, - e.getMessage(), - "Error", - JOptionPane.ERROR_MESSAGE); - } } - - /** - * Executes a command for inserting a new link. - */ - void insertLink(MAssociation association, MObject[] objects) { - if (association.hasQualifiedEnds()) { - QualifierInputView input = new QualifierInputView(fMainWindow, fSystem, association, objects); - input.setLocationRelativeTo(this); - input.setVisible(true); - } else { - try { - fSystem.execute(new MLinkInsertionStatement(association, objects, Collections.>emptyList())); - } catch (MSystemException e) { - JOptionPane.showMessageDialog( - fMainWindow, - e.getMessage(), - "Error", - JOptionPane.ERROR_MESSAGE); - } - } + @Override public void insertLink(MAssociation association, MObject[] objects) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onInsertLink(association, Arrays.asList(objects)); + } else if (appController != null) { + appController.insertLink(association, Arrays.asList(objects)); + } } - - - /** - * Executes a command for deleting selected objects. - */ - void deleteObjects(Set objects) { - MSequenceStatement sequence = new MSequenceStatement(); - - for (MObject obj : objects) { - sequence.appendStatement( - new MObjectDestructionStatement(obj.value())); + @Override public void deleteLink(MLink link) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onDeleteLink(link); + } else if (appController != null) { + appController.deleteLink(link); } - - if (sequence.isEmpty()) { - return; + } + @Override public void deleteObjects(Set objects) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onDeleteObjects(objects); + } else if (appController != null) { + appController.deleteObjects(objects); } - try { - fSystem.execute(sequence.simplify()); - } catch (MSystemException e) { - JOptionPane.showMessageDialog( - fMainWindow, - e.getMessage(), - "Error", - JOptionPane.ERROR_MESSAGE); - } } - - public MSystem system() { - return fSystem; + @Override public void resetDiagram(ObjDiagramOptions options) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onResetDiagram(options); + } else { + initDiagram(false, options); + } } /** @@ -328,16 +171,14 @@ public MSystem system() { */ @Override public void detachModel() { - fSystem.getEventBus().unregister(this); + if (fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().detach(); + } ModelBrowserSorting.getInstance().removeSortChangeListener( this ); fSystem.unregisterRequiresAllDerivedValues(); viewcount--; } - void createObject(String clsName) { - MainWindow.instance().createObject(clsName); - } - @Override public void printView(PageFormat pf) { fObjectDiagram.printDiagram(pf, "Object diagram" ); @@ -389,4 +230,13 @@ public void setStatus(String status) { fMainWindow.statusBar().showTmpMessage(status); } } + + @Override + public void stateChanged(SortChangeEvent e) { + if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { + fObjectDiagram.getPresenter().onRefreshRequested(); + } else if (fObjectDiagram != null) { + fObjectDiagram.invalidateContent(true); + } + } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java new file mode 100644 index 000000000..de53e4671 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java @@ -0,0 +1,27 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.sys.MInstance; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MObject; + +/** + * Facade for diagram operations that the presenter can trigger without reaching + * into the view implementation. + */ +public interface ObjectDiagramInteractor { + void addObject(MObject obj); + void deleteObject(MObject obj); + void addLink(MLink link); + void deleteLink(MLink link); + void updateObject(MInstance obj); + void invalidateContent(boolean fullLayout); + void hideLink(MLink link); + void hideObject(MObject obj); + void hideAllLinks(); + void showAll(); + void showAllLinks(); + void setShowStates(boolean show); + boolean isShowStates(); + void setGreyed(MObject obj, boolean greyed); + boolean isGreyed(MObject obj); +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java index 9e77657c4..ad79f5676 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PlacementRepository.java @@ -1,12 +1,22 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; +import org.tzi.use.gui.util.PersistHelper; +import org.tzi.use.uml.sys.MSystem; +import org.w3c.dom.Element; +import java.util.Set; /** - * Persistence boundary for diagram layouts/placements. - * Implementation will handle IO; kept minimal for MVP wiring. + * Persistence boundary for diagram layouts/placements. Concrete implementations + * decide how and where to persist. Kept small to align with the MVP target + * architecture. */ public interface PlacementRepository { - void storeLayout(ObjectDiagramModel model); - void restoreLayout(ObjectDiagramModel model); + void storeLayout(NewObjectDiagramModel model, + PersistHelper helper, + Element root); + + Set restoreLayout(NewObjectDiagramModel model, + PersistHelper helper, + int version, + MSystem system); } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java b/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java index 5348c308e..167c835aa 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java @@ -366,7 +366,13 @@ public void actionPerformed(ActionEvent e) { JMenuItem hideAll = new JMenuItem("Hide all"); hideAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { - ((NewObjectDiagram) diagram).hideLink(menu.getKey(), links); + List matching = new ArrayList<>(); + for (MLink link : links) { + if (menu.getKey().equals(link.association().toString())) { + matching.add(link); + } + } + ((NewObjectDiagram) diagram).hideLink(matching); diagram.repaint(); } }); @@ -509,7 +515,13 @@ public void actionPerformed(ActionEvent e) { JMenuItem showAll = new JMenuItem("Show all"); showAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { - ((NewObjectDiagram) diagram).showLink(menu.getKey(), links); + List matching = new ArrayList<>(); + for (MLink link : links) { + if (menu.getKey().equals(link.association().toString())) { + matching.add(link); + } + } + ((NewObjectDiagram) diagram).showLink(matching); diagram.repaint(); } }); @@ -819,4 +831,4 @@ public Set getHiddenObjects(MClass cls) { return objects; } -} \ No newline at end of file +} From 91462b8ad8ed268da512e75390957c3fa01ab5b8 Mon Sep 17 00:00:00 2001 From: ahmed Date: Fri, 27 Mar 2026 02:15:25 +0100 Subject: [PATCH 24/34] =?UTF-8?q?Refactor(context=20menu):=20Deterministis?= =?UTF-8?q?che=20Men=C3=BC-Erzeugung=20in=20DefaultContextMenuProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beschreibung:\n- Zentralisiert die Erzeugung des Kontextmenüs in DefaultContextMenuProvider.enhanceMenu(...)\n- Hilfsmethoden erzeugen MenuItems/JMenus ohne Seiteneffekte, Einfügung erfolgt deterministisch mit inkrementellem pos\n- normalizeSeparators(popupMenu) wird am Ende aufgerufen, um führende/abschluss- und doppelte Separatoren zu entfernen\n- Vorhandene Presenter-Aufrufe/Platzhalter wurden beibehalten, keine funktionale Änderung beabsichtigt\n\nTODO:\n- BOM-bezogene Compilerfehler prüfen und ggf. BOM aus .java-Dateien entfernen\n- Weitere Vorkommen von popupMenu.insert(...) konsolidieren oder prüfen\n\nBetroffene Datei:\n- use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java --- .../DefaultContextMenuProvider.java | 964 ++++++++++++++++-- .../INewObjectDiagramPresenter.java | 21 - .../IObjectDiagramPresenter.java | 12 - .../NullApplicationController.java | 27 - .../NullContextMenuProvider.java | 15 - .../NullPlacementRepository.java | 18 - 6 files changed, 889 insertions(+), 168 deletions(-) delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index 672a0c345..b67d41667 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -1,16 +1,25 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; - -import javax.swing.JPopupMenu; -import javax.swing.JMenuItem; -import javax.swing.JCheckBoxMenuItem; -import java.awt.event.ActionEvent; +import javax.swing.*; +import java.awt.Color; import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import java.awt.event.ItemListener; +import java.awt.event.ItemEvent; +// ...existing imports... +import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.Collectors; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MAssociationEnd; +import org.tzi.use.uml.mm.MClass; import org.tzi.use.uml.sys.MObject; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MLinkObject; - /** * Default context menu provider used when no plugin provides a specialized menu. */ @@ -25,99 +34,904 @@ public void enhanceMenu(JPopupMenu popupMenu, if (popupMenu == null || presenter == null) { return; } + // Build menu in a strictly linear fashion. Helpers only build items; this method + // inserts them at incrementing positions and controls all separators centrally. + int pos = 0; - String summary = String.format("Selected objects: %d, selected links: %d", - selectedObjects.size(), - selectedLinks.size()); - JMenuItem summaryItem = new JMenuItem("Selection overview"); - summaryItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - presenter.onStatusMessage(summary); - } + // 1) Object-specific actions (edit/destroy) + List objectActions = buildObjectActions(presenter, selectedObjects); + for (JMenuItem it : objectActions) { + popupMenu.insert(it, pos++); + } + + // 2) Separator + popupMenu.insert(new JSeparator(), pos++); + + // 3) Insert/actions placeholders + List insertItems = buildInsertPlaceholders(presenter, selectedObjects, selectedLinks); + for (JMenuItem it : insertItems) { + popupMenu.insert(it, pos++); + } + // separator after insert block + popupMenu.insert(new JSeparator(), pos++); + + // 4) Show hidden elements (single item, may be null) + JMenuItem showHidden = buildShowHiddenElementsIfNeeded(diagram, presenter); + if (showHidden != null) { + popupMenu.insert(showHidden, pos++); + } + + // 5) Top-level hide/crop/grey display items + HideCropGroup hideCrop = buildHideCropGreyTopLevel(presenter, diagram, selectedObjects, selectedLinks); + for (JMenuItem it : hideCrop.topItems) { + popupMenu.insert(it, pos++); + } + // separator after top-level hide/crop/grey + popupMenu.insert(new JSeparator(), pos++); + + // 6) Submenus and other fixed entries in requested order + // Two identical "Show/hide/crop objects" entries are preserved intentionally + JMenu showHideCrop1 = buildShowHideCropSubmenu(presenter, diagram, selectedObjects, hideCrop); + popupMenu.insert(showHideCrop1, pos++); + JMenu showHideCrop2 = buildShowHideCropSubmenu(presenter, diagram, selectedObjects, hideCrop); + popupMenu.insert(showHideCrop2, pos++); + + JMenu hideObjectsMenu = buildHideObjectsSubmenu(presenter, selectedObjects); + popupMenu.insert(hideObjectsMenu, pos++); + + JMenu hideLinksMenu = buildHideLinksSubmenu(presenter, selectedLinks); + popupMenu.insert(hideLinksMenu, pos++); + + popupMenu.insert(new JSeparator(), pos++); + + JMenuItem linksByKind = buildLinksByKindPlaceholder(); + popupMenu.insert(linksByKind, pos++); + + popupMenu.insert(new JSeparator(), pos++); + + JMenuItem protocol = buildProtocolStatePlaceholder(); + popupMenu.insert(protocol, pos++); + + popupMenu.insert(new JSeparator(), pos++); + + JMenuItem commentNode = buildCommentNode(presenter); + popupMenu.insert(commentNode, pos++); + + popupMenu.insert(new JSeparator(), pos++); + + // 7) Checkboxes and general items: these are typically created in DiagramView.unionOfPopUpMenu, + // but we need to ensure the "Show states" checkbox is present and wired to the diagram/presenter. + try { + boolean init = diagram != null && diagram.isShowStates(); + JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", init); + showStates.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent ev) { + boolean sel = ev.getStateChange() == ItemEvent.SELECTED; + try { + presenter.onToggleShowStates(sel); + } catch (Throwable ignored) {} + if (diagram != null) { + diagram.setShowStates(sel); + diagram.invalidateContent(true); + } + } + }); + popupMenu.insert(showStates, pos++); + } catch (Throwable ignored) { + // safe fallback: if diagram API not present, skip + } + // Ensure separators are normalized after deterministic insertion sequence + normalizeSeparators(popupMenu); + } + private int addObjectActions(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + Set selectedObjects, + int pos) { + if (selectedObjects.size() == 1) { + MObject single = selectedObjects.iterator().next(); + String name = safeName(single); + popupMenu.insert(buildMenuItem("Edit properties of '" + name + "'", ev -> presenter.onShowObjectProperties(single)), pos++); + popupMenu.insert(buildMenuItem("Destroy '" + name + "'", ev -> presenter.onDeleteObjects(selectedObjects)), pos++); + } else if (selectedObjects.size() > 1) { + popupMenu.insert(buildMenuItem("Destroy " + selectedObjects.size() + " objects", ev -> presenter.onDeleteObjects(selectedObjects)), pos++); + } + return pos; + } + private int addHideObjectsSubmenu(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + Set selectedObjects, + int pos) { + if (!selectedObjects.isEmpty()) { + JMenu hideObjectsMenu = new JMenu("Hide objects"); + hideObjectsMenu.add(buildMenuItem("Hide selected objects", ev -> presenter.onHideObjects(selectedObjects))); + popupMenu.insert(hideObjectsMenu, pos++); + } + return pos; + } + private int addLinksByKindPlaceholder(JPopupMenu popupMenu, int pos) { + JMenuItem placeholder = new JMenuItem("Show/hide links-by-kind"); + placeholder.setEnabled(false); + popupMenu.insert(placeholder, pos++); + return pos; + } + private int addProtocolStatePlaceholder(JPopupMenu popupMenu, int pos) { + JMenuItem placeholder = new JMenuItem("Show protocol state machine..."); + placeholder.setEnabled(false); + popupMenu.insert(placeholder, pos++); + return pos; + } + private int addCommentNode(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + int pos) { + // Always insert a separator immediately before the comment node. + // normalizeSeparators() will later remove duplicates/leading separators. + popupMenu.insert(new JSeparator(), pos++); + popupMenu.insert(buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")), pos++); + return pos; + } + private int insertSeparator(JPopupMenu popupMenu, int pos) { + // Only insert a separator if we have at least one component already + // and the last component is not a separator. This avoids stray small + // gaps when a conditional block (like inserts) is omitted. + int count = popupMenu.getComponentCount(); + if (count == 0) { + return pos; + } + java.awt.Component last = popupMenu.getComponent(count - 1); + if (last instanceof JSeparator) { + return pos; + } + popupMenu.insert(new JSeparator(), pos++); + return pos; + } + private HideCropGroup addHideCropGreyTopLevel(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + ObjectDiagramInteractor diagram, + Set selectedObjects, + Set selectedLinks, + int pos) { + // Build labels according to selection + int size = selectedObjects.size() + selectedLinks.size(); + String hideLabel; + String cropLabel; + if (size > 1) { + hideLabel = "Hide " + size + " elements"; + cropLabel = "Crop " + size + " elements"; + } else if (selectedObjects.size() == 1) { + String name = safeName(selectedObjects.iterator().next()); + hideLabel = "Hide " + name; + cropLabel = "Crop " + name; + } else { + // single link or nothing selected -> generic labels + hideLabel = "Hide selected"; + cropLabel = "Crop selected"; + } + + // Create display menu items directly (MenuElements) so the popup does not close + // when hovering. Add a decorative matte border around the group to emulate the + // boxed appearance from the previous implementation. + List displayItems = new ArrayList<>(); + + JMenuItem displayHide = buildMenuItem(hideLabel, ev -> { + presenter.onHideLinks(selectedLinks); + presenter.onHideObjects(selectedObjects); + presenter.onStatusMessage("Selected elements hidden"); + }); + displayItems.add(displayHide); + + JMenuItem displayCrop = buildMenuItem(cropLabel, ev -> { + Set objectsToHide = new HashSet<>(selectedObjects); + selectedLinks.forEach(link -> { + if (link instanceof MLinkObject linkObject) { + objectsToHide.add(linkObject); + } else { + objectsToHide.addAll(link.linkedObjects()); + } + }); + presenter.onCropSelection(objectsToHide); + presenter.onStatusMessage("Cropped selection"); }); - popupMenu.insert(summaryItem, 0); + displayItems.add(displayCrop); + + // Grey in / out + int greyed = 0; + int visible = 0; + for (MObject obj : selectedObjects) { + if (diagram != null && diagram.isGreyed(obj)) { + greyed++; + } else { + visible++; + } + } + if (greyed > 0) { + String labelGreyIn; + if (selectedObjects.size() == 1) { + labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyIn = "Grey in selected"; + if (greyed > 1) { + labelGreyIn += " (" + greyed + ")"; + } + } + displayItems.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); + } + if (visible > 0) { + String labelGreyOut; + if (selectedObjects.size() == 1) { + labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyOut = "Grey out selected"; + if (visible > 1) { + labelGreyOut += " (" + visible + ")"; + } + } + displayItems.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); + } - JMenuItem expandItem = new JMenuItem("Refresh selection"); - expandItem.addActionListener(ev -> { - presenter.onStatusMessage("Refreshing selection overview"); - presenter.onRefreshRequested(); + // Insert the items as regular JMenuItems between separators (like insert entries) + if (!displayItems.isEmpty()) { + for (JMenuItem it : displayItems) { + // ensure consistent look & behavior + it.setOpaque(true); + it.setBackground(UIManager.getColor("Menu.background")); + popupMenu.insert(it, pos++); + } + // insert a separator immediately after the top-level hide/crop/grey items + popupMenu.insert(new JSeparator(), pos++); + } + + // Create separate JMenuItem instances to be used in the Show/hide/crop submenu later. + JMenuItem hideItem = new JMenuItem(hideLabel); + hideItem.addActionListener(ev -> { + presenter.onHideLinks(selectedLinks); + presenter.onHideObjects(selectedObjects); + presenter.onStatusMessage("Selected elements hidden"); }); - popupMenu.insert(expandItem, 1); - - // Hide selected items - if (!selectedObjects.isEmpty() || !selectedLinks.isEmpty()) { - JMenuItem hideItem = new JMenuItem("Hide selected"); - hideItem.addActionListener(ev -> { - presenter.onHideLinks(selectedLinks); - presenter.onHideObjects(selectedObjects); - presenter.onStatusMessage("Selected elements hidden"); + JMenuItem cropItem = new JMenuItem(cropLabel); + cropItem.addActionListener(ev -> { + Set objectsToHide = new HashSet<>(selectedObjects); + selectedLinks.forEach(link -> { + if (link instanceof MLinkObject linkObject) { + objectsToHide.add(linkObject); + } else { + objectsToHide.addAll(link.linkedObjects()); + } + }); + presenter.onCropSelection(objectsToHide); + presenter.onStatusMessage("Cropped selection"); + }); + + int nextPos = popupMenu.getComponentCount(); + return new HideCropGroup(hideItem, cropItem, nextPos); + } + private int addShowHideCropSubmenu(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + ObjectDiagramInteractor diagram, + Set selectedObjects, + HideCropGroup hideCrop, + int pos) { + JMenu showHideCrop = new JMenu("Show/hide/crop objects"); + showHideCrop.add(hideCrop.hideItem); + showHideCrop.add(hideCrop.cropItem); + addGreyItems(showHideCrop, diagram, presenter, selectedObjects); + popupMenu.insert(showHideCrop, pos++); + return pos; + } + private int addHideLinksSubmenu(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + Set selectedLinks, + int pos) { + if (!selectedLinks.isEmpty()) { + JMenu hideLinksMenu = new JMenu("Hide links"); + hideLinksMenu.add(buildMenuItem("Hide selected links", ev -> presenter.onHideLinks(selectedLinks))); + popupMenu.insert(hideLinksMenu, pos++); + } + return pos; + } + /** + * Adds a group of placeholder "insert ..." menu items as seen in the reference Kontextmenü. + * Keeps them non-interactive or routes them to a status message via presenter. + * This implementation restores the full combinatorial generation and per-link delete items + * similar to the original legacy `unionOfPopUpMenu()`. + */ + private int addInsertPlaceholders(JPopupMenu popupMenu, + NewObjectDiagramPresenter presenter, + Set selectedObjects, + Set selectedLinks, + int pos) { + // If there are selected objects, generate all assignments of selected objects + // to association ends (radix-based enumeration) and offer insert/delete actions + // per combination where applicable. + if (selectedObjects != null && !selectedObjects.isEmpty()) { + List selList = new ArrayList<>(selectedObjects); + int m = selList.size(); + boolean addedInsertLinkAction = false; + Collection associations = presenter.fetchAllAssociations(); + if (associations == null) { + return pos; + } + for (MAssociation assoc : associations) { + if (assoc.isReadOnly()) continue; + List ends = assoc.associationEnds(); + int n = ends == null ? 0 : ends.size(); + if (n == 0) continue; + if (m > n) continue; // more selected objects than ends + int pow = 1; + for (int i = 0; i < n; ++i) pow *= m; + for (int i = 0; i < pow; ++i) { + int[] digits = radixConversion(i, m, n); + if (!isCompleteObjectCombination(digits, m)) continue; + MObject[] l = new MObject[n]; + MClass[] c = new MClass[n]; + for (int j = 0; j < n; ++j) { + l[j] = selList.get(digits[j]); + c[j] = l[j].cls(); + } + if (!assoc.isAssignableFrom(c)) continue; + // find existing links between these objects for this association + Set links = presenter.fetchLinksOfAssociation(assoc).stream() + .filter(link -> matchesLink(link, l)) + .collect(Collectors.toSet()); + if (links.isEmpty() || assoc.hasQualifiedEnds()) { + // build label like: "insert (Obj1,Obj2,...) into AssocName" + String joinedNames = Arrays.stream(l) + .map(this::safeName) + .collect(Collectors.joining(",")); + String insLabel = "insert (" + joinedNames + ") into " + assoc.name(); + JMenuItem ins = buildMenuItem(insLabel, ev -> presenter.onInsertLink(assoc, Arrays.asList(l))); + popupMenu.insert(ins, pos++); + addedInsertLinkAction = true; + } + if (!links.isEmpty()) { + for (MLink link : links) { + JMenuItem del = buildMenuItem("delete " + link.toString(), ev -> presenter.onDeleteLink(link)); + popupMenu.insert(del, pos++); + addedInsertLinkAction = true; + } + } + } + } + if (addedInsertLinkAction) { + pos = insertSeparator(popupMenu, pos); + } + return pos; + } + // Fallback: no selection -> show generic insert items based on available objects of classes + Collection associations = presenter.fetchAllAssociations(); + if (associations == null || associations.isEmpty()) { + return pos; + } + for (MAssociation assoc : associations) { + List ends = assoc.associationEnds(); + if (ends == null || ends.isEmpty()) { + continue; + } + boolean possible = true; + for (MAssociationEnd end : ends) { + // fetch objects of the required class from the presenter (diagram-level) + Set candidates = presenter.fetchObjectsOfClass(end.cls()); + if (candidates == null || candidates.isEmpty()) { + possible = false; + break; + } + } + if (!possible) { + // skip associations that cannot be realized from the current diagram + continue; + } + int required = ends.size(); + boolean selectionEmpty = selectedObjects == null || selectedObjects.isEmpty(); + boolean selectionMatches = selectedObjects != null && selectedObjects.size() == required; + String label; + if (!selectionEmpty && selectedObjects.size() == 1 && required == 2) { + String name = safeName(selectedObjects.iterator().next()); + // match formatting: no space after comma + label = "insert (" + name + "," + name + ") into " + assoc.name(); + } else { + label = "insert into " + assoc.name(); + } + JMenuItem mi = buildMenuItem(label, ev -> { + if (selectionMatches) { + presenter.onInsertLink(assoc, new ArrayList<>(selectedObjects)); + } else { + // interactive insertion: presenter will choose participants from available objects + presenter.onInsertLinkInteractive(selectedObjects); + } }); - popupMenu.insert(hideItem, 2); + // only enabled when selection matches required participants or interaction is possible + mi.setEnabled(selectionMatches || selectionEmpty); + popupMenu.insert(mi, pos++); } + return pos; + } + /** + * Returns the number of associations that can be realized given the + * objects currently available in the diagram. This is used to decide + * whether to render the insert block at all (avoids small empty gaps). + */ + private int countPossibleInserts(NewObjectDiagramPresenter presenter, Set selectedObjects) { + Collection associations = presenter.fetchAllAssociations(); + if (associations == null || associations.isEmpty()) { + return 0; + } + int count = 0; + for (MAssociation assoc : associations) { + List ends = assoc.associationEnds(); + if (ends == null || ends.isEmpty()) { + continue; + } + boolean possible = true; + for (MAssociationEnd end : ends) { + Set candidates = presenter.fetchObjectsOfClass(end.cls()); + if (candidates == null || candidates.isEmpty()) { + possible = false; + break; + } + } + if (possible) { + count++; + } + } + return count; + } + // removed unused addShowHidden to match the reference menu ordering + private static class HideCropGroup { + final JMenuItem hideItem; + final JMenuItem cropItem; + final int nextPos; + final List topItems; - // Crop selection -> hide everything in selection (objects + link endpoints) - if (!selectedObjects.isEmpty() || !selectedLinks.isEmpty()) { - JMenuItem cropItem = new JMenuItem("Crop selection"); - cropItem.addActionListener(ev -> { - Set objectsToHide = new HashSet<>(selectedObjects); - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject) { - objectsToHide.add((MLinkObject) link); - } else { - objectsToHide.addAll(link.linkedObjects()); + HideCropGroup(JMenuItem hideItem, JMenuItem cropItem, int nextPos) { + this.hideItem = hideItem; + this.cropItem = cropItem; + this.nextPos = nextPos; + this.topItems = List.of(); + } + + HideCropGroup(List topItems, JMenuItem hideItem, JMenuItem cropItem) { + this.hideItem = hideItem; + this.cropItem = cropItem; + this.nextPos = -1; + this.topItems = topItems == null ? List.of() : topItems; + } + } + private JMenuItem buildMenuItem(String label, ActionListener l) { + JMenuItem item = new JMenuItem(label); + item.addActionListener(l); + return item; + } + + // New builders that only create items/menus and do NOT insert into a JPopupMenu + private List buildObjectActions(NewObjectDiagramPresenter presenter, Set selectedObjects) { + List res = new ArrayList<>(); + if (selectedObjects == null) { + return res; + } + if (selectedObjects.size() == 1) { + MObject single = selectedObjects.iterator().next(); + String name = safeName(single); + res.add(buildMenuItem("Edit properties of '" + name + "'", ev -> presenter.onShowObjectProperties(single))); + res.add(buildMenuItem("Destroy '" + name + "'", ev -> presenter.onDeleteObjects(selectedObjects))); + } else if (selectedObjects.size() > 1) { + res.add(buildMenuItem("Destroy " + selectedObjects.size() + " objects", ev -> presenter.onDeleteObjects(selectedObjects))); + } + return res; + } + + private List buildInsertPlaceholders(NewObjectDiagramPresenter presenter, Set selectedObjects, Set selectedLinks) { + List items = new ArrayList<>(); + if (presenter == null) return items; + + if (selectedObjects != null && !selectedObjects.isEmpty()) { + List selList = new ArrayList<>(selectedObjects); + int m = selList.size(); + boolean addedInsertLinkAction = false; + Collection associations = presenter.fetchAllAssociations(); + if (associations == null) { + return items; + } + for (MAssociation assoc : associations) { + if (assoc.isReadOnly()) continue; + List ends = assoc.associationEnds(); + int n = ends == null ? 0 : ends.size(); + if (n == 0) continue; + if (m > n) continue; // more selected objects than ends + int pow = 1; + for (int i = 0; i < n; ++i) pow *= m; + for (int i = 0; i < pow; ++i) { + int[] digits = radixConversion(i, m, n); + if (!isCompleteObjectCombination(digits, m)) continue; + MObject[] l = new MObject[n]; + MClass[] c = new MClass[n]; + for (int j = 0; j < n; ++j) { + l[j] = selList.get(digits[j]); + c[j] = l[j].cls(); } - }); - presenter.onCropSelection(objectsToHide); - presenter.onStatusMessage("Cropped selection"); + if (!assoc.isAssignableFrom(c)) continue; + Set links = presenter.fetchLinksOfAssociation(assoc).stream() + .filter(link -> matchesLink(link, l)) + .collect(Collectors.toSet()); + if (links.isEmpty() || assoc.hasQualifiedEnds()) { + String joinedNames = Arrays.stream(l).map(this::safeName).collect(Collectors.joining(",")); + String insLabel = "insert (" + joinedNames + ") into " + assoc.name(); + JMenuItem ins = buildMenuItem(insLabel, ev -> presenter.onInsertLink(assoc, Arrays.asList(l))); + items.add(ins); + addedInsertLinkAction = true; + } + if (!links.isEmpty()) { + for (MLink link : links) { + JMenuItem del = buildMenuItem("delete " + link.toString(), ev -> presenter.onDeleteLink(link)); + items.add(del); + addedInsertLinkAction = true; + } + } + } + } + return items; + } + + Collection associations = presenter.fetchAllAssociations(); + if (associations == null || associations.isEmpty()) { + return items; + } + for (MAssociation assoc : associations) { + List ends = assoc.associationEnds(); + if (ends == null || ends.isEmpty()) { + continue; + } + boolean possible = true; + for (MAssociationEnd end : ends) { + Set candidates = presenter.fetchObjectsOfClass(end.cls()); + if (candidates == null || candidates.isEmpty()) { + possible = false; + break; + } + } + if (!possible) continue; + int required = ends.size(); + boolean selectionEmpty = selectedObjects == null || selectedObjects.isEmpty(); + boolean selectionMatches = selectedObjects != null && selectedObjects.size() == required; + String label; + if (!selectionEmpty && selectedObjects.size() == 1 && required == 2) { + String name = safeName(selectedObjects.iterator().next()); + label = "insert (" + name + "," + name + ") into " + assoc.name(); + } else { + label = "insert into " + assoc.name(); + } + JMenuItem mi = buildMenuItem(label, ev -> { + if (selectionMatches) { + presenter.onInsertLink(assoc, new ArrayList<>(selectedObjects)); + } else { + presenter.onInsertLinkInteractive(selectedObjects); + } }); - popupMenu.insert(cropItem, 3); + mi.setEnabled(selectionMatches || selectionEmpty); + items.add(mi); + } + return items; + } + + private JMenuItem buildShowHiddenElementsIfNeeded(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + if (diagram == null || presenter == null) return null; + try { + Method m = diagram.getClass().getMethod("getHiddenData"); + Object hidden = m.invoke(diagram); + if (hidden == null) return null; + Method getEdges = null; + Method getNodes = null; + try { getEdges = hidden.getClass().getMethod("getEdges"); } catch (NoSuchMethodException ignored) {} + try { getNodes = hidden.getClass().getMethod("getNodes"); } catch (NoSuchMethodException ignored) {} + boolean hasHidden = false; + if (getEdges != null) { + Object edges = getEdges.invoke(hidden); + if (edges instanceof Collection) { + hasHidden = !((Collection) edges).isEmpty(); + } + } + if (!hasHidden && getNodes != null) { + Object nodes = getNodes.invoke(hidden); + if (nodes instanceof Collection) { + hasHidden = !((Collection) nodes).isEmpty(); + } + } + if (hasHidden) { + JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); + showAllObjects.addActionListener(ev -> { + try { presenter.onShowHiddenElements(); } catch (Throwable ignored) {} + }); + return showAllObjects; + } + } catch (Throwable ignored) {} + return null; + } + + private HideCropGroup buildHideCropGreyTopLevel(NewObjectDiagramPresenter presenter, + ObjectDiagramInteractor diagram, + Set selectedObjects, + Set selectedLinks) { + // Build labels according to selection + int size = (selectedObjects == null ? 0 : selectedObjects.size()) + (selectedLinks == null ? 0 : selectedLinks.size()); + String hideLabel; + String cropLabel; + if (size > 1) { + hideLabel = "Hide " + size + " elements"; + cropLabel = "Crop " + size + " elements"; + } else if (selectedObjects != null && selectedObjects.size() == 1) { + String name = safeName(selectedObjects.iterator().next()); + hideLabel = "Hide " + name; + cropLabel = "Crop " + name; + } else { + hideLabel = "Hide selected"; + cropLabel = "Crop selected"; } - // Show hidden elements - JMenuItem showHidden = new JMenuItem("Show hidden elements"); - showHidden.addActionListener(ev -> { - presenter.onShowHiddenElements(); - presenter.onStatusMessage("Showing hidden elements"); + List topItems = new ArrayList<>(); + JMenuItem displayHide = buildMenuItem(hideLabel, ev -> { + presenter.onHideLinks(selectedLinks); + presenter.onHideObjects(selectedObjects); + presenter.onStatusMessage("Selected elements hidden"); }); - popupMenu.insert(showHidden, 4); + topItems.add(displayHide); - // Toggle show states - JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", diagram != null && diagram.isShowStates()); - showStates.addActionListener(ev -> presenter.onToggleShowStates(showStates.isSelected())); - popupMenu.insert(showStates, 5); + JMenuItem displayCrop = buildMenuItem(cropLabel, ev -> { + Set objectsToHide = new HashSet<>(selectedObjects == null ? Set.of() : selectedObjects); + if (selectedLinks != null) { + selectedLinks.forEach(link -> { + if (link instanceof MLinkObject linkObject) { + objectsToHide.add(linkObject); + } else { + objectsToHide.addAll(link.linkedObjects()); + } + }); + } + presenter.onCropSelection(objectsToHide); + presenter.onStatusMessage("Cropped selection"); + }); + topItems.add(displayCrop); - // Gray in/out - if (!selectedObjects.isEmpty()) { - Set selection = selectedObjects; - int greyed = 0; - int visible = 0; - for (MObject obj : selection) { + int greyed = 0; + int visible = 0; + if (selectedObjects != null) { + for (MObject obj : selectedObjects) { if (diagram != null && diagram.isGreyed(obj)) { greyed++; } else { visible++; } } - if (greyed > 0) { - JMenuItem grayIn = new JMenuItem("Gray in selected" + (greyed > 1 ? " (" + greyed + ")" : "")); - grayIn.addActionListener(ev -> presenter.onGrayIn(selection)); - popupMenu.insert(grayIn, 6); + } + if (greyed > 0) { + String labelGreyIn; + if (selectedObjects != null && selectedObjects.size() == 1) { + labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyIn = "Grey in selected"; + if (greyed > 1) labelGreyIn += " (" + greyed + ")"; } - if (visible > 0) { - JMenuItem grayOut = new JMenuItem("Gray out selected" + (visible > 1 ? " (" + visible + ")" : "")); - grayOut.addActionListener(ev -> presenter.onGrayOut(selection)); - popupMenu.insert(grayOut, 7); + topItems.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); + } + if (visible > 0) { + String labelGreyOut; + if (selectedObjects != null && selectedObjects.size() == 1) { + labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyOut = "Grey out selected"; + if (visible > 1) labelGreyOut += " (" + visible + ")"; } + topItems.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); } - // Hide/show all links - JMenuItem hideAllLinks = new JMenuItem("Hide all links"); - hideAllLinks.addActionListener(ev -> presenter.onHideAllLinks()); - popupMenu.insert(hideAllLinks, 8); + JMenuItem hideItem = new JMenuItem(hideLabel); + hideItem.addActionListener(ev -> { + presenter.onHideLinks(selectedLinks); + presenter.onHideObjects(selectedObjects); + presenter.onStatusMessage("Selected elements hidden"); + }); + JMenuItem cropItem = new JMenuItem(cropLabel); + cropItem.addActionListener(ev -> { + Set objectsToHide = new HashSet<>(selectedObjects == null ? Set.of() : selectedObjects); + if (selectedLinks != null) { + selectedLinks.forEach(link -> { + if (link instanceof MLinkObject linkObject) { + objectsToHide.add(linkObject); + } else { + objectsToHide.addAll(link.linkedObjects()); + } + }); + } + presenter.onCropSelection(objectsToHide); + presenter.onStatusMessage("Cropped selection"); + }); + + return new HideCropGroup(topItems, hideItem, cropItem); + } - JMenuItem showAllLinks = new JMenuItem("Show all links"); - showAllLinks.addActionListener(ev -> presenter.onShowAllLinks()); - popupMenu.insert(showAllLinks, 9); + private JMenu buildShowHideCropSubmenu(NewObjectDiagramPresenter presenter, ObjectDiagramInteractor diagram, Set selectedObjects, HideCropGroup hideCrop) { + JMenu showHideCrop = new JMenu("Show/hide/crop objects"); + if (hideCrop != null) { + showHideCrop.add(hideCrop.hideItem); + showHideCrop.add(hideCrop.cropItem); + addGreyItems(showHideCrop, diagram, presenter, selectedObjects == null ? Set.of() : selectedObjects); + } + return showHideCrop; } + + private JMenu buildHideObjectsSubmenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { + JMenu hideObjectsMenu = new JMenu("Hide objects"); + JMenuItem mi = buildMenuItem("Hide selected objects", ev -> presenter.onHideObjects(selectedObjects == null ? Set.of() : selectedObjects)); + mi.setEnabled(selectedObjects != null && !selectedObjects.isEmpty()); + hideObjectsMenu.add(mi); + return hideObjectsMenu; + } + + private JMenu buildHideLinksSubmenu(NewObjectDiagramPresenter presenter, Set selectedLinks) { + JMenu hideLinksMenu = new JMenu("Hide links"); + JMenuItem mi = buildMenuItem("Hide selected links", ev -> presenter.onHideLinks(selectedLinks == null ? Set.of() : selectedLinks)); + mi.setEnabled(selectedLinks != null && !selectedLinks.isEmpty()); + hideLinksMenu.add(mi); + return hideLinksMenu; + } + + private JMenuItem buildLinksByKindPlaceholder() { + JMenuItem placeholder = new JMenuItem("Show/hide links-by-kind"); + placeholder.setEnabled(false); + return placeholder; + } + + private JMenuItem buildProtocolStatePlaceholder() { + JMenuItem placeholder = new JMenuItem("Show protocol state machine..."); + placeholder.setEnabled(false); + return placeholder; + } + + private JMenuItem buildCommentNode(NewObjectDiagramPresenter presenter) { + JMenuItem mi = buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")); + return mi; + } + private void addGreyItems(JComponent menu, + ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedObjects) { + int greyed = 0; + int visible = 0; + for (MObject obj : selectedObjects) { + if (diagram != null && diagram.isGreyed(obj)) { + greyed++; + } else { + visible++; + } + } + if (greyed > 0) { + String labelGreyIn; + if (selectedObjects.size() == 1) { + labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyIn = "Grey in selected"; + if (greyed > 1) { + labelGreyIn += " (" + greyed + ")"; + } + } + menu.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); + } + if (visible > 0) { + String labelGreyOut; + if (selectedObjects.size() == 1) { + labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); + } else { + labelGreyOut = "Grey out selected"; + if (visible > 1) { + labelGreyOut += " (" + visible + ")"; + } + } + menu.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); + } + } + private String safeName(MObject obj) { + try { return obj == null ? "" : obj.name(); } catch (Exception e) { return ""; } + } + /** + * Remove leading/trailing separators and collapse consecutive separators. + */ + private void normalizeSeparators(JPopupMenu popupMenu) { + if (popupMenu == null) { + return; + } + // Remove leading separators + while (popupMenu.getComponentCount() > 0 && popupMenu.getComponent(0) instanceof JSeparator) { + popupMenu.remove(0); + } + // Remove trailing separators + while (popupMenu.getComponentCount() > 0 && popupMenu.getComponent(popupMenu.getComponentCount() - 1) instanceof JSeparator) { + popupMenu.remove(popupMenu.getComponentCount() - 1); + } + // Collapse consecutive separators + for (int i = 1; i < popupMenu.getComponentCount(); i++) { + if (popupMenu.getComponent(i) instanceof JSeparator && popupMenu.getComponent(i - 1) instanceof JSeparator) { + popupMenu.remove(i); + i--; // stay at same index to check for further duplicates + } + } + } + /** + * Adds a "Show hidden elements" menu entry if the diagram reports hidden nodes/edges. + * Uses reflection to avoid requiring a direct API on ObjectDiagramInteractor. + */ + private int addShowHiddenElementsIfNeeded(JPopupMenu popupMenu, + ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + int pos) { + if (diagram == null || presenter == null) { + return pos; + } + try { + Method m = diagram.getClass().getMethod("getHiddenData"); + Object hidden = m.invoke(diagram); + if (hidden == null) { + return pos; + } + Method getEdges = null; + Method getNodes = null; + try { getEdges = hidden.getClass().getMethod("getEdges"); } catch (NoSuchMethodException ignored) {} + try { getNodes = hidden.getClass().getMethod("getNodes"); } catch (NoSuchMethodException ignored) {} + boolean hasHidden = false; + if (getEdges != null) { + Object edges = getEdges.invoke(hidden); + if (edges instanceof Collection) { + hasHidden = !((Collection) edges).isEmpty(); + } + } + if (!hasHidden && getNodes != null) { + Object nodes = getNodes.invoke(hidden); + if (nodes instanceof Collection) { + hasHidden = !((Collection) nodes).isEmpty(); + } + } + if (hasHidden) { + JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); + showAllObjects.addActionListener(ev -> { + try { presenter.onShowHiddenElements(); } catch (Throwable ignored) {} + }); + popupMenu.insert(showAllObjects, pos++); + } + } catch (Throwable ignored) { + // reflection failed -> silently skip + } + return pos; + } + // helper: radix conversion for enumerating assignments + private int[] radixConversion(int value, int radix, int length) { + int[] digits = new int[length]; + for (int i = 0; i < length; i++) { + digits[i] = value % radix; + value /= radix; + } + return digits; + } + // helper: ensure that every selected object index [0..m-1] appears at least once in digits + private boolean isCompleteObjectCombination(int[] digits, int m) { + boolean[] used = new boolean[m]; + int usedCount = 0; + for (int d : digits) { + if (!used[d]) { + used[d] = true; + usedCount++; + } + } + return usedCount == m; + } + // helper: check whether a link connects exactly the objects in l (multiset match) + private boolean matchesLink(MLink link, MObject[] l) { + if (link == null) return false; + java.util.List linked = new ArrayList<>(); + link.linkedObjects().forEach(linked::add); + if (linked.size() != l.length) return false; + for (MObject o : l) { + boolean removed = linked.remove(o); + if (!removed) return false; + } + return linked.isEmpty(); + } + + // BoxMenuElement removed: use plain JMenuItems so hide/crop/grey appear like insert entries } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java deleted file mode 100644 index b31fb96bc..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/INewObjectDiagramPresenter.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import org.tzi.use.uml.ocl.value.Value; -import org.tzi.use.uml.sys.events.*; -import org.tzi.use.uml.sys.MObject; - -/** Minimal presenter contract for the object diagram MVP. */ -public interface INewObjectDiagramPresenter { - void onRequestPopup(); - void onAddObject(Value value); - void onRefreshRequested(); - void onCreateObject(String clsName); - - // System event hooks (currently no-op implementations) - default void onTransition(TransitionEvent e) {} - default void onObjectCreated(MObject obj) {} - default void onObjectDestroyed(MObject obj) {} - default void onAttributeAssigned(AttributeAssignedEvent e) {} - default void onLinkInserted(LinkInsertedEvent e) {} - default void onLinkDeleted(LinkDeletedEvent e) {} -} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java deleted file mode 100644 index edcac56c2..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramPresenter.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import org.tzi.use.uml.ocl.value.Value; - -/** Minimal presenter contract for the object diagram MVP. */ -public interface IObjectDiagramPresenter { - void onRequestPopup(); - void onAddObject(Value value); - void onRefreshRequested(); - void onCreateObject(String clsName); -} - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java deleted file mode 100644 index b852fbf7c..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullApplicationController.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.sys.MLink; -import org.tzi.use.uml.sys.MObject; -import java.util.List; - -/** - * No-op controller used during incremental migration. - */ -public class NullApplicationController implements ApplicationController { - @Override - public void createObject(String className) { - // no-op - } - - @Override - public void insertLink(MAssociation association, List participants) { - // no-op - } - - @Override - public void deleteLink(MLink link) { - // no-op - } -} - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java deleted file mode 100644 index 9269a46ca..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullContextMenuProvider.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import javax.swing.JPopupMenu; -import java.awt.event.MouseEvent; - -/** - * No-op context menu provider used during incremental migration. - */ -public class NullContextMenuProvider implements ContextMenuProvider { - @Override - public JPopupMenu buildMenu(MouseEvent triggerEvent, NewObjectDiagramPresenter presenter) { - return new JPopupMenu(); - } -} - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java deleted file mode 100644 index 92cabe547..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NullPlacementRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectDiagramModel; - -/** - * No-op placement repository used during incremental migration. - */ -public class NullPlacementRepository implements PlacementRepository { - @Override - public void storeLayout(ObjectDiagramModel model) { - // no-op - } - - @Override - public void restoreLayout(ObjectDiagramModel model) { - // no-op - } -} From 75ee1d7715c985def7ba5d500bdcc31b5fa5b205 Mon Sep 17 00:00:00 2001 From: ahmed Date: Sat, 28 Mar 2026 21:03:41 +0100 Subject: [PATCH 25/34] Refactor DefaultContextMenuProvider to restore deterministic menu hierarchy --- .../DefaultContextMenuProvider.java | 1142 +++++------------ 1 file changed, 317 insertions(+), 825 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index b67d41667..4fe6d2a12 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -1,29 +1,35 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.gui.views.diagrams.util.MenuScroller; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MAssociationEnd; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.sys.MLink; +import org.tzi.use.uml.sys.MObject; + import javax.swing.*; -import java.awt.Color; -import java.awt.event.ActionListener; +import java.awt.Component; import java.awt.event.ActionEvent; -import java.awt.event.ItemListener; +import java.awt.event.ActionListener; import java.awt.event.ItemEvent; -// ...existing imports... -import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Set; -import java.util.Collection; -import java.util.List; +import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Arrays; -import java.util.stream.Collectors; -import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MAssociationEnd; -import org.tzi.use.uml.mm.MClass; -import org.tzi.use.uml.sys.MObject; -import org.tzi.use.uml.sys.MLink; -import org.tzi.use.uml.sys.MLinkObject; -/** - * Default context menu provider used when no plugin provides a specialized menu. - */ +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Consumer; +import java.util.function.Supplier; + public class DefaultContextMenuProvider implements ContextMenuProvider { + + private static final int INSERT_SLOT_COUNT = 3; + @Override public void enhanceMenu(JPopupMenu popupMenu, ObjectDiagramInteractor diagram, @@ -34,872 +40,372 @@ public void enhanceMenu(JPopupMenu popupMenu, if (popupMenu == null || presenter == null) { return; } - // Build menu in a strictly linear fashion. Helpers only build items; this method - // inserts them at incrementing positions and controls all separators centrally. - int pos = 0; - - // 1) Object-specific actions (edit/destroy) - List objectActions = buildObjectActions(presenter, selectedObjects); - for (JMenuItem it : objectActions) { - popupMenu.insert(it, pos++); - } - // 2) Separator - popupMenu.insert(new JSeparator(), pos++); - - // 3) Insert/actions placeholders - List insertItems = buildInsertPlaceholders(presenter, selectedObjects, selectedLinks); - for (JMenuItem it : insertItems) { - popupMenu.insert(it, pos++); - } - // separator after insert block - popupMenu.insert(new JSeparator(), pos++); - - // 4) Show hidden elements (single item, may be null) - JMenuItem showHidden = buildShowHiddenElementsIfNeeded(diagram, presenter); - if (showHidden != null) { - popupMenu.insert(showHidden, pos++); - } - - // 5) Top-level hide/crop/grey display items - HideCropGroup hideCrop = buildHideCropGreyTopLevel(presenter, diagram, selectedObjects, selectedLinks); - for (JMenuItem it : hideCrop.topItems) { - popupMenu.insert(it, pos++); - } - // separator after top-level hide/crop/grey - popupMenu.insert(new JSeparator(), pos++); - - // 6) Submenus and other fixed entries in requested order - // Two identical "Show/hide/crop objects" entries are preserved intentionally - JMenu showHideCrop1 = buildShowHideCropSubmenu(presenter, diagram, selectedObjects, hideCrop); - popupMenu.insert(showHideCrop1, pos++); - JMenu showHideCrop2 = buildShowHideCropSubmenu(presenter, diagram, selectedObjects, hideCrop); - popupMenu.insert(showHideCrop2, pos++); - - JMenu hideObjectsMenu = buildHideObjectsSubmenu(presenter, selectedObjects); - popupMenu.insert(hideObjectsMenu, pos++); - - JMenu hideLinksMenu = buildHideLinksSubmenu(presenter, selectedLinks); - popupMenu.insert(hideLinksMenu, pos++); - - popupMenu.insert(new JSeparator(), pos++); - - JMenuItem linksByKind = buildLinksByKindPlaceholder(); - popupMenu.insert(linksByKind, pos++); - - popupMenu.insert(new JSeparator(), pos++); - - JMenuItem protocol = buildProtocolStatePlaceholder(); - popupMenu.insert(protocol, pos++); - - popupMenu.insert(new JSeparator(), pos++); - - JMenuItem commentNode = buildCommentNode(presenter); - popupMenu.insert(commentNode, pos++); - - popupMenu.insert(new JSeparator(), pos++); + List baseItems = new ArrayList<>(Arrays.asList(popupMenu.getComponents())); + popupMenu.removeAll(); + + Set safeObjects = selectedObjects == null ? Set.of() : selectedObjects; + Set safeLinks = selectedLinks == null ? Set.of() : selectedLinks; + + List ordered = new ArrayList<>(); + + addComponent(ordered, buildEditPropertiesItem(presenter, safeObjects)); + addComponent(ordered, buildDestroyItem(presenter, safeObjects)); + addSeparator(ordered); + + addComponents(ordered, buildInsertItems(presenter, safeObjects)); + addSeparator(ordered); + + addComponent(ordered, buildHideSelectedItem(presenter, safeObjects)); + addComponent(ordered, buildCropSelectedItem(presenter, safeObjects)); + addComponent(ordered, buildGreyOutItem(presenter, safeObjects)); + addSeparator(ordered); + + addComponent(ordered, buildShowHideCropMenu(presenter, diagram, safeObjects, safeLinks)); + addComponent(ordered, buildHideObjectsMenu(presenter, safeObjects)); + addComponent(ordered, buildHideLinksMenu(presenter, safeLinks)); + addSeparator(ordered); + addComponent(ordered, buildLinksByKindMenu(diagram)); + addSeparator(ordered); + + addComponent(ordered, buildProtocolStateMachineItem(presenter)); + addSeparator(ordered); + + addComponent(ordered, extractOrFallback(baseItems, "Add comment node", () -> buildCommentNode(presenter))); + addSeparator(ordered); + + addComponent(ordered, extractOrFallback(baseItems, "Show attributes", () -> buildStatusItem("Show attributes", presenter))); + addComponent(ordered, buildShowStatesToggle(diagram, presenter)); + addComponent(ordered, extractOrFallback(baseItems, "Show association names", () -> buildStatusItem("Show association names", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show role names", () -> buildStatusItem("Show role names", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Align elements", () -> new JMenu("Align elements"))); + addComponent(ordered, extractOrFallback(baseItems, "Anti-aliasing", () -> buildStatusItem("Anti-aliasing", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show grid", () -> buildStatusItem("Show grid", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Grayscale view", () -> buildStatusItem("Grayscale view", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Auto-Layout", () -> buildStatusItem("Auto-Layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Layouts", () -> new JMenu("Layouts"))); + addComponent(ordered, extractOrFallback(baseItems, "Reset layout", () -> buildStatusItem("Reset layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Load layout...", () -> buildStatusItem("Load layout...", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Save layout...", () -> buildStatusItem("Save layout...", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Select all nodes", () -> buildStatusItem("Select all nodes", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Select all edges", () -> buildStatusItem("Select all edges", presenter))); + + ordered.stream().filter(Objects::nonNull).forEach(popupMenu::add); + } - // 7) Checkboxes and general items: these are typically created in DiagramView.unionOfPopUpMenu, - // but we need to ensure the "Show states" checkbox is present and wired to the diagram/presenter. - try { - boolean init = diagram != null && diagram.isShowStates(); - JCheckBoxMenuItem showStates = new JCheckBoxMenuItem("Show states", init); - showStates.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent ev) { - boolean sel = ev.getStateChange() == ItemEvent.SELECTED; - try { - presenter.onToggleShowStates(sel); - } catch (Throwable ignored) {} - if (diagram != null) { - diagram.setShowStates(sel); - diagram.invalidateContent(true); - } - } - }); - popupMenu.insert(showStates, pos++); - } catch (Throwable ignored) { - // safe fallback: if diagram API not present, skip + private void addComponent(List target, Component component) { + if (component != null) { + target.add(component); } - // Ensure separators are normalized after deterministic insertion sequence - normalizeSeparators(popupMenu); } - private int addObjectActions(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - Set selectedObjects, - int pos) { - if (selectedObjects.size() == 1) { - MObject single = selectedObjects.iterator().next(); - String name = safeName(single); - popupMenu.insert(buildMenuItem("Edit properties of '" + name + "'", ev -> presenter.onShowObjectProperties(single)), pos++); - popupMenu.insert(buildMenuItem("Destroy '" + name + "'", ev -> presenter.onDeleteObjects(selectedObjects)), pos++); - } else if (selectedObjects.size() > 1) { - popupMenu.insert(buildMenuItem("Destroy " + selectedObjects.size() + " objects", ev -> presenter.onDeleteObjects(selectedObjects)), pos++); - } - return pos; + + private void addComponents(List target, List components) { + components.stream().filter(Objects::nonNull).forEach(target::add); } - private int addHideObjectsSubmenu(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - Set selectedObjects, - int pos) { - if (!selectedObjects.isEmpty()) { - JMenu hideObjectsMenu = new JMenu("Hide objects"); - hideObjectsMenu.add(buildMenuItem("Hide selected objects", ev -> presenter.onHideObjects(selectedObjects))); - popupMenu.insert(hideObjectsMenu, pos++); + + private void addSeparator(List target) { + if (target.isEmpty() || target.get(target.size() - 1) instanceof JSeparator) { + return; } - return pos; - } - private int addLinksByKindPlaceholder(JPopupMenu popupMenu, int pos) { - JMenuItem placeholder = new JMenuItem("Show/hide links-by-kind"); - placeholder.setEnabled(false); - popupMenu.insert(placeholder, pos++); - return pos; + target.add(new JSeparator()); } - private int addProtocolStatePlaceholder(JPopupMenu popupMenu, int pos) { - JMenuItem placeholder = new JMenuItem("Show protocol state machine..."); - placeholder.setEnabled(false); - popupMenu.insert(placeholder, pos++); - return pos; - } - private int addCommentNode(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - int pos) { - // Always insert a separator immediately before the comment node. - // normalizeSeparators() will later remove duplicates/leading separators. - popupMenu.insert(new JSeparator(), pos++); - popupMenu.insert(buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")), pos++); - return pos; - } - private int insertSeparator(JPopupMenu popupMenu, int pos) { - // Only insert a separator if we have at least one component already - // and the last component is not a separator. This avoids stray small - // gaps when a conditional block (like inserts) is omitted. - int count = popupMenu.getComponentCount(); - if (count == 0) { - return pos; - } - java.awt.Component last = popupMenu.getComponent(count - 1); - if (last instanceof JSeparator) { - return pos; + + private Component extractOrFallback(List baseItems, String text, Supplier fallback) { + Component extracted = takeAndRemove(baseItems, text); + if (extracted != null) { + return extracted; } - popupMenu.insert(new JSeparator(), pos++); - return pos; + return fallback == null ? null : fallback.get(); } - private HideCropGroup addHideCropGreyTopLevel(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - ObjectDiagramInteractor diagram, - Set selectedObjects, - Set selectedLinks, - int pos) { - // Build labels according to selection - int size = selectedObjects.size() + selectedLinks.size(); - String hideLabel; - String cropLabel; - if (size > 1) { - hideLabel = "Hide " + size + " elements"; - cropLabel = "Crop " + size + " elements"; - } else if (selectedObjects.size() == 1) { - String name = safeName(selectedObjects.iterator().next()); - hideLabel = "Hide " + name; - cropLabel = "Crop " + name; - } else { - // single link or nothing selected -> generic labels - hideLabel = "Hide selected"; - cropLabel = "Crop selected"; - } - - // Create display menu items directly (MenuElements) so the popup does not close - // when hovering. Add a decorative matte border around the group to emulate the - // boxed appearance from the previous implementation. - List displayItems = new ArrayList<>(); - JMenuItem displayHide = buildMenuItem(hideLabel, ev -> { - presenter.onHideLinks(selectedLinks); - presenter.onHideObjects(selectedObjects); - presenter.onStatusMessage("Selected elements hidden"); - }); - displayItems.add(displayHide); - - JMenuItem displayCrop = buildMenuItem(cropLabel, ev -> { - Set objectsToHide = new HashSet<>(selectedObjects); - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject linkObject) { - objectsToHide.add(linkObject); - } else { - objectsToHide.addAll(link.linkedObjects()); - } - }); - presenter.onCropSelection(objectsToHide); - presenter.onStatusMessage("Cropped selection"); - }); - displayItems.add(displayCrop); - - // Grey in / out - int greyed = 0; - int visible = 0; - for (MObject obj : selectedObjects) { - if (diagram != null && diagram.isGreyed(obj)) { - greyed++; - } else { - visible++; - } - } - if (greyed > 0) { - String labelGreyIn; - if (selectedObjects.size() == 1) { - labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); - } else { - labelGreyIn = "Grey in selected"; - if (greyed > 1) { - labelGreyIn += " (" + greyed + ")"; - } + private Component takeAndRemove(List components, String text) { + for (Iterator it = components.iterator(); it.hasNext(); ) { + Component candidate = it.next(); + if (candidate instanceof JMenuItem item && text.equals(item.getText())) { + it.remove(); + return item; } - displayItems.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); - } - if (visible > 0) { - String labelGreyOut; - if (selectedObjects.size() == 1) { - labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); - } else { - labelGreyOut = "Grey out selected"; - if (visible > 1) { - labelGreyOut += " (" + visible + ")"; - } + if (candidate instanceof JMenu menu && text.equals(menu.getText())) { + it.remove(); + return menu; } - displayItems.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); } + return null; + } - // Insert the items as regular JMenuItems between separators (like insert entries) - if (!displayItems.isEmpty()) { - for (JMenuItem it : displayItems) { - // ensure consistent look & behavior - it.setOpaque(true); - it.setBackground(UIManager.getColor("Menu.background")); - popupMenu.insert(it, pos++); + private JMenuItem buildEditPropertiesItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Edit properties of '" + safeName(selectedObjects.iterator().next()) + "'" , ev -> { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select an object to edit its properties."); + } else { + presenter.onShowObjectProperties(selectedObjects.iterator().next()); } - // insert a separator immediately after the top-level hide/crop/grey items - popupMenu.insert(new JSeparator(), pos++); - } - - // Create separate JMenuItem instances to be used in the Show/hide/crop submenu later. - JMenuItem hideItem = new JMenuItem(hideLabel); - hideItem.addActionListener(ev -> { - presenter.onHideLinks(selectedLinks); - presenter.onHideObjects(selectedObjects); - presenter.onStatusMessage("Selected elements hidden"); - }); - JMenuItem cropItem = new JMenuItem(cropLabel); - cropItem.addActionListener(ev -> { - Set objectsToHide = new HashSet<>(selectedObjects); - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject linkObject) { - objectsToHide.add(linkObject); - } else { - objectsToHide.addAll(link.linkedObjects()); - } - }); - presenter.onCropSelection(objectsToHide); - presenter.onStatusMessage("Cropped selection"); }); - - int nextPos = popupMenu.getComponentCount(); - return new HideCropGroup(hideItem, cropItem, nextPos); - } - private int addShowHideCropSubmenu(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - ObjectDiagramInteractor diagram, - Set selectedObjects, - HideCropGroup hideCrop, - int pos) { - JMenu showHideCrop = new JMenu("Show/hide/crop objects"); - showHideCrop.add(hideCrop.hideItem); - showHideCrop.add(hideCrop.cropItem); - addGreyItems(showHideCrop, diagram, presenter, selectedObjects); - popupMenu.insert(showHideCrop, pos++); - return pos; - } - private int addHideLinksSubmenu(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - Set selectedLinks, - int pos) { - if (!selectedLinks.isEmpty()) { - JMenu hideLinksMenu = new JMenu("Hide links"); - hideLinksMenu.add(buildMenuItem("Hide selected links", ev -> presenter.onHideLinks(selectedLinks))); - popupMenu.insert(hideLinksMenu, pos++); - } - return pos; } - /** - * Adds a group of placeholder "insert ..." menu items as seen in the reference Kontextmenü. - * Keeps them non-interactive or routes them to a status message via presenter. - * This implementation restores the full combinatorial generation and per-link delete items - * similar to the original legacy `unionOfPopUpMenu()`. - */ - private int addInsertPlaceholders(JPopupMenu popupMenu, - NewObjectDiagramPresenter presenter, - Set selectedObjects, - Set selectedLinks, - int pos) { - // If there are selected objects, generate all assignments of selected objects - // to association ends (radix-based enumeration) and offer insert/delete actions - // per combination where applicable. - if (selectedObjects != null && !selectedObjects.isEmpty()) { - List selList = new ArrayList<>(selectedObjects); - int m = selList.size(); - boolean addedInsertLinkAction = false; - Collection associations = presenter.fetchAllAssociations(); - if (associations == null) { - return pos; - } - for (MAssociation assoc : associations) { - if (assoc.isReadOnly()) continue; - List ends = assoc.associationEnds(); - int n = ends == null ? 0 : ends.size(); - if (n == 0) continue; - if (m > n) continue; // more selected objects than ends - int pow = 1; - for (int i = 0; i < n; ++i) pow *= m; - for (int i = 0; i < pow; ++i) { - int[] digits = radixConversion(i, m, n); - if (!isCompleteObjectCombination(digits, m)) continue; - MObject[] l = new MObject[n]; - MClass[] c = new MClass[n]; - for (int j = 0; j < n; ++j) { - l[j] = selList.get(digits[j]); - c[j] = l[j].cls(); - } - if (!assoc.isAssignableFrom(c)) continue; - // find existing links between these objects for this association - Set links = presenter.fetchLinksOfAssociation(assoc).stream() - .filter(link -> matchesLink(link, l)) - .collect(Collectors.toSet()); - if (links.isEmpty() || assoc.hasQualifiedEnds()) { - // build label like: "insert (Obj1,Obj2,...) into AssocName" - String joinedNames = Arrays.stream(l) - .map(this::safeName) - .collect(Collectors.joining(",")); - String insLabel = "insert (" + joinedNames + ") into " + assoc.name(); - JMenuItem ins = buildMenuItem(insLabel, ev -> presenter.onInsertLink(assoc, Arrays.asList(l))); - popupMenu.insert(ins, pos++); - addedInsertLinkAction = true; - } - if (!links.isEmpty()) { - for (MLink link : links) { - JMenuItem del = buildMenuItem("delete " + link.toString(), ev -> presenter.onDeleteLink(link)); - popupMenu.insert(del, pos++); - addedInsertLinkAction = true; - } - } - } - } - if (addedInsertLinkAction) { - pos = insertSeparator(popupMenu, pos); - } - return pos; - } - // Fallback: no selection -> show generic insert items based on available objects of classes - Collection associations = presenter.fetchAllAssociations(); - if (associations == null || associations.isEmpty()) { - return pos; - } - for (MAssociation assoc : associations) { - List ends = assoc.associationEnds(); - if (ends == null || ends.isEmpty()) { - continue; - } - boolean possible = true; - for (MAssociationEnd end : ends) { - // fetch objects of the required class from the presenter (diagram-level) - Set candidates = presenter.fetchObjectsOfClass(end.cls()); - if (candidates == null || candidates.isEmpty()) { - possible = false; - break; - } - } - if (!possible) { - // skip associations that cannot be realized from the current diagram - continue; - } - int required = ends.size(); - boolean selectionEmpty = selectedObjects == null || selectedObjects.isEmpty(); - boolean selectionMatches = selectedObjects != null && selectedObjects.size() == required; - String label; - if (!selectionEmpty && selectedObjects.size() == 1 && required == 2) { - String name = safeName(selectedObjects.iterator().next()); - // match formatting: no space after comma - label = "insert (" + name + "," + name + ") into " + assoc.name(); + + private JMenuItem buildDestroyItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Destroy '" + safeName(selectedObjects.iterator().next()) + "'", ev -> { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select at least one object to destroy."); } else { - label = "insert into " + assoc.name(); + presenter.onDeleteObjects(selectedObjects); } - JMenuItem mi = buildMenuItem(label, ev -> { - if (selectionMatches) { - presenter.onInsertLink(assoc, new ArrayList<>(selectedObjects)); - } else { - // interactive insertion: presenter will choose participants from available objects - presenter.onInsertLinkInteractive(selectedObjects); - } - }); - // only enabled when selection matches required participants or interaction is possible - mi.setEnabled(selectionMatches || selectionEmpty); - popupMenu.insert(mi, pos++); - } - return pos; - } - /** - * Returns the number of associations that can be realized given the - * objects currently available in the diagram. This is used to decide - * whether to render the insert block at all (avoids small empty gaps). - */ - private int countPossibleInserts(NewObjectDiagramPresenter presenter, Set selectedObjects) { - Collection associations = presenter.fetchAllAssociations(); - if (associations == null || associations.isEmpty()) { - return 0; - } - int count = 0; - for (MAssociation assoc : associations) { - List ends = assoc.associationEnds(); - if (ends == null || ends.isEmpty()) { - continue; - } - boolean possible = true; - for (MAssociationEnd end : ends) { - Set candidates = presenter.fetchObjectsOfClass(end.cls()); - if (candidates == null || candidates.isEmpty()) { - possible = false; - break; - } - } - if (possible) { - count++; - } - } - return count; - } - // removed unused addShowHidden to match the reference menu ordering - private static class HideCropGroup { - final JMenuItem hideItem; - final JMenuItem cropItem; - final int nextPos; - final List topItems; - - HideCropGroup(JMenuItem hideItem, JMenuItem cropItem, int nextPos) { - this.hideItem = hideItem; - this.cropItem = cropItem; - this.nextPos = nextPos; - this.topItems = List.of(); - } - - HideCropGroup(List topItems, JMenuItem hideItem, JMenuItem cropItem) { - this.hideItem = hideItem; - this.cropItem = cropItem; - this.nextPos = -1; - this.topItems = topItems == null ? List.of() : topItems; - } - } - private JMenuItem buildMenuItem(String label, ActionListener l) { - JMenuItem item = new JMenuItem(label); - item.addActionListener(l); - return item; - } - - // New builders that only create items/menus and do NOT insert into a JPopupMenu - private List buildObjectActions(NewObjectDiagramPresenter presenter, Set selectedObjects) { - List res = new ArrayList<>(); - if (selectedObjects == null) { - return res; - } - if (selectedObjects.size() == 1) { - MObject single = selectedObjects.iterator().next(); - String name = safeName(single); - res.add(buildMenuItem("Edit properties of '" + name + "'", ev -> presenter.onShowObjectProperties(single))); - res.add(buildMenuItem("Destroy '" + name + "'", ev -> presenter.onDeleteObjects(selectedObjects))); - } else if (selectedObjects.size() > 1) { - res.add(buildMenuItem("Destroy " + selectedObjects.size() + " objects", ev -> presenter.onDeleteObjects(selectedObjects))); - } - return res; + }); } - private List buildInsertPlaceholders(NewObjectDiagramPresenter presenter, Set selectedObjects, Set selectedLinks) { + private List buildInsertItems(NewObjectDiagramPresenter presenter, Set selectedObjects) { List items = new ArrayList<>(); - if (presenter == null) return items; + if (presenter == null) { + return items; + } - if (selectedObjects != null && !selectedObjects.isEmpty()) { + if (!selectedObjects.isEmpty()) { List selList = new ArrayList<>(selectedObjects); int m = selList.size(); - boolean addedInsertLinkAction = false; Collection associations = presenter.fetchAllAssociations(); if (associations == null) { return items; } for (MAssociation assoc : associations) { - if (assoc.isReadOnly()) continue; + if (assoc.isReadOnly()) { + continue; + } List ends = assoc.associationEnds(); int n = ends == null ? 0 : ends.size(); - if (n == 0) continue; - if (m > n) continue; // more selected objects than ends + if (n == 0 || m > n) { + continue; + } int pow = 1; - for (int i = 0; i < n; ++i) pow *= m; - for (int i = 0; i < pow; ++i) { - int[] digits = radixConversion(i, m, n); - if (!isCompleteObjectCombination(digits, m)) continue; - MObject[] l = new MObject[n]; - MClass[] c = new MClass[n]; - for (int j = 0; j < n; ++j) { - l[j] = selList.get(digits[j]); - c[j] = l[j].cls(); + for (int i = 0; i < n; i++) { + pow *= m; + } + for (int value = 0; value < pow; value++) { + int[] digits = radixConversion(value, m, n); + if (!isCompleteObjectCombination(digits, m)) { + continue; } - if (!assoc.isAssignableFrom(c)) continue; - Set links = presenter.fetchLinksOfAssociation(assoc).stream() - .filter(link -> matchesLink(link, l)) - .collect(Collectors.toSet()); - if (links.isEmpty() || assoc.hasQualifiedEnds()) { - String joinedNames = Arrays.stream(l).map(this::safeName).collect(Collectors.joining(",")); - String insLabel = "insert (" + joinedNames + ") into " + assoc.name(); - JMenuItem ins = buildMenuItem(insLabel, ev -> presenter.onInsertLink(assoc, Arrays.asList(l))); - items.add(ins); - addedInsertLinkAction = true; + MObject[] tuple = new MObject[n]; + MClass[] types = new MClass[n]; + for (int idx = 0; idx < n; idx++) { + tuple[idx] = selList.get(digits[idx]); + types[idx] = tuple[idx].cls(); } - if (!links.isEmpty()) { - for (MLink link : links) { - JMenuItem del = buildMenuItem("delete " + link.toString(), ev -> presenter.onDeleteLink(link)); - items.add(del); - addedInsertLinkAction = true; - } + if (!assoc.isAssignableFrom(types)) { + continue; + } + String joined = Arrays.stream(tuple).map(this::safeName).reduce((a, b) -> a + "," + b).orElse("..."); + items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), + ev -> presenter.onInsertLink(assoc, Arrays.asList(tuple)))); + if (items.size() == INSERT_SLOT_COUNT) { + return items; } } } - return items; } Collection associations = presenter.fetchAllAssociations(); - if (associations == null || associations.isEmpty()) { - return items; - } - for (MAssociation assoc : associations) { - List ends = assoc.associationEnds(); - if (ends == null || ends.isEmpty()) { - continue; - } - boolean possible = true; - for (MAssociationEnd end : ends) { - Set candidates = presenter.fetchObjectsOfClass(end.cls()); - if (candidates == null || candidates.isEmpty()) { - possible = false; - break; + if (associations != null) { + for (MAssociation assoc : associations) { + items.add(buildMenuItem("insert (...) into " + assoc.name(), + ev -> presenter.onInsertLinkInteractive(selectedObjects))); + if (items.size() == INSERT_SLOT_COUNT) { + return items; } } - if (!possible) continue; - int required = ends.size(); - boolean selectionEmpty = selectedObjects == null || selectedObjects.isEmpty(); - boolean selectionMatches = selectedObjects != null && selectedObjects.size() == required; - String label; - if (!selectionEmpty && selectedObjects.size() == 1 && required == 2) { - String name = safeName(selectedObjects.iterator().next()); - label = "insert (" + name + "," + name + ") into " + assoc.name(); - } else { - label = "insert into " + assoc.name(); - } - JMenuItem mi = buildMenuItem(label, ev -> { - if (selectionMatches) { - presenter.onInsertLink(assoc, new ArrayList<>(selectedObjects)); - } else { - presenter.onInsertLinkInteractive(selectedObjects); - } - }); - mi.setEnabled(selectionMatches || selectionEmpty); - items.add(mi); + } + + while (items.size() < INSERT_SLOT_COUNT) { + items.add(buildMenuItem("insert (...) into ...", + ev -> presenter.onInsertLinkInteractive(selectedObjects))); } return items; } - private JMenuItem buildShowHiddenElementsIfNeeded(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { - if (diagram == null || presenter == null) return null; - try { - Method m = diagram.getClass().getMethod("getHiddenData"); - Object hidden = m.invoke(diagram); - if (hidden == null) return null; - Method getEdges = null; - Method getNodes = null; - try { getEdges = hidden.getClass().getMethod("getEdges"); } catch (NoSuchMethodException ignored) {} - try { getNodes = hidden.getClass().getMethod("getNodes"); } catch (NoSuchMethodException ignored) {} - boolean hasHidden = false; - if (getEdges != null) { - Object edges = getEdges.invoke(hidden); - if (edges instanceof Collection) { - hasHidden = !((Collection) edges).isEmpty(); - } - } - if (!hasHidden && getNodes != null) { - Object nodes = getNodes.invoke(hidden); - if (nodes instanceof Collection) { - hasHidden = !((Collection) nodes).isEmpty(); - } - } - if (hasHidden) { - JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); - showAllObjects.addActionListener(ev -> { - try { presenter.onShowHiddenElements(); } catch (Throwable ignored) {} - }); - return showAllObjects; - } - } catch (Throwable ignored) {} - return null; + private JMenuItem buildHideSelectedItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Hide " + describeSelection(selectedObjects), + ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs))); } - private HideCropGroup buildHideCropGreyTopLevel(NewObjectDiagramPresenter presenter, - ObjectDiagramInteractor diagram, - Set selectedObjects, - Set selectedLinks) { - // Build labels according to selection - int size = (selectedObjects == null ? 0 : selectedObjects.size()) + (selectedLinks == null ? 0 : selectedLinks.size()); - String hideLabel; - String cropLabel; - if (size > 1) { - hideLabel = "Hide " + size + " elements"; - cropLabel = "Crop " + size + " elements"; - } else if (selectedObjects != null && selectedObjects.size() == 1) { - String name = safeName(selectedObjects.iterator().next()); - hideLabel = "Hide " + name; - cropLabel = "Crop " + name; - } else { - hideLabel = "Hide selected"; - cropLabel = "Crop selected"; - } - - List topItems = new ArrayList<>(); - JMenuItem displayHide = buildMenuItem(hideLabel, ev -> { - presenter.onHideLinks(selectedLinks); - presenter.onHideObjects(selectedObjects); - presenter.onStatusMessage("Selected elements hidden"); - }); - topItems.add(displayHide); - - JMenuItem displayCrop = buildMenuItem(cropLabel, ev -> { - Set objectsToHide = new HashSet<>(selectedObjects == null ? Set.of() : selectedObjects); - if (selectedLinks != null) { - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject linkObject) { - objectsToHide.add(linkObject); - } else { - objectsToHide.addAll(link.linkedObjects()); - } - }); - } - presenter.onCropSelection(objectsToHide); - presenter.onStatusMessage("Cropped selection"); - }); - topItems.add(displayCrop); - - int greyed = 0; - int visible = 0; - if (selectedObjects != null) { - for (MObject obj : selectedObjects) { - if (diagram != null && diagram.isGreyed(obj)) { - greyed++; - } else { - visible++; - } - } - } - if (greyed > 0) { - String labelGreyIn; - if (selectedObjects != null && selectedObjects.size() == 1) { - labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); - } else { - labelGreyIn = "Grey in selected"; - if (greyed > 1) labelGreyIn += " (" + greyed + ")"; - } - topItems.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); - } - if (visible > 0) { - String labelGreyOut; - if (selectedObjects != null && selectedObjects.size() == 1) { - labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); + private JMenuItem buildCropSelectedItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Crop " + describeSelection(selectedObjects), ev -> { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select objects before cropping."); } else { - labelGreyOut = "Grey out selected"; - if (visible > 1) labelGreyOut += " (" + visible + ")"; + presenter.onCropSelection(new HashSet<>(selectedObjects)); } - topItems.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); - } - - JMenuItem hideItem = new JMenuItem(hideLabel); - hideItem.addActionListener(ev -> { - presenter.onHideLinks(selectedLinks); - presenter.onHideObjects(selectedObjects); - presenter.onStatusMessage("Selected elements hidden"); - }); - JMenuItem cropItem = new JMenuItem(cropLabel); - cropItem.addActionListener(ev -> { - Set objectsToHide = new HashSet<>(selectedObjects == null ? Set.of() : selectedObjects); - if (selectedLinks != null) { - selectedLinks.forEach(link -> { - if (link instanceof MLinkObject linkObject) { - objectsToHide.add(linkObject); - } else { - objectsToHide.addAll(link.linkedObjects()); - } - }); - } - presenter.onCropSelection(objectsToHide); - presenter.onStatusMessage("Cropped selection"); }); + } - return new HideCropGroup(topItems, hideItem, cropItem); + private JMenuItem buildGreyOutItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Grey out " + describeSelection(selectedObjects), + ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayOut(objs))); } - private JMenu buildShowHideCropSubmenu(NewObjectDiagramPresenter presenter, ObjectDiagramInteractor diagram, Set selectedObjects, HideCropGroup hideCrop) { - JMenu showHideCrop = new JMenu("Show/hide/crop objects"); - if (hideCrop != null) { - showHideCrop.add(hideCrop.hideItem); - showHideCrop.add(hideCrop.cropItem); - addGreyItems(showHideCrop, diagram, presenter, selectedObjects == null ? Set.of() : selectedObjects); - } - return showHideCrop; + private JMenu buildShowHideCropMenu(NewObjectDiagramPresenter presenter, + ObjectDiagramInteractor diagram, + Set selectedObjects, + Set selectedLinks) { + JMenu menu = new JMenu("Show/hide/crop objects"); + menu.add(buildMenuItem("Show hidden elements", ev -> presenter.onShowHiddenElements())); + menu.add(buildMenuItem("Hide selected objects", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs)))); + menu.add(buildMenuItem("Crop selection", ev -> { + if (selectedObjects.isEmpty() && selectedLinks.isEmpty()) { + presenter.onStatusMessage("Select objects or links to crop."); + return; + } + Set targets = new HashSet<>(selectedObjects); + selectedLinks.forEach(link -> targets.addAll(link.linkedObjects())); + presenter.onCropSelection(targets); + })); + menu.add(buildMenuItem("Grey out selection", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayOut(objs)))); + menu.add(buildMenuItem("Grey in selection", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayIn(objs)))); + if (diagram instanceof NewObjectDiagram newDiagram) { + menu.addSeparator(); + menu.add(buildMenuItem("Show all objects", ev -> newDiagram.showAll())); + menu.add(buildMenuItem("Hide all objects", ev -> newDiagram.hideAll())); + } + return menu; } - private JMenu buildHideObjectsSubmenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { - JMenu hideObjectsMenu = new JMenu("Hide objects"); - JMenuItem mi = buildMenuItem("Hide selected objects", ev -> presenter.onHideObjects(selectedObjects == null ? Set.of() : selectedObjects)); - mi.setEnabled(selectedObjects != null && !selectedObjects.isEmpty()); - hideObjectsMenu.add(mi); - return hideObjectsMenu; + private JMenu buildHideObjectsMenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { + JMenu menu = new JMenu("Hide objects"); + menu.add(buildMenuItem("Hide selected objects", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs)))); + menu.add(buildMenuItem("Show hidden objects", ev -> presenter.onShowHiddenElements())); + return menu; } - private JMenu buildHideLinksSubmenu(NewObjectDiagramPresenter presenter, Set selectedLinks) { - JMenu hideLinksMenu = new JMenu("Hide links"); - JMenuItem mi = buildMenuItem("Hide selected links", ev -> presenter.onHideLinks(selectedLinks == null ? Set.of() : selectedLinks)); - mi.setEnabled(selectedLinks != null && !selectedLinks.isEmpty()); - hideLinksMenu.add(mi); - return hideLinksMenu; + private JMenu buildHideLinksMenu(NewObjectDiagramPresenter presenter, Set selectedLinks) { + JMenu menu = new JMenu("Hide links"); + menu.add(buildMenuItem("Hide selected links", ev -> { + if (selectedLinks.isEmpty()) { + presenter.onStatusMessage("Select links to hide."); + } else { + presenter.onHideLinks(selectedLinks); + } + })); + menu.add(buildMenuItem("Show all links", ev -> presenter.onShowAllLinks())); + menu.add(buildMenuItem("Hide all links", ev -> presenter.onHideAllLinks())); + return menu; + } + + private JMenu buildLinksByKindMenu(ObjectDiagramInteractor diagram) { + JMenu menu = new JMenu("Show/hide links-by-kind"); + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + menu.add(buildMenuItem("Not available", ev -> {})); + return menu; + } + + TreeMap> grouped = newDiagram.mapLinksToKindOfAssociation(); + if (grouped.isEmpty()) { + menu.add(buildMenuItem("No associations", ev -> {})); + return menu; + } + + MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); + menu.add(buildMenuItem("Show all links", ev -> { + newDiagram.showAllLinks(); + newDiagram.repaint(); + })); + menu.add(buildMenuItem("Hide all links", ev -> { + newDiagram.hideAllLinks(); + newDiagram.repaint(); + })); + menu.addSeparator(); + + for (Map.Entry> entry : grouped.entrySet()) { + JMenu assocMenu = new JMenu(entry.getKey()); + List links = entry.getValue(); + assocMenu.add(buildMenuItem("Show all", ev -> { + newDiagram.showLink(links); + newDiagram.repaint(); + })); + assocMenu.add(buildMenuItem("Hide all", ev -> { + newDiagram.hideLink(links); + newDiagram.repaint(); + })); + assocMenu.addSeparator(); + for (MLink link : links) { + assocMenu.add(buildMenuItem(formatLinkLabel("Show", link), ev -> { + newDiagram.showLink(link); + newDiagram.repaint(); + })); + assocMenu.add(buildMenuItem(formatLinkLabel("Hide", link), ev -> { + newDiagram.hideLink(link); + newDiagram.repaint(); + })); + } + menu.add(assocMenu); + } + return menu; } - private JMenuItem buildLinksByKindPlaceholder() { - JMenuItem placeholder = new JMenuItem("Show/hide links-by-kind"); - placeholder.setEnabled(false); - return placeholder; + private String formatLinkLabel(String prefix, MLink link) { + return prefix + " " + link.toString(); } - private JMenuItem buildProtocolStatePlaceholder() { - JMenuItem placeholder = new JMenuItem("Show protocol state machine..."); - placeholder.setEnabled(false); - return placeholder; + private JMenuItem buildProtocolStateMachineItem(NewObjectDiagramPresenter presenter) { + return buildMenuItem("Show protocol state machine...", ev -> presenter.onStatusMessage("Protocol state machine view not implemented yet.")); } private JMenuItem buildCommentNode(NewObjectDiagramPresenter presenter) { - JMenuItem mi = buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")); - return mi; + return buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")); } - private void addGreyItems(JComponent menu, - ObjectDiagramInteractor diagram, - NewObjectDiagramPresenter presenter, - Set selectedObjects) { - int greyed = 0; - int visible = 0; - for (MObject obj : selectedObjects) { - if (diagram != null && diagram.isGreyed(obj)) { - greyed++; - } else { - visible++; - } - } - if (greyed > 0) { - String labelGreyIn; - if (selectedObjects.size() == 1) { - labelGreyIn = "Grey in " + safeName(selectedObjects.iterator().next()); - } else { - labelGreyIn = "Grey in selected"; - if (greyed > 1) { - labelGreyIn += " (" + greyed + ")"; - } - } - menu.add(buildMenuItem(labelGreyIn, ev -> presenter.onGrayIn(selectedObjects))); - } - if (visible > 0) { - String labelGreyOut; - if (selectedObjects.size() == 1) { - labelGreyOut = "Grey out " + safeName(selectedObjects.iterator().next()); - } else { - labelGreyOut = "Grey out selected"; - if (visible > 1) { - labelGreyOut += " (" + visible + ")"; - } + + private JMenuItem buildShowStatesToggle(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + boolean initial = diagram != null && diagram.isShowStates(); + JCheckBoxMenuItem item = new JCheckBoxMenuItem("Show states", initial); + item.addItemListener(ev -> { + boolean selected = ev.getStateChange() == ItemEvent.SELECTED; + presenter.onToggleShowStates(selected); + if (diagram != null) { + diagram.setShowStates(selected); + diagram.invalidateContent(true); } - menu.add(buildMenuItem(labelGreyOut, ev -> presenter.onGrayOut(selectedObjects))); - } + }); + return item; } - private String safeName(MObject obj) { - try { return obj == null ? "" : obj.name(); } catch (Exception e) { return ""; } + + private JMenuItem buildStatusItem(String label, NewObjectDiagramPresenter presenter) { + return buildMenuItem(label, ev -> presenter.onStatusMessage(label + " is managed by the base view.")); } - /** - * Remove leading/trailing separators and collapse consecutive separators. - */ - private void normalizeSeparators(JPopupMenu popupMenu) { - if (popupMenu == null) { - return; - } - // Remove leading separators - while (popupMenu.getComponentCount() > 0 && popupMenu.getComponent(0) instanceof JSeparator) { - popupMenu.remove(0); + + private JMenuItem buildMenuItem(String label, ActionListener listener) { + JMenuItem item = new JMenuItem(label); + item.addActionListener(listener); + return item; + } + + private String safeName(MObject obj) { + try { + return obj == null ? "" : obj.name(); + } catch (Exception e) { + return ""; } - // Remove trailing separators - while (popupMenu.getComponentCount() > 0 && popupMenu.getComponent(popupMenu.getComponentCount() - 1) instanceof JSeparator) { - popupMenu.remove(popupMenu.getComponentCount() - 1); + } + + private String describeSelection(Set selectedObjects) { + if (selectedObjects.isEmpty()) { + return ""; } - // Collapse consecutive separators - for (int i = 1; i < popupMenu.getComponentCount(); i++) { - if (popupMenu.getComponent(i) instanceof JSeparator && popupMenu.getComponent(i - 1) instanceof JSeparator) { - popupMenu.remove(i); - i--; // stay at same index to check for further duplicates - } + if (selectedObjects.size() == 1) { + return safeName(selectedObjects.iterator().next()); } + return selectedObjects.size() + " objects"; } - /** - * Adds a "Show hidden elements" menu entry if the diagram reports hidden nodes/edges. - * Uses reflection to avoid requiring a direct API on ObjectDiagramInteractor. - */ - private int addShowHiddenElementsIfNeeded(JPopupMenu popupMenu, - ObjectDiagramInteractor diagram, - NewObjectDiagramPresenter presenter, - int pos) { - if (diagram == null || presenter == null) { - return pos; - } - try { - Method m = diagram.getClass().getMethod("getHiddenData"); - Object hidden = m.invoke(diagram); - if (hidden == null) { - return pos; - } - Method getEdges = null; - Method getNodes = null; - try { getEdges = hidden.getClass().getMethod("getEdges"); } catch (NoSuchMethodException ignored) {} - try { getNodes = hidden.getClass().getMethod("getNodes"); } catch (NoSuchMethodException ignored) {} - boolean hasHidden = false; - if (getEdges != null) { - Object edges = getEdges.invoke(hidden); - if (edges instanceof Collection) { - hasHidden = !((Collection) edges).isEmpty(); - } - } - if (!hasHidden && getNodes != null) { - Object nodes = getNodes.invoke(hidden); - if (nodes instanceof Collection) { - hasHidden = !((Collection) nodes).isEmpty(); - } - } - if (hasHidden) { - JMenuItem showAllObjects = new JMenuItem("Show hidden elements"); - showAllObjects.addActionListener(ev -> { - try { presenter.onShowHiddenElements(); } catch (Throwable ignored) {} - }); - popupMenu.insert(showAllObjects, pos++); - } - } catch (Throwable ignored) { - // reflection failed -> silently skip + + private void hideOrWarn(NewObjectDiagramPresenter presenter, + Set selectedObjects, + Consumer> action) { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select at least one object to perform this action."); + return; } - return pos; + action.accept(selectedObjects); } - // helper: radix conversion for enumerating assignments + private int[] radixConversion(int value, int radix, int length) { int[] digits = new int[length]; for (int i = 0; i < length; i++) { @@ -908,7 +414,7 @@ private int[] radixConversion(int value, int radix, int length) { } return digits; } - // helper: ensure that every selected object index [0..m-1] appears at least once in digits + private boolean isCompleteObjectCombination(int[] digits, int m) { boolean[] used = new boolean[m]; int usedCount = 0; @@ -920,18 +426,4 @@ private boolean isCompleteObjectCombination(int[] digits, int m) { } return usedCount == m; } - // helper: check whether a link connects exactly the objects in l (multiset match) - private boolean matchesLink(MLink link, MObject[] l) { - if (link == null) return false; - java.util.List linked = new ArrayList<>(); - link.linkedObjects().forEach(linked::add); - if (linked.size() != l.length) return false; - for (MObject o : l) { - boolean removed = linked.remove(o); - if (!removed) return false; - } - return linked.isEmpty(); - } - - // BoxMenuElement removed: use plain JMenuItems so hide/crop/grey appear like insert entries -} +} \ No newline at end of file From 0d30ba40f5e4d4c59611dc4ecccf5a2ff24dfaed Mon Sep 17 00:00:00 2001 From: ahmed Date: Sat, 28 Mar 2026 22:17:37 +0100 Subject: [PATCH 26/34] Generate insert menu entries dynamically --- .../DefaultContextMenuProvider.java | 87 +++++++++++++------ 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index 4fe6d2a12..96d1abcde 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -28,8 +29,6 @@ public class DefaultContextMenuProvider implements ContextMenuProvider { - private static final int INSERT_SLOT_COUNT = 3; - @Override public void enhanceMenu(JPopupMenu popupMenu, ObjectDiagramInteractor diagram, @@ -162,15 +161,23 @@ private List buildInsertItems(NewObjectDiagramPresenter presenter, Se return items; } - if (!selectedObjects.isEmpty()) { + Collection assocCollection = presenter.fetchAllAssociations(); + List associations = assocCollection == null ? new ArrayList<>() : new ArrayList<>(assocCollection); + associations.removeIf(Objects::isNull); + associations.sort(Comparator.comparing( + MAssociation::name, + Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); + + boolean addedCombinationEntries = false; + + if (selectedObjects != null && !selectedObjects.isEmpty()) { List selList = new ArrayList<>(selectedObjects); + selList.removeIf(Objects::isNull); + selList.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); int m = selList.size(); - Collection associations = presenter.fetchAllAssociations(); - if (associations == null) { - return items; - } + for (MAssociation assoc : associations) { - if (assoc.isReadOnly()) { + if (assoc == null || assoc.isReadOnly()) { continue; } List ends = assoc.associationEnds(); @@ -178,10 +185,17 @@ private List buildInsertItems(NewObjectDiagramPresenter presenter, Se if (n == 0 || m > n) { continue; } + + Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); + if (associationLinks == null) { + associationLinks = List.of(); + } + int pow = 1; for (int i = 0; i < n; i++) { pow *= m; } + for (int value = 0; value < pow; value++) { int[] digits = radixConversion(value, m, n); if (!isCompleteObjectCombination(digits, m)) { @@ -196,31 +210,33 @@ private List buildInsertItems(NewObjectDiagramPresenter presenter, Se if (!assoc.isAssignableFrom(types)) { continue; } - String joined = Arrays.stream(tuple).map(this::safeName).reduce((a, b) -> a + "," + b).orElse("..."); - items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), - ev -> presenter.onInsertLink(assoc, Arrays.asList(tuple)))); - if (items.size() == INSERT_SLOT_COUNT) { - return items; - } - } - } - } - Collection associations = presenter.fetchAllAssociations(); - if (associations != null) { - for (MAssociation assoc : associations) { - items.add(buildMenuItem("insert (...) into " + assoc.name(), - ev -> presenter.onInsertLinkInteractive(selectedObjects))); - if (items.size() == INSERT_SLOT_COUNT) { - return items; + String joined = Arrays.stream(tuple) + .map(this::safeName) + .reduce((a, b) -> a + "," + b) + .orElse("..."); + + MLink existingLink = findMatchingLink(tuple, associationLinks); + if (existingLink != null) { + MLink linkForDeletion = existingLink; + items.add(buildMenuItem("delete (" + joined + ") from " + assoc.name(), + ev -> presenter.onDeleteLink(linkForDeletion))); + } else { + MAssociation currentAssoc = assoc; + List tupleList = Arrays.asList(tuple.clone()); + items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), + ev -> presenter.onInsertLink(currentAssoc, tupleList))); + } + addedCombinationEntries = true; } } } - while (items.size() < INSERT_SLOT_COUNT) { + if (!addedCombinationEntries) { items.add(buildMenuItem("insert (...) into ...", - ev -> presenter.onInsertLinkInteractive(selectedObjects))); + ev -> presenter.onInsertLinkInteractive(selectedObjects == null ? Set.of() : selectedObjects))); } + return items; } @@ -426,4 +442,21 @@ private boolean isCompleteObjectCombination(int[] digits, int m) { } return usedCount == m; } -} \ No newline at end of file + + private MLink findMatchingLink(MObject[] tuple, Collection associationLinks) { + outerLinks: for (MLink link : associationLinks) { + List linkObjects = link.linkedObjects(); + if (linkObjects == null || linkObjects.size() != tuple.length) { + continue; + } + for (int idx = 0; idx < tuple.length; idx++) { + if (linkObjects.get(idx) != tuple[idx]) { + continue outerLinks; + } + } + return link; + } + return null; + } +} + From 39049f17d230f0f99efae3ae69d95b2290ecc03d Mon Sep 17 00:00:00 2001 From: ahmed Date: Mon, 6 Apr 2026 22:58:08 +0200 Subject: [PATCH 27/34] Commits bereinigt --- .gitignore | 12 + .idea/.gitignore | 8 - .idea/encodings.xml | 15 - .idea/inspectionProfiles/Project_Default.xml | 6 - .idea/misc.xml | 17 - .idea/vcs.xml | 6 - .../ant_cycles_history_no_tests.csv | 637 --------------- .../ant_cycles_history_with_tests.csv | 637 --------------- docs/archunit-history/ant_layers_history.csv | 637 --------------- .../maven_build_time_history.csv | 65 -- .../archunit-history/maven_cycles_history.csv | 64 -- .../archunit-history/maven_layers_history.csv | 65 -- docs/archunit-results/README | 2 +- docs/scripts/Ant/ant_cycles_test.ps1 | 284 ------- docs/scripts/Ant/ant_layer_test.ps1 | 190 ----- docs/scripts/Ant/ant_utilities.ps1 | 297 ------- docs/scripts/Maven/maven_buildtime_test.ps1 | 139 ---- docs/scripts/Maven/maven_cycles_test.ps1 | 288 ------- docs/scripts/Maven/maven_layer_test.ps1 | 218 ----- docs/scripts/Maven/maven_utilities.ps1 | 102 --- docs/scripts/general_utilities.ps1 | 204 ----- log.txt | 10 - use-core/.ai/mcp/mcp.json | 0 .../src/main/java/org/tzi/use/util/Debug.java | 33 + .../main/resources/etc/java-header-use.txt | 18 - .../Documentation/AssociationClass/Info.txt | 15 - .../examples/Documentation/Demo/Info.txt | 35 - .../examples/Documentation/Employee/Info.txt | 25 - .../examples/Documentation/Graph/Info.txt | 21 - .../00readme.txt | 199 ----- .../NestedOperationCalls/Info.txt | 19 - .../examples/Metamodels/OCL2MM/Info.txt | 7 - .../examples/Metamodels/UML13All/Info.txt | 11 - .../examples/Metamodels/UML13Core/Info.txt | 8 - .../examples/Metamodels/UML23/Info.txt | 7 - .../Metamodels/actionsemantics/Info.txt | 2 - .../resources/examples/Others/AB/Info.txt | 21 - .../examples/Others/CallSequence/Info.txt | 12 - .../examples/Others/CarRental/Info.txt | 21 - .../resources/examples/Others/Empty/Info.txt | 7 - .../resources/examples/Others/Ex/Info.txt | 13 - .../examples/Others/Grammar/Info.txt | 25 - .../resources/examples/Others/Job/Info.txt | 13 - .../resources/examples/Others/Lists/Info.txt | 14 - .../resources/examples/Others/Math/Info.txt | 14 - .../Others/MultipleInheritance/Info.txt | 9 - .../resources/examples/Others/Person/Info.txt | 12 - .../examples/Others/Polygon/Info.txt | 21 - .../examples/Others/Project/Info.txt | 13 - .../Others/RecursiveOperations/Info.txt | 11 - .../Others/ReflexiveAssociation/Info.txt | 12 - .../examples/Others/Student/Info.txt | 10 - .../sudoku_lh_Result_V1_no_constraints.txt | 157 ---- .../sudoku_lh_Result_V2_valid_solution.txt | 30 - .../examples/Others/SwapLinks/Info.txt | 23 - .../resources/examples/Others/Test/Info.txt | 6 - .../resources/examples/Others/Tree/Info.txt | 35 - .../Papers/1998/RichtersAndGogolla/Info.txt | 22 - .../Papers/1998/WarmerAndKleppe/Info.txt | 12 - .../Papers/1999/RichtersAndGogolla/Info.txt | 12 - .../EmployeeExtended/Info.txt | 23 - .../NestedOperationCalls/Info.txt | 1 - .../2005/GogollaBohlingRichters/info.txt | 39 - .../GogollaBuettnerRichters/sample_output.txt | 10 - .../generator/english/cycles/invariants.txt | 8 - .../english/predecessors/invariants.txt | 9 - .../german/schleifen/invarianten.txt | 9 - .../german/vorgaenger/invarianten.txt | 10 - .../oclextensions/README-Distributions.txt | 18 - .../resources/oclextensions/README-Random.txt | 63 -- use-gui/TESTS_ObjectDiagram_MVP.md | 47 ++ .../objectdiagram/ContextMenuProvider.java | 2 + .../DefaultContextMenuProvider.java | 753 ++++++++++++++---- .../diagrams/objectdiagram/MenuEntry.java | 0 .../objectdiagram/NewObjectDiagram.java | 18 +- .../NewObjectDiagramPresenter.java | 17 +- .../NewObjectDiagramPresenterImpl.java | 53 +- .../ObjectDiagramInteractor.java | 3 + .../objectdiagram/PresenterFileLogger.java | 146 ++++ .../PresenterFileLoggerTestMain.java | 20 + .../ShowHideCropMenuBuilder.java | 16 + .../main/resources/images/_image_licenses.txt | 20 - 82 files changed, 944 insertions(+), 5169 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 docs/archunit-history/ant_cycles_history_no_tests.csv delete mode 100644 docs/archunit-history/ant_cycles_history_with_tests.csv delete mode 100644 docs/archunit-history/ant_layers_history.csv delete mode 100644 docs/archunit-history/maven_build_time_history.csv delete mode 100644 docs/archunit-history/maven_cycles_history.csv delete mode 100644 docs/archunit-history/maven_layers_history.csv delete mode 100644 docs/scripts/Ant/ant_cycles_test.ps1 delete mode 100644 docs/scripts/Ant/ant_layer_test.ps1 delete mode 100644 docs/scripts/Ant/ant_utilities.ps1 delete mode 100644 docs/scripts/Maven/maven_buildtime_test.ps1 delete mode 100644 docs/scripts/Maven/maven_cycles_test.ps1 delete mode 100644 docs/scripts/Maven/maven_layer_test.ps1 delete mode 100644 docs/scripts/Maven/maven_utilities.ps1 delete mode 100644 docs/scripts/general_utilities.ps1 delete mode 100644 log.txt create mode 100644 use-core/.ai/mcp/mcp.json create mode 100644 use-core/src/main/java/org/tzi/use/util/Debug.java delete mode 100644 use-core/src/main/resources/etc/java-header-use.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/Demo/Info.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/Employee/Info.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/Graph/Info.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt delete mode 100644 use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt delete mode 100644 use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt delete mode 100644 use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt delete mode 100644 use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt delete mode 100644 use-core/src/main/resources/examples/Metamodels/UML23/Info.txt delete mode 100644 use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/AB/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/CallSequence/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/CarRental/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Empty/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Ex/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Grammar/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Job/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Lists/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Math/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Person/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Polygon/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Project/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Student/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt delete mode 100644 use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt delete mode 100644 use-core/src/main/resources/examples/Others/SwapLinks/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Test/Info.txt delete mode 100644 use-core/src/main/resources/examples/Others/Tree/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt delete mode 100644 use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt delete mode 100644 use-core/src/main/resources/examples/generator/english/cycles/invariants.txt delete mode 100644 use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt delete mode 100644 use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt delete mode 100644 use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt delete mode 100644 use-core/src/main/resources/oclextensions/README-Distributions.txt delete mode 100644 use-core/src/main/resources/oclextensions/README-Random.txt create mode 100644 use-gui/TESTS_ObjectDiagram_MVP.md create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java create mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java delete mode 100644 use-gui/src/main/resources/images/_image_licenses.txt diff --git a/.gitignore b/.gitignore index 0d379eafe..8cb0c1ed0 100644 --- a/.gitignore +++ b/.gitignore @@ -117,3 +117,15 @@ fabric.properties /use-assembly/target **/.DS_Store +/.idea +/tools/ +/pic/ +*.txt +/use_refactor_logs/ +*.csv +*.ps1 + +/backups/ +/use-gui/scripts/ +*.puml +/use-gui/src/main/resources/lib/ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e62911258..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/../../../../../:\Dev\USE\use\.idea/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 882bb50c6..000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 40155f00c..000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 136227842..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/docs/archunit-history/ant_cycles_history_no_tests.csv b/docs/archunit-history/ant_cycles_history_no_tests.csv deleted file mode 100644 index e2eb033c1..000000000 --- a/docs/archunit-history/ant_cycles_history_no_tests.csv +++ /dev/null @@ -1,637 +0,0 @@ -date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util -2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,26,0,0,0,1,0,1,0,5,0 -2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,26,0,0,0,1,0,1,0,5,0 -2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,26,0,0,0,1,0,1,0,5,0 -2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,26,0,0,0,1,0,1,0,5,0 -2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,26,0,0,0,1,0,1,0,5,0 -2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,26,0,0,0,1,0,1,0,5,0 -2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,26,0,0,0,1,0,1,0,5,0 -2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,26,0,0,0,1,0,1,0,5,0 -2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,26,0,0,0,1,0,1,0,5,0 -2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,26,0,0,0,1,0,1,0,5,0 -2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,26,0,0,0,1,0,1,0,5,0 -2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,26,0,0,0,1,0,1,0,5,0 -2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,26,0,0,0,1,0,1,0,5,0 -2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,26,0,0,0,1,0,1,0,5,0 -2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,26,0,0,0,1,0,1,0,5,0 -2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,26,0,0,0,1,0,1,0,5,0 -2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,26,0,0,0,1,0,1,0,5,0 -2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,26,0,0,0,1,0,1,0,5,0 -2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,26,0,0,0,1,0,1,0,5,0 -2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,26,0,0,0,1,0,1,0,5,0 -2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,26,0,0,0,1,0,1,0,5,0 -2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,26,0,0,0,1,0,1,0,5,0 -2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,26,0,0,0,1,0,1,0,5,0 -2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,26,0,0,0,1,0,1,0,5,0 -2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,26,0,0,0,1,0,1,0,5,0 -2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,26,0,0,0,1,0,1,0,5,0 -2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,26,0,0,0,1,0,1,0,5,0 -2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,26,0,0,0,1,0,1,0,5,0 -2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,26,0,0,0,1,0,1,0,5,0 -2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,26,0,0,0,1,0,1,0,5,0 -2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,26,0,0,0,1,0,1,0,5,0 -2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,26,0,0,0,1,0,1,0,5,0 -2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,26,0,0,0,1,0,1,0,5,0 -2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,26,0,0,0,1,0,1,0,5,0 -2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,26,0,0,0,1,0,1,0,5,0 -2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,26,0,0,0,1,0,1,0,5,0 -2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,26,0,0,0,1,0,1,0,5,0 -2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,26,0,0,0,1,0,1,0,5,0 -2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,26,0,0,0,1,0,1,0,5,0 -2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,26,0,0,0,1,0,1,0,5,0 -2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,26,0,0,0,1,0,1,0,5,0 -2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,26,0,0,0,1,0,1,0,5,0 -2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,26,0,0,0,1,0,1,0,5,0 -2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,26,0,0,0,1,0,1,0,5,0 -2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,26,0,0,0,1,0,1,0,5,0 -2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,26,0,0,0,1,0,1,0,5,0 -2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,26,0,0,0,1,0,1,0,5,0 -2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,26,0,0,0,1,0,1,0,5,0 -2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,26,0,0,0,1,0,1,0,5,0 -2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,26,0,0,0,1,0,1,0,5,0 -2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,26,0,0,0,1,0,1,0,5,0 -2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,26,0,0,0,1,0,1,0,5,0 -2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,26,0,0,0,1,0,1,0,5,0 -2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,26,0,0,0,1,0,1,0,5,0 -2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,26,0,0,0,1,0,1,0,5,0 -2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,26,0,0,0,1,0,1,0,5,0 -2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,26,0,0,0,1,0,1,0,5,0 -2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,26,0,0,0,1,0,1,0,5,0 -2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,26,0,0,0,1,0,1,0,5,0 -2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,26,0,0,0,1,0,1,0,5,0 -2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,26,0,0,0,1,0,1,0,5,0 -2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,26,0,0,0,1,0,1,0,5,0 -2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,26,0,0,0,1,0,1,0,5,0 -2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,26,0,0,0,1,0,1,0,5,0 -2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,26,0,0,0,1,0,1,0,5,0 -2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,26,0,0,0,1,0,1,2,5,0 -2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,26,0,0,0,1,0,1,2,5,0 -2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,26,0,0,0,1,0,1,2,5,0 -2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,26,0,0,0,1,0,1,2,5,0 -2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,26,0,0,0,1,0,1,2,5,0 -2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,26,0,0,0,1,0,1,2,5,0 -2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,26,0,0,0,1,0,1,2,5,0 -2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,26,0,0,0,1,0,1,2,5,0 -2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,26,0,0,0,1,0,1,2,5,0 -2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,26,0,0,0,1,0,1,2,5,0 -2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,26,0,0,0,1,0,1,2,5,0 -2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,26,0,0,0,1,0,1,2,5,0 -2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,26,0,0,0,1,0,1,2,5,0 -2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,26,0,0,0,1,0,1,2,5,0 -2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,26,0,0,0,1,0,1,2,5,0 -2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,26,0,0,0,1,0,1,2,5,0 -2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,26,0,0,0,1,0,1,2,5,0 -2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,26,0,0,0,1,0,1,2,5,0 -2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,26,0,0,0,1,0,1,2,5,0 -2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,26,0,0,0,1,0,1,2,5,0 -2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,26,0,0,0,1,0,1,2,5,0 -2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,26,0,0,0,1,0,1,2,5,0 -2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,26,0,0,0,1,0,1,2,5,0 -2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,26,0,0,0,1,0,1,2,5,0 -2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,26,0,0,0,1,0,1,2,5,0 -2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,26,0,0,0,1,0,1,2,5,0 -2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,26,0,0,0,1,0,1,2,5,0 -2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,26,0,0,0,1,0,1,2,5,0 -2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,26,0,0,0,1,0,1,2,5,0 -2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,26,0,0,0,1,0,1,2,5,0 -2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,26,0,0,0,1,0,1,2,5,0 -2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,26,0,0,0,1,0,1,2,5,0 -2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,26,0,0,0,1,0,1,2,5,0 -2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,26,0,0,0,1,0,1,2,5,0 -2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,26,0,0,0,1,0,1,2,5,0 -2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,26,0,0,0,1,0,1,2,5,0 -2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,26,0,0,0,1,0,1,2,5,0 -2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,26,0,0,0,1,0,1,2,5,0 -2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,26,0,0,0,1,0,1,2,5,0 -2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,26,0,0,0,1,0,1,2,5,0 -2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,26,0,0,0,1,0,1,2,5,0 -2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,26,0,0,0,1,0,1,2,5,0 -2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,26,0,0,0,1,0,1,2,5,0 -2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,26,0,0,0,1,0,1,2,5,0 -2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,26,0,0,0,1,0,1,2,5,0 -2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,26,0,0,0,1,0,1,2,5,0 -2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,26,0,0,0,1,0,1,2,5,0 -2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,26,0,0,0,1,0,1,2,5,0 -2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,26,0,0,0,1,0,1,2,5,0 -2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,26,0,0,0,1,0,1,2,5,0 -2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,26,0,0,0,1,0,1,2,5,0 -2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,26,0,0,0,1,0,1,2,5,0 -2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,26,0,0,0,1,0,1,2,5,0 -2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,26,0,0,0,1,0,1,2,5,0 -2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,26,0,0,0,1,0,1,2,5,0 -2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,26,0,0,0,1,0,1,2,5,0 -2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,26,0,0,0,1,0,1,2,5,0 -2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,26,0,0,0,1,0,1,2,5,0 -2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,26,0,0,0,1,0,1,2,5,0 -2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,26,0,0,0,1,0,1,2,5,0 -2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,26,0,0,0,1,0,1,2,5,0 -2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,26,0,0,0,1,0,1,2,5,0 -2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,26,0,0,0,1,0,1,2,5,0 -2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,26,0,0,0,1,0,1,2,5,0 -2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,26,0,0,0,1,0,1,2,5,0 -2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,26,0,0,0,1,0,1,2,5,0 -2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,26,0,0,0,1,0,1,2,5,0 -2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,26,0,0,0,1,0,1,2,5,0 -2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,26,0,0,0,1,0,1,2,5,0 -2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,26,0,0,0,1,0,1,2,5,0 -2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,26,0,0,0,1,0,1,2,5,0 -2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,26,0,0,0,1,0,1,2,5,0 -2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,26,0,0,0,1,0,1,2,5,0 -2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,26,0,0,0,1,0,1,2,5,0 -2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,26,0,0,0,1,0,1,2,5,0 -2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,26,0,0,0,1,0,1,2,5,0 -2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,26,0,0,0,1,0,1,2,5,0 -2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,26,0,0,0,1,0,1,2,5,0 -2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,26,0,0,0,1,0,1,2,5,0 -2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,26,0,0,0,1,0,1,2,5,0 -2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,26,0,0,0,1,0,1,2,5,0 -2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,26,0,0,0,1,0,1,2,5,0 -2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,26,0,0,0,1,0,1,2,5,0 -2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,26,0,0,0,1,0,1,2,5,0 -2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,26,0,0,0,1,0,1,2,5,0 -2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,26,0,0,0,1,0,1,2,5,0 -2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,26,0,0,0,1,0,1,2,5,0 -2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,26,0,0,0,1,0,1,2,5,0 -2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,26,0,0,0,1,0,1,2,5,0 -2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,26,0,0,0,1,0,1,2,5,0 -2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,26,0,0,0,1,0,1,2,5,0 -2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,26,0,0,0,1,0,1,2,5,0 -2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,26,0,0,0,1,0,1,2,5,0 -2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,26,0,0,0,1,0,1,2,5,0 -2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,26,0,0,0,1,0,1,2,5,0 -2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,26,0,0,0,1,0,1,2,5,0 -2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,26,0,0,0,1,0,1,2,5,0 -2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,26,0,0,0,1,0,1,2,5,0 -2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,26,0,0,0,1,0,1,2,5,0 -2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,26,0,0,0,1,0,1,2,5,0 -2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,26,0,0,0,1,0,1,2,5,0 -2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,26,0,0,0,1,0,1,2,5,0 -2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,26,0,0,0,1,0,1,2,5,0 -2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,26,0,0,0,1,0,1,2,5,0 -2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,26,0,0,0,1,0,1,2,5,0 -2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,26,0,0,0,1,0,1,2,5,0 -2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,26,0,0,0,1,0,1,2,5,0 -2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,26,0,0,0,1,0,1,2,5,0 -2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,26,0,0,0,1,0,1,2,5,0 -2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,26,0,0,0,1,0,1,2,5,0 -2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,26,0,0,0,1,0,1,2,5,0 -2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,26,0,0,0,1,0,1,2,5,0 -2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,26,0,0,0,1,0,1,2,5,0 -2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,26,0,0,0,1,0,1,2,5,0 -2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,26,0,0,0,1,0,1,2,5,0 -2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,26,0,0,0,1,0,1,2,5,0 -2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,26,0,0,0,1,0,1,2,5,0 -2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,26,0,0,0,1,0,1,2,5,0 -2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,26,0,0,0,1,0,1,2,5,0 -2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,26,0,0,0,1,0,1,2,5,0 -2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,26,0,0,0,1,0,1,2,5,0 -2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,26,0,0,0,1,0,1,2,5,0 -2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,26,0,0,0,1,0,1,2,5,0 -2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,26,0,0,0,1,0,1,2,5,0 -2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,26,0,0,0,1,0,1,2,5,0 -2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,26,0,0,0,1,0,1,2,5,0 -2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,26,0,0,0,1,0,1,2,5,0 -2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,26,0,0,0,1,0,1,2,5,0 -2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,26,0,0,0,1,0,1,2,5,0 -2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,26,0,0,0,1,0,1,2,5,0 -2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,26,0,0,0,1,0,1,2,5,0 -2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,26,0,0,0,1,0,1,2,5,0 -2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,26,0,0,0,1,0,1,2,5,0 -2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,26,0,0,0,1,0,1,2,5,0 -2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,26,0,0,0,1,0,1,2,5,0 -2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,26,0,0,0,1,0,1,2,5,0 -2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,26,0,0,0,1,0,1,2,5,0 -2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,26,0,0,0,1,0,1,2,5,0 -2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,26,0,0,0,1,0,1,2,5,0 -2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,26,0,0,0,1,0,1,2,5,0 -2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,26,0,0,0,1,0,1,2,5,0 -2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,26,0,0,0,1,0,1,2,5,0 -2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,26,0,0,0,1,0,1,2,5,0 -2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,26,0,0,0,1,0,1,2,5,0 -2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,26,0,0,0,1,0,1,2,5,0 -2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,26,0,0,0,1,0,1,2,5,0 -2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,26,0,0,0,1,0,1,2,5,0 -2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,26,0,0,0,1,0,1,2,5,0 -2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,26,0,0,0,1,0,1,2,5,0 -2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,26,0,0,0,1,0,1,2,5,0 -2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,26,0,0,0,1,0,1,2,5,0 -2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,26,0,0,0,1,0,1,2,5,0 -2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,26,0,0,0,1,0,1,2,5,0 -2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,26,0,0,0,1,0,1,2,5,0 -2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,26,0,0,0,1,0,1,2,5,0 -2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,26,0,0,0,1,0,1,2,5,0 -2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,26,0,0,0,1,0,1,2,5,0 -2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,26,0,0,0,1,0,1,2,5,0 -2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,26,0,0,0,1,0,1,2,5,0 -2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,26,0,0,0,1,0,1,2,5,0 -2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,26,0,0,0,1,0,1,2,5,0 -2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,26,0,0,0,1,0,1,2,5,0 -2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,26,0,0,0,1,0,1,2,5,0 -2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,26,0,0,0,1,0,1,2,5,0 -2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,26,0,0,0,1,0,1,2,5,0 -2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,26,0,0,0,1,0,1,2,5,0 -2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,26,0,0,0,1,0,1,2,5,0 -2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,26,0,0,0,1,0,1,2,5,0 -2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,26,0,0,0,1,0,1,2,5,0 -2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,26,0,0,0,1,0,1,2,5,0 -2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,26,0,0,0,1,0,1,2,5,0 -2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,26,0,0,0,1,0,1,2,5,0 -2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,26,0,0,0,1,0,1,2,5,0 -2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,26,0,0,0,1,0,1,2,5,0 -2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,26,0,0,0,1,0,1,2,5,0 -2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,26,0,0,0,1,0,1,2,5,0 -2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,26,0,0,0,1,0,1,2,5,0 -2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,26,0,0,0,1,0,1,2,5,0 -2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,26,0,0,0,1,0,1,2,5,0 -2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,26,0,0,0,1,0,1,2,5,0 -2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,26,0,0,0,1,0,1,2,5,0 -2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,26,0,0,0,1,0,1,2,5,0 -2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,26,0,0,0,1,0,1,2,5,0 -2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,26,0,0,0,1,0,1,2,5,0 -2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,26,0,0,0,1,0,1,2,5,0 -2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,26,0,0,0,1,0,1,2,5,0 -2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,26,0,0,0,1,0,1,2,5,0 -2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,26,0,0,0,1,0,1,2,5,0 -2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,26,0,0,0,1,0,1,2,5,0 -2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,26,0,0,0,1,0,1,2,5,0 -2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,26,0,0,0,1,0,1,2,5,0 -2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,26,0,0,0,1,0,1,2,5,0 -2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,26,0,0,0,1,0,1,2,5,0 -2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,26,0,0,0,1,0,1,2,5,0 -2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,26,0,0,0,1,0,1,2,5,0 -2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,26,0,0,0,1,0,1,2,5,0 -2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,26,0,0,0,1,0,1,2,5,0 -2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,26,0,0,0,1,0,1,2,5,0 -2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,26,0,0,0,1,0,1,2,5,0 -2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,26,0,0,0,1,0,1,2,5,0 -2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,26,0,0,0,1,0,1,2,5,0 -2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,26,0,0,0,1,0,1,2,5,0 -2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,26,0,0,0,1,0,1,2,5,0 -2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,26,0,0,0,1,0,1,2,5,0 -2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,26,0,0,0,1,0,1,2,5,0 -2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,26,0,0,0,1,0,1,2,5,0 -2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,26,0,0,0,1,0,1,2,5,0 -2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,26,0,0,0,1,0,1,2,5,0 -2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,26,0,0,0,1,0,1,2,5,0 -2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,26,0,0,0,1,0,1,2,5,0 -2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,26,0,0,0,1,0,1,2,5,0 -2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,26,0,0,0,1,0,1,2,5,0 -2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,26,0,0,0,1,0,1,2,5,0 -2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,26,0,0,0,1,0,1,2,5,0 -2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,26,0,0,0,1,0,1,2,5,0 -2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,26,0,0,0,1,0,1,2,5,0 -2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,26,0,0,0,1,0,1,2,5,0 -2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,26,0,0,0,1,0,1,2,5,0 -2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,26,0,0,0,1,0,1,2,5,0 -2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,26,0,0,0,1,0,1,2,5,0 -2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,26,0,0,0,1,0,1,2,5,0 -2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,26,0,0,0,1,0,1,2,5,0 -2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,26,0,0,0,1,0,1,2,5,0 -2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,26,0,0,0,1,0,1,2,5,0 -2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,26,0,0,0,1,0,1,2,5,0 -2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,26,0,0,0,1,0,1,2,5,0 -2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,26,0,0,0,1,0,1,2,5,0 -2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,26,0,0,0,1,0,1,2,5,0 -2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,26,0,0,0,1,0,1,2,5,0 -2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,26,0,0,0,1,0,1,2,5,0 -2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,26,0,0,0,2,0,1,2,5,0 -2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,26,0,0,0,2,0,1,2,5,0 -2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,26,0,0,0,2,0,1,2,5,0 -2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,26,0,0,0,2,0,1,2,5,0 -2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,30,0,0,0,3,0,1,2,5,0 -2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,30,0,0,0,3,0,1,2,5,0 -2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,30,0,0,0,3,0,1,2,5,0 -2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,30,0,0,0,3,0,1,2,5,0 -2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,30,0,0,0,3,0,1,2,5,0 -2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,30,0,0,0,3,0,1,2,5,0 -2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,30,0,0,0,3,0,1,2,5,0 -2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,30,0,0,0,3,0,1,2,5,0 -2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,30,0,0,0,3,0,1,2,5,0 -2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,30,0,0,0,3,0,1,2,5,0 -2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,30,0,0,0,3,0,1,2,5,0 -2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,30,0,0,0,3,0,1,2,5,0 -2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,30,0,0,0,3,0,1,2,5,0 -2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,30,0,0,0,3,0,1,2,5,0 -2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,30,0,0,0,3,0,1,2,5,0 -2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,30,0,0,0,3,0,1,2,5,0 -2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,30,0,0,0,3,0,1,2,5,0 -2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,30,0,0,0,3,0,1,2,5,0 -2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,30,0,0,0,3,0,1,2,5,0 -2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,30,0,0,0,3,0,1,2,5,0 -2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,30,0,0,0,3,0,1,2,5,0 -2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,30,0,0,0,3,0,1,2,5,0 -2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,30,0,0,0,3,0,1,2,5,0 -2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,30,0,0,0,3,0,1,2,5,0 -2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,30,0,0,0,3,0,1,2,5,0 -2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,30,0,0,0,3,0,1,2,5,0 -2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,30,0,0,0,3,0,1,2,5,0 -2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,30,0,0,0,3,0,1,2,5,0 -2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,30,0,0,0,3,0,1,2,5,0 -2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,30,0,0,0,3,0,1,2,5,0 -2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,30,0,0,0,3,0,1,2,5,0 -2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,30,0,0,0,3,0,1,2,5,0 -2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,30,0,0,0,3,0,1,2,5,0 -2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,30,0,0,0,3,0,1,2,5,0 -2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,30,0,0,0,3,0,1,2,5,0 -2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,30,0,0,0,3,0,1,2,5,0 -2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,30,0,0,0,3,0,1,2,5,0 -2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,30,0,0,0,3,0,1,2,5,0 -2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,30,0,0,0,3,0,1,2,5,0 -2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,30,0,0,0,3,0,1,2,5,0 -2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,30,0,0,0,3,0,1,2,5,0 -2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,30,0,0,0,3,0,1,2,5,0 -2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,30,0,0,0,3,0,1,2,5,0 -2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,30,0,0,0,3,0,1,2,5,0 -2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,30,0,0,0,3,0,1,2,5,0 -2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,30,0,0,0,3,0,1,2,5,0 -2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,30,0,0,0,3,0,1,2,5,0 -2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,30,0,0,0,3,0,1,2,5,0 -2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,30,0,0,0,3,0,1,2,5,0 -2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,30,0,0,0,3,0,1,2,5,0 -2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,30,0,0,0,3,0,1,2,5,0 -2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,30,0,0,0,3,0,1,2,5,0 -2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,30,0,0,0,3,0,1,2,5,0 -2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,30,0,0,0,3,0,1,2,5,0 -2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,30,0,0,0,3,0,1,2,5,0 -2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,30,0,0,0,3,0,1,2,5,0 -2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,30,0,0,0,3,0,1,2,5,0 -2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,30,0,0,0,3,0,1,2,5,0 -2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,30,0,0,0,3,0,1,2,5,0 -2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,30,0,0,0,3,0,1,2,5,0 -2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,30,0,0,0,3,0,1,2,5,0 -2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,30,0,0,0,3,0,1,2,5,0 -2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,30,0,0,0,3,0,1,2,5,0 -2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,30,0,0,0,3,0,1,2,5,0 -2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,30,0,0,0,3,0,1,2,5,0 -2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,30,0,0,0,3,0,1,2,5,0 -2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,30,0,0,0,3,0,1,2,5,0 -2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,30,0,0,0,3,0,1,2,5,0 -2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,30,0,0,0,3,0,1,2,5,0 -2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,30,0,0,0,3,0,1,2,5,0 -2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,30,0,0,0,3,0,1,2,5,0 -2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,30,0,0,0,3,0,1,2,5,0 -2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,30,0,0,0,3,0,1,2,5,0 -2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,30,0,0,0,3,0,1,2,5,0 -2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,30,0,0,0,3,0,1,2,5,0 -2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,30,0,0,0,3,0,1,2,5,0 -2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,30,0,0,0,3,0,1,2,5,0 -2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,30,0,0,0,3,0,1,2,5,0 -2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,30,0,0,0,3,0,1,2,5,0 -2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,30,0,0,0,3,0,1,2,5,0 -2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,30,0,0,0,3,0,1,2,5,0 -2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,30,0,0,0,3,0,1,2,5,0 -2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,30,0,0,0,3,0,1,2,5,0 -2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,30,0,0,0,3,0,1,2,5,0 -2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,30,0,0,0,3,0,1,2,5,0 -2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,30,0,0,0,3,0,1,2,5,0 -2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,30,0,0,0,3,0,1,2,5,0 -2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,30,0,0,0,3,0,1,2,5,0 -2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,30,0,0,0,3,0,1,2,5,0 -2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,30,0,0,0,3,0,1,2,5,0 -2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,30,0,0,0,3,0,1,2,5,0 -2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,30,0,0,0,3,0,1,2,5,0 -2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,30,0,1,0,3,0,1,2,5,0 -2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,30,0,1,0,3,0,1,2,5,0 -2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,30,0,1,0,3,0,1,2,5,0 -2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,30,0,1,0,3,0,1,2,5,0 -2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,30,0,1,0,3,0,1,2,5,0 -2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,30,0,1,0,3,0,1,2,5,0 -2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,30,0,1,0,3,0,1,2,5,0 -2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,30,0,1,0,3,0,1,2,5,0 -2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,30,0,1,0,3,0,1,2,5,0 -2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,30,0,1,0,3,0,1,2,5,0 -2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,30,0,1,0,3,0,1,2,5,0 -2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,30,0,1,0,3,0,1,2,5,0 -2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,30,0,1,0,3,0,1,2,5,0 -2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,30,0,1,0,3,0,1,2,5,0 -2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,30,0,1,0,3,0,1,2,5,0 -2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,30,0,1,0,3,0,1,2,5,0 -2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,30,0,1,0,3,0,1,2,5,0 -2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,30,0,1,0,3,0,1,2,5,0 -2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,35,0,1,0,1,0,1,2,5,0 -2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,35,0,1,0,1,0,1,2,5,0 -2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,35,0,1,0,1,0,1,2,5,0 -2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,35,0,1,0,1,0,1,2,5,0 -2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,35,0,1,0,1,0,1,2,5,0 -2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,35,0,1,0,1,0,1,2,5,0 -2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,35,0,1,0,1,0,1,2,5,0 -2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,35,0,1,0,1,0,1,2,5,0 -2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,35,0,1,0,1,0,1,2,5,0 -2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,35,0,1,0,1,0,1,2,5,0 -2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,35,0,1,0,1,0,1,2,5,0 -2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,35,0,1,0,1,0,1,2,5,0 -2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,35,0,1,0,1,0,1,2,5,0 -2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,35,0,1,0,1,0,1,2,5,0 -2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,35,0,1,0,1,0,1,2,5,0 -2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,35,0,1,0,1,0,1,2,5,0 -2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,35,0,1,0,1,0,1,2,5,0 -2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,35,0,1,0,1,0,1,2,5,0 -2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,35,0,1,0,1,0,1,2,5,0 -2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,35,0,1,0,1,0,1,2,5,0 -2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,35,0,1,0,1,0,1,2,5,0 -2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,35,0,1,0,1,0,1,2,5,0 -2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,35,0,1,0,1,0,1,2,5,0 -2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,35,0,1,0,1,0,1,2,5,0 -2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,35,0,1,0,1,0,1,2,5,0 -2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,35,0,1,0,1,0,1,2,5,0 -2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,35,0,1,0,1,0,1,2,5,0 -2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,35,0,1,0,1,0,1,2,5,0 -2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,35,0,1,0,1,0,1,2,5,0 -2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,35,0,1,0,1,0,1,2,5,0 -2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,35,0,1,0,1,0,1,2,5,0 -2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,35,0,1,0,1,0,1,2,5,0 -2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,35,0,1,0,1,0,1,2,5,0 -2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,35,0,1,0,1,0,1,2,5,0 -2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,35,0,1,0,1,0,1,2,5,0 -2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,35,0,1,0,1,0,1,2,5,0 -2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,35,0,1,0,1,0,1,2,5,0 -2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,35,0,1,0,1,0,1,2,5,0 -2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,35,0,1,0,1,0,1,2,5,0 -2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,35,0,1,0,1,0,1,2,5,0 -2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,35,0,1,0,1,0,1,2,5,0 -2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,35,0,1,0,1,0,1,2,5,0 -2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,35,0,1,0,1,0,1,2,5,0 -2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,35,0,1,0,1,0,1,2,5,0 -2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,35,0,1,0,1,0,1,2,5,0 -2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,35,0,1,0,1,0,1,2,5,0 -2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,35,0,1,0,1,0,1,2,5,0 -2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,35,0,1,0,1,0,1,2,5,0 -2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,35,0,1,0,1,0,1,2,5,0 -2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,35,0,1,0,1,0,1,2,5,0 -2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,35,0,1,0,1,0,1,2,5,0 -2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,35,0,1,0,1,0,1,2,5,0 -2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,35,0,1,0,1,0,1,2,5,0 -2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,35,0,1,0,1,0,1,2,5,0 -2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,35,0,1,0,1,0,1,2,5,0 -2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,35,0,1,0,1,0,1,2,5,0 -2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,35,0,1,0,1,0,1,2,5,0 -2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,35,0,1,0,1,0,1,2,5,0 -2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,35,0,1,0,1,0,1,2,5,0 -2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,35,0,1,0,1,0,1,2,5,0 -2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,35,0,1,0,1,0,1,2,5,0 -2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,35,0,1,0,1,0,1,2,5,0 -2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,35,0,1,0,1,0,1,2,5,0 -2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,35,0,1,0,1,0,1,2,5,0 -2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,35,0,1,0,1,0,1,2,5,0 -2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,35,0,1,0,1,0,1,2,5,0 -2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,35,0,1,0,1,0,1,2,5,0 -2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,35,0,1,0,1,0,1,2,5,0 -2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,35,0,1,0,1,0,1,2,5,0 -2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,35,0,1,0,1,0,1,2,5,0 -2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,35,0,1,0,1,0,1,2,5,0 -2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,35,0,1,0,1,0,1,2,5,0 -2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,35,0,1,0,1,0,1,2,5,0 -2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,35,0,1,0,1,0,1,2,5,0 -2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,35,0,1,0,1,0,1,2,5,0 -2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,35,0,1,0,1,0,1,2,5,0 -2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,35,0,1,0,1,0,1,2,5,0 -2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,35,0,1,0,1,0,1,2,5,0 -2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,42,0,1,0,1,0,1,2,5,0 -2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,35,0,1,0,1,0,1,2,5,0 -2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,35,0,1,0,1,0,1,2,5,0 -2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,35,0,1,0,1,0,1,2,5,0 -2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,35,0,1,0,1,0,1,2,5,0 -2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,35,0,1,0,1,0,1,2,5,0 -2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,35,0,1,0,1,0,1,2,5,0 -2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,35,0,1,0,1,0,1,2,5,0 -2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,42,0,1,0,1,0,1,2,5,0 -2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,42,0,1,0,1,0,1,2,5,0 -2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,42,0,1,0,1,0,1,2,5,0 -2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,42,0,1,0,1,0,1,2,5,0 -2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,42,0,1,0,1,0,1,2,5,0 -2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,42,0,1,0,1,0,1,2,5,0 -2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,42,0,1,0,1,0,1,2,5,0 -2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,110,0,1,0,1,0,1,2,5,0 -2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,110,0,1,0,1,0,1,2,5,0 -2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,110,0,1,0,1,0,1,2,5,0 -2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,110,0,1,0,1,0,1,2,5,0 -2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,110,0,1,0,1,0,1,2,5,0 -2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,110,0,1,0,1,0,1,2,5,0 -2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,110,0,1,0,1,0,1,2,5,0 -2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,110,0,1,0,1,0,1,2,5,0 -2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,110,0,1,0,1,0,1,2,5,0 -2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,110,0,1,0,1,0,1,2,5,0 -2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,110,0,1,0,1,0,1,2,5,0 -2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,110,0,1,0,1,0,1,2,5,0 -2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,110,0,1,0,1,0,1,2,5,0 -2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,110,0,1,0,1,0,1,2,5,0 -2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,110,0,1,0,1,0,1,2,5,0 -2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,110,0,1,0,1,0,1,2,5,0 -2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,110,0,1,0,1,0,1,2,5,0 -2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,110,0,1,0,1,0,1,2,5,0 -2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,110,0,1,0,1,0,1,2,5,0 -2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,110,0,1,0,1,0,1,2,5,0 -2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,110,0,1,0,1,0,1,2,5,0 -2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,110,0,1,0,1,0,1,2,5,0 -2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,110,0,1,0,1,0,1,2,5,0 -2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,110,0,1,0,1,0,1,2,5,0 -2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,110,0,1,0,1,0,1,2,5,0 -2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,110,0,1,0,1,0,1,2,5,0 -2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,110,0,1,0,1,0,1,2,5,0 -2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,110,0,1,0,1,0,1,2,5,0 -2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,110,0,1,0,1,0,1,2,5,0 -2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,110,0,1,0,1,0,1,2,5,0 -2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,110,0,1,0,1,0,1,2,5,0 -2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,110,0,1,0,1,0,1,2,5,0 -2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,110,0,1,0,1,0,1,2,5,0 -2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,110,0,1,0,1,0,1,2,5,0 -2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,110,0,1,0,1,0,1,2,5,0 -2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,110,0,1,0,1,0,1,2,5,0 -2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,110,0,1,0,1,0,1,2,5,0 -2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,110,0,1,0,1,0,1,2,5,0 -2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,110,0,1,0,1,0,1,2,5,0 -2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,110,0,1,0,1,0,1,2,5,0 -2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,110,0,1,0,1,0,1,2,5,0 -2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,110,0,1,0,1,0,1,2,5,0 -2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,110,0,1,0,1,0,1,2,5,0 -2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,110,0,1,0,1,0,1,2,5,0 -2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,110,0,1,0,1,0,1,2,5,0 -2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,110,0,1,0,1,0,1,2,5,0 -2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,110,0,1,0,1,0,1,2,5,0 -2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,110,0,1,0,1,0,1,2,5,0 -2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,110,0,1,0,1,0,1,2,5,0 -2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,110,0,1,0,1,0,1,2,5,0 -2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,110,0,1,0,1,0,1,2,5,0 -2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,110,0,1,0,1,0,1,2,5,0 -2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,110,0,1,0,1,0,1,2,5,0 -2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,110,0,1,0,1,0,1,2,5,0 -2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,110,0,1,0,1,0,1,2,5,0 -2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,110,0,1,0,1,0,1,2,5,0 -2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,110,0,1,0,1,0,1,2,5,0 -2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,110,0,1,0,1,0,1,2,5,0 -2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,110,0,1,0,1,0,1,2,5,0 -2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,110,0,1,0,1,0,1,2,5,0 -2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,110,0,1,0,1,0,1,2,5,0 -2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,110,0,1,0,1,0,1,2,5,0 -2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,110,0,1,0,1,0,1,2,5,0 -2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,110,0,1,0,1,0,1,2,5,0 -2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,110,0,1,0,1,0,1,2,5,0 -2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,110,0,1,0,1,0,1,2,5,0 -2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,110,0,1,0,1,0,1,2,5,0 -2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,110,0,1,0,1,0,1,2,5,0 -2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,110,0,1,0,1,0,1,2,5,0 -2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,110,0,1,0,1,0,1,2,5,0 -2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,110,0,1,0,1,0,1,2,5,0 -2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,110,0,1,0,1,0,1,2,5,0 -2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,110,0,1,0,1,0,1,2,5,0 -2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,110,0,1,0,1,0,1,2,5,0 -2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,110,0,1,0,1,0,1,2,5,0 -2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,110,0,1,0,1,0,1,2,5,0 -2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,110,0,1,0,1,0,1,2,5,0 -2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,110,0,1,0,1,0,1,2,5,0 -2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,110,0,1,0,1,0,1,2,5,0 -2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,110,0,1,0,1,0,1,2,5,0 -2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,110,0,1,0,1,0,1,2,5,0 -2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,110,0,1,0,1,0,1,2,5,0 -2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,110,0,1,0,1,0,1,2,5,0 -2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,110,0,1,0,1,0,1,2,5,0 -2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,110,0,1,0,1,0,1,2,5,0 -2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,110,0,1,0,1,0,1,2,5,0 -2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,110,0,1,0,1,0,1,2,5,0 -2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,110,0,1,0,1,0,1,2,5,0 -2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,110,0,1,0,1,0,1,2,5,0 -2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,110,0,1,0,1,0,1,2,5,0 -2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,110,0,1,0,1,0,1,2,5,0 -2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,110,0,1,0,1,0,1,2,5,0 -2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,110,0,1,0,1,0,1,2,5,0 -2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,110,0,1,0,1,0,1,2,5,0 -2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,110,0,1,0,1,0,1,2,5,0 -2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,110,0,1,0,1,0,1,2,5,0 -2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,110,0,1,0,1,0,1,2,5,0 -2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,110,0,1,0,1,0,1,2,5,0 -2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,110,0,1,0,1,0,1,2,5,0 \ No newline at end of file diff --git a/docs/archunit-history/ant_cycles_history_with_tests.csv b/docs/archunit-history/ant_cycles_history_with_tests.csv deleted file mode 100644 index 913514dc6..000000000 --- a/docs/archunit-history/ant_cycles_history_with_tests.csv +++ /dev/null @@ -1,637 +0,0 @@ -date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util -2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,67,0,0,0,1,0,1,22,5,1 -2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,67,0,0,0,1,0,1,22,5,1 -2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,67,0,0,0,1,0,1,22,5,1 -2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,67,0,0,0,1,0,1,22,5,1 -2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,67,0,0,0,1,0,1,22,5,1 -2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,67,0,0,0,1,0,1,22,5,1 -2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,67,0,0,0,1,0,1,22,5,1 -2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,67,0,0,0,1,0,1,22,5,1 -2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,67,0,0,0,1,0,1,22,5,1 -2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,67,0,0,0,1,0,1,22,5,1 -2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,67,0,0,0,1,0,1,22,5,1 -2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,67,0,0,0,1,0,1,22,5,1 -2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,67,0,0,0,1,0,1,22,5,1 -2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,67,0,0,0,1,0,1,22,5,1 -2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,67,0,0,0,1,0,1,22,5,1 -2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,67,0,0,0,1,0,1,22,5,1 -2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,67,0,0,0,1,0,1,22,5,1 -2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,67,0,0,0,1,0,1,22,5,1 -2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,67,0,0,0,1,0,1,22,5,1 -2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,67,0,0,0,1,0,1,22,5,1 -2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,67,0,0,0,1,0,1,22,5,1 -2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,67,0,0,0,1,0,1,22,5,1 -2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,67,0,0,0,1,0,1,22,5,1 -2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,67,0,0,0,1,0,1,22,5,1 -2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,67,0,0,0,1,0,1,22,5,1 -2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,67,0,0,0,1,0,1,22,5,1 -2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,67,0,0,0,1,0,1,22,5,1 -2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,67,0,0,0,1,0,1,22,5,1 -2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,67,0,0,0,1,0,1,22,5,1 -2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,67,0,0,0,1,0,1,22,5,1 -2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,67,0,0,0,1,0,1,22,5,1 -2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,67,0,0,0,1,0,1,22,5,1 -2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,67,0,0,0,1,0,1,22,5,1 -2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,67,0,0,0,1,0,1,22,5,1 -2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,67,0,0,0,1,0,1,22,5,1 -2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,67,0,0,0,1,0,1,22,5,1 -2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,67,0,0,0,1,0,1,22,5,1 -2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,67,0,0,0,1,0,1,22,5,1 -2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,67,0,0,0,1,0,1,22,5,1 -2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,67,0,0,0,1,0,1,22,5,1 -2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,67,0,0,0,1,0,1,22,5,1 -2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,67,0,0,0,1,0,1,22,5,1 -2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,67,0,0,0,1,0,1,22,5,1 -2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,67,0,0,0,1,0,1,22,5,1 -2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,67,0,0,0,1,0,1,22,5,1 -2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,67,0,0,0,1,0,1,22,5,1 -2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,67,0,0,0,1,0,1,22,5,1 -2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,67,0,0,0,1,0,1,22,5,1 -2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,67,0,0,0,1,0,1,22,5,1 -2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,67,0,0,0,1,0,1,22,5,1 -2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,67,0,0,0,1,0,1,22,5,1 -2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,67,0,0,0,1,0,1,22,5,1 -2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,67,0,0,0,1,0,1,22,5,1 -2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,67,0,0,0,1,0,1,22,5,1 -2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,67,0,0,0,1,0,1,22,5,1 -2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,67,0,0,0,1,0,1,22,5,1 -2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,67,0,0,0,1,0,1,22,5,1 -2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,67,0,0,0,1,0,1,22,5,1 -2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,67,0,0,0,1,0,1,22,5,1 -2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,67,0,0,0,1,0,1,22,5,1 -2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,67,0,0,0,1,0,1,22,5,1 -2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,67,0,0,0,1,0,1,22,5,1 -2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,67,0,0,0,1,0,1,22,5,1 -2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,67,0,0,0,1,0,1,22,5,1 -2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,67,0,0,0,1,0,1,22,5,1 -2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,67,0,0,0,1,0,1,36,5,1 -2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,67,0,0,0,1,0,1,36,5,1 -2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,67,0,0,0,1,0,1,36,5,1 -2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,67,0,0,0,1,0,1,36,5,1 -2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,67,0,0,0,1,0,1,36,5,1 -2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,67,0,0,0,1,0,1,36,5,1 -2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,67,0,0,0,1,0,1,36,5,1 -2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,67,0,0,0,1,0,1,36,5,1 -2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,67,0,0,0,1,0,1,36,5,1 -2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,67,0,0,0,1,0,1,36,5,1 -2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,67,0,0,0,1,0,1,36,5,1 -2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,67,0,0,0,1,0,1,36,5,1 -2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,67,0,0,0,1,0,1,36,5,1 -2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,67,0,0,0,1,0,1,36,5,1 -2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,67,0,0,0,1,0,1,36,5,1 -2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,67,0,0,0,1,0,1,36,5,1 -2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,67,0,0,0,1,0,1,36,5,1 -2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,67,0,0,0,1,0,1,36,5,1 -2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,67,0,0,0,1,0,1,36,5,1 -2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,67,0,0,0,1,0,1,36,5,1 -2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,67,0,0,0,1,0,1,36,5,1 -2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,67,0,0,0,1,0,1,36,5,1 -2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,67,0,0,0,1,0,1,36,5,1 -2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,67,0,0,0,1,0,1,36,5,1 -2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,67,0,0,0,1,0,1,36,5,1 -2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,67,0,0,0,1,0,1,36,5,1 -2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,67,0,0,0,1,0,1,36,5,1 -2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,67,0,0,0,1,0,1,36,5,1 -2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,67,0,0,0,1,0,1,36,5,1 -2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,67,0,0,0,1,0,1,36,5,1 -2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,67,0,0,0,1,0,1,36,5,1 -2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,67,0,0,0,1,0,1,36,5,1 -2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,67,0,0,0,1,0,1,36,5,1 -2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,67,0,0,0,1,0,1,36,5,1 -2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,67,0,0,0,1,0,1,36,5,1 -2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,67,0,0,0,1,0,1,36,5,1 -2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,67,0,0,0,1,0,1,36,5,1 -2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,67,0,0,0,1,0,1,36,5,1 -2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,67,0,0,0,1,0,1,36,5,1 -2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,67,0,0,0,1,0,1,36,5,1 -2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,67,0,0,0,1,0,1,36,5,1 -2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,67,0,0,0,1,0,1,36,5,1 -2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,67,0,0,0,1,0,1,36,5,1 -2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,67,0,0,0,1,0,1,36,5,1 -2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,67,0,0,0,1,0,1,36,5,1 -2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,67,0,0,0,1,0,1,36,5,1 -2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,67,0,0,0,1,0,1,36,5,1 -2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,67,0,0,0,1,0,1,36,5,1 -2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,67,0,0,0,1,0,1,36,5,1 -2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,67,0,0,0,1,0,1,36,5,1 -2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,67,0,0,0,1,0,1,36,5,1 -2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,67,0,0,0,1,0,1,36,5,1 -2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,67,0,0,0,1,0,1,36,5,1 -2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,67,0,0,0,1,0,1,36,5,1 -2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,67,0,0,0,1,0,1,36,5,1 -2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,67,0,0,0,1,0,1,36,5,1 -2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,67,0,0,0,1,0,1,36,5,1 -2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,67,0,0,0,1,0,1,36,5,1 -2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,67,0,0,0,1,0,1,36,5,1 -2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,67,0,0,0,1,0,1,36,5,1 -2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,67,0,0,0,1,0,1,36,5,1 -2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,67,0,0,0,1,0,1,36,5,1 -2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,67,0,0,0,1,0,1,36,5,1 -2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,67,0,0,0,1,0,1,36,5,1 -2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,67,0,0,0,1,0,1,36,5,1 -2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,67,0,0,0,1,0,1,36,5,1 -2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,67,0,0,0,1,0,1,36,5,1 -2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,67,0,0,0,1,0,1,36,5,1 -2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,67,0,0,0,1,0,1,36,5,1 -2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,67,0,0,0,1,0,1,36,5,1 -2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,67,0,0,0,1,0,1,36,5,1 -2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,67,0,0,0,1,0,1,36,5,1 -2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,67,0,0,0,1,0,1,36,5,1 -2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,67,0,0,0,1,0,1,36,5,1 -2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,67,0,0,0,1,0,1,36,5,1 -2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,67,0,0,0,1,0,1,36,5,1 -2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,67,0,0,0,1,0,1,36,5,1 -2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,67,0,0,0,1,0,1,36,5,1 -2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,67,0,0,0,1,0,1,36,5,1 -2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,67,0,0,0,1,0,1,36,5,1 -2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,67,0,0,0,1,0,1,36,5,1 -2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,67,0,0,0,1,0,1,36,5,1 -2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,67,0,0,0,1,0,1,36,5,1 -2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,67,0,0,0,1,0,1,36,5,1 -2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,67,0,0,0,1,0,1,36,5,1 -2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,67,0,0,0,1,0,1,36,5,1 -2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,67,0,0,0,1,0,1,36,5,1 -2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,67,0,0,0,1,0,1,36,5,1 -2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,67,0,0,0,1,0,1,36,5,1 -2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,67,0,0,0,1,0,1,36,5,1 -2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,67,0,0,0,1,0,1,36,5,1 -2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,67,0,0,0,1,0,1,36,5,1 -2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,67,0,0,0,1,0,1,36,5,1 -2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,67,0,0,0,1,0,1,36,5,1 -2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,67,0,0,0,1,0,1,36,5,1 -2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,67,0,0,0,1,0,1,36,5,1 -2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,67,0,0,0,1,0,1,36,5,1 -2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,67,0,0,0,1,0,1,36,5,1 -2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,67,0,0,0,1,0,1,36,5,1 -2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,67,0,0,0,1,0,1,36,5,1 -2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,67,0,0,0,1,0,1,36,5,1 -2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,67,0,0,0,1,0,1,36,5,1 -2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,67,0,0,0,1,0,1,36,5,1 -2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,67,0,0,0,1,0,1,36,5,1 -2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,67,0,0,0,1,0,1,36,5,1 -2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,67,0,0,0,1,0,1,36,5,1 -2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,67,0,0,0,1,0,1,36,5,1 -2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,67,0,0,0,1,0,1,36,5,1 -2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,67,0,0,0,1,0,1,36,5,1 -2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,67,0,0,0,1,0,1,36,5,1 -2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,67,0,0,0,1,0,1,36,5,1 -2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,67,0,0,0,1,0,1,36,5,1 -2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,67,0,0,0,1,0,1,36,5,1 -2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,67,0,0,0,1,0,1,36,5,1 -2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,67,0,0,0,1,0,1,36,5,1 -2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,67,0,0,0,1,0,1,36,5,1 -2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,67,0,0,0,1,0,1,36,5,1 -2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,67,0,0,0,1,0,1,36,5,1 -2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,67,0,0,0,1,0,1,36,5,1 -2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,67,0,0,0,1,0,1,36,5,1 -2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,67,0,0,0,1,0,1,36,5,1 -2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,67,0,0,0,1,0,1,36,5,1 -2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,67,0,0,0,1,0,1,36,5,1 -2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,67,0,0,0,1,0,1,36,5,1 -2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,67,0,0,0,1,0,1,36,5,1 -2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,67,0,0,0,1,0,1,36,5,1 -2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,67,0,0,0,1,0,1,36,5,1 -2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,67,0,0,0,1,0,1,36,5,1 -2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,67,0,0,0,1,0,1,36,5,1 -2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,67,0,0,0,1,0,1,36,5,1 -2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,67,0,0,0,1,0,1,36,5,1 -2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,67,0,0,0,1,0,1,36,5,1 -2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,67,0,0,0,1,0,1,36,5,1 -2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,67,0,0,0,1,0,1,36,5,1 -2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,67,0,0,0,1,0,1,36,5,1 -2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,67,0,0,0,1,0,1,36,5,1 -2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,67,0,0,0,1,0,1,36,5,1 -2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,67,0,0,0,1,0,1,36,5,1 -2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,67,0,0,0,1,0,1,36,5,1 -2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,67,0,0,0,1,0,1,36,5,1 -2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,67,0,0,0,1,0,1,36,5,1 -2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,67,0,0,0,1,0,1,36,5,1 -2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,67,0,0,0,1,0,1,36,5,1 -2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,67,0,0,0,1,0,1,36,5,1 -2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,67,0,0,0,1,0,1,36,5,1 -2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,67,0,0,0,1,0,1,36,5,1 -2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,67,0,0,0,1,0,1,36,5,1 -2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,67,0,0,0,1,0,1,36,5,1 -2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,67,0,0,0,1,0,1,36,5,1 -2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,67,0,0,0,1,0,1,36,5,1 -2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,67,0,0,0,1,0,1,36,5,1 -2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,67,0,0,0,1,0,1,36,5,1 -2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,67,0,0,0,1,0,1,36,5,1 -2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,67,0,0,0,1,0,1,36,5,1 -2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,67,0,0,0,1,0,1,36,5,1 -2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,67,0,0,0,1,0,1,36,5,1 -2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,67,0,0,0,1,0,1,36,5,1 -2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,67,0,0,0,1,0,1,36,5,1 -2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,67,0,0,0,1,0,1,36,5,1 -2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,67,0,0,0,1,0,1,36,5,1 -2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,67,0,0,0,1,0,1,36,5,1 -2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,67,0,0,0,1,0,1,36,5,1 -2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,67,0,0,0,1,0,1,36,5,1 -2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,67,0,0,0,1,0,1,36,5,1 -2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,67,0,0,0,1,0,1,36,5,1 -2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,67,0,0,0,1,0,1,36,5,1 -2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,67,0,0,0,1,0,1,36,5,1 -2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,67,0,0,0,1,0,1,36,5,1 -2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,67,0,0,0,1,0,1,36,5,1 -2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,67,0,0,0,1,0,1,36,5,1 -2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,67,0,0,0,1,0,1,36,5,1 -2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,67,0,0,0,1,0,1,36,5,1 -2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,67,0,0,0,1,0,1,36,5,1 -2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,67,0,0,0,1,0,1,36,5,1 -2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,67,0,0,0,1,0,1,36,5,1 -2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,67,0,0,0,1,0,1,36,5,1 -2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,67,0,0,0,1,0,1,36,5,1 -2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,67,0,0,0,1,0,1,36,5,1 -2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,67,0,0,0,1,0,1,36,5,1 -2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,67,0,0,0,1,0,1,36,5,1 -2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,67,0,0,0,1,0,1,36,5,1 -2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,67,0,0,0,1,0,1,36,5,1 -2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,67,0,0,0,1,0,1,36,5,1 -2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,67,0,0,0,1,0,1,36,5,1 -2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,67,0,0,0,1,0,1,36,5,1 -2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,67,0,0,0,1,0,1,36,5,1 -2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,67,0,0,0,1,0,1,36,5,1 -2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,67,0,0,0,1,0,1,36,5,1 -2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,67,0,0,0,1,0,1,36,5,1 -2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,67,0,0,0,1,0,1,36,5,1 -2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,67,0,0,0,1,0,1,36,5,1 -2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,67,0,0,0,1,0,1,36,5,1 -2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,67,0,0,0,1,0,1,36,5,1 -2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,67,0,0,0,1,0,1,36,5,1 -2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,67,0,0,0,1,0,1,36,5,1 -2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,67,0,0,0,1,0,1,36,5,1 -2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,67,0,0,0,1,0,1,36,5,1 -2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,67,0,0,0,1,0,1,36,5,1 -2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,67,0,0,0,1,0,1,36,5,1 -2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,67,0,0,0,1,0,1,36,5,1 -2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,67,0,0,0,1,0,1,36,5,1 -2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,67,0,0,0,1,0,1,36,5,1 -2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,67,0,0,0,1,0,1,36,5,1 -2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,67,0,0,0,1,0,1,36,5,1 -2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,67,0,0,0,1,0,1,36,5,1 -2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,67,0,0,0,1,0,1,36,5,1 -2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,67,0,0,0,1,0,1,36,5,1 -2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,67,0,0,0,1,0,1,36,5,2 -2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,67,0,0,0,1,0,1,36,5,2 -2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,67,0,0,0,1,0,1,36,5,2 -2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,67,0,0,0,1,0,1,36,5,2 -2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,67,0,0,0,1,0,1,36,5,2 -2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,67,0,0,0,1,0,1,36,5,2 -2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,67,0,0,0,1,0,1,36,5,2 -2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,67,0,0,0,1,0,1,36,5,2 -2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,67,0,0,0,1,0,1,36,5,2 -2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,67,0,0,0,1,0,1,36,5,2 -2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,67,0,0,0,1,0,1,36,5,2 -2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,67,0,0,0,1,0,1,36,5,2 -2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,67,0,0,0,1,0,1,36,5,2 -2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,67,0,0,0,1,0,1,36,5,2 -2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,67,0,0,0,1,0,1,36,5,2 -2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,67,0,0,0,1,0,1,36,5,2 -2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,67,0,0,0,1,0,1,36,5,2 -2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,67,0,0,0,1,0,1,36,5,2 -2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,67,0,0,0,1,0,1,36,5,2 -2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,67,0,0,0,1,0,1,36,5,2 -2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,67,0,0,0,1,0,1,36,5,2 -2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,67,0,0,0,1,0,1,36,5,2 -2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,67,0,0,0,1,0,1,36,5,2 -2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,67,0,0,0,2,0,1,36,5,2 -2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,67,0,0,0,2,0,1,36,5,2 -2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,67,0,0,0,2,0,1,36,5,2 -2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,67,0,0,0,2,0,1,36,5,2 -2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,75,0,0,0,3,0,1,36,5,2 -2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,75,0,0,0,3,0,1,36,5,2 -2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,75,0,0,0,3,0,1,36,5,2 -2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,75,0,0,0,3,0,1,36,5,2 -2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,75,0,0,0,3,0,1,36,5,2 -2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,75,0,0,0,3,0,1,36,5,2 -2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,75,0,0,0,3,0,1,36,5,2 -2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,75,0,0,0,3,0,1,36,5,2 -2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,75,0,0,0,3,0,1,36,5,2 -2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,75,0,0,0,3,0,1,36,5,2 -2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,75,0,0,0,3,0,1,36,5,1 -2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,75,0,0,0,3,0,1,36,5,1 -2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,75,0,0,0,3,0,1,36,5,1 -2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,75,0,0,0,3,0,1,36,5,1 -2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,75,0,0,0,3,0,1,36,5,1 -2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,75,0,0,0,3,0,1,36,5,1 -2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,75,0,0,0,3,0,1,36,5,1 -2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,75,0,0,0,3,0,1,36,5,1 -2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,75,0,0,0,3,0,1,36,5,1 -2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,75,0,0,0,3,0,1,36,5,1 -2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,75,0,0,0,3,0,1,36,5,1 -2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,75,0,0,0,3,0,1,36,5,1 -2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,75,0,0,0,3,0,1,36,5,1 -2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,75,0,0,0,3,0,1,36,5,1 -2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,75,0,0,0,3,0,1,36,5,1 -2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,75,0,0,0,3,0,1,36,5,1 -2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,75,0,0,0,3,0,1,36,5,1 -2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,75,0,0,0,3,0,1,36,5,1 -2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,75,0,0,0,3,0,1,36,5,1 -2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,75,0,0,0,3,0,1,36,5,1 -2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,75,0,0,0,3,0,1,36,5,1 -2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,75,0,0,0,3,0,1,36,5,1 -2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,75,0,0,0,3,0,1,36,5,1 -2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,75,0,0,0,3,0,1,36,5,1 -2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,75,0,0,0,3,0,1,36,5,1 -2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,75,0,0,0,3,0,1,36,5,1 -2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,75,0,0,0,3,0,1,36,5,1 -2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,75,0,0,0,3,0,1,36,5,1 -2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,75,0,0,0,3,0,1,36,5,1 -2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,75,0,0,0,3,0,1,36,5,1 -2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,75,0,0,0,3,0,1,36,5,1 -2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,75,0,0,0,3,0,1,36,5,1 -2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,75,0,0,0,3,0,1,36,5,1 -2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,75,0,0,0,3,0,1,36,5,1 -2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,75,0,0,0,3,0,1,36,5,1 -2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,75,0,0,0,3,0,1,36,5,1 -2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,75,0,0,0,3,0,1,36,5,1 -2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,75,0,0,0,3,0,1,36,5,1 -2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,75,0,0,0,3,0,1,36,5,1 -2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,75,0,0,0,3,0,1,36,5,1 -2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,75,0,0,0,3,0,1,36,5,1 -2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,75,0,0,0,3,0,1,36,5,1 -2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,75,0,0,0,3,0,1,36,5,1 -2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,75,0,0,0,3,0,1,36,5,1 -2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,75,0,0,0,3,0,1,36,5,1 -2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,75,0,0,0,3,0,1,36,5,1 -2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,75,0,0,0,3,0,1,36,5,1 -2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,75,0,0,0,3,0,1,36,5,1 -2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,75,0,0,0,3,0,1,36,5,1 -2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,75,0,0,0,3,0,1,36,5,1 -2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,75,0,0,0,3,0,1,36,5,1 -2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,75,0,0,0,3,0,1,36,5,1 -2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,75,0,0,0,3,0,1,36,5,1 -2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,75,0,0,0,3,0,1,36,5,1 -2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,75,0,0,0,3,0,1,36,5,1 -2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,75,0,0,0,3,0,1,36,5,1 -2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,75,0,0,0,3,0,1,36,5,1 -2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,75,0,0,0,3,0,1,36,5,1 -2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,75,0,0,0,3,0,1,36,5,1 -2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,75,0,0,0,3,0,1,36,5,1 -2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,75,0,0,0,3,0,1,36,5,1 -2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,75,0,0,0,3,0,1,36,5,1 -2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,75,0,0,0,3,0,1,36,5,1 -2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,75,0,0,0,3,0,1,36,5,1 -2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,75,0,0,0,3,0,1,36,5,1 -2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,75,0,0,0,3,0,1,36,5,1 -2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,75,0,0,0,3,0,1,36,5,1 -2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,75,0,0,0,3,0,1,36,5,1 -2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,75,0,0,0,3,0,1,36,5,1 -2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,75,0,0,0,3,0,1,36,5,1 -2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,75,0,0,0,3,0,1,36,5,1 -2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,75,0,0,0,3,0,1,36,5,1 -2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,75,0,0,0,3,0,1,36,5,1 -2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,75,0,0,0,3,0,1,36,5,1 -2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,75,0,0,0,3,0,1,36,5,1 -2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,75,0,0,0,3,0,1,36,5,1 -2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,75,0,0,0,3,0,1,36,5,1 -2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,75,0,0,0,3,0,1,36,5,1 -2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,75,0,0,0,3,0,1,36,5,1 -2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,75,0,0,0,3,0,1,36,5,1 -2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,75,0,0,0,3,0,1,36,5,1 -2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,75,0,0,0,3,0,1,36,5,1 -2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,280,0,1,0,3,0,1,36,5,1 -2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,280,0,1,0,3,0,1,36,5,1 -2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,280,0,1,0,3,0,1,36,5,1 -2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,280,0,1,0,3,0,1,36,5,1 -2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,280,0,1,0,3,0,1,36,5,1 -2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,280,0,1,0,3,0,1,36,5,1 -2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,280,0,1,0,3,0,1,36,5,1 -2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,280,0,1,0,3,0,1,36,5,1 -2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,280,0,1,0,3,0,1,36,5,1 -2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,280,0,1,0,3,0,1,36,5,1 -2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,280,0,1,0,3,0,1,36,5,1 -2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,280,0,1,0,3,0,1,36,5,1 -2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,280,0,1,0,3,0,1,36,5,1 -2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,280,0,1,0,3,0,1,36,5,1 -2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,280,0,1,0,3,0,1,36,5,1 -2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,280,0,1,0,3,0,1,36,5,1 -2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,280,0,1,0,3,0,1,36,5,1 -2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,280,0,1,0,3,0,1,36,5,1 -2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,349,0,1,0,1,0,1,36,5,2 -2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,349,0,1,0,1,0,1,36,5,2 -2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,349,0,1,0,1,0,1,36,5,2 -2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,349,0,1,0,1,0,1,36,5,2 -2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,349,0,1,0,1,0,1,36,5,2 -2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,349,0,1,0,1,0,1,36,5,2 -2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,349,0,1,0,1,0,1,36,5,2 -2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,349,0,1,0,1,0,1,36,5,2 -2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,349,0,1,0,1,0,1,36,5,2 -2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,349,0,1,0,1,0,1,36,5,2 -2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,349,0,1,0,1,0,1,36,5,2 -2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,349,0,1,0,1,0,1,36,5,2 -2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,349,0,1,0,1,0,1,36,5,2 -2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,349,0,1,0,1,0,1,36,5,2 -2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,349,0,1,0,1,0,1,36,5,2 -2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,349,0,1,0,1,0,1,36,5,2 -2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,349,0,1,0,1,0,1,36,5,2 -2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,349,0,1,0,1,0,1,36,5,2 -2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,349,0,1,0,1,0,1,36,5,2 -2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,349,0,1,0,1,0,1,36,5,2 -2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,349,0,1,0,1,0,1,36,5,2 -2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,349,0,1,0,1,0,1,36,5,2 -2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,349,0,1,0,1,0,1,36,5,2 -2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,349,0,1,0,1,0,1,36,5,2 -2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,349,0,1,0,1,0,1,36,5,2 -2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,349,0,1,0,1,0,1,36,5,2 -2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,349,0,1,0,1,0,1,36,5,2 -2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,349,0,1,0,1,0,1,36,5,2 -2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,349,0,1,0,1,0,1,36,5,2 -2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,349,0,1,0,1,0,1,36,5,2 -2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,349,0,1,0,1,0,1,36,5,2 -2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,349,0,1,0,1,0,1,36,5,2 -2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,349,0,1,0,1,0,1,36,5,2 -2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,349,0,1,0,1,0,1,36,5,2 -2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,349,0,1,0,1,0,1,36,5,2 -2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,349,0,1,0,1,0,1,36,5,2 -2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,349,0,1,0,1,0,1,36,5,2 -2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,349,0,1,0,1,0,1,36,5,2 -2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,349,0,1,0,1,0,1,36,5,2 -2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,349,0,1,0,1,0,1,36,5,2 -2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,349,0,1,0,1,0,1,36,5,2 -2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,349,0,1,0,1,0,1,36,5,2 -2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,349,0,1,0,1,0,1,36,5,2 -2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,349,0,1,0,1,0,1,36,5,2 -2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,349,0,1,0,1,0,1,36,5,2 -2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,349,0,1,0,1,0,1,36,5,2 -2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,349,0,1,0,1,0,1,36,5,2 -2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,349,0,1,0,1,0,1,36,5,2 -2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,349,0,1,0,1,0,1,36,5,2 -2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,349,0,1,0,1,0,1,36,5,2 -2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,349,0,1,0,1,0,1,36,5,2 -2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,349,0,1,0,1,0,1,36,5,2 -2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,349,0,1,0,1,0,1,36,5,2 -2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,349,0,1,0,1,0,1,36,5,2 -2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,349,0,1,0,1,0,1,36,5,2 -2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,349,0,1,0,1,0,1,36,5,2 -2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,349,0,1,0,1,0,1,36,5,2 -2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,349,0,1,0,1,0,1,36,5,2 -2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,349,0,1,0,1,0,1,36,5,2 -2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,349,0,1,0,1,0,1,36,5,2 -2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,349,0,1,0,1,0,1,36,5,2 -2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,349,0,1,0,1,0,1,36,5,2 -2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,349,0,1,0,1,0,1,36,5,2 -2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,349,0,1,0,1,0,1,36,5,2 -2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,349,0,1,0,1,0,1,36,5,2 -2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,349,0,1,0,1,0,1,36,5,2 -2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,349,0,1,0,1,0,1,36,5,2 -2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,349,0,1,0,1,0,1,36,5,2 -2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,349,0,1,0,1,0,1,36,5,2 -2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,349,0,1,0,1,0,1,36,5,2 -2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,349,0,1,0,1,0,1,36,5,2 -2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,349,0,1,0,1,0,1,36,5,2 -2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,349,0,1,0,1,0,1,36,5,2 -2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,349,0,1,0,1,0,1,36,5,2 -2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,349,0,1,0,1,0,1,36,5,2 -2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,349,0,1,0,1,0,1,36,5,2 -2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,349,0,1,0,1,0,1,36,5,2 -2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,349,0,1,0,1,0,1,36,5,2 -2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,407,0,1,0,1,0,1,36,5,2 -2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,349,0,1,0,1,0,1,36,5,2 -2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,349,0,1,0,1,0,1,36,5,2 -2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,349,0,1,0,1,0,1,36,5,2 -2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,349,0,1,0,1,0,1,36,5,2 -2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,349,0,1,0,1,0,1,36,5,2 -2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,349,0,1,0,1,0,1,36,5,2 -2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,349,0,1,0,1,0,1,36,5,2 -2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,407,0,1,0,1,0,1,36,5,2 -2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,407,0,1,0,1,0,1,36,5,2 -2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,407,0,1,0,1,0,1,36,5,2 -2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,407,0,1,0,1,0,1,36,5,2 -2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,407,0,1,0,1,0,1,36,5,2 -2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,407,0,1,0,1,0,1,36,5,2 -2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,407,0,1,0,1,0,1,36,5,2 -2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,407,0,1,0,1,0,1,36,5,2 -2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,572,0,1,0,1,0,1,36,5,2 -2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,572,0,1,0,1,0,1,36,5,2 -2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,572,0,1,0,1,0,1,36,5,2 -2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,572,0,1,0,1,0,1,36,5,2 -2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,572,0,1,0,1,0,1,36,5,2 -2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,572,0,1,0,1,0,1,36,5,2 -2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,572,0,1,0,1,0,1,36,5,2 -2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,572,0,1,0,1,0,1,36,5,2 -2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,572,0,1,0,1,0,1,36,5,2 -2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,572,0,1,0,1,0,1,36,5,2 -2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,572,0,1,0,1,0,1,36,5,2 -2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,572,0,1,0,1,0,1,36,5,2 -2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,572,0,1,0,1,0,1,36,5,2 -2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,572,0,1,0,1,0,1,36,5,2 -2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,572,0,1,0,1,0,1,36,5,2 -2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,572,0,1,0,1,0,1,36,5,2 -2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,572,0,1,0,1,0,1,36,5,2 -2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,572,0,1,0,1,0,1,36,5,2 -2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,572,0,1,0,1,0,1,36,5,2 -2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,572,0,1,0,1,0,1,36,5,2 -2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,572,0,1,0,1,0,1,36,5,2 -2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,572,0,1,0,1,0,1,36,5,2 -2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,572,0,1,0,1,0,1,36,5,2 -2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,572,0,1,0,1,0,1,36,5,2 -2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,572,0,1,0,1,0,1,36,5,2 -2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,572,0,1,0,1,0,1,36,5,2 -2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,572,0,1,0,1,0,1,36,5,2 -2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,572,0,1,0,1,0,1,36,5,2 -2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,572,0,1,0,1,0,1,36,5,2 -2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,572,0,1,0,1,0,1,36,5,2 -2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,572,0,1,0,1,0,1,36,5,2 -2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,572,0,1,0,1,0,1,36,5,2 -2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,572,0,1,0,1,0,1,36,5,2 -2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,572,0,1,0,1,0,1,36,5,2 -2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,572,0,1,0,1,0,1,36,5,2 -2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,572,0,1,0,1,0,1,36,5,2 -2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,572,0,1,0,1,0,1,36,5,2 -2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,572,0,1,0,1,0,1,36,5,2 -2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,572,0,1,0,1,0,1,36,5,2 -2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,572,0,1,0,1,0,1,36,5,2 -2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,572,0,1,0,1,0,1,36,5,2 -2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,572,0,1,0,1,0,1,36,5,2 -2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,572,0,1,0,1,0,1,36,5,2 -2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,572,0,1,0,1,0,1,36,5,2 -2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,572,0,1,0,1,0,1,36,5,2 -2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,572,0,1,0,1,0,1,36,5,2 -2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,572,0,1,0,1,0,1,36,5,2 -2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,572,0,1,0,1,0,1,36,5,2 -2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,572,0,1,0,1,0,1,36,5,2 -2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,572,0,1,0,1,0,1,36,5,2 -2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,572,0,1,0,1,0,1,36,5,2 -2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,572,0,1,0,1,0,1,36,5,2 -2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,572,0,1,0,1,0,1,36,5,2 -2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,572,0,1,0,1,0,1,36,5,2 -2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,572,0,1,0,1,0,1,36,5,2 -2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,572,0,1,0,1,0,1,36,5,2 -2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,572,0,1,0,1,0,1,36,5,2 -2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,572,0,1,0,1,0,1,36,5,2 -2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,572,0,1,0,1,0,1,36,5,2 -2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,572,0,1,0,1,0,1,36,5,2 -2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,572,0,1,0,1,0,1,36,5,2 -2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,572,0,1,0,1,0,1,36,5,2 -2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,572,0,1,0,1,0,1,36,5,2 -2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,572,0,1,0,1,0,1,36,5,2 -2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,572,0,1,0,1,0,1,36,5,2 -2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,572,0,1,0,1,0,1,36,5,2 -2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,572,0,1,0,1,0,1,36,5,2 -2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,572,0,1,0,1,0,1,36,5,2 -2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,572,0,1,0,1,0,1,36,5,2 -2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,572,0,1,0,1,0,1,36,5,2 -2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,572,0,1,0,1,0,1,36,5,2 -2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,572,0,1,0,1,0,1,36,5,2 -2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,572,0,1,0,1,0,1,36,5,2 -2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,572,0,1,0,1,0,1,36,5,2 -2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,572,0,1,0,1,0,1,36,5,2 -2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,572,0,1,0,1,0,1,36,5,2 -2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,572,0,1,0,1,0,1,36,5,2 -2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,572,0,1,0,1,0,1,36,5,2 -2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,572,0,1,0,1,0,1,36,5,2 -2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,572,0,1,0,1,0,1,36,5,2 -2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,572,0,1,0,1,0,1,36,5,2 -2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,572,0,1,0,1,0,1,36,5,2 -2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,572,0,1,0,1,0,1,36,5,2 -2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,572,0,1,0,1,0,1,36,5,2 -2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,572,0,1,0,1,0,1,36,5,2 -2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,572,0,1,0,1,0,1,36,5,2 -2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,572,0,1,0,1,0,1,36,5,2 -2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,572,0,1,0,1,0,1,36,5,2 -2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,572,0,1,0,1,0,1,36,5,2 -2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,572,0,1,0,1,0,1,36,5,2 -2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,572,0,1,0,1,0,1,36,5,2 -2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,572,0,1,0,1,0,1,36,5,2 -2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,572,0,1,0,1,0,1,36,5,2 -2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,572,0,1,0,1,0,1,36,5,2 -2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,572,0,1,0,1,0,1,36,5,2 -2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,572,0,1,0,1,0,1,36,5,2 -2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,572,0,1,0,1,0,1,36,5,2 -2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,572,0,1,0,1,0,1,36,5,2 -2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,572,0,1,0,1,0,1,36,5,2 \ No newline at end of file diff --git a/docs/archunit-history/ant_layers_history.csv b/docs/archunit-history/ant_layers_history.csv deleted file mode 100644 index f0bb0048e..000000000 --- a/docs/archunit-history/ant_layers_history.csv +++ /dev/null @@ -1,637 +0,0 @@ -date,time,commit,violations -2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,0 -2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,0 -2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,0 -2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,0 -2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,0 -2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,0 -2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,0 -2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,0 -2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,0 -2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,0 -2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,0 -2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,0 -2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,0 -2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,0 -2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,0 -2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,0 -2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,0 -2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,0 -2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,0 -2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,0 -2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,0 -2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,0 -2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,0 -2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,0 -2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,0 -2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,0 -2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,0 -2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,0 -2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,0 -2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,0 -2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,0 -2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1 -2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,0 -2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,0 -2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,0 -2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,0 -2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,0 -2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,0 -2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,0 -2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,0 -2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,0 -2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,0 -2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,0 -2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,0 -2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,0 -2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,0 -2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,0 -2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,0 -2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,0 -2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,0 -2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,0 -2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,0 -2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,0 -2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,0 -2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,0 -2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,0 -2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,0 -2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,0 -2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,0 -2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,0 -2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,0 -2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,-1 -2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,-1 -2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,0 -2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,0 -2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,0 -2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,0 -2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,0 -2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,0 -2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,0 -2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,0 -2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,0 -2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1 -2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,0 -2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,0 -2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,0 -2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,0 -2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,0 -2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,0 -2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,0 -2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,0 -2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,0 -2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,0 -2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,0 -2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,0 -2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,0 -2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,0 -2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,0 -2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,0 -2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,0 -2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,0 -2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,0 -2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,0 -2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,0 -2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,0 -2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,0 -2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,0 -2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,0 -2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,0 -2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,0 -2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,0 -2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,0 -2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,0 -2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,0 -2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,0 -2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,0 -2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,0 -2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,0 -2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,0 -2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,0 -2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,0 -2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,0 -2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,0 -2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,0 -2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,0 -2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,0 -2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,0 -2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,0 -2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,0 -2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,0 -2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,0 -2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,0 -2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,0 -2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,0 -2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,0 -2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,0 -2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,0 -2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,0 -2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,0 -2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,0 -2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,0 -2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,0 -2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,0 -2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,0 -2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,0 -2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,0 -2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,0 -2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,0 -2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,0 -2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,0 -2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,0 -2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,0 -2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,0 -2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,0 -2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,0 -2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,0 -2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,0 -2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,0 -2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,0 -2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,0 -2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,0 -2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,0 -2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,0 -2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,0 -2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,0 -2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,0 -2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,0 -2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,0 -2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,0 -2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,0 -2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,0 -2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,0 -2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,0 -2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,0 -2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,0 -2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1 -2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,0 -2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,0 -2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,0 -2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,0 -2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,0 -2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,0 -2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,0 -2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,0 -2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,0 -2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,0 -2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,0 -2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,0 -2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,0 -2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,0 -2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,0 -2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,0 -2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,0 -2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,0 -2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,0 -2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,0 -2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,0 -2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,0 -2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,0 -2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,0 -2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,0 -2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,0 -2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,0 -2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,0 -2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,0 -2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,0 -2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,0 -2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,0 -2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,0 -2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,0 -2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,0 -2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,0 -2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,0 -2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,0 -2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,0 -2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,0 -2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,0 -2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,0 -2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,0 -2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,0 -2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,0 -2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,0 -2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,0 -2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,0 -2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,0 -2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,0 -2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,0 -2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,0 -2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,0 -2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,0 -2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,0 -2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,0 -2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,0 -2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,0 -2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,0 -2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,0 -2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,0 -2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,0 -2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,0 -2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,0 -2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,0 -2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,0 -2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,0 -2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,0 -2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,0 -2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,0 -2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,0 -2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,0 -2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,0 -2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,0 -2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,0 -2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,0 -2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,0 -2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,0 -2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,0 -2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,0 -2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,0 -2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,0 -2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,0 -2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,0 -2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,0 -2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,0 -2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,0 -2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,0 -2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,0 -2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,0 -2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,0 -2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,0 -2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,0 -2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,0 -2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,0 -2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,0 -2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,0 -2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,0 -2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,0 -2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,0 -2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,0 -2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,0 -2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,0 -2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,0 -2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,0 -2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,0 -2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,0 -2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,0 -2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,0 -2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,0 -2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,0 -2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,0 -2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,0 -2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,0 -2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,0 -2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,0 -2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,0 -2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,0 -2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,0 -2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,0 -2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,0 -2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,0 -2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,0 -2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,0 -2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,0 -2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,0 -2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,0 -2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,0 -2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,0 -2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1 -2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,0 -2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,0 -2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,0 -2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,0 -2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,0 -2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,0 -2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,0 -2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,0 -2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,0 -2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,0 -2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,0 -2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,0 -2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,0 -2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,0 -2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,0 -2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,0 -2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,0 -2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,0 -2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,0 -2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,0 -2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1 -2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,0 -2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,0 -2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,0 -2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,0 -2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,0 -2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,0 -2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,0 -2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,0 -2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,0 -2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,0 -2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,0 -2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,0 -2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,0 -2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,0 -2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,0 -2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,0 -2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,0 -2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,0 -2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,0 -2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,0 -2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,0 -2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,0 -2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,0 -2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,0 -2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,0 -2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,0 -2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,0 -2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,0 -2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,0 -2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,0 -2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,0 -2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,0 -2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,0 -2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,0 -2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,0 -2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,0 -2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,0 -2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,0 -2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,0 -2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,0 -2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,0 -2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,0 -2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,0 -2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,0 -2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,0 -2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,0 -2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,0 -2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,-1 -2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,0 -2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1 -2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,0 -2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,0 -2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,0 -2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,0 -2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,0 -2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,0 -2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,0 -2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,0 -2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,0 -2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1 -2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,0 -2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,0 -2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,0 -2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,0 -2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,0 -2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,0 -2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,0 -2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,0 -2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,0 -2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,0 -2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,0 -2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,0 -2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,0 -2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,0 -2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,0 -2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,0 -2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,0 -2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,0 -2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,0 -2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,0 -2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,0 -2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,0 -2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,0 -2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,0 -2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,0 -2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,0 -2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,0 -2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,0 -2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,0 -2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,0 -2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,0 -2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,0 -2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,0 -2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,0 -2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,0 -2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,0 -2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,0 -2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,0 -2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,0 -2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,0 -2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,0 -2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,0 -2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,0 -2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,0 -2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,0 -2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,0 -2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,0 -2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,0 -2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,0 -2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,0 -2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,0 -2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,0 -2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,0 -2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,0 -2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,0 -2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,0 -2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,0 -2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,0 -2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,0 -2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,14 -2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,14 -2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,14 -2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,14 -2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,14 -2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,14 -2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,14 -2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,14 -2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,14 -2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,14 -2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,14 -2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,14 -2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,14 -2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,14 -2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,14 -2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,14 -2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,14 -2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,14 -2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,14 -2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,14 -2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,14 -2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,14 -2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,14 -2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,14 -2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,14 -2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,14 -2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,14 -2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,14 -2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,14 -2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,14 -2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,14 -2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,14 -2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,14 -2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,14 -2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,14 -2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,14 -2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,14 -2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,14 -2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,14 -2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,14 -2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,14 -2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,14 -2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,14 -2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,14 -2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,14 -2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,14 -2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,14 -2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,14 -2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,14 -2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,14 -2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,14 -2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,14 -2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,14 -2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,14 -2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,14 -2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,14 -2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,2 -2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,2 -2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,2 -2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,2 -2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,2 -2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,2 -2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,2 -2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,2 -2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,2 -2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,2 -2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,2 -2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,2 -2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,2 -2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1 -2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,2 -2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,2 -2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,2 -2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,2 -2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,2 -2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,2 -2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,2 -2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,2 -2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,2 -2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,2 -2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,2 -2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,2 -2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,2 -2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,2 -2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,2 -2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,2 -2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1 -2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,2 -2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,2 -2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,2 -2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,2 -2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,2 -2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,2 -2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,2 -2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,2 -2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,2 -2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,2 -2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,2 -2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,2 -2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,2 -2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,2 -2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,2 -2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,2 -2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,2 -2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,2 -2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,2 -2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,2 -2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,2 -2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,2 -2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,2 -2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,2 -2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,2 -2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,2 -2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,2 -2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,2 -2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,2 -2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,2 -2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,2 -2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,2 -2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,2 -2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,2 -2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,2 -2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,2 -2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,2 -2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,2 -2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,2 -2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,2 -2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,2 -2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,2 -2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,2 -2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,2 -2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,2 -2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,2 -2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,2 -2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,2 -2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,2 -2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,2 -2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,2 -2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,2 -2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,2 -2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,2 -2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,2 -2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,2 -2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,2 -2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,2 -2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,2 -2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,2 -2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,2 -2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,2 -2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,2 -2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,2 -2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,2 -2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,2 -2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,2 -2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,2 -2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,2 -2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,2 -2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,2 -2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,2 -2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,2 -2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,2 -2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,2 -2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,2 -2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,2 -2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,2 -2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,2 -2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,2 -2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,2 -2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,2 -2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,2 -2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,2 -2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,2 -2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,2 -2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,2 -2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,2 -2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,2 -2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,2 -2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,2 -2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,2 -2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,2 -2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,2 -2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,2 -2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,2 -2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,2 -2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,2 -2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,2 -2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,2 -2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,2 -2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,2 -2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,2 -2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,2 -2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,2 -2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,2 -2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,2 -2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,2 -2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,2 -2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,2 -2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,2 -2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,2 -2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,2 diff --git a/docs/archunit-history/maven_build_time_history.csv b/docs/archunit-history/maven_build_time_history.csv deleted file mode 100644 index cffaab0a4..000000000 --- a/docs/archunit-history/maven_build_time_history.csv +++ /dev/null @@ -1,65 +0,0 @@ -date,time,commit,buildtime -2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,47 -2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,46 -2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,46 -2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,47 -2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,47 -2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,46 -2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,46 -2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,46 -2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,46 -2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,49 -2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,48 -2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,56 -2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,56 -2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,56 -2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,59 -2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,54 -2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,53 -2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,54 -2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,54 -2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,59 -2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,62 -2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,55 -2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,56 -2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,54 -2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,55 -2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,54 -2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,55 -2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,57 -2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,55 -2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,57 -2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,55 -2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,54 -2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,52 -2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,54 -2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,56 -2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,56 -2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,56 -2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,57 -2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,55 -2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,55 -2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,56 -2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,55 -2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,55 -2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,56 -2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,57 -2024-06-13,11:40:53,62850ef0b952963293bd1c103ea379f6d3d07b9b,-1 -2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,55 -2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,57 -2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,56 -2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,56 -2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,54 -2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,57 -2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,56 -2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,56 -2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,56 -2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,58 -2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,65 -2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,57 -2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,56 -2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,57 -2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,57 -2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,56 -2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,56 -2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,56 diff --git a/docs/archunit-history/maven_cycles_history.csv b/docs/archunit-history/maven_cycles_history.csv deleted file mode 100644 index 00586c2fe..000000000 --- a/docs/archunit-history/maven_cycles_history.csv +++ /dev/null @@ -1,64 +0,0 @@ -date,time,commit,all_modules_no_tests,all_modules_with_tests,analysis_no_tests,analysis_with_tests,api_no_tests,api_with_tests,config_no_tests,config_with_tests,gen_no_tests,gen_with_tests,graph_no_tests,graph_with_tests,main_no_tests,main_with_tests,parser_no_tests,parser_with_tests,uml_no_tests,uml_with_tests,util_no_tests,util_with_tests -2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,56,294,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 -2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 \ No newline at end of file diff --git a/docs/archunit-history/maven_layers_history.csv b/docs/archunit-history/maven_layers_history.csv deleted file mode 100644 index 9fca0ee54..000000000 --- a/docs/archunit-history/maven_layers_history.csv +++ /dev/null @@ -1,65 +0,0 @@ -date,time,commit,violations -2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,0 -2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,0 -2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,0 -2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,0 -2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,0 -2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,0 -2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,0 -2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,0 -2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,0 -2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,0 -2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,0 -2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,0 -2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,0 -2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,0 -2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,0 -2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,0 -2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,0 -2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,0 -2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,0 -2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,0 -2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,0 -2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,0 -2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,0 -2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,0 -2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,0 -2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,0 -2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,0 -2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,0 -2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,0 -2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,0 -2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,0 -2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,0 -2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,0 -2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,0 -2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,0 -2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,0 -2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,0 -2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,0 -2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,0 -2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,0 -2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,0 -2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,0 -2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,0 -2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,0 -2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,0 -2024-06-13,11:40:53,62850ef0b952963293bd1c103ea379f6d3d07b9b,-1 -2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,0 -2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,0 -2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,0 -2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,0 -2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,0 -2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,0 -2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,0 -2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,0 -2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,0 -2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,0 -2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,0 -2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,0 -2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,0 -2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,0 -2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,0 -2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,0 -2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,0 -2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,0 diff --git a/docs/archunit-results/README b/docs/archunit-results/README index ee9f54695..76d974a6e 100644 --- a/docs/archunit-results/README +++ b/docs/archunit-results/README @@ -1,2 +1,2 @@ -This file needs to stay here, because the directory is needed during test runs. +This file needs to stay here, because the directory is needed during test runs. If the file is removed, the directory would be "deleted" from the git repository. \ No newline at end of file diff --git a/docs/scripts/Ant/ant_cycles_test.ps1 b/docs/scripts/Ant/ant_cycles_test.ps1 deleted file mode 100644 index b44e264ba..000000000 --- a/docs/scripts/Ant/ant_cycles_test.ps1 +++ /dev/null @@ -1,284 +0,0 @@ -# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -# JAVA_HOME will need to be set to Java 14 / 8 -param( - [string]$StartCommitHash = "", - [string]$StartLoop = "y", - [string]$OriginalUseDir = "", - [string]$ResultsDir = "" -) - -. "..\general_utilities.ps1" -. ".\ant_utilities.ps1" - -######################################### -# Global variables start here # -######################################### - -$ErrorActionPreference = "Stop" -# Set paths based on parameters or use defaults -$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { - $OriginalUseDir -} else { - # Scripts are in docs/scripts/maven, go 3 levels up to repo root - Join-Path (Get-Location) "../../.."} - -# Validate that the original use directory exists -if (-not (Test-Path $ORIGINAL_USE_DIR)) { - Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" - Log-Message "Please specify the correct path using -OriginalUseDir parameter" - exit 1 -} - -$RESULTS_DIR = if ($ResultsDir -ne "") { - $ResultsDir -} else { - Get-Location -} - -# Create results directory if it doesn't exist -if (-not (Test-Path $RESULTS_DIR)) { - New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null -} - -$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" -$RESULTS_FILE = Join-Path $RESULTS_DIR "ant_cycles_test_results.csv" -$LOG_FILE = Join-Path $RESULTS_DIR "ant_cycles_test_log.txt" - -$RELEVANT_PATHS = @(("src/main")) -$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\java\org\tzi\use\architecture\AntCyclicDependenciesCoreTest.java" -$PROPERTIES_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\resources\archunit.properties" - -$ARCHUNIT_JUNIT_PATH = "" -$ARCHUNIT_CORE_PATH = "" -$SLF4J_API_PATH = "" -$SLF4J_SIMPLE_PATH = "" - -######################################### -# Functions start here # -######################################### - -######################################### -# Util Functions # -######################################### - -function Record-Result { - param( - [string]$CommitHash, - [hashtable]$CycleCounts - ) - - $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash - $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash - - $csvLine = "$commitDate,$commitTime,$CommitHash" - - $metrics = @( - "all_modules", - "analysis", - "api", - "config", - "gen", - "graph", - "main", - "parser", - "uml", - "util" - ) - - foreach ($metric in $metrics) { - $value = if ($CycleCounts.ContainsKey($metric)) { $CycleCounts[$metric] } else { 0 } - $csvLine += ",$value" - } - - $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false - [System.IO.File]::AppendAllText($RESULTS_FILE, "$csvLine`r`n", $utf8NoBomEncoding) - Log-Message "Recorded result for commit $CommitHash with all metrics" - - # Save the cycle counts to use for the next commit if needed - $script:previousCycleCounts = $CycleCounts.Clone() -} - -function Parse-CycleResults { - param( - [string[]]$OutputLines - ) - - $metrics = @{} - - # Regex pattern to extract cycle counts - $pattern = "Number of cycles in (org\.tzi\.use(?:\.\w+)?): (\d+)" - $patternCore = "Cycles in core module: (\d+)" - - foreach ($line in $OutputLines) { - # Match for core module counts (all_modules) - if ($line -match $patternCore) { - $metrics["all_modules"] = [int]$matches[1] - } - # Match for specific package counts - elseif ($line -match $pattern) { - $package = $matches[1] -replace "org\.tzi\.use\.", "" - # Handle root package - if ($package -eq "org.tzi.use") { - $package = "all_modules" - } - $metrics[$package] = [int]$matches[2] - } - } - - return $metrics -} - -######################################### -# Dependency Functions # -######################################### - -function Check-Buildxml-Classpath { - $buildXml = Get-Content "build.xml" -Raw - - # Check for ArchUnit property definitions - $hasArchunitJar = $buildXml -match "archunit\.jar" - $hasArchunitJunit4Jar = $buildXml -match "archunit-junit4\.jar" - - # Check for ArchUnit in compilation classpath - $compileClasspathHasArchUnit = $buildXml -match '&1 - - # Parse metrics directly from test output - $cycleMetrics = Parse-CycleResults -OutputLines $test_output - - if ($cycleMetrics.Count -gt 0) { - Log-Message "Successfully parsed cycle metrics from output" - Record-Result -CommitHash $CommitHash -CycleCounts $cycleMetrics - return - } else { - Log-Message "No cycle metrics found in test output" - $failureMetrics = @{} - $metrics = @( - "all_modules", - "analysis", - "api", - "config", - "gen", - "graph", - "main", - "parser", - "uml", - "util" - ) - foreach ($metric in $metrics) { - $failureMetrics[$metric] = -1 - } - Record-Result -CommitHash $CommitHash -CycleCounts $failureMetrics - return - } -} - -function Process-Commit { - param( - [string]$CommitHash - ) - Add-CombinatoricsLib-If-Missing - Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\org\tzi\use\architecture" -FileName "AntCyclicDependenciesCoreTest.java" -FileContent $test_file_content - Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\resources" -FileName "archunit.properties" -FileContent $properties_file_content - Remove-Id-Tags - Update-Java-Version - Add-Dependencies-To-Lib -TempDir $TEMP_DIR - Update-Dependencies-In-Buildxml - Add-Missing-Test-Target-To-Buildxml - Check-Buildxml-Classpath - Check-And-Fix-Bag-File - Check-And-Fix-DiagramView-File - Check-And-Fix-ExtendedJTable-File - Execute-ArchUnit-Test -CommitHash $CommitHash -} - -######################################### -# Setup starts here # -######################################### - -# Initialize csv file with header -Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util" -# Create and move to use copy -Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR -# Download dependencies once -Setup-Dependencies-In-Shared-Dir -ResultsDir $RESULTS_DIR - -######################################### -# Store ArchUnit Test # -######################################### - -$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH -$properties_file_content = Store-ArchTest -TestFilePath $PROPERTIES_FILE_PATH - -######################################### -# Main Loop starts here # -######################################### - -Verify-StartCommit -StartCommit $StartCommitHash - -# Determine which commits to process -$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop - -$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count -$CURRENT_COMMIT = 1 -$previousCycleCounts = @{} - -try { - foreach ($COMMIT in $CommitsToProcess) { - Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" - - # Get previous commit hash - $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null - if ($LASTEXITCODE -ne 0) { - $previousCommit = $null - } - - $isFirstCommitInRepo = ($previousCommit -eq $null) - $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) - $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) - - if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { - git checkout -q $COMMIT - $is_ant = Test-Path (Join-Path $TEMP_DIR "build.xml") - - if ($is_ant) { - Process-Commit -CommitHash $COMMIT - } else { - Log-Message "No build.xml found. Skipping this commit..." - } - } else { - Log-Message "No relevant changes in commit $COMMIT. Using previous cycle counts." - if ($previousCycleCounts.Count -gt 0) { - Record-Result -CommitHash $COMMIT -CycleCounts $previousCycleCounts - } - } - $CURRENT_COMMIT++ - Cleanup-Commit - } -} -catch { - Log-Message "Catch Block: An error occurred: $_" - Log-Message "Stack Trace: $($_.ScriptStackTrace)" -} -finally { - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR - $dependencies_dir = Join-Path $RESULTS_DIR "dependencies" - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $dependencies_dir -} \ No newline at end of file diff --git a/docs/scripts/Ant/ant_layer_test.ps1 b/docs/scripts/Ant/ant_layer_test.ps1 deleted file mode 100644 index b641c3eae..000000000 --- a/docs/scripts/Ant/ant_layer_test.ps1 +++ /dev/null @@ -1,190 +0,0 @@ -# JAVA_HOME will need to be set to Java 14 / 8 -# Erster Ant Commit 4cdc2d1 - -param( - [string]$StartCommitHash = "", - [string]$StartLoop = "y", - [string]$OriginalUseDir = "", - [string]$ResultsDir = "" -) - -. "..\general_utilities.ps1" -. ".\ant_utilities.ps1" - -######################################### -# Global variables start here # -######################################### - -$ErrorActionPreference = "Stop" -# Set paths based on parameters or use defaults -$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { - $OriginalUseDir -} else { - # Scripts are in docs/scripts/maven, go 3 levels up to repo root - Join-Path (Get-Location) "../../.."} - -# Validate that the original use directory exists -if (-not (Test-Path $ORIGINAL_USE_DIR)) { - Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" - Log-Message "Please specify the correct path using -OriginalUseDir parameter" - exit 1 -} - -$RESULTS_DIR = if ($ResultsDir -ne "") { - $ResultsDir -} else { - Get-Location -} - -# Create results directory if it doesn't exist -if (-not (Test-Path $RESULTS_DIR)) { - New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null -} - -$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" -$RESULTS_FILE = Join-Path $RESULTS_DIR "ant_layer_violations_history.csv" -$LOG_FILE = Join-Path $RESULTS_DIR "ant_layer_test_log.txt" - -$RELEVANT_PATHS = @(("src/main"), ("src/gui")) -$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-gui\src\test\java\org\tzi\use\architecture\AntLayeredArchitectureTest.java" - -$ARCHUNIT_JUNIT_PATH = "" -$ARCHUNIT_CORE_PATH = "" -$SLF4J_API_PATH = "" -$SLF4J_SIMPLE_PATH = "" - -######################################### -# Functions start here # -######################################### - -function Parse-Test-Results { - param( - [string]$TestOutput - ) - - $violation_count = -1 - - foreach ($line in $test_output) { - if ($line -match "Number of violations: (\d+)") { - $violation_count = [int]$matches[1] - Log-Message "Found violation count: $violation_count" - break - } - } - return $violation_count -} - -######################################### -# Building & Testing Functions # -######################################### - -function Run-ArchUnit-Test { - param( - [string]$CommitHash - ) - - Log-Message "Running ant test-junit for ArchUnit test..." - $test_output = ant test-junit -Dtest.case="org.tzi.use.architecture.AntLayeredArchitectureTest" 2>&1 - - $violation_count = Parse-Test-Results -TestOutput $test_output - - if ($violation_count -ge 0) { - Record-Simple-Result -CommitHash $CommitHash -TestResult $violation_count -ResultsFile $RESULTS_FILE - } else { - Log-Message "Failed to extract violation count from test output" - Record-Simple-Result -CommitHash $CommitHash -ResultsFile $RESULTS_FILE - } -} - -function Process-Commit { - param( - [string]$CommitHash - ) - - Add-CombinatoricsLib-If-Missing - Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\org\tzi\use\architecture" -FileName "AntLayeredArchitectureTest.java" -FileContent $test_file_content - Remove-Id-Tags - Update-Java-Version - Add-Dependencies-To-Lib -TempDir $TEMP_DIR - Update-Dependencies-In-Buildxml - Add-Missing-Test-Target-To-Buildxml - - if ($LASTEXITCODE -ne 0) { - Log-Message "Build.xml injection failed. Skipping this commit..." - Record-Simple-Result -CommitHash $CommitHash -ResultsFile $RESULTS_FILE - return $false - } - - Check-And-Fix-Bag-File - Check-And-Fix-DiagramView-File - Check-And-Fix-ExtendedJTable-File - Run-ArchUnit-Test -CommitHash $CommitHash - return $true -} - -######################################### -# Setup starts here # -######################################### - -# Initialize results file with headers -Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,violations" -# Create and move to use copy -Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR -# Download dependencies once -Setup-Dependencies-In-Shared-Dir -ResultsDir $RESULTS_DIR - -######################################### -# Store ArchUnit Test # -######################################### - -$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH - -######################################### -# Main Loop starts here # -######################################### - -Verify-StartCommit -StartCommit $StartCommitHash - -$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop -$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count -$CURRENT_COMMIT = 1 - -try { - foreach ($COMMIT in $CommitsToProcess) { - Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" - - $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null - - $isFirstCommitInRepo = ($previousCommit -eq $null) - $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) - $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) - - if($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { - git checkout -q $COMMIT - $is_ant = Test-Path (Join-Path $TEMP_DIR "build.xml") - $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") - - if($is_ant -and (-not $is_maven)) { - $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT - if (-not $commitProcessedSuccessfully) { - Log-Message "Build failed for commit $COMMIT" - } - } else { - Log-Message "No build.xml found. Skipping this commit..." - } - } else { - Log-Message "No relevant changes in commit $COMMIT. Skipping..." - } - $CURRENT_COMMIT++ - Cleanup-Commit - } -} -catch { - Log-Message "Catch Block: An error occurred: $_" - Log-Message "Stack Trace: $($_.ScriptStackTrace)" -} -finally { - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR - $dependencies_dir = Join-Path $RESULTS_DIR "dependencies" - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $dependencies_dir -} \ No newline at end of file diff --git a/docs/scripts/Ant/ant_utilities.ps1 b/docs/scripts/Ant/ant_utilities.ps1 deleted file mode 100644 index bc90a84a9..000000000 --- a/docs/scripts/Ant/ant_utilities.ps1 +++ /dev/null @@ -1,297 +0,0 @@ -######################################### -# Fixing Functions # -######################################### - -function Check-And-Fix-Bag-File { - $bagFile = Get-ChildItem -Recurse -Filter "Bag.java" | Select-Object -First 1 - - if ($bagFile) { - $content = Get-Content $bagFile.FullName -Raw - $needsFixing = $content -match 'boolean contains\(T obj\)' -or - $content -match 'boolean remove\(T o\)' -or - (-not ($content -match '@Override.*boolean contains\(Object obj\)' -or - $content -match '@Override.*boolean remove\(Object o\)')) - - if ($needsFixing) { - Log-Message "Faulty Bag interface - Applying fix..." - $content = $content -replace 'boolean contains\(T obj\)', 'boolean contains(Object obj)' - $content = $content -replace 'boolean remove\(T o\)', 'boolean remove(Object o)' - $content | Set-Content $bagFile.FullName - } - } -} - -function Check-And-Fix-DiagramView-File { - $diagramViewFile = Get-ChildItem -Recurse -Filter "DiagramView.java" | Select-Object -First 1 - - if ($diagramViewFile) { - $content = Get-Content $diagramViewFile.FullName -Raw - $needsFixing = $content -match 'new OutputFormat\(doc\);' - - if ($needsFixing) { - Log-Message "Faulty DiagramView file - Applying fix..." - $content = $content -replace 'new OutputFormat\(doc\);', 'new OutputFormat();' - $content | Set-Content $diagramViewFile.FullName - } - } -} - -function Check-And-Fix-ExtendedJTable-File { - $extendedJTableFile = Get-ChildItem -Recurse -Filter "ExtendedJTable.java" | Select-Object -First 1 - - if ($extendedJTableFile) { - $content = Get-Content $extendedJTableFile.FullName -Raw - $needsFixing = $content -match 'public ExtendedJTable\(Vector\<\?\> rowData\, Vector\<\?\> columnNames\)' - - if ($needsFixing) { - Log-Message "Faulty ExtendedJTable constructor - Applying fix..." - $content = $content -replace 'public ExtendedJTable\(Vector\<\?\> rowData\, Vector\<\?\> columnNames\)', 'public ExtendedJTable(Vector> rowData, Vector columnNames)' - $content | Set-Content $extendedJTableFile.FullName - } - } -} - -function Remove-Id-Tags { - Get-ChildItem -Recurse -Filter *.java | ForEach-Object { - $content = Get-Content $_.FullName -Raw - if ($content -match '\$Id\$') { - $content = $content -replace '\$Id\$', '' - $content | Set-Content $_.FullName - } - } - if (Test-Path "build.xml") { - $content = Get-Content "build.xml" -Raw - if ($content -match '') { - $content = $content -replace '\s*\n', '' - $content | Set-Content "build.xml" - } - } -} - -######################################### -# Dependency Functions # -######################################### - -# Downloads necessary jar-Files from Maven Central into a specified dir -function Download-Jar { - param( - [string]$GroupId, - [string]$ArtifactId, - [string]$Version, - [string]$TargetDir - ) - - $groupPath = $GroupId -replace '\.', '/' - $jarName = "$ArtifactId-$Version.jar" - $url = "https://repo1.maven.org/maven2/$groupPath/$ArtifactId/$Version/$jarName" - $targetPath = Join-Path $TargetDir $jarName - - try { - Invoke-WebRequest -Uri $url -OutFile $targetPath -UseBasicParsing - Log-Message "Successfully downloaded $jarName" - return $targetPath - } - catch { - Log-Message "Failed to download $jarName`: $_" - exit 1 - } -} - -# Locally creates shared dependencies dir for all commits and calls Download-Jar -# This avoids downloading jars for every commit -function Setup-Dependencies-In-Shared-Dir { - param( - [string]$ResultsDir - ) - - # Create a shared lib directory for downloads - $shared_dep_dir = Join-Path $ResultsDir "dependencies" - if (-not (Test-Path $shared_dep_dir)) { - New-Item -ItemType Directory -Force -Path $shared_dep_dir | Out-Null - } - - # Download dependencies once and store paths in global variables - $script:ARCHUNIT_JUNIT_PATH = Download-Jar "com.tngtech.archunit" "archunit-junit4" "0.23.1" $shared_dep_dir - $script:ARCHUNIT_CORE_PATH = Download-Jar "com.tngtech.archunit" "archunit" "0.23.1" $shared_dep_dir - $script:SLF4J_API_PATH = Download-Jar "org.slf4j" "slf4j-api" "1.7.25" $shared_dep_dir - $script:SLF4J_SIMPLE_PATH = Download-Jar "org.slf4j" "slf4j-nop" "1.7.25" $shared_dep_dir - - Log-Message "Dependencies setup completed" -} - -# Copies pre-downloaded dependencies to a commit's lib directory -function Add-Dependencies-To-Lib { - param( - [string]$TempDir - ) - $lib_dir = Join-Path $TempDir "lib" - if (-not (Test-Path $lib_dir)) { - New-Item -ItemType Directory -Force -Path $lib_dir | Out-Null - } - - Copy-Item $script:ARCHUNIT_JUNIT_PATH (Join-Path $lib_dir "archunit-junit4-0.23.1.jar") - Copy-Item $script:ARCHUNIT_CORE_PATH (Join-Path $lib_dir "archunit-0.23.1.jar") - Copy-Item $script:SLF4J_API_PATH (Join-Path $lib_dir "slf4j-api-1.7.25.jar") - Copy-Item $script:SLF4J_SIMPLE_PATH (Join-Path $lib_dir "slf4j-simple-1.7.25.jar") - - Log-Message "Copied ArchUnit & SLF4J dependencies to lib directory" -} - -######################################### -# Debugging Functions # -######################################### - -function Detect-Original-Java-Version { - if (Test-Path "build.xml") { - $buildXml = Get-Content "build.xml" -Raw - - # Check for source version pattern - if ($buildXml -match 'source="(1\.)?(\d+)"') { - $sourceVersion = $matches[2] - Log-Message "Original Java source version detected: $sourceVersion" - } - elseif ($buildXml -match 'java\.sourceversion"\s+value="1\.(\d+)"') { - $sourceVersion = $matches[1] - Log-Message "Original Java source version detected: $sourceVersion" - } - elseif ($buildXml -match 'value="1\.(\d+)"') { - $sourceVersion = $matches[1] - Log-Message "Original Java version detected: $sourceVersion" - } - else { - Log-Message "Could not detect Java version from build.xml" - } - - # Also check if ANTLR version is specified - if ($buildXml -match 'antlr-([\d\.]+)\.jar') { - $antlrVersion = $matches[1] - Log-Message "ANTLR version detected: $antlrVersion" - } - } - else { - Log-Message "build.xml not found, cannot detect Java version" - } -} - -function Print-BuildXml { - if (Test-Path "build.xml") { - Write-Host "Contents of build.xml:" - Get-Content "build.xml" | ForEach-Object { Write-Host $_ } - } else { - Write-Host "build.xml not found in the current directory." - } -} - -######################################### -# Updating Functions # -######################################### - -# Update to Java 8 because 6 is not compatible with ArchUnit and to increase backwards compatibility -function Update-Java-Version { - $buildXml = Get-Content "build.xml" -Raw - - $buildXml = $buildXml -replace 'source="(1\.)?(\d+)"', 'source="8"' - $buildXml = $buildXml -replace 'target="(1\.)?(\d+)"', 'target="8"' - $buildXml = $buildXml -replace '(java\.targetversion"\s+value=")1\.?\d+(")', 'java.targetversion" value="8"' - $buildXml = $buildXml -replace '(java\.sourceversion"\s+value=")1\.?\d+(")', 'java.sourceversion" value="8"' - $buildXml = $buildXml -replace 'value="1\.[0-7]+"', 'value="8"' - $buildXml = $buildXml -replace 'value="1\.[0-7]+\s*"', 'value="8"' - - $buildXml | Set-Content "build.xml" - - $content = Get-Content "build.xml" -Raw - if ($content -match 'value="8"') { - Log-Message "Successfully updated Java version to 8" - } else { - Log-Message "Java version update may not have worked. Exiting..." - exit 1 - } -} - -# Add necessary archunit and slf4j dependencies to build.xml -function Update-Dependencies-In-Buildxml { - $buildXml = Get-Content "build.xml" -Raw - - $buildXml = $buildXml -replace '()[\s\S]*?', '$1' - - if ($buildXml -match "archunit-junit4-0.23.1.jar|archunit-0.23.1.jar") { - Log-Message "ArchUnit dependencies already present in build.xml" - return - } - - $propertyInsert = @" - - - - - -"@ - - $buildXml = $buildXml -replace '()', "`$1`n$propertyInsert" - $buildXml = $buildXml -replace '()', "`$1`n$propertyInsert" - - $newDeps = ':${archunit.jar}:${archunit-junit4.jar}:${slf4j-api.jar}:${slf4j-simple.jar}:${src.test.resources.dir}' - - $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\}:\$\{combinatoricslib\.jar\}:\$\{vtd-xml\.jar\}:\$\{itextpdf\.jar\})', "`$1$newDeps" - $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\}:\$\{combinatoricslib\.jar\})', "`$1$newDeps" - - $buildXml = $buildXml -replace '(classpath path="\$\{antlr\.jar\}:\$\{build\.classes\.dir\}:\$\{gsbase\.jar\}:\$\{jruby\.jar\}:\$\{junit\.jar\}:\$\{guava\.jar\})', "`$1$newDeps" - $buildXml = $buildXml -replace '(classpath path="\$\{antlr\.jar\}:\$\{build\.classes\.dir\}:\$\{gsbase\.jar\}:\$\{jruby\.jar\}:\$\{junit\.jar\})', "`$1$newDeps" - - $buildXml | Set-Content "build.xml" -Force - Log-Message "Successfully added ArchUnit dependencies to build.xml" -} - -######################################### -# Adding Missing Build.xml Contents Functions # -######################################### - -# Add a test-junit target if it doesn't exist -function Add-Missing-Test-Target-To-Buildxml { - $buildXml = Get-Content "build.xml" -Raw - - if ($buildXml -notmatch ' - - - - - - - - - - - - - - - - -"@ - - # Add test target before closing bracket of project - if ($buildXml -match '') { - $buildXml = $buildXml -replace '', "$testJunitTarget`n" - $buildXml | Set-Content "build.xml" -Force - Log-Message "Added test-junit target to build.xml" - } - } -} - -# Adds missing reference of combinatoricslib in build.xml, relies on it being present in the lib dir -function Add-CombinatoricsLib-If-Missing { - $buildXml = Get-Content "build.xml" -Raw - - if ($buildXml -notmatch "combinatoricslib\.jar") { - $propertyLine = ' ' - $buildXml = $buildXml -replace '()', "`$1`n$propertyLine" - - $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{jruby\.jar\})"', '$1:${combinatoricslib.jar}"' - $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\})"', '$1:${combinatoricslib.jar}"' - - $buildXml | Set-Content "build.xml" -Force - Log-Message "Added combinatoricslib dependency to build.xml" - } -} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_buildtime_test.ps1 b/docs/scripts/Maven/maven_buildtime_test.ps1 deleted file mode 100644 index 2c2b12f46..000000000 --- a/docs/scripts/Maven/maven_buildtime_test.ps1 +++ /dev/null @@ -1,139 +0,0 @@ -# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -# First Maven Commit is 132ab9b -param( - [string]$StartCommitHash = "", - [string]$StartLoop = "y", - [string]$OriginalUseDir = "", - [string]$ResultsDir = "" -) - -. ".\general_utilities.ps1" -. ".\maven_utilities.ps1" - -######################################### -# Global variables start here # -######################################### - -$ErrorActionPreference = "Stop" -# Set paths based on parameters or use defaults -$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { - $OriginalUseDir -} else { - # Scripts are in docs/scripts/maven, go 3 levels up to repo root - Join-Path (Get-Location) "../../.."} - -# Validate that the original use directory exists -if (-not (Test-Path $ORIGINAL_USE_DIR)) { - Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" - Log-Message "Please specify the correct path using -OriginalUseDir parameter" - exit 1 -} - -$RESULTS_DIR = if ($ResultsDir -ne "") { - $ResultsDir -} else { - Get-Location -} - -# Create results directory if it doesn't exist -if (-not (Test-Path $RESULTS_DIR)) { - New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null -} - -$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" -$RESULTS_FILE = Join-Path $RESULTS_DIR "build_time_history.csv" -$LOG_FILE = Join-Path $RESULTS_DIR "test_log_build_time_history.txt" - -######################################### -# Functions start here # -######################################### - -######################################### -# Build & Execution Functions # -######################################### - -function Measure-Build-Time { - param( - [string]$CommitHash - ) - - Log-Message "Measuring build time..." - - # Measure time it takes to build & test the project - $startTime = Get-Date - $buildOutput = mvn --batch-mode --update-snapshots verify - $endTime = Get-Date - $buildTime = $endTime - $startTime - # Convert to seconds - $buildTimeSec = [int]$buildTime.TotalSeconds - - if ($LASTEXITCODE -eq 0) { - Log-Message "Build completed successfully in $buildTimeSec s" - Record-Simple-Result -CommitHash $CommitHash -TestResult $buildTimeSec -ResultsFile $RESULTS_FILE - return $true - } else { - return $false - } -} - -function Process-Commit { - param( - [string]$CommitHash - ) - - Update-Java-Version-For-Maven - Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR - $mavenBuildSuccess = Measure-Build-Time -CommitHash $CommitHash - Cleanup-Commit - - return $mavenBuildSuccess -} - -######################################### -# Setup starts here # -######################################### - -# Initialize results file with headers -Initialize-Results-File -FilePath $RESULTS_DIR -Header "date,time,commit,buildtime" - -Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR -git checkout -q master - -######################################### -# Main Loop starts here # -######################################### - -Verify-StartCommit -StartCommit $StartCommitHash - -# Determine which commits to process -$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop - -$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count -$CURRENT_COMMIT = 1 - -try { - foreach ($COMMIT in $CommitsToProcess) { - Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" - - git checkout -q $COMMIT - $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") - - if($is_maven) { - $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT - if (-not $commitProcessedSuccessfully) { - Log-Message "Build failed for commit $COMMIT" - Record-Simple-Result -CommitHash $COMMIT -TestResult -1 -ResultsFile $RESULTS_FILE - } - } else { - Log-Message "No pom.xml found. Skipping this commit..." - } - $CURRENT_COMMIT++ - } -} -catch { - Log-Message "Catch Block: An error occurred: $_" - Log-Message "Stack Trace: $($_.ScriptStackTrace)" -} -finally { - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR -} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_cycles_test.ps1 b/docs/scripts/Maven/maven_cycles_test.ps1 deleted file mode 100644 index 81bdb4f81..000000000 --- a/docs/scripts/Maven/maven_cycles_test.ps1 +++ /dev/null @@ -1,288 +0,0 @@ -# JAVA_HOME will need to be set to Java 21 -# First Maven Commit is 132ab9b -param( - [string]$StartCommitHash = "", - [string]$StartLoop = "y", - [string]$OriginalUseDir = "", - [string]$ResultsDir = "" -) - -. "..\general_utilities.ps1" -. ".\maven_utilities.ps1" - -######################################### -# Global variables start here # -######################################### - -$ErrorActionPreference = "Stop" -# Set paths based on parameters or use defaults -$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { - $OriginalUseDir -} else { - # Scripts are in docs/scripts/maven, go 3 levels up to repo root - Join-Path (Get-Location) "../../.." -} - -# Validate that the original use directory exists -if (-not (Test-Path $ORIGINAL_USE_DIR)) { - Write-Host "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" - Write-Host "Please specify the correct path using -OriginalUseDir parameter" - exit 1 -} - -$RESULTS_DIR = if ($ResultsDir -ne "") { - $ResultsDir -} else { - Get-Location -} - -# Create results directory if it doesn't exist -if (-not (Test-Path $RESULTS_DIR)) { - New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null -} - -$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" -$RESULTS_FILE = Join-Path $RESULTS_DIR "maven_cycles_history.csv" -$LOG_FILE = Join-Path $RESULTS_DIR "maven_cycles_test_log.txt" - -$RELEVANT_PATHS = @( - ("use-gui/src/"), - ("use-core/src/") -) -$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\java\org\tzi\use\architecture\MavenCyclicDependenciesCoreTest.java" -$PROPERTIES_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\resources\archunit.properties" - -######################################### -# Functions start here # -######################################### - -######################################### -# Util Functions # -######################################### - -function Record-Result { - param( - [string]$CommitHash, - [hashtable]$CycleCounts - ) - - $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash - $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash - - $csvLine = "$commitDate,$commitTime,$CommitHash" - - # Add metrics in the correct order for CSV - $metrics = @( - "all_modules_no_tests", "all_modules_with_tests", - "analysis_no_tests", "analysis_with_tests", - "api_no_tests", "api_with_tests", - "config_no_tests", "config_with_tests", - "gen_no_tests", "gen_with_tests", - "graph_no_tests", "graph_with_tests", - "main_no_tests", "main_with_tests", - "parser_no_tests", "parser_with_tests", - "uml_no_tests", "uml_with_tests", - "util_no_tests", "util_with_tests" - ) - - foreach ($metric in $metrics) { - $value = if ($CycleCounts.ContainsKey($metric)) { $CycleCounts[$metric] } else { 0 } - $csvLine += ",$value" - } - - $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false - [System.IO.File]::AppendAllText($RESULTS_FILE, "$csvLine`r`n", $utf8NoBomEncoding) - Log-Message "Recorded result for commit $CommitHash with all metrics" - - # Save the cycle counts to use for the next commit if needed - $script:previousCycleCounts = $CycleCounts.Clone() -} - -function Parse-CycleResults { - param( - [string[]]$OutputLines - ) - - $metrics = @{} - - # Regex patterns to extract cycle counts from stdout - $patternNoTests = "Number of cycles in (org\.tzi\.use(?:\.\w+)?) without tests: (\d+)" - $patternWithTests = "Number of cycles in (org\.tzi\.use(?:\.\w+)?) with tests: (\d+)" - $patternCoreNoTests = "Cycles in core module without tests : (\d+)" - $patternCoreWithTests = "Cycles in core module with tests : (\d+)" - - foreach ($line in $OutputLines) { - # Match for core module counts (all_modules) - if ($line -match $patternCoreNoTests) { - $metrics["all_modules_no_tests"] = [int]$matches[1] - } - elseif ($line -match $patternCoreWithTests) { - $metrics["all_modules_with_tests"] = [int]$matches[1] - } - # Match for specific package counts - elseif ($line -match $patternNoTests) { - $package = $matches[1] -replace "org\.tzi\.use\.", "" - # Handle root package - if ($package -eq "org.tzi.use") { - $package = "all_modules" - } - $metrics["$($package)_no_tests"] = [int]$matches[2] - } - elseif ($line -match $patternWithTests) { - $package = $matches[1] -replace "org\.tzi\.use\.", "" - # Handle root package - if ($package -eq "org.tzi.use") { - $package = "all_modules" - } - $metrics["$($package)_with_tests"] = [int]$matches[2] - } - } - return $metrics -} - -######################################### -# Build & Execution Functions # -######################################### - -function Run-ArchUnit-Test { - Log-Message "Running ArchUnit test..." - $test_output = mvn -pl use-core test "-Dtest=org.tzi.use.architecture.MavenCyclicDependenciesCoreTest#count_cycles_in_core_without_tests" -DfailIfNoTests=false 2>&1 - - # Parse metrics directly from test output - $cycleMetrics = Parse-CycleResults -OutputLines $test_output - - if ($cycleMetrics.Count -gt 0) { - Log-Message "Successfully parsed cycle metrics from output" - return $cycleMetrics - } else { - Log-Message "No cycle metrics found in test output" - return @{} - } -} - -function Maven-Build-And-Test { - param( - [string]$CommitHash - ) - - $compile_output = mvn clean compile 2>&1 - if ($LASTEXITCODE -ne 0) { - Log-Message "Maven compilation failed. Error output:" - $compile_output | ForEach-Object { Log-Message $_ } - return $false - } - - $cycleMetrics = Run-ArchUnit-Test - - if ($cycleMetrics.Count -gt 0) { - Record-Result -CommitHash $CommitHash -CycleCounts $cycleMetrics - return $true - } else { - return $false - } -} - -function Process-Commit { - param( - [string]$CommitHash, - [hashtable]$PreviousCycleCounts - ) - - Update-Java-Version-For-Maven - Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR - Inject-File -TempDir $TEMP_DIR -RelativePath "use-core\src\test\java\org\tzi\use\architecture" -FileName "MavenCyclicDependenciesCoreTest.java" -FileContent $test_file_content - Inject-File -TempDir $TEMP_DIR -RelativePath "use-core\src\test\resources" -FileName "archunit.properties" -FileContent $properties_file_content - $mavenBuildSuccess = Maven-Build-And-Test -CommitHash $CommitHash - - return $mavenBuildSuccess -} - - -######################################### -# Setup starts here # -######################################### - -# Initialize results file with header -Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,all_modules_no_tests,all_modules_with_tests,analysis_no_tests,analysis_with_tests,api_no_tests,api_with_tests,config_no_tests,config_with_tests,gen_no_tests,gen_with_tests,graph_no_tests,graph_with_tests,main_no_tests,main_with_tests,parser_no_tests,parser_with_tests,uml_no_tests,uml_with_tests,util_no_tests,util_with_tests" -# Create and move to use copy -Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR - -######################################### -# Store ArchUnit Test # -######################################### - -$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH -$properties_file_content = Store-ArchTest -TestFilePath $PROPERTIES_FILE_PATH - -######################################### -# Main Loop starts here # -######################################### - -Verify-StartCommit -StartCommit $StartCommitHash - -# Determine which commits to process -$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop - -$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count -$CURRENT_COMMIT = 1 -$previousCycleCounts = @{} - -try { - foreach ($COMMIT in $CommitsToProcess) { - Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" - - # Get previous commit hash - $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null - if ($LASTEXITCODE -ne 0) { - $previousCommit = $null - } - - $isFirstCommitInRepo = ($previousCommit -eq $null) - $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) - $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) - - if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { - git checkout -q $COMMIT - $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") - - if ($is_maven) { - $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT -PreviousCycleCounts $previousCycleCounts - if (-not $commitProcessedSuccessfully) { - $failureMetrics = @{} - $metrics = @( - "all_modules_no_tests", "all_modules_with_tests", - "analysis_no_tests", "analysis_with_tests", - "api_no_tests", "api_with_tests", - "config_no_tests", "config_with_tests", - "gen_no_tests", "gen_with_tests", - "graph_no_tests", "graph_with_tests", - "main_no_tests", "main_with_tests", - "parser_no_tests", "parser_with_tests", - "uml_no_tests", "uml_with_tests", - "util_no_tests", "util_with_tests" - ) - foreach ($metric in $metrics) { - $failureMetrics[$metric] = -1 - } - Record-Result -CommitHash $COMMIT -CycleCounts $failureMetrics - } - } else { - Log-Message "No pom.xml found. Skipping this commit..." - } - } else { - Log-Message "No relevant changes in commit $COMMIT. Using previous cycle counts." - if ($previousCycleCounts.Count -gt 0) { - Record-Result -CommitHash $COMMIT -CycleCounts $previousCycleCounts - } - } - $CURRENT_COMMIT++ - Cleanup-Commit - } -} -catch { - Log-Message "Catch Block: An error occurred: $_" - Log-Message "Stack Trace: $($_.ScriptStackTrace)" -} -finally { - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR -} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_layer_test.ps1 b/docs/scripts/Maven/maven_layer_test.ps1 deleted file mode 100644 index 8889d13ab..000000000 --- a/docs/scripts/Maven/maven_layer_test.ps1 +++ /dev/null @@ -1,218 +0,0 @@ -# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -# First Maven Commit is 132ab9b -param( - [string]$StartCommitHash = "", - [string]$StartLoop = "y", - [string]$OriginalUseDir = "", - [string]$ResultsDir = "" -) - -. "..\general_utilities.ps1" -. ".\maven_utilities.ps1" - -######################################### -# Global variables start here # -######################################### - -$ErrorActionPreference = "Stop" -# Set paths based on parameters or use defaults -$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { - $OriginalUseDir -} else { - # Scripts are in docs/scripts/maven, go 3 levels up to repo root - Join-Path (Get-Location) "../../.." -} - -# Validate that the original use directory exists -if (-not (Test-Path $ORIGINAL_USE_DIR)) { - Write-Host "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" - Write-Host "Please specify the correct path using -OriginalUseDir parameter" - exit 1 -} - -$RESULTS_DIR = if ($ResultsDir -ne "") { - $ResultsDir -} else { - Get-Location -} - -# Create results directory if it doesn't exist -if (-not (Test-Path $RESULTS_DIR)) { - New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null -} - -$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" -$RESULTS_FILE = Join-Path $RESULTS_DIR "maven_layers_history.csv" -$LOG_FILE = Join-Path $RESULTS_DIR "mave_layers_test_log.txt" - -$RELEVANT_PATHS = @( - ("use-gui/src/"), - ("use-core/src/") -) -$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-gui\src\test\java\org\tzi\use\architecture\MavenLayeredArchitectureTest.java" - - -######################################### -# Functions start here # -######################################### - -######################################### -# Dependency Functions # -######################################### - -function Parse-Test-Results { - param( - [string[]]$TestOutput - ) - - # Violation count appears alone on the line after the "Running org.tzi.use.architecture.MavenLayeredArchitectureTest" line - $violation_count = -1 - $running_line_found = $false - - foreach ($line in $test_output) { - if ($running_line_found) { - # The next line should contain the violation count - if ($line -match '^\s*(\d+)\s*$') { - $violation_count = [int]$matches[1] - break - } - } - - if ($line -match 'Running org\.tzi\.use\.architecture\.MavenLayeredArchitectureTest') { - $running_line_found = $true - } - } - return $violation_count -} - -######################################### -# Build & Execution Functions # -######################################### - -function Run-ArchUnit-Test { - param( - [string]$CommitHash - ) - Log-Message "Running ArchUnit test..." - $test_output = mvn -pl use-gui test "-Dtest=org.tzi.use.architecture.MavenLayeredArchitectureTest" -DfailIfNoTests=false -o 2>&1 - - # Parse metrics directly from test output - $violation_count = Parse-Test-Results -TestOutput $test_output - - if ($violation_count -ge 0) { - Log-Message "Successfully parsed violation count from test output" - Record-Simple-Result -CommitHash $CommitHash -TestResult $violation_count -ResultsFile $RESULTS_FILE - } else { - Log-Message "Failed to extract violation count from test output" - Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE - } -} - -function Maven-Build-And-Test { - param( - [string]$CommitHash - ) - - # Build & install parent pom - $parent_output = mvn -N clean install 2>&1 - - if ($LASTEXITCODE -ne 0) { - Log-Message "Parent pom installation failed:" - $parent_output | ForEach-Object { Log-Message $_ } - Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE - return $false - } - - # Install core module to local repository (without tests) bc of snapshot errors - $core_install_output = mvn -pl use-core clean install -DskipTests 2>&1 - - if ($LASTEXITCODE -ne 0) { - Log-Message "Maven core module installation failed:" - Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE - return $false - } - Log-Message "Core module installed successfully. Compiling project..." - - Run-ArchUnit-Test -CommitHash $CommitHash - return $true -} - -function Process-Commit { - param( - [string]$CommitHash - ) - - Update-Java-Version-For-Maven - Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR - Inject-File -TempDir $TEMP_DIR -RelativePath "use-gui\src\test\java\org\tzi\use\architecture" -FileName "MavenLayeredArchitectureTest.java" -FileContent $test_file_content - $mavenBuildSuccess = Maven-Build-And-Test -CommitHash $CommitHash - - return $mavenBuildSuccess -} - -######################################### -# Setup starts here # -######################################### - -# Initialize results file with header -Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,violations" -# Create and move to use copy -Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR - -######################################### -# Store ArchUnit Test # -######################################### - -$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH - -######################################### -# Main Loop starts here # -######################################### - -Verify-StartCommit -StartCommit $StartCommitHash - -# Determine which commits to process -$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop - -$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count -$CURRENT_COMMIT = 1 - -try { - foreach ($COMMIT in $CommitsToProcess) { - Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" - - $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null - if ($LASTEXITCODE -ne 0) { - $previousCommit = $null - } - - $isFirstCommitInRepo = ($previousCommit -eq $null) - $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) - $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) - - if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { - git checkout -q $COMMIT - $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") - - if($is_maven){ - $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT - if (-not $commitProcessedSuccessfully) { - Log-Message "Build failed for commit $COMMIT" - } - } else { - Log-Message "No pom.xml found. Skipping this commit..." - } - } else { - Log-Message "No relevant changes in commit $COMMIT. Skipping..." - } - $CURRENT_COMMIT++ - Cleanup-Commit - } -} -catch { - Log-Message "Catch Block: An error occurred: $_" - Log-Message "Stack Trace: $($_.ScriptStackTrace)" -} -finally { - Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR -} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_utilities.ps1 b/docs/scripts/Maven/maven_utilities.ps1 deleted file mode 100644 index a4fc70f15..000000000 --- a/docs/scripts/Maven/maven_utilities.ps1 +++ /dev/null @@ -1,102 +0,0 @@ -. "..\general_utilities.ps1" - -######################################### -# Dependency Functions # -######################################### - -function Ensure-Dependencies-For-Maven { - param( - [string]$TempDir - ) - - $pom_files = @("pom.xml", "use-core/pom.xml", "use-gui/pom.xml") - - foreach ($pom_file in $pom_files) { - $full_path = Join-Path $TempDir $pom_file - if (Test-Path $full_path) { - Log-Message "Checking and adding dependencies in $full_path" - $pom = [xml](Get-Content $full_path) - - if ($null -eq $pom.project) { - Log-Message "Project node not found in $full_path. Exiting..." - exit 1 - } - - if ($null -eq $pom.project.dependencies) { - Log-Message "No dependencies in pom" - $dependencies = $pom.CreateElement("dependencies", $pom.DocumentElement.NamespaceURI) - $pom.project.AppendChild($dependencies) - } else { - $dependencies = $pom.project.dependencies - } - - $archunit_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "archunit-junit5" } - if (-not $archunit_present) { - $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) - $new_dep.InnerXml = "com.tngtech.archunitarchunit-junit51.0.1" - $dependencies.AppendChild($new_dep) - } - - $junit_jupiter_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "junit-jupiter" } - if (-not $junit_jupiter_present) { - $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) - $new_dep.InnerXml = "org.junit.jupiterjunit-jupiter5.8.2test" - $dependencies.AppendChild($new_dep) - } - - $slf4j_nop_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "slf4j-nop" } - if (-not $slf4j_nop_present) { - $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) - $new_dep.InnerXml = "org.slf4jslf4j-nop1.7.32test" - $dependencies.AppendChild($new_dep) - } - - $build = $pom.project.build - if ($build -and $build.plugins) { - $helper_plugin = $build.plugins.plugin | Where-Object { $_.artifactId -eq "build-helper-maven-plugin" } - if ($helper_plugin) { - Log-Message "Deactivating build-helper-plugin in $full_path" - foreach ($execution in $helper_plugin.executions.execution) { - if ($execution.id -eq "add-test-source") { - $execution.phase = "none" - } - } - } - } - $pom.Save($full_path) - } - else { - Log-Message "pom.xml not found at $full_path. Exiting..." - exit 1 - } - } -} - -######################################### -# Updating Functions # -######################################### - -function Update-Java-Version-For-Maven { - - $pomFiles = @( - "$TEMP_DIR\pom.xml", - "$TEMP_DIR\use-core\pom.xml", - "$TEMP_DIR\use-gui\pom.xml", - "$TEMP_DIR\use-assembly\pom.xml" - ) - - foreach ($pomFile in $pomFiles) { - if (Test-Path $pomFile) { - $content = Get-Content $pomFile -Raw - - $content = $content -replace '15', '14' - $content = $content -replace '15', '14' - - $content | Set-Content $pomFile - Log-Message "Changed problematic Java Version 15 to 14" - } - else { - Log-Message "Warning: ${pomFile} not found." - } - } -} \ No newline at end of file diff --git a/docs/scripts/general_utilities.ps1 b/docs/scripts/general_utilities.ps1 deleted file mode 100644 index 577b2dfa7..000000000 --- a/docs/scripts/general_utilities.ps1 +++ /dev/null @@ -1,204 +0,0 @@ -# Load with . ".\general_utilities.ps1" - -######################################### -# Utility Functions # -######################################### - -function Log-Message { - param([string]$message) - Write-Host $message - $message | Out-File -FilePath $LOG_FILE -Append -} - -# Initialize CSV file with header for results -function Initialize-Results-File { - param( - [string]$FilePath, - [string]$Header - ) - - if (-not (Test-Path $FilePath)) { - $Header | Out-File -FilePath $FilePath -Encoding UTF8 - Log-Message "Created results file with header: $FilePath" - } -} - -function Record-Simple-Result { - param( - [string]$CommitHash, - [int]$TestResult = -1, - [string]$ResultsFile - ) - - # Get commit date and time - $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash - $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash - - # Format the result - $resultLine = "$commitDate,$commitTime,$CommitHash,$TestResult" - $resultLine | Out-File -FilePath $ResultsFile -Append -} - - -function Remove-BOM { - param( - [string]$FilePath - ) - $full_path = Join-Path $TEMP_DIR $FilePath - $content = [System.IO.File]::ReadAllBytes($full_path) - if ($content.Length -ge 3 -and $content[0] -eq 0xEF -and $content[1] -eq 0xBB -and $content[2] -eq 0xBF) { - $content = $content[3..$content.Length] - [System.IO.File]::WriteAllBytes($full_path, $content) - } -} - -######################################### -# Commit Functions # -######################################### - -# Compares two commit hashes and checks whether there are changes to the source code -function Has-Relevant-Changes { - param( - [string]$CommitHash, - [string]$PreviousCommitHash, - [string[]]$RelevantPaths - ) - $changedFiles = git diff --name-only $PreviousCommitHash $CommitHash - - foreach ($file in $changedFiles) { - foreach ($path in $RelevantPaths) { - if ($file.StartsWith($path) -and $file.EndsWith(".java")) { - return $true - } - } - } - return $false -} - -function Verify-StartCommit { - param( - $StartCommit - ) - # Verify that the start commit exists - if ($StartCommitHash -ne "") { - $commitExists = git cat-file -e "$StartCommitHash^{commit}" 2>$null - if ($LASTEXITCODE -ne 0) { - Log-Message "Start commit hash $StartCommitHash not found in repository. Exiting." - exit 1 - } - Log-Message "Found start commit $StartCommitHash" - } -} - -function Determine-Commits-To-Process { - param( - $StartCommitHash, - $StartLoop - ) - # Determine which commits to process - $CommitsToProcess = if ($StartCommitHash -eq "") { - # Process all commits from the beginning - git log --first-parent --reverse --format="%H" - } elseif ($StartLoop.ToLower() -eq "n") { - # Process only the specified commit - @($StartCommitHash) - } else { - # Process from the specified commit onwards - git log --first-parent --reverse --format="%H" "$StartCommitHash^..HEAD" - } - return $CommitsToProcess -} - -######################################### -# Cleanup Functions # -######################################### - -function Cleanup-Commit { - git reset -q --hard - git clean -qfd - Log-Message "#####################################################################################" -} - -function Final-Cleanup { - param( - $ResultsDir, - $TempDir - ) - Set-Location $ResultsDir - if (Test-Path $TempDir) { - Remove-Item -Recurse -Force $TempDir - Log-Message "Cleaned up directory $TempDir" - } -} - -######################################### -# Setup Functions # -######################################### - -function Setup-Repo { - param( - [string]$TempDir, - [string]$OriginalUseDir - ) - # Create & move to temp directory - New-Item -ItemType Directory -Force -Path $TempDir | Out-Null - Set-Location $TempDir - Log-Message "Created & moved to temporary directory: $TempDir" - - Log-Message "Attempting to clone repository from $OriginalUseDir" - $gitOutput = & { - $ErrorActionPreference = 'SilentlyContinue' - git clone $OriginalUseDir . 2>&1 - } - # Comment in for debugging - #$gitOutput | ForEach-Object { Log-Message "Git output: $_" } - - if ($LASTEXITCODE -ne 0) { - Log-Message "Failed to clone repository. Exit code: $LASTEXITCODE" - exit 1 - } - else { - Log-Message "Repository cloned successfully." - } -} - -function Store-ArchTest { - param( - $TestFilePath - ) - # In case we're not on master already - git checkout -q master - - if (-not (Test-Path $TestFilePath)) { - Log-Message "Required file $TestFilePath not found in master branch. Exiting." - exit 1 - } - - $test_file_content = Get-Content $TestFilePath -Raw -Encoding UTF8 - return $test_file_content -} - -# Creates new architecture test dir, new ArchTest file and copies pre-stored test content into that file -# Alternatively same for properties file -function Inject-File { - param( - [string]$TempDir, - [string]$RelativePath, - [string]$FileName, - [string]$FileContent - ) - - $target_dir = Join-Path $TempDir $RelativePath - if (-not (Test-Path $target_dir)) { - New-Item -ItemType Directory -Force -Path $target_dir | Out-Null - Log-Message "Created directory: $target_dir" - } - - $target_file = Join-Path $target_dir $FileName - $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false - [System.IO.File]::WriteAllText($target_file, $FileContent, $utf8NoBomEncoding) - - if (Test-Path $target_file) { - Log-Message "Successfully added $FileName to commit" - } -} \ No newline at end of file diff --git a/log.txt b/log.txt deleted file mode 100644 index 738498b39..000000000 --- a/log.txt +++ /dev/null @@ -1,10 +0,0 @@ -Log-Eintrag 1 -Log-Eintrag 2 -Log-Eintrag 3 -Log-Eintrag 4 -Log-Eintrag 5 -Log-Eintrag 6 -Log-Eintrag 7 -Log-Eintrag 8 -Log-Eintrag 9 -Log-Eintrag 10 diff --git a/use-core/.ai/mcp/mcp.json b/use-core/.ai/mcp/mcp.json new file mode 100644 index 000000000..e69de29bb diff --git a/use-core/src/main/java/org/tzi/use/util/Debug.java b/use-core/src/main/java/org/tzi/use/util/Debug.java new file mode 100644 index 000000000..efc80d8c9 --- /dev/null +++ b/use-core/src/main/java/org/tzi/use/util/Debug.java @@ -0,0 +1,33 @@ +package org.tzi.use.util; + +/** + * Small debug helper to enable conditional debug output without polluting + * the normal test/golden outputs. Activate by setting system property + * -Duse.debug=true or environment variable USE_DEBUG=true. + */ +public final class Debug { + private Debug() {} + + public static boolean enabled() { + try { + String p = System.getProperty("use.debug"); + if (p != null) return "true".equalsIgnoreCase(p); + String e = System.getenv("USE_DEBUG"); + return "true".equalsIgnoreCase(e); + } catch (Throwable t) { + return false; + } + } + + public static void log(String s) { + if (enabled()) { + try { + // Try to write to USE protocol (preferred for integration tests) + org.tzi.use.util.USEWriter.getInstance().protocol("[USE-DEBUG] " + s); + } catch (Throwable ignore) { + // fallback to stderr + System.err.println("[USE-DEBUG] " + s); + } + } + } +} diff --git a/use-core/src/main/resources/etc/java-header-use.txt b/use-core/src/main/resources/etc/java-header-use.txt deleted file mode 100644 index 31ea7632b..000000000 --- a/use-core/src/main/resources/etc/java-header-use.txt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * USE - UML based specification environment - * Copyright (C) 1999-2004 Mark Richters, University of Bremen - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ diff --git a/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt b/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt deleted file mode 100644 index 9fad6e4e2..000000000 --- a/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt +++ /dev/null @@ -1,15 +0,0 @@ -An example with persons working for a company. -Salary and employee ranking are represented by -association classes. - -This example is part of -"Improvements in USE 2.2.0" - -AssociationClass.use: -two classes Company and Person -two association classes WorksFor, EmployeeRanking -no Constraints - -AssociationClass.cmd: -creates objects for classes and -association classes diff --git a/use-core/src/main/resources/examples/Documentation/Demo/Info.txt b/use-core/src/main/resources/examples/Documentation/Demo/Info.txt deleted file mode 100644 index 106672c4e..000000000 --- a/use-core/src/main/resources/examples/Documentation/Demo/Info.txt +++ /dev/null @@ -1,35 +0,0 @@ -An example with employees working in different departments -on projects, which are controlled by a department. -After executing Demo.cmd one invariant evaluates to false -because one project has a higher budged than its department. - -This example is part of the "USE Quick Tour". - -Demo.use: -three classes Employee, Department and Project -three associations -at least one invariant for each class - -Demo.cmd: -== the sequence of Demo0.cmd to Demo4.cmd - -SplitCommands/Demo0.cmd: -creates one object of type Department - -SplitCommands/Demo1.cmd: -assigns the attribute values in the new object - -SplitCommands/Demo2.cmd: -creates two objects of type Employee and assigns -attribute values - -SplitCommands/Demo3.cmd: -creates two links between the department and the employees - -SplitCommands/Demo4.cmd: -creates two projects, assigns attribute values and -creates two links between the projects and the -department -creates links between the employees and the new projects - -Classdiagram/Demo-UML.eps: Class diagram for this example diff --git a/use-core/src/main/resources/examples/Documentation/Employee/Info.txt b/use-core/src/main/resources/examples/Documentation/Employee/Info.txt deleted file mode 100644 index bea733b07..000000000 --- a/use-core/src/main/resources/examples/Documentation/Employee/Info.txt +++ /dev/null @@ -1,25 +0,0 @@ -This example shows companies and persons working -for them. - -The example corresponds to the example -model in the section `Validating Pre- and Postconditions -with USE´ - -Employee.use: -Corresponds to examples/monitoring/Employee.use, -but the invariant context Person inv: age >= 18 -is missing here - -two classes Person and Company with at least -one operation with side effects -one association WorksFor -no invariants, but one constraint for every operation - -Employee.cmd: -creates one Company and one Person -the operation hire is executed to create a link -between both objects -after that, the raiseSalary operation with return value -is executed -finally the new link is destroyed by executing the -operation fire diff --git a/use-core/src/main/resources/examples/Documentation/Graph/Info.txt b/use-core/src/main/resources/examples/Documentation/Graph/Info.txt deleted file mode 100644 index 1f7ed5ea9..000000000 --- a/use-core/src/main/resources/examples/Documentation/Graph/Info.txt +++ /dev/null @@ -1,21 +0,0 @@ -This example describes a graph with nodes and edges. -The operation -newTarget creates a new link (edge) between a -source node and exactly one new node. -This operation uses the operation oclIsNew. - -The example corresponds to -the section `Validating Pre- and Postconditions -with USE - -Graph.use: -one class Node and one association Edge -one operation newTarget with two postconditions - -Graph.cmd: -three calls of newTarget -both postconditions evaluate to true after the first call -the first postcondition evaluates to false and the -second to true after the second call -and the first postcondition evaluates to true -and the second to false after the last call diff --git a/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt b/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt deleted file mode 100644 index c5b44c893..000000000 --- a/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt +++ /dev/null @@ -1,199 +0,0 @@ - How to Check UML and OCL Models with USE - Martin Gogolla - July 2010 - -Abstract: This note contains practical hints on how to define UML and -OCL models and how to check such models with the tool USE (UML-based -Specification Environment) developed at the University of Bremen. One -should obtain a link to the tool USE by searching Google with the terms -'use ocl bremen'. This note explains most of the USE functionality by a -simple example describing civil status properties of persons. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -1. WHAT IS CONTAINED IN THE FILES? - -In order to work with the civil status example easily, all files should -be placed in the directory 'c:/use/civstat/'. In your directory -'c:/use/civstat/' there should be 56 files which are partitioned into 9 -groups. - ------------------------------------------ files documenting this note -- -- 00readme.pdf -- 00readme.sxw -- 00readme.txt ------------------------------------------ files for the abcd scenario -- -- abcd_assl.cmd -- abcd_assl.olt -+ abcd_assl.pro -- abcd_cmd.cmd -- abcd_cmd.olt -+ abcd_cmd.pro -+ abcd_seqDiaDetail1.gif -+ abcd_seqDiaDetail2.gif -+ abcd_useScreenshot.gif ---------------------------------------- files for the bigamy scenario -- -- bigamy.cmd -- bigamy.invs -+ bigamy.pro -------------------------------------- central files showing the model -- -+ civstat.assl -+ civstat.use -+ civstat_classDia.gif ----------------------------------------- files for the crowd scenario -- -- crowd.cmd -- crowd.olt -+ crowd.pro -+ crowd_classExtent.gif -+ crowd_useScreenshot.gif ----------------------------------- papers explaining underlying ideas -- -- Gogolla_2005_SOSYM.pdf -- Gogolla_2005_SOSYM.ps -- Gogolla_2007_SCP.pdf -- Gogolla_2007_SCP.ps -- Gogolla_2009_TAP.pdf -- Gogolla_2009_TAP.ps ---------------------------------- files for the independence scenario -- -- independence_allInvariants.gif -- independence_attributesDefined.cmd -+ independence_attributesDefined.gif -- independence_attributesDefined.pro -- independence_femaleHasNoWife.cmd -+ independence_femaleHasNoWife.gif -- independence_femaleHasNoWife.pro -- independence_maleHasNoHusband.cmd -+ independence_maleHasNoHusband.gif -- independence_maleHasNoHusband.pro -- independence_nameCapitalThenSmallLetters.cmd -+ independence_nameCapitalThenSmallLetters.gif -- independence_nameCapitalThenSmallLetters.pro -- independence_nameIsUnique.cmd -+ independence_nameIsUnique.gif -- independence_nameIsUnique.pro ---------------------------------- cmd files defining model operations -- -+ Person_birth.cmd -+ Person_death_married.cmd -+ Person_death_unmarried.cmd -+ Person_divorce.cmd -+ Person_marry.cmd ----------------------------------------- files for the world scenario -- -- world.cmd -- world.olt -+ world.pro -+ world_objDia.gif -- world_query.cmd -+ world_query.pro ------------------------------------------------------------------------- - -Files ending with 'use', 'assl', 'cmd', 'invs', or 'olt' can be -processed by the USE tool. All files with other suffixes ('pdf', -'sxw', 'txt', 'pro', 'gif', or 'ps') are the result of documenting the -work ('gif', 'pro', ...) with USE or explain basic ideas ('ps', -'pdf'). The file suffixes indicate the file content as follows. - -use - definition of the UML and OCL model (classes, invariants, etc.) -assl - definition of parametrized scripts for manipulating the model -cmd - scripts or script calls realizing scenarios -invs - additional invariants to be loaded dynamically -olt - object diagram layout - -pdf - pdf file for documentation -txt - plain text files for documentation -pro - protocol file (plain text) documenting execution of a cmd file -gif - graphic file containing a UML diagram or something similar -ps - ps file for documentation - -All files enumerated above with '+' are shown in the file -'00readme.pdf'. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -2. HOW CAN I RUN USE AND EXECUTE SCENARIOS? - -Download, install and start USE. Consult the USE documentation if -needed. USE will show up with a GUI window and a COMMAND LINE -window. Open the file 'c:/use/civstat/abcd_cmd.cmd' with a text -editor. The first line of that file looks as follows: - --- read c:/use/civstat/abcd_cmd.cmd - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A cmd file contains a sequence of commands which can be processed by -USE. The characters '--' indicate that the rest of the line is a -comment. Copy that part of this first line into your clipboard which -is marked above with the character '^'. Paste the command which you -have copied from your clipboard into the COMMAND LINE window and press -return. USE will execute all commands in the file -'c:/use/civstat/abcd_cmd.cmd' and will build up an object diagram. USE -has constructed several object diagrams before reaching the final -one. All executed operations can be traced in the sequence diagram -view. - -Execution of all above mentioned scenarios can be done in the same way -as for the first scenario, i.e., by loading the respective cmd file into -a text editor, by copying from the first line the read command together -with the respective file name and by pasting this command into the -COMMAND LINE window. This will work for the following cmd files: - -abcd_assl.{cmd|pro} -abcd_cmd.{cmd|pro} -bigamy.{cmd|pro} -crowd.{cmd|pro} -independence_attributesDefined.{cmd|pro} -independence_femaleHasNoWife.{cmd|pro} -independence_maleHasNoHusband.{cmd|pro} -independence_nameCapitalThenSmallLetters.{cmd|pro} -independence_nameIsUnique.{cmd|pro} -world.{cmd|pro} -world_query.{cmd|pro} - -These scenarios are documented with a protocol file having the same name -as the cmd file but possessing the suffix pro. These pro files are -ordinary text files. They are edited versions (long files names are -shortened) of the output given by USE in the COMMAND LINE window. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -3. WHAT DO THE DIFFERENT SCENARIOS SHOW? - -Scenario 'abcd': A simple object diagram with four persons (ada, bob, - cyd, dan) is built up. The persons are created, partly get married or - divorced or die. This scenario is expressed in two versions, namely - one version realizing the operations with cmd files (abcd_cmd.cmd) - and one version realizing the operations using the assl file - (abcd_assl.cmd). - -Scenario 'bigamy': This scenario (bigamy.cmd) checks whether a bigamy - situation can be constructed under the stated invariants. A large - number of possible bigamy situations is tried with the script - attemptBigamy() from the civstat.assl file, but none is found. This - proves that at least in the enumerated search space, the UML and OCL - model is bigamy free. - -Scenario 'crowd': The cmd file crowd.cmd builds up an invalid object - diagram where one model-inherent multiplicity constraint and two - explicit invariants are violated. This scenario may be regarded as a - negative test case which has to lead to a constraint violation. - -Scenario 'independence': This scenario considers the relationship - between the five invariants and consists of five cmd files - (independence_attributesDefined.cmd, - independence_femaleHasNoWife.cmd, independence_maleHasNoHusband.cmd, - independence_nameCapitalThenSmallLetters.cmd, - independence_nameIsUnique.cmd). It builds up five object diagrams - where each single object diagram violates exactly one invariant and - satisfies the other four invariants. The construction of these five - object diagrams proves that the five invariants are independent from - each other, i.e., no single invariant is a consequence of the other - invariants. In other words, the five invariants are non-redundant and - express independent requirements. - -Scenario 'world': Here a larger object diagram is constructed with the - cmd file world.cmd that shows that the invariants are consistent, - i.e., the invariants are not contradictory to each other. The object - diagram is constructed by the script world() which is parametrized - with the number of expected female and male persons and the number of - expected mariages. Person attributes like name or gender are filled - with values representing real-world situations. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt b/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt deleted file mode 100644 index af88e606b..000000000 --- a/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt +++ /dev/null @@ -1,19 +0,0 @@ -This example shows the handling of nested operation -calls. It is based on the factorial function -with return type Integer. -The operation can be used as query operation and -with openter and opexit, too. - -NestedOperationCalls.use: -one Class Rec -one operation fac, computing and returning the factorial -of the functions argument -this operation is defined as query and has -pre- and postconditions - - -NestedOperationCalls.cmd: -calls the Function three times with different -arguments (not as query) -and it ends the calls in the same order -all pre- and postconditions evaluate to true diff --git a/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt b/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt deleted file mode 100644 index 14310f6d5..000000000 --- a/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt +++ /dev/null @@ -1,7 +0,0 @@ -Specification of a metamodel for OCL expressions -classifiers, association ends and attributes. - -OCL2MM.use: - -OCL2MM.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt deleted file mode 100644 index 595d0ad94..000000000 --- a/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt +++ /dev/null @@ -1,11 +0,0 @@ -Specifies UML 1.3 in USE - -UML13All.use: -- - -UML13All.cmd: -leer - -Demo-meta.cmd: -Represents a part of the metamodel of the /Documentation/ -Demo example. (classes and attributes) \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt deleted file mode 100644 index d5fb47fea..000000000 --- a/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt +++ /dev/null @@ -1,8 +0,0 @@ -Specifies the UML 1.3 Core -the definition is also a part of /Specifications/ -UML13All - -UML13Core.use: - -UML13Core.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt deleted file mode 100644 index 0f1dd373e..000000000 --- a/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt +++ /dev/null @@ -1,7 +0,0 @@ -Specification of a metamodel for OCL expressions -(structured-)classifiers, association ends and attributes. - -OCL2MM.use: - -OCL2MM.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt b/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt deleted file mode 100644 index f5fd7d4cb..000000000 --- a/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt +++ /dev/null @@ -1,2 +0,0 @@ -Specification of the actionsemantics model --> OMG RFP ad/98-11-01 \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/AB/Info.txt b/use-core/src/main/resources/examples/Others/AB/Info.txt deleted file mode 100644 index 43a25fdaf..000000000 --- a/use-core/src/main/resources/examples/Others/AB/Info.txt +++ /dev/null @@ -1,21 +0,0 @@ -This Example shows the use of openter and opexit -for an operation with side effects. -With four postconditions different expressions using -@pre are presented. - -AB.use: -two classes A,B and one association R - -AB.cmd: -creates state 1 with two objects and one link -calls the operation with openter -creates state 2 by chancing attribute values, -changing links and creating a new object -then opexit - -AB1.cmd: -creates state 1 - -AB2.cmd: -creates state 2 - diff --git a/use-core/src/main/resources/examples/Others/CallSequence/Info.txt b/use-core/src/main/resources/examples/Others/CallSequence/Info.txt deleted file mode 100644 index 5c7db4fd3..000000000 --- a/use-core/src/main/resources/examples/Others/CallSequence/Info.txt +++ /dev/null @@ -1,12 +0,0 @@ -This example shows nested operation calls with different -objects. - -CallSequence.use: -two classes with one operation (without parameters -and definition) -each - -CallSequence.cmd: -creates two objects with differen types -it follows a sequence of alternating openter and -opexit commands diff --git a/use-core/src/main/resources/examples/Others/CarRental/Info.txt b/use-core/src/main/resources/examples/Others/CarRental/Info.txt deleted file mode 100644 index ee40aac9c..000000000 --- a/use-core/src/main/resources/examples/Others/CarRental/Info.txt +++ /dev/null @@ -1,21 +0,0 @@ -This is a complex version of the -examples/Papers/1998/RichtersAndGogolla example -with simple invariants to ensure object diagrams -which make sense and pre-/postconditions -for every operation with side effects. - -CarRental2.use: -more classes and associations than the simple example -there is a 3-ary association - -many attributes (with primitive and complex types) -there are queries and operations changing the system -state - -CarRental2.cmd: -creates a state with at least -one object per class and assigned attribute values -not all constraints evaluate to true -there are inconsistent invariants - -CarRental2.olt: diff --git a/use-core/src/main/resources/examples/Others/Empty/Info.txt b/use-core/src/main/resources/examples/Others/Empty/Info.txt deleted file mode 100644 index 5e8870056..000000000 --- a/use-core/src/main/resources/examples/Others/Empty/Info.txt +++ /dev/null @@ -1,7 +0,0 @@ -An empty class and object diagram. - -Empty.use: -empty model - -Empty.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Ex/Info.txt b/use-core/src/main/resources/examples/Others/Ex/Info.txt deleted file mode 100644 index dcf727eea..000000000 --- a/use-core/src/main/resources/examples/Others/Ex/Info.txt +++ /dev/null @@ -1,13 +0,0 @@ -This example is the same as Example/Documentation/Demo. -But there is an invariant added and absent comments -in the Ex.use file. - -Ex*.cmd == Demo*.cmd - -e.cmd: -== Ex.cmd and a creation of three -more projects controlled by the department - -After executing e.cmd one more invariant evaluates to -false, because there are more projects controlled by the -department than there are employees working for it. \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Grammar/Info.txt b/use-core/src/main/resources/examples/Others/Grammar/Info.txt deleted file mode 100644 index 49a22b496..000000000 --- a/use-core/src/main/resources/examples/Others/Grammar/Info.txt +++ /dev/null @@ -1,25 +0,0 @@ -This example describes a grammar with terminal -and non terminal symbols (composition) -and production rules describing how the symbols -can be replaced. - -Grammar.use: -several classes with generalization -and compositions compositions -for every class at least one simple invariant -with iterate and nested operations - -Grammar.cmd: -a simple grammar is created -four terminal symbols +, -, 0 and 1 -two non terminal symbols expr and operator -five production rules - -> - -> '0' - -> '1' - -> '+' - -> '-' - -Grammar.fig: - -Grammar.olt: diff --git a/use-core/src/main/resources/examples/Others/Job/Info.txt b/use-core/src/main/resources/examples/Others/Job/Info.txt deleted file mode 100644 index 4a109e7b1..000000000 --- a/use-core/src/main/resources/examples/Others/Job/Info.txt +++ /dev/null @@ -1,13 +0,0 @@ -This example describes Jobs and Persons who have Jobs. -Students and employees are persons. - -Job.use: -four classes Person, Student (subclass of Person), -Employee (subclass of Person) and Job -one association Works between Job and Person -no constraints - -Job.cmd: -one object is created for every class -one link between a student and a job is created -then two objects are destroyed and the link deleted diff --git a/use-core/src/main/resources/examples/Others/Lists/Info.txt b/use-core/src/main/resources/examples/Others/Lists/Info.txt deleted file mode 100644 index 560825f8a..000000000 --- a/use-core/src/main/resources/examples/Others/Lists/Info.txt +++ /dev/null @@ -1,14 +0,0 @@ -This example shows a representation of lists. -They can belong to maps and include object pairs. - -Lists.use: -several classes with generalization and associations -many constraints - -Lists.cmd: -one list is created with three not empty lists and -one empty list -then a Map with a not empty list containing a pair -is created - -Lists.olt: diff --git a/use-core/src/main/resources/examples/Others/Math/Info.txt b/use-core/src/main/resources/examples/Others/Math/Info.txt deleted file mode 100644 index e2dc2979e..000000000 --- a/use-core/src/main/resources/examples/Others/Math/Info.txt +++ /dev/null @@ -1,14 +0,0 @@ -This example contains only one class with an operation -not free from side effects with return type Integer. -Its not defined as query, but with a postcondition -and result inside the class definition (not as an -explicit constraint). -The operation computes the greatest common divisor -of the arguments (two Integers). - -Math.use: -one class Math with an operation gcd - -Math.cmd: -gdc is called with different arguments -the result values satisfy the postcondition \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt b/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt deleted file mode 100644 index 57e8696dc..000000000 --- a/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt +++ /dev/null @@ -1,9 +0,0 @@ -This example shows generalization between several -classes without attributes, operations and associations. - -MultipleInheritance.use: -five classes A, B (subclass of A), C (subclass of A), -D (subclass of B, C and E), E - -MultipleInheritance.cmd: -creates an object for every class \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Person/Info.txt b/use-core/src/main/resources/examples/Others/Person/Info.txt deleted file mode 100644 index 1848fc7ea..000000000 --- a/use-core/src/main/resources/examples/Others/Person/Info.txt +++ /dev/null @@ -1,12 +0,0 @@ -This example shows the connection of father, mother -and children with the aid of a class and a 3-ary -association Family. -Every child has exactly one father and one mother. -Fathers and mothers may have more than one child. - -Person.use: -one class Person -one association Family - -Person.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Polygon/Info.txt b/use-core/src/main/resources/examples/Others/Polygon/Info.txt deleted file mode 100644 index 49f260b01..000000000 --- a/use-core/src/main/resources/examples/Others/Polygon/Info.txt +++ /dev/null @@ -1,21 +0,0 @@ -Points and polygons are represented in this example. -Ordered points can belong to polygons. A single -point and a set of points representing -a polygon can be moved. There are also colored -points. - -Polygon.use: -three classes Point, ColorPoint (subclass of Point) and -Polygon -one association (with stereotype ordered) -Polygon_Point between points and polygons -for each class, there is an operation -with side effects for moving the points resp. -polygons and the corresponding constraints -(postconditions) defined - -Polygon.cmd: -creates a polygon and three points -one of it is colored -then the polygon, a point and the colored point -are moved diff --git a/use-core/src/main/resources/examples/Others/Project/Info.txt b/use-core/src/main/resources/examples/Others/Project/Info.txt deleted file mode 100644 index e686c1945..000000000 --- a/use-core/src/main/resources/examples/Others/Project/Info.txt +++ /dev/null @@ -1,13 +0,0 @@ -Example from exercises of the lecture -Object-oriented Software Design. - -This example equals /Documentation/Demo, but the -invariants are ordered differently. -In this example the constraints are defined in the -class definition. - -Project.use: -~Demo.use - -Project.cmd: -empty diff --git a/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt b/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt deleted file mode 100644 index 68eb35ec4..000000000 --- a/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt +++ /dev/null @@ -1,11 +0,0 @@ -This example shows the use of two different recursive -operations. One of it does not terminate. -Like /Documentation/NestedOperationCalls the factorial -function is defined here, but without constraints. - -RecursiveOperations.use: -one class Rec with two operations - -RecursiveOperations.cmd: -one object is created -two operation calls with different arguments diff --git a/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt b/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt deleted file mode 100644 index 237ba661e..000000000 --- a/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt +++ /dev/null @@ -1,12 +0,0 @@ -This example is the simple version of /Others/Person. -There are nodes and connections between them. -The role of a node can be parent or child. - -ReflexiveAssociation.use: -one class Node with one attribute num -one association - -ReflexiveAssociation.cmd: -creates two objects -both are connected with two links and changed roles -a third link connects an object with itself diff --git a/use-core/src/main/resources/examples/Others/Student/Info.txt b/use-core/src/main/resources/examples/Others/Student/Info.txt deleted file mode 100644 index bdefbb68c..000000000 --- a/use-core/src/main/resources/examples/Others/Student/Info.txt +++ /dev/null @@ -1,10 +0,0 @@ -This example is a part of /Others/Job. -There are persons, students and employees with -generalization. - -Student.use: -three classes Person, Student (subclass of Person) -and Employee (subclass of Person) - -Student.cmd: -empty diff --git a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt deleted file mode 100644 index 8ec4ad8c4..000000000 --- a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt +++ /dev/null @@ -1,157 +0,0 @@ -(all c: one Column | one (BoardColumns . c)) ----OUTCOME--- -TRIVIALLY_SATISFIABLE - ----INSTANCE--- -relations: { - -Integer=[[I_1], [I_2], [I_3], [I_4], [I_5], [I_6], [I_7], [I_8], [I_9]], - -Board=[[board]], - -Row=[[Row1], [Row2], [Row3], [Row4], [Row5], [Row6], [Row7], [Row8], [Row9]], -Column=[[Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9]], -Square=[[Square1], [Square2], [Square3], [Square4], [Square5], [Square6], [Square7], [Square8], [Square9]], -Field=[[Field1], [Field2], [Field3], [Field4], [Field5], [Field6], [Field7], [Field8], [Field9], - [Field10], [Field11], [Field12], [Field13], [Field14], [Field15], [Field16], [Field17], [Field18], - [Field19], [Field20], [Field21], [Field22], [Field23], [Field24], [Field25], [Field26], [Field27], - [Field28], [Field29], [Field30], [Field31], [Field32], [Field33], [Field34], [Field35], [Field36], - [Field37], [Field38], [Field39], [Field40], [Field41], [Field42], [Field43], [Field44], [Field45], - [Field46], [Field47], [Field48], [Field49], [Field50], [Field51], [Field52], [Field53], [Field54], - [Field55], [Field56], [Field57], [Field58], [Field59], [Field60], [Field61], [Field62], [Field63], - [Field64], [Field65], [Field66], [Field67], [Field68], [Field69], [Field70], [Field71], [Field72], - [Field73], [Field74], [Field75], [Field76], [Field77], [Field78], [Field79], [Field80], [Field81]], - -BoardFields=[[board, Field1], [board, Field2], [board, Field3], - [board, Field4], [board, Field5], [board, Field6], - [board, Field7], [board, Field8], [board, Field9], - [board, Field10], [board, Field11], [board, Field12], - [board, Field13], [board, Field14], [board, Field15], - [board, Field16], [board, Field17], [board, Field18], - [board, Field19], [board, Field20], [board, Field21], - [board, Field22], [board, Field23], [board, Field24], - [board, Field25], [board, Field26], [board, Field27], - [board, Field28], [board, Field29], [board, Field30], - [board, Field31], [board, Field32], [board, Field33], - [board, Field34], [board, Field35], [board, Field36], - [board, Field37], [board, Field38], [board, Field39], - [board, Field40], [board, Field41], [board, Field42], - [board, Field43], [board, Field44], [board, Field45], - [board, Field46], [board, Field47], [board, Field48], - [board, Field49], [board, Field50], [board, Field51], - [board, Field52], [board, Field53], [board, Field54], - [board, Field55], [board, Field56], [board, Field57], - [board, Field58], [board, Field59], [board, Field60], - [board, Field61], [board, Field62], [board, Field63], - [board, Field64], [board, Field65], [board, Field66], - [board, Field67], [board, Field68], [board, Field69], - [board, Field70], [board, Field71], [board, Field72], - [board, Field73], [board, Field74], [board, Field75], - [board, Field76], [board, Field77], [board, Field78], - [board, Field79], [board, Field80], [board, Field81]], - -ColumnFields=[[Column1, Field1], [Column1, Field10], [Column1, Field19], - [Column1, Field28], [Column1, Field37], [Column1, Field46], - [Column1, Field55], [Column1, Field64], [Column1, Field73], - [Column2, Field2], [Column2, Field11], [Column2, Field20], - [Column2, Field29], [Column2, Field38], [Column2, Field47], - [Column2, Field56], [Column2, Field65], [Column2, Field74], - [Column3, Field3], [Column3, Field12], [Column3, Field21], - [Column3, Field30], [Column3, Field39], [Column3, Field48], - [Column3, Field57], [Column3, Field66], [Column3, Field75], - [Column4, Field4], [Column4, Field13], [Column4, Field22], - [Column4, Field31], [Column4, Field40], [Column4, Field49], - [Column4, Field58], [Column4, Field67], [Column4, Field76], - [Column5, Field5], [Column5, Field14], [Column5, Field23], - [Column5, Field32], [Column5, Field41], [Column5, Field50], - [Column5, Field59], [Column5, Field68], [Column5, Field77], - [Column6, Field6], [Column6, Field15], [Column6, Field24], - [Column6, Field33], [Column6, Field42], [Column6, Field51], - [Column6, Field60], [Column6, Field69], [Column6, Field78], - [Column7, Field7], [Column7, Field16], [Column7, Field25], - [Column7, Field34], [Column7, Field43], [Column7, Field52], - [Column7, Field61], [Column7, Field70], [Column7, Field79], - [Column8, Field8], [Column8, Field17], [Column8, Field26], - [Column8, Field35], [Column8, Field44], [Column8, Field53], - [Column8, Field62], [Column8, Field71], [Column8, Field80], - [Column9, Field9], [Column9, Field18], [Column9, Field27], - [Column9, Field36], [Column9, Field45], [Column9, Field54], - [Column9, Field63], [Column9, Field72], [Column9, Field81]], - -RowFields=[[Row1, Field1], [Row1, Field2], [Row1, Field3], - [Row1, Field4], [Row1, Field5], [Row1, Field6], - [Row1, Field7], [Row1, Field8], [Row1, Field9], - [Row2, Field10], [Row2, Field11], [Row2, Field12], - [Row2, Field13], [Row2, Field14], [Row2, Field15], - [Row2, Field16], [Row2, Field17], [Row2, Field18], - [Row3, Field19], [Row3, Field20], [Row3, Field21], - [Row3, Field22], [Row3, Field23], [Row3, Field24], - [Row3, Field25], [Row3, Field26], [Row3, Field27], - [Row4, Field28], [Row4, Field29], [Row4, Field30], - [Row4, Field31], [Row4, Field32], [Row4, Field33], - [Row4, Field34], [Row4, Field35], [Row4, Field36], - [Row5, Field37], [Row5, Field38], [Row5, Field39], - [Row5, Field40], [Row5, Field41], [Row5, Field42], - [Row5, Field43], [Row5, Field44], [Row5, Field45], - [Row6, Field46], [Row6, Field47], [Row6, Field48], - [Row6, Field49], [Row6, Field50], [Row6, Field51], - [Row6, Field52], [Row6, Field53], [Row6, Field54], - [Row7, Field55], [Row7, Field56], [Row7, Field57], - [Row7, Field58], [Row7, Field59], [Row7, Field60], - [Row7, Field61], [Row7, Field62], [Row7, Field63], - [Row8, Field64], [Row8, Field65], [Row8, Field66], - [Row8, Field67], [Row8, Field68], [Row8, Field69], - [Row8, Field70], [Row8, Field71], [Row8, Field72], - [Row9, Field73], [Row9, Field74], [Row9, Field75], - [Row9, Field76], [Row9, Field77], [Row9, Field78], - [Row9, Field79], [Row9, Field80], [Row9, Field81]], - -SquareFields=[[Square1, Field1], [Square1,Field2], [Square1, Field3], - [Square1, Field10], [Square1, Field11],[Square1, Field12], - [Square1, Field19], [Square1, Field20], [Square1,Field21], - [Square2, Field4], [Square2, Field5], [Square2, Field6], - [Square2, Field13], [Square2, Field14], [Square2, Field15], - [Square2,Field22], [Square2, Field23], [Square2, Field24], - [Square3, Field7],[Square3, Field8], [Square3, Field9], - [Square3, Field16], [Square3,Field17], [Square3, Field18], - [Square3, Field25], [Square3, Field26],[Square3, Field27], - [Square4, Field28], [Square4, Field29], [Square4,Field30], - [Square4, Field37], [Square4, Field38], [Square4, Field39], - [Square4, Field46], [Square4, Field47], [Square4, Field48], - [Square5,Field31], [Square5, Field32], [Square5, Field33], - [Square5, Field40],[Square5, Field41], [Square5, Field42], - [Square5, Field49], [Square5,Field50], [Square5, Field51], - [Square6, Field34], [Square6, Field35],[Square6, Field36], - [Square6, Field43], [Square6, Field44], [Square6,Field45], - [Square6, Field52], [Square6, Field53], [Square6, Field54], - [Square7, Field55], [Square7, Field56], [Square7, Field57], - [Square7,Field64], [Square7, Field65], [Square7, Field66], - [Square7, Field73],[Square7, Field74], [Square7, Field75], - [Square8, Field58], [Square8,Field59], [Square8, Field60], - [Square8, Field67], [Square8, Field68],[Square8, Field69], - [Square8, Field76], [Square8, Field77], [Square8,Field78], - [Square9, Field61], [Square9, Field62], [Square9, Field63], - [Square9, Field70], [Square9, Field71], [Square9, Field72], - [Square9,Field79], [Square9, Field80], [Square9, Field81]] - -BoardRows=[[board, Row1], [board, Row2], [board, Row3], - [board, Row4], [board, Row5], [board, Row6], - [board, Row7], [board, Row8], [board, Row9]], - -BoardColumns=[[board, Column1], [board, Column2], [board, Column3], - [board, Column4], [board, Column5], [board, Column6], - [board, Column7], [board, Column8], [board, Column9]], - -BoardSquares=[[board, Square1], [board, Square2], [board, Square3], [board, Square4], [board, Square5], [board, Square6], [board, Square7], [board, Square8], [board, Square9]], - - - -value=[], - -ints: [] - ----STATS--- -p cnf 0 0 -primary variables: 0 -translation time: 63 ms -solving time: 0 ms diff --git a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt deleted file mode 100644 index ea201fde5..000000000 --- a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt +++ /dev/null @@ -1,30 +0,0 @@ -((((((((((((((((((((((((((((((((((all c: one Column | one (BoardColumns . c)) && (all f: one Field | one (BoardFields . f))) && (all r: one Row | one (BoardRows . r))) && (all s: one Square | one (BoardSquares . s))) && ((BoardColumns . univ) in Board)) && ((BoardFields . univ) in Board)) && ((BoardRows . univ) in Board)) && ((BoardSquares . univ) in Board)) && (all f: one Field | one (ColumnFields . f))) && (all b: one Board | (#((b . BoardColumns)) = 9))) && ((univ . BoardColumns) in Column)) && ((ColumnFields . univ) in Column)) && (all b: one Board | (#((b . BoardFields)) = 81))) && (all c: one Column | (#((c . ColumnFields)) = 9))) && (all r: one Row | (#((r . RowFields)) = 9))) && (all s: one Square | (#((s . SquareFields)) = 9))) && ((univ . BoardFields) in Field)) && ((univ . ColumnFields) in Field)) && ((univ . RowFields) in Field)) && ((univ . SquareFields) in Field)) && (all f: one Field | one (RowFields . f))) && (all b: one Board | (#((b . BoardRows)) = 9))) && ((univ . BoardRows) in Row)) && ((RowFields . univ) in Row)) && (all f: one Field | one (SquareFields . f))) && (all b: one Board | (#((b . BoardSquares)) = 9))) && ((univ . BoardSquares) in Square)) && ((SquareFields . univ) in Square)) && ((value . univ) in Field)) && ((univ . value) in Integer)) && (all f: one Field | one (f . value))) && (all r: one Row | (#({ f1: one (r . RowFields) | (#({ f2: one (r . RowFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((r . RowFields))) }) = #((r . RowFields))))) && (all c: one Column | (#({ f1: one (c . ColumnFields) | (#({ f2: one (c . ColumnFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((c . ColumnFields))) }) = #((c . ColumnFields))))) && (all s: one Square | (#({ f1: one (s . SquareFields) | (#({ f2: one (s . SquareFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((s . SquareFields))) }) = #((s . SquareFields))))) ----OUTCOME--- -SATISFIABLE - ----INSTANCE--- -relations: {Board=[[board]], - -value=[ - -[I_4], [I_3], [I_9], [I_8], [I_2], [I_5], [I_7], [I_1], [I_6], -[I_2], [I_5], [I_7], [I_6], [I_1], [I_3], [I_4], [I_8], [I_9], -[I_1], [I_6], [I_8], [I_7], [I_4], [I_9], [I_2], [I_3], [I_5], -[I_3], [I_2], [I_1], [I_5], [I_9], [I_7], [I_6], [I_4], [I_8], -[I_7], [I_9], [I_4], [I_2], [I_8], [I_6], [I_1], [I_5], [I_3], -[I_5], [I_8], [I_6], [I_4], [I_3], [I_1], [I_9], [I_7], [I_2], -[I_9], [I_4], [I_3], [I_1], [I_6], [I_8], [I_5], [I_2], [I_7], -[I_8], [I_7], [I_2], [I_9], [I_5], [I_4], [I_3], [I_6], [I_1], -[I_6], [I_1], [I_5], [I_3], [I_7], [I_2], [I_8], [I_9], [I_4]], - - -Integer=[[I_1], [I_2], [I_3], [I_4], [I_5], [I_6], [I_7], [I_8], [I_9]], Row=[[Row1], [Row2], [Row3], [Row4], [Row5], [Row6], [Row7], [Row8], [Row9]], Column=[[Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9]], Square=[[Square1], [Square2], [Square3], [Square4], [Square5], [Square6], [Square7], [Square8], [Square9]], Field=[[[[[[[[[[[Field10], [Field11], [Field12], [Field13], [Field14], [Field15], [Field16], [Field17], [Field18], [Field19], [Field20], [Field21], [Field22], [Field23], [Field24], [Field25], [Field26], [Field27], [Field28], [Field29], [Field30], [Field31], [Field32], [Field33], [Field34], [Field35], [Field36], [Field37], [Field38], [Field39], [Field40], [Field41], [Field42], [Field43], [Field44], [Field45], [Field46], [Field47], [Field48], [Field49], [Field50], [Field51], [Field52], [Field53], [Field54], [Field55], [Field56], [Field57], [Field58], [Field59], [Field60], [Field61], [Field62], [Field63], [Field64], [Field65], [Field66], [Field67], [Field68], [Field69], [Field70], [Field71], [Field72], [Field73], [Field74], [Field75], [Field76], [Field77], [Field78], [Field79], [Field80], [Field81]], BoardRows=[[board, Row1], [board, Row2], [board, Row3], [board, Row4], [board, Row5], [board, Row6], [board, Row7], [board, Row8], [board, Row9]], BoardColumns=[[board, Column1], [board, Column2], [board, Column3], [board, Column4], [board, Column5], [board, Column6], [board, Column7], [board, Column8], [board, Column9]], BoardSquares=[[board, Square1], [board, Square2], [board, Square3], [board, Square4], [board, Square5], [board, Square6], [board, Square7], [board, Square8], [board, Square9]], BoardFields=[[board, [board, [board, [board, [board, [board, [board, [board, [board, [board, Field10], [board, Field11], [board, Field12], [board, Field13], [board, Field14], [board, Field15], [board, Field16], [board, Field17], [board, Field18], [board, Field19], [board, Field20], [board, Field21], [board, Field22], [board, Field23], [board, Field24], [board, Field25], [board, Field26], [board, Field27], [board, Field28], [board, Field29], [board, Field30], [board, Field31], [board, Field32], [board, Field33], [board, Field34], [board, Field35], [board, Field36], [board, Field37], [board, Field38], [board, Field39], [board, Field40], [board, Field41], [board, Field42], [board, Field43], [board, Field44], [board, Field45], [board, Field46], [board, Field47], [board, Field48], [board, Field49], [board, Field50], [board, Field51], [board, Field52], [board, Field53], [board, Field54], [board, Field55], [board, Field56], [board, Field57], [board, Field58], [board, Field59], [board, Field60], [board, Field61], [board, Field62], [board, Field63], [board, Field64], [board, Field65], [board, Field66], [board, Field67], [board, Field68], [board, Field69], [board, Field70], [board, Field71], [board, Field72], [board, Field73], [board, Field74], [board, Field75], [board, Field76], [board, Field77], [board, Field78], [board, Field79], [board, Field80], [board, Field81]], ColumnFields=[[Column1, [Column1, Field10], [Column1, Field19], [Column1, Field28], [Column1, Field37], [Column1, Field46], [Column1, Field55], [Column1, Field64], [Column1, Field73], [Column2, [Column2, Field11], [Column2, Field20], [Column2, Field29], [Column2, Field38], [Column2, Field47], [Column2, Field56], [Column2, Field65], [Column2, Field74], [Column3, [Column3, Field12], [Column3, Field21], [Column3, Field30], [Column3, Field39], [Column3, Field48], [Column3, Field57], [Column3, Field66], [Column3, Field75], [Column4, [Column4, Field13], [Column4, Field22], [Column4, Field31], [Column4, Field40], [Column4, Field49], [Column4, Field58], [Column4, Field67], [Column4, Field76], [Column5, [Column5, Field14], [Column5, Field23], [Column5, Field32], [Column5, Field41], [Column5, Field50], [Column5, Field59], [Column5, Field68], [Column5, Field77], [Column6, [Column6, Field15], [Column6, Field24], [Column6, Field33], [Column6, Field42], [Column6, Field51], [Column6, Field60], [Column6, Field69], [Column6, Field78], [Column7, [Column7, Field16], [Column7, Field25], [Column7, Field34], [Column7, Field43], [Column7, Field52], [Column7, Field61], [Column7, Field70], [Column7, Field79], [Column8, [Column8, Field17], [Column8, Field26], [Column8, Field35], [Column8, Field44], [Column8, Field53], [Column8, Field62], [Column8, Field71], [Column8, Field80], [Column9, [Column9, Field18], [Column9, Field27], [Column9, Field36], [Column9, Field45], [Column9, Field54], [Column9, Field63], [Column9, Field72], [Column9, Field81]], RowFields=[[Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row2, Field10], [Row2, Field11], [Row2, Field12], [Row2, Field13], [Row2, Field14], [Row2, Field15], [Row2, Field16], [Row2, Field17], [Row2, Field18], [Row3, Field19], [Row3, Field20], [Row3, Field21], [Row3, Field22], [Row3, Field23], [Row3, Field24], [Row3, Field25], [Row3, Field26], [Row3, Field27], [Row4, Field28], [Row4, Field29], [Row4, Field30], [Row4, Field31], [Row4, Field32], [Row4, Field33], [Row4, Field34], [Row4, Field35], [Row4, Field36], [Row5, Field37], [Row5, Field38], [Row5, Field39], [Row5, Field40], [Row5, Field41], [Row5, Field42], [Row5, Field43], [Row5, Field44], [Row5, Field45], [Row6, Field46], [Row6, Field47], [Row6, Field48], [Row6, Field49], [Row6, Field50], [Row6, Field51], [Row6, Field52], [Row6, Field53], [Row6, Field54], [Row7, Field55], [Row7, Field56], [Row7, Field57], [Row7, Field58], [Row7, Field59], [Row7, Field60], [Row7, Field61], [Row7, Field62], [Row7, Field63], [Row8, Field64], [Row8, Field65], [Row8, Field66], [Row8, Field67], [Row8, Field68], [Row8, Field69], [Row8, Field70], [Row8, Field71], [Row8, Field72], [Row9, Field73], [Row9, Field74], [Row9, Field75], [Row9, Field76], [Row9, Field77], [Row9, Field78], [Row9, Field79], [Row9, Field80], [Row9, Field81]], SquareFields=[[Square1, [Square1, [Square1, [Square1, Field10], [Square1, Field11], [Square1, Field12], [Square1, Field19], [Square1, Field20], [Square1, Field21], [Square2, [Square2, [Square2, [Square2, Field13], [Square2, Field14], [Square2, Field15], [Square2, Field22], [Square2, Field23], [Square2, Field24], [Square3, [Square3, [Square3, [Square3, Field16], [Square3, Field17], [Square3, Field18], [Square3, Field25], [Square3, Field26], [Square3, Field27], [Square4, Field28], [Square4, Field29], [Square4, Field30], [Square4, Field37], [Square4, Field38], [Square4, Field39], [Square4, Field46], [Square4, Field47], [Square4, Field48], [Square5, Field31], [Square5, Field32], [Square5, Field33], [Square5, Field40], [Square5, Field41], [Square5, Field42], [Square5, Field49], [Square5, Field50], [Square5, Field51], [Square6, Field34], [Square6, Field35], [Square6, Field36], [Square6, Field43], [Square6, Field44], [Square6, Field45], [Square6, Field52], [Square6, Field53], [Square6, Field54], [Square7, Field55], [Square7, Field56], [Square7, Field57], [Square7, Field64], [Square7, Field65], [Square7, Field66], [Square7, Field73], [Square7, Field74], [Square7, Field75], [Square8, Field58], [Square8, Field59], [Square8, Field60], [Square8, Field67], [Square8, Field68], [Square8, Field69], [Square8, Field76], [Square8, Field77], [Square8, Field78], [Square9, Field61], [Square9, Field62], [Square9, Field63], [Square9, Field70], [Square9, Field71], [Square9, Field72], [Square9, Field79], [Square9, Field80], [Square9, Field81]]} - - -ints: [] - ----STATS--- -p cnf 227878 858581 -primary variables: 13892 -translation time: 27097 ms -solving time: 827 ms diff --git a/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt b/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt deleted file mode 100644 index 710c35f5d..000000000 --- a/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt +++ /dev/null @@ -1,23 +0,0 @@ -This model contains two classes A and B with -associations R1 and R2 between them. -The operation swap_b swaps the two R1 and R2 links -for an A object. The expected state resulting from the -operation is asserted by a postcondition. -The command file uses features introduced in -USE 2.1.0: note the expressions in the insert and -delete commands, and the new let command. - -SwapLinks.use: -two classes A (with one Operation) and B -two associations between A and B -one object of type A has to be connected with -exactly one object of type B for each association -pre- and postconditions for the operation - -SwapLinks.cmd: -two objects of type B and one Object a of type A -are created -a is connected with the other objects -with two links from the different associations -then the operation is called and the objects -swap (let is used) diff --git a/use-core/src/main/resources/examples/Others/Test/Info.txt b/use-core/src/main/resources/examples/Others/Test/Info.txt deleted file mode 100644 index 4d55253a3..000000000 --- a/use-core/src/main/resources/examples/Others/Test/Info.txt +++ /dev/null @@ -1,6 +0,0 @@ -This test file was automatically generated. -It contains 50 classes and 2450 (= 50 * 49) -associations connecting each class with each other. - -Test.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Tree/Info.txt b/use-core/src/main/resources/examples/Others/Tree/Info.txt deleted file mode 100644 index c26b6bbec..000000000 --- a/use-core/src/main/resources/examples/Others/Tree/Info.txt +++ /dev/null @@ -1,35 +0,0 @@ -Trees can be created with this model. -There is a class, which represents the nodes of a tree. -A link of the association Parentship can be created -between two nodes. -A parent may have several children -but only one parent or no parent, -if it is the root node. - -Tree.use: -one class TreeNode -one association Parantship -one invariant (does not allow cycles) -four complex operations: - - childPlus1 (recursive) returns all objects - the calling object is connected with (transitive). - The union of sets, collect and flatten is used. - Does not terminate if there are cycles in the graph. - - childPlus2 like childPlus2; it uses the operation - childPlusOnNodeSet - - childPlusOnNodeSet (recursive) collects all - objects the objects in the set (argument) - are connected with (transitive) and checks for all - elements if all directly connected children are - also element of the set (termination condition). - With this check, cycles are no problem. - - childPlus3 can handle cycles - because the search depth equals the maximum depth - of the tree. - -Tree.cmd: -creates a graph with cycles - -Tree2.cmd: -creates a graph with two nodes -the invariant evaluates to false diff --git a/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt b/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt deleted file mode 100644 index 16a5b4283..000000000 --- a/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt +++ /dev/null @@ -1,22 +0,0 @@ -An example with generalization. There are -vehicles (abstract class) and cars resp. motorcycles -(subclasses). -Vehicles belong to companies, which -have a branch RentalStation (aggregation). -Persons work for rental stations or manage them. - -The example corresponds to the paper: -Mark Richters and Martin Gogolla, -"On Formalizing the UML Object Constraint Language OCL", -Figure 1 - -CarRental.use: -six classes Company, RentalStation, Person, -Vehicle (abstract class), Car, Motorcycle -with generalization -attributes and queries -four associations Owns, hasBranch (aggregation), -managedBy, WorksFor and some explicit role names - -CarRental.cmd: -empty diff --git a/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt b/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt deleted file mode 100644 index 2a115590b..000000000 --- a/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt +++ /dev/null @@ -1,12 +0,0 @@ -Modeled after an example taken from: -Jos Warmer and Anneke Kleppe, -"The Object Constraint Language: -Precise Modeling with UML", Addison-Wesley, 1998. (p. 12) - -RoyalAndLoyal.use: -several classes and attributes -no operations and constraints -several associations - -RoyalAndLoyal.cmd: -empty diff --git a/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt b/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt deleted file mode 100644 index 19d8775c9..000000000 --- a/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt +++ /dev/null @@ -1,12 +0,0 @@ -This example corresponds to Fig. 4 Metamodel -for OCL Types in "A Metamodel for OCL" - -see also: Phd thesis of Mark Richters -Figure 6.5 - -OCLmetamodel.use: -contains a class with generalization and associations -for each OCL type - -OCLmetamodel.cmd: -empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt deleted file mode 100644 index 6f754dd5f..000000000 --- a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt +++ /dev/null @@ -1,23 +0,0 @@ -This example corresponds to -the case study of Mark Richters in his PhD Thesis: -"A Precise Approach to Validating UML Models and OCL -Constraints" - -EmployeeExtended.use: -Classes from /Others/Ex/Ex.use -Person renamed into Employee -Employee extended by attribute age : Integer -Employee extended by operation raiseSalary from -/Documentation/Employee.use -Invariants from /Others/Ex/Ex.use -Constraint for raiseSalary from Employee, extended -by the postcondition amount > 0 and changed -from rate to amount - -EmployeeExtended.cmd: -==EmployeeExtended0.cmd,EmployeeExtended1.cmd, -EmployeeExtended2.cmd,EmployeeExtended3.cmd, -EmployeeExtended4.cmd,EmployeeExtendedRaiseSalary.cmd - -Builds up on /Others/Ex/Ex.cmd and is extended -by an operation call from /Documentation/Employee.cmd diff --git a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt deleted file mode 100644 index f22774d85..000000000 --- a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt +++ /dev/null @@ -1 +0,0 @@ -copy of /Documentation/NestedOperationCalls \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt b/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt deleted file mode 100644 index 1de4afd0a..000000000 --- a/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt +++ /dev/null @@ -1,39 +0,0 @@ -bossBossBetterPaidThanWorker.invs bossBoss better paid than worker invariant -companyHasEmployee.invs company has employee invariant -hierarchyBinTree.ins hierarchy is binary tree (worker size =0 or =2) -jobsAtMost.invs person has at most 2 jobs invariant -percom-1.cmd 7 persons, 1 company, 7 jobs, 6 BossWorker -percom-130.cmd 10 persons, 26 company, 130 jobs, 120 BossWorker -percom-2.cmd 4 persons, 1 company, 4 jobs, 3 BossWorker -percom-3.cmd twoRoleTC (2 persons, 3 company, 6 jobs, 4 BossWorker) -percom-3b.cmd 3 persons, 2 company, 5 jobs, 3 BossWorker -percom-3c.cmd 2 persons, 3 company, 2 jobs, 2 BossWorker -percom-3d.cmd 26 persons, 7 company, 182 jobs, 175 BossWorker / no success -percom-3e.cmd 26 persons, 4 company, 28 jobs, 24 BossWorker -percom-4.cmd 4 persons, 3 company, 8 jobs, 5 BossWorker -percom-5.cmd twoBossesTC (7 persons, 1 company, 7 jobs, 6 BossWorker) -percom-5b.cmd 7 persons, 1 company, 7 jobs, genBW2 -percom-5c.cmd 8 persons, 1 company, 8 jobs, 7 BossWorker -percom-6.cmd genPersons versus genPersonsNaive -percom-7.cmd bossBossVC (3 persons, 1 company, 3 jobs, bB better paid) -percom-8.cmd generatePersonWith2Jobs[0|1]Companies -percom-9.cmd generatePersonWith3Jobs[0|1|2]Companies -percom-10.cmd generate binary tree hierarchy -percom-10-X.cmd generated by 10.cmd (7P,1C,7J,6BW) -percom-10-X.olt layout for percom-10-X.cmd -percom-11.cmd attempt to automatically calculate reject from invs -percom-12.cmd realistic snapshot (15P, 3C, 18J, 15BW) -percom-13.cmd chain snapshot (7P, 1C, 7J, 6BW) -percom-14.cmd 'bohling' snapshot -percom.assl assl file -percom.use use file -personEmployeeInverseCompEmployer.invs invariant following from operation definition (VC ToDo) -personWith2JobsIn0Or1Company.invs invariant not satisfiable -personWith3JobsIn0Or1Or2Companies.invs invariant not satisfiable -threeLevelHierarchy.cmd three level hierarchy query -threeLevelHierarchy.invs three level hierarchy invariant -twoBossesWithDisjointWorkers.cmd two bosses with existing disjoint workers query -twoBossesWithDisjointWorkers.invs two bosses with existing disjoint workers invariant -twoBossesWithDisjointWorkers2.invs two bosses with 2 disjoint workers invariant -twoRoleEmployee.cmd two role employee query -twoRoleEmployee.invs two role employee invariant diff --git a/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt b/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt deleted file mode 100644 index 254d44875..000000000 --- a/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt +++ /dev/null @@ -1,10 +0,0 @@ -Test suite 'CivilStatus' with 3 test cases -Executing test 1/3 `testSetUp'... success -Executing test 2/3 `uniqueNames'... success -Executing test 3/3 `excludeBigamie'... success - -Test suite 'CivilStatus' with 3 test cases -Executing test 1/3 `testSetUp'... success -Executing test 2/3 `uniqueNames'... success -Executing test 3/3 `excludeBigamie'... failure - Assertion failure in line 59. \ No newline at end of file diff --git a/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt b/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt deleted file mode 100644 index bfe587999..000000000 --- a/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt +++ /dev/null @@ -1,8 +0,0 @@ - -context Train - inv Chain_tooWeak: - self.waggon->select(w: Waggon | w.predecessor->isEmpty)->size = 1 - -context Waggon - inv NoCycles: - not self.transPredecessor()->includes(self) diff --git a/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt b/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt deleted file mode 100644 index ac25c8cdb..000000000 --- a/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt +++ /dev/null @@ -1,9 +0,0 @@ - -context Train - inv Chain_tooWeak: - self.waggon->select(w: Waggon | w.predecessor->isEmpty)->size = 1 - -context Waggon - inv PredecessorInSameTrain: - (not self.predecessor->isEmpty) implies - self.predecessor.train = self.train diff --git a/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt b/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt deleted file mode 100644 index 147ad8516..000000000 --- a/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt +++ /dev/null @@ -1,9 +0,0 @@ - -context Zug - inv Kette_zuWeich: - self.waggon->select(w: Waggon | w.vorgaenger->isEmpty)->size = 1 - -context Waggon - inv KeineSchleife: - not self.transVorgaenger()->includes(self) - diff --git a/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt b/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt deleted file mode 100644 index 808b42c15..000000000 --- a/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt +++ /dev/null @@ -1,10 +0,0 @@ - -context Zug - inv Kette_zuWeich: - self.waggon->select(w: Waggon | w.vorgaenger->isEmpty)->size = 1 - -context Waggon - inv VorgaengerImGleichenZug: - (not self.vorgaenger->isEmpty) implies - self.vorgaenger.zug = self.zug - diff --git a/use-core/src/main/resources/oclextensions/README-Distributions.txt b/use-core/src/main/resources/oclextensions/README-Distributions.txt deleted file mode 100644 index deb454cb5..000000000 --- a/use-core/src/main/resources/oclextensions/README-Distributions.txt +++ /dev/null @@ -1,18 +0,0 @@ -File "Distributions.xml" contains an extension for USE Real numbers - -Given x, m, s: Real, then: - -x.pdf01() returns the distribution function PDF(x) of a Gaussian Distribution with mean=0 and sigma=1, N(0,1) - -x.pdf(m,s) returns the distribution function PDF(x) of a N(m,s) - -x.cdf01() returns the CUMMULATIVE distribution function CDF(x) of a Gaussian - Distribution with mean=0 and sigma=1, N(0,1) - -x.cdf(m,s) returns the CUMMULATIVE distribution function CDF(x) of a N(m,s) - -x.normalDistr(y) returns a value of a Normal (Gaussian) distribution of mean x and sigma y, N(x,y). - For example 0.normalDistr(1) returns the value of N(0,1) - -Finally, x.expDistr() returns a value of an exponential distribution of mean x (or 0.0 if x==0.0) - diff --git a/use-core/src/main/resources/oclextensions/README-Random.txt b/use-core/src/main/resources/oclextensions/README-Random.txt deleted file mode 100644 index 9fd0dd42f..000000000 --- a/use-core/src/main/resources/oclextensions/README-Random.txt +++ /dev/null @@ -1,63 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -RANDOM Numbers - - - - - - - - - - - - 0 - return Random.srand($self) %1000000 - else - return Random.srand() % 10000000 - end - ]]> - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -EXAMPLES OF USE - -use> ?1.rand() --> 0.09152860811512553 : Real -use> ?2.rand() --> 1.8371397364794912 : Real -use> ?2.rand() --> 0.6646401472302712 : Real -use> ?2.rand() --> 1.5417649510780334 : Real -use> ?2.rand() --> 0.990212333639167 : Real -use> ?2.rand() --> 1.676070756281957 : Real -use> ?2.rand() --> 1.835645464118648 : Real -use> ?1.srand() --> 32783 : Integer -use> ?1.srand() --> 1 : Integer -use> ?0.srand() --> 1 : Integer -use> ?0.srand() --> 2297549 : Integer -use> ?0.srand() --> 3220924 : Integer -use> ?0.srand() --> 3666729 : Integer -use> \ No newline at end of file diff --git a/use-gui/TESTS_ObjectDiagram_MVP.md b/use-gui/TESTS_ObjectDiagram_MVP.md new file mode 100644 index 000000000..9234ae04a --- /dev/null +++ b/use-gui/TESTS_ObjectDiagram_MVP.md @@ -0,0 +1,47 @@ +# Testfälle: NewObjectDiagram / Presenter (MVP) + +Diese Datei enthält 10 fokussierte Testfälle, die ausschließlich `NewObjectDiagram`, `NewObjectDiagramPresenterImpl` und die direkt beteiligten Komponenten (`NewObjectDiagramView`, `NewObjectDiagramModel`, `PlacementRepository`, `ContextMenuProvider`, `ApplicationController`) betreffen. + +Hinweis: Für die Log-Verifizierung werden Einträge im Verzeichnis `use_refactor_logs` erwartet (z. B. `%USERPROFILE%\use_refactor_logs\t01.log`). + +| Test-ID | Scope | Vorbedingung | Schritte | Erwartete Log-Einträge (Beispiele) | Verifikation | +|---|---|---|---|---|---| +| Test-01 | Presenter-Initialisierung | `NewObjectDiagramView.initDiagram()` wird aufgerufen | Öffne die Objektdiagram-View (View init) | `NewObjectDiagramPresenterImpl - constructed`
`NewObjectDiagram.setPresenter - presenter attached for test=...`
`LOGGER TEST` (ctor) | Alle drei Einträge erscheinen in `.log` | +| Test-02 | Create Object → Presenter → ApplicationController | Diagramm geöffnet | Erzeuge Objekt via View (z. B. Create A) | `onCreateObject called` (presenter)
Controller-spezifische Logs (z. B. create invocation) | Presenter-Log vorhanden und Controller-Aufruf sichtbar oder Objekt im Model vorhanden | +| Test-03 | Show Object Properties flow | Mind. ein Objekt vorhanden | Rechtsklick auf Objekt → Properties (oder Doppelklick) | `NewObjectDiagram - invoking presenter.onShowObjectProperties for object=...`
`onShowObjectProperties object=...`
`DefaultApplicationController.showObjectProperties - object=...` | Reihenfolge: Presenter → Controller; ObjectPropertiesView zeigt Objekt | +| Test-04 | Insert Link | Zwei Objekte (A,B) vorhanden | Insert Link via Context/Toolbar zwischen A und B | `onInsertLink association=... participants=2` | Link erscheint; Log zeigt participants=2 | +| Test-05 | Delete Link | Ein Link zwischen A und B existiert | Delete Link via Context/Toolbar | `onDeleteLink link=...` | Link ist entfernt; Log enthält `onDeleteLink` | +| Test-06 | Delete Objects (Multi) | Mehrere Objekte auswählbar | Wähle A,B → Delete objects | `onDeleteObjects count=2` | Objekte sind entfernt; Log zeigt count | +| Test-07 | Store / Restore Layout (PlacementRepository) | Nodes sind manuell positioniert | 1) Save layout → 2) Reset positions → 3) Restore layout | `onStoreLayout called`
`onRestoreLayout called version=...` | Nach Restore sind Positionen wiederhergestellt; Logs enthalten Store+Restore | +| Test-08 | Hide / Show Links & Objects | Links/Objects vorhanden | Hide links → Show all links → Hide objects (crop) | `onHideLinks count=...`
`onShowAllLinks called`
`onCropSelection count=...` | Visueller Status entspricht Aktionen; Logs enthalten counts | +| Test-09 | Highlight / Transition Events (EventBus) | System kann Events senden | 1) Trigger TransitionEvent (z. B. Attributänderung)
2) Trigger HighlightChangeEvent | `onTransition event source=...`
`onHighlightChange called event=...` | Presenter empfängt Events; Diagramm wird refreshed; Logs vorhanden | +| Test-10 | Full Reset / Refresh Flow | Diagramm in beliebigem Zustand | 1) Reset Diagram → 2) Refresh (z. B. SortChange) | `onResetDiagram called options=...`
`onRefreshRequested called`
`onStatusMessage: Diagram reset` | Diagramm ist zurückgesetzt; Status-Logs vorhanden | + +--- + +Kurze Ausführungs- und Prüf-Hinweise + +- Setze vor dem Start die Umgebungsvariable `TEST_NAME` oder übergebe sie beim Start, z. B. mit dem bereitgestellten Script: + +```powershell +Push-Location "C:\Users\ahmed\IdeaProjects\use\use-gui\src\main\resources\bin" +$env:TEST_NAME = 't01' +.\start_with_testlog.bat t01 > C:\temp\use_start_t01.txt 2>&1 +Pop-Location +``` + +- Live-Tail des Logs während Interaktion: + +```powershell +Get-Content -Path "$env:USERPROFILE\use_refactor_logs\t01.log" -Wait -Tail 20 +``` + +- Prüfe die erwarteten Log-Muster in der Datei `%USERPROFILE%\use_refactor_logs\.log` oder in der Working-Copy `...\bin\use_refactor_logs\.log`. + +Wenn du möchtest, kann ich jetzt: +- A) Für jeden Test ein kurzes PowerShell-Checkskript erzeugen, das die erwarteten Log-Patterns prüft (einfaches text-suchen), oder +- B) Die 10 Tests als separate `.md`-Files unter `use-gui/tests/` ablegen, oder +- C) Sofort Test-2..Test-10 Einträge in die Logs wie bei Test-1 schreiben. + +Antworte bitte mit `A`, `B` oder `C` (oder `Stop`). + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java index 9577fc02f..e5cc1b3bd 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java @@ -1,6 +1,7 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; import javax.swing.JPopupMenu; +import java.awt.Point; import java.util.Set; import org.tzi.use.uml.sys.MObject; import org.tzi.use.uml.sys.MLink; @@ -12,6 +13,7 @@ public interface ContextMenuProvider { void enhanceMenu(JPopupMenu popupMenu, ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter, + Point popupPosition, Set selectedObjects, Set selectedLinks, Set selectedAssocObjects); diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index 96d1abcde..948ab5b52 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -1,29 +1,27 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; +import org.tzi.use.gui.views.diagrams.elements.CommentNode; +import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; import org.tzi.use.gui.views.diagrams.util.MenuScroller; +import org.tzi.use.gui.views.diagrams.ObjectNodeActivity; import org.tzi.use.uml.mm.MAssociation; import org.tzi.use.uml.mm.MAssociationEnd; +import org.tzi.use.uml.mm.MAssociationClassImpl; import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.mm.MNamedElementComparator; +import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MObject; +import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; +import org.tzi.use.util.collections.CollectionUtil; +import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; import javax.swing.*; import java.awt.Component; -import java.awt.event.ActionEvent; +import java.awt.Point; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; @@ -33,6 +31,7 @@ public class DefaultContextMenuProvider implements ContextMenuProvider { public void enhanceMenu(JPopupMenu popupMenu, ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter, + Point popupPosition, Set selectedObjects, Set selectedLinks, Set selectedAssocObjects) { @@ -45,32 +44,49 @@ public void enhanceMenu(JPopupMenu popupMenu, Set safeObjects = selectedObjects == null ? Set.of() : selectedObjects; Set safeLinks = selectedLinks == null ? Set.of() : selectedLinks; + Set safeAssocObjects = selectedAssocObjects == null ? Set.of() : selectedAssocObjects; + boolean hasSelectedObjects = !safeObjects.isEmpty(); + boolean hasSelectedLinks = !safeLinks.isEmpty(); List ordered = new ArrayList<>(); - addComponent(ordered, buildEditPropertiesItem(presenter, safeObjects)); - addComponent(ordered, buildDestroyItem(presenter, safeObjects)); - addSeparator(ordered); + if (hasSelectedObjects) { + addComponent(ordered, buildEditPropertiesItem(presenter, safeObjects)); + addComponent(ordered, buildDestroyItem(presenter, safeObjects)); + addSeparator(ordered); + } - addComponents(ordered, buildInsertItems(presenter, safeObjects)); - addSeparator(ordered); + if (hasSelectedObjects) { + addComponents(ordered, buildInsertItems(presenter, safeObjects)); + addSeparator(ordered); + } - addComponent(ordered, buildHideSelectedItem(presenter, safeObjects)); - addComponent(ordered, buildCropSelectedItem(presenter, safeObjects)); - addComponent(ordered, buildGreyOutItem(presenter, safeObjects)); - addSeparator(ordered); + if (hasSelectedObjects) { + addComponent(ordered, buildHideSelectedItem(presenter, safeObjects)); + addComponent(ordered, buildCropSelectedItem(presenter, safeObjects)); + addComponent(ordered, buildGreyOutItem(presenter, safeObjects)); + addSeparator(ordered); + } + + if (hasSelectedLinks) { + addComponent(ordered, buildHideSelectedLinksItem(diagram, presenter, safeLinks)); + addComponent(ordered, buildCropSelectedLinksItem(diagram, presenter, safeLinks, safeAssocObjects)); + addSeparator(ordered); + } - addComponent(ordered, buildShowHideCropMenu(presenter, diagram, safeObjects, safeLinks)); - addComponent(ordered, buildHideObjectsMenu(presenter, safeObjects)); - addComponent(ordered, buildHideLinksMenu(presenter, safeLinks)); + addComponent(ordered, buildShowHideCropMenu(diagram, presenter, safeObjects)); + addComponent(ordered, buildHideObjectsMenu(diagram, presenter)); + addComponent(ordered, buildHideLinksMenu(diagram, presenter)); + addComponent(ordered, buildShowObjectsMenu(diagram, presenter)); + addComponent(ordered, buildShowLinksMenu(diagram, presenter)); addSeparator(ordered); - addComponent(ordered, buildLinksByKindMenu(diagram)); + addComponent(ordered, buildLinksByKindMenu(diagram, presenter)); addSeparator(ordered); - addComponent(ordered, buildProtocolStateMachineItem(presenter)); + addComponent(ordered, buildProtocolStateMachineMenu(presenter, safeObjects)); addSeparator(ordered); - addComponent(ordered, extractOrFallback(baseItems, "Add comment node", () -> buildCommentNode(presenter))); + addComponent(ordered, buildCommentNode(diagram, presenter, popupPosition)); addSeparator(ordered); addComponent(ordered, extractOrFallback(baseItems, "Show attributes", () -> buildStatusItem("Show attributes", presenter))); @@ -106,7 +122,7 @@ private void addComponents(List target, List com } private void addSeparator(List target) { - if (target.isEmpty() || target.get(target.size() - 1) instanceof JSeparator) { + if (target.isEmpty() || target.getLast() instanceof JSeparator) { return; } target.add(new JSeparator()); @@ -136,18 +152,20 @@ private Component takeAndRemove(List components, String text) { } private JMenuItem buildEditPropertiesItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { - return buildMenuItem("Edit properties of '" + safeName(selectedObjects.iterator().next()) + "'" , ev -> { - if (selectedObjects.isEmpty()) { + MObject first = selectedObjects == null || selectedObjects.isEmpty() ? null : selectedObjects.iterator().next(); + return buildMenuItem("Edit properties of '" + safeName(first) + "'", ev -> { + if (first == null) { presenter.onStatusMessage("Select an object to edit its properties."); } else { - presenter.onShowObjectProperties(selectedObjects.iterator().next()); + presenter.onShowObjectProperties(first); } }); } private JMenuItem buildDestroyItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { - return buildMenuItem("Destroy '" + safeName(selectedObjects.iterator().next()) + "'", ev -> { - if (selectedObjects.isEmpty()) { + MObject first = selectedObjects == null || selectedObjects.isEmpty() ? null : selectedObjects.iterator().next(); + return buildMenuItem("Destroy '" + safeName(first) + "'", ev -> { + if (selectedObjects == null || selectedObjects.isEmpty()) { presenter.onStatusMessage("Select at least one object to destroy."); } else { presenter.onDeleteObjects(selectedObjects); @@ -168,75 +186,117 @@ private List buildInsertItems(NewObjectDiagramPresenter presenter, Se MAssociation::name, Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); - boolean addedCombinationEntries = false; + if (selectedObjects == null || selectedObjects.isEmpty() || associations.isEmpty()) { + return items; + } - if (selectedObjects != null && !selectedObjects.isEmpty()) { - List selList = new ArrayList<>(selectedObjects); - selList.removeIf(Objects::isNull); - selList.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); - int m = selList.size(); + List selList = new ArrayList<>(selectedObjects); + selList.removeIf(Objects::isNull); + selList.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); + int m = selList.size(); + if (m == 0) { + return items; + } - for (MAssociation assoc : associations) { - if (assoc == null || assoc.isReadOnly()) { - continue; - } - List ends = assoc.associationEnds(); - int n = ends == null ? 0 : ends.size(); - if (n == 0 || m > n) { + for (MAssociation assoc : associations) { + if (assoc == null || assoc.isReadOnly()) { + continue; + } + + List ends = assoc.associationEnds(); + int n = ends == null ? 0 : ends.size(); + if (n == 0) { + continue; + } + + Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); + if (associationLinks == null) { + associationLinks = List.of(); + } + + int pow = 1; + for (int i = 0; i < n; i++) { + pow *= m; + } + + for (int value = 0; value < pow; value++) { + int[] digits = radixConversion(value, m, n); + if (!isCompleteObjectCombination(digits, m)) { continue; } - Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); - if (associationLinks == null) { - associationLinks = List.of(); + MObject[] tuple = new MObject[n]; + MClass[] types = new MClass[n]; + for (int idx = 0; idx < n; idx++) { + tuple[idx] = selList.get(digits[idx]); + types[idx] = tuple[idx].cls(); + } + if (!assoc.isAssignableFrom(types)) { + continue; } - int pow = 1; - for (int i = 0; i < n; i++) { - pow *= m; + StringBuilder joined = new StringBuilder(); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + joined.append(','); + } + joined.append(safeName(tuple[idx])); } - for (int value = 0; value < pow; value++) { - int[] digits = radixConversion(value, m, n); - if (!isCompleteObjectCombination(digits, m)) { + List matchingLinks = new ArrayList<>(); + for (MLink link : associationLinks) { + List linkObjects = link.linkedObjects(); + if (linkObjects == null || linkObjects.size() != tuple.length) { continue; } - MObject[] tuple = new MObject[n]; - MClass[] types = new MClass[n]; - for (int idx = 0; idx < n; idx++) { - tuple[idx] = selList.get(digits[idx]); - types[idx] = tuple[idx].cls(); + + boolean sameTuple = true; + for (int idx = 0; idx < tuple.length; idx++) { + if (linkObjects.get(idx) != tuple[idx]) { + sameTuple = false; + break; + } } - if (!assoc.isAssignableFrom(types)) { - continue; + + if (sameTuple) { + matchingLinks.add(link); } + } - String joined = Arrays.stream(tuple) - .map(this::safeName) - .reduce((a, b) -> a + "," + b) - .orElse("..."); - - MLink existingLink = findMatchingLink(tuple, associationLinks); - if (existingLink != null) { - MLink linkForDeletion = existingLink; - items.add(buildMenuItem("delete (" + joined + ") from " + assoc.name(), - ev -> presenter.onDeleteLink(linkForDeletion))); - } else { - MAssociation currentAssoc = assoc; - List tupleList = Arrays.asList(tuple.clone()); - items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), - ev -> presenter.onInsertLink(currentAssoc, tupleList))); + if (matchingLinks.isEmpty()) { + List tupleList = Arrays.asList(tuple.clone()); + items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), + ev -> presenter.onInsertLink(assoc, tupleList))); + } else { + for (MLink link : matchingLinks) { + StringBuilder deleteLabel = new StringBuilder("delete ("); + List> qualifiers = castQualifiers(link.getQualifier()); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + deleteLabel.append(','); + } + deleteLabel.append(safeName(tuple[idx])); + if (qualifiers != null && idx < qualifiers.size()) { + List qualifierForEnd = qualifiers.get(idx); + if (qualifierForEnd != null && !qualifierForEnd.isEmpty()) { + deleteLabel.append('{'); + for (int q = 0; q < qualifierForEnd.size(); q++) { + if (q > 0) { + deleteLabel.append(','); + } + deleteLabel.append(qualifierForEnd.get(q)); + } + deleteLabel.append('}'); + } + } + } + deleteLabel.append(") from ").append(assoc.name()); + items.add(buildMenuItem(deleteLabel.toString(), ev -> presenter.onDeleteLink(link))); } - addedCombinationEntries = true; } } } - if (!addedCombinationEntries) { - items.add(buildMenuItem("insert (...) into ...", - ev -> presenter.onInsertLinkInteractive(selectedObjects == null ? Set.of() : selectedObjects))); - } - return items; } @@ -260,114 +320,467 @@ private JMenuItem buildGreyOutItem(NewObjectDiagramPresenter presenter, Set hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayOut(objs))); } - private JMenu buildShowHideCropMenu(NewObjectDiagramPresenter presenter, - ObjectDiagramInteractor diagram, - Set selectedObjects, - Set selectedLinks) { - JMenu menu = new JMenu("Show/hide/crop objects"); - menu.add(buildMenuItem("Show hidden elements", ev -> presenter.onShowHiddenElements())); - menu.add(buildMenuItem("Hide selected objects", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs)))); - menu.add(buildMenuItem("Crop selection", ev -> { - if (selectedObjects.isEmpty() && selectedLinks.isEmpty()) { - presenter.onStatusMessage("Select objects or links to crop."); - return; + private JMenu buildHideObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Hide objects"); + MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); + + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return menu; + } + + Set visibleObjects = new LinkedHashSet<>(newDiagram.getVisibleData().getObjectToNodeMap().keySet()); + if (visibleObjects.isEmpty()) { + return null; + } + + JMenuItem hideAllObjects = new JMenuItem("Hide all objects"); + hideAllObjects.setEnabled(!visibleObjects.isEmpty()); + hideAllObjects.addActionListener(ev -> presenter.onHideObjects(new LinkedHashSet<>(visibleObjects))); + menu.add(hideAllObjects); + menu.addSeparator(); + + Map> objectsByClass = new HashMap<>(); + for (MObject obj : visibleObjects) { + objectsByClass.computeIfAbsent(obj.cls(), key -> new ArrayList<>()).add(obj); + } + + List classes = new ArrayList<>(objectsByClass.keySet()); + classes.sort(new MNamedElementComparator()); + + for (MClass cls : classes) { + JMenu classMenu = new JMenu("Class " + cls.name()); + MenuScroller.setScrollerFor(classMenu, 15, 125, 0, 0); + + List classObjects = new ArrayList<>(objectsByClass.getOrDefault(cls, List.of())); + classObjects.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); + + JMenuItem hideClassAll = new JMenuItem("Hide all"); + hideClassAll.addActionListener(ev -> presenter.onHideObjects(new LinkedHashSet<>(classObjects))); + classMenu.add(hideClassAll); + classMenu.addSeparator(); + + for (MObject obj : classObjects) { + classMenu.add(buildMenuItem("Hide " + obj.name(), ev -> presenter.onHideObjects(Set.of(obj)))); } - Set targets = new HashSet<>(selectedObjects); - selectedLinks.forEach(link -> targets.addAll(link.linkedObjects())); - presenter.onCropSelection(targets); - })); - menu.add(buildMenuItem("Grey out selection", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayOut(objs)))); - menu.add(buildMenuItem("Grey in selection", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayIn(objs)))); - if (diagram instanceof NewObjectDiagram newDiagram) { - menu.addSeparator(); - menu.add(buildMenuItem("Show all objects", ev -> newDiagram.showAll())); - menu.add(buildMenuItem("Hide all objects", ev -> newDiagram.hideAll())); + + menu.add(classMenu); } + return menu; } - private JMenu buildHideObjectsMenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { - JMenu menu = new JMenu("Hide objects"); - menu.add(buildMenuItem("Hide selected objects", ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs)))); - menu.add(buildMenuItem("Show hidden objects", ev -> presenter.onShowHiddenElements())); + private JMenu buildHideLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Hide links"); + MenuScroller.setScrollerFor(menu, 20, 125, 0, 0); + + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } + + List links = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getVisibleData().getEdges())); + if (links.isEmpty()) { + return null; + } + + JMenuItem hideAllLinks = new JMenuItem("Hide all links"); + hideAllLinks.setEnabled(!newDiagram.getVisibleData().getEdges().isEmpty()); + hideAllLinks.addActionListener(ev -> presenter.onHideAllLinks()); + menu.add(hideAllLinks); + menu.addSeparator(); + + Map> grouped = groupLinksByAssociation(links); + for (Map.Entry> entry : grouped.entrySet()) { + JMenu assocMenu = new JMenu(entry.getKey()); + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = entry.getValue(); + assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); + assocMenu.addSeparator(); + assocLinks.sort(linkComparator()); + for (MLink link : assocLinks) { + assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); + } + menu.add(assocMenu); + } return menu; } - private JMenu buildHideLinksMenu(NewObjectDiagramPresenter presenter, Set selectedLinks) { - JMenu menu = new JMenu("Hide links"); - menu.add(buildMenuItem("Hide selected links", ev -> { - if (selectedLinks.isEmpty()) { - presenter.onStatusMessage("Select links to hide."); - } else { - presenter.onHideLinks(selectedLinks); + private JMenu buildShowLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show links"); + MenuScroller.setScrollerFor(menu, 20, 125, 0, 0); + + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } + + List links = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getHiddenData().getEdges())); + if (links.isEmpty()) { + return null; + } + + JMenuItem showAllLinks = new JMenuItem("Show all links"); + showAllLinks.setEnabled(!newDiagram.getHiddenData().getEdges().isEmpty()); + showAllLinks.addActionListener(ev -> presenter.onShowAllLinks()); + menu.add(showAllLinks); + menu.addSeparator(); + + Map> grouped = groupLinksByAssociation(links); + for (Map.Entry> entry : grouped.entrySet()) { + JMenu assocMenu = new JMenu(entry.getKey()); + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = entry.getValue(); + assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); + assocMenu.addSeparator(); + assocLinks.sort(linkComparator()); + for (MLink link : assocLinks) { + assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); } - })); - menu.add(buildMenuItem("Show all links", ev -> presenter.onShowAllLinks())); - menu.add(buildMenuItem("Hide all links", ev -> presenter.onHideAllLinks())); + menu.add(assocMenu); + } + return menu; } - private JMenu buildLinksByKindMenu(ObjectDiagramInteractor diagram) { - JMenu menu = new JMenu("Show/hide links-by-kind"); + private JMenu buildShowObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show objects"); + MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); + if (!(diagram instanceof NewObjectDiagram newDiagram)) { - menu.add(buildMenuItem("Not available", ev -> {})); + return null; + } + + Set hiddenNodes = newDiagram.getHiddenNodes(); + Set hiddenObjectNodes = CollectionUtil.filterByType(hiddenNodes, ObjectNodeActivity.class); + if (hiddenObjectNodes.isEmpty()) { + return null; + } + + JMenuItem showAllObjects = new JMenuItem("Show all hidden objects"); + showAllObjects.setEnabled(true); + showAllObjects.addActionListener(ev -> presenter.onShowHiddenElements()); + menu.add(showAllObjects); + menu.addSeparator(); + + TreeSet sortedNodes = new TreeSet<>(Comparator.comparing((ObjectNodeActivity n) -> n.object().name(), new org.tzi.use.gui.util.AlphanumComparator())); + sortedNodes.addAll(hiddenObjectNodes); + + Map classMenus = new HashMap<>(); + for (ObjectNodeActivity node : sortedNodes) { + MClass cls = node.cls(); + MObject obj = node.object(); + + if (!classMenus.containsKey(cls)) { + JMenu subm = new JMenu("Class " + cls.name()); + MenuScroller.setScrollerFor(subm, 15, 125, 0, 0); + classMenus.put(cls, subm); + + JMenuItem showAll = new JMenuItem("Show all"); + showAll.addActionListener(e -> presenter.onShowHiddenElements()); + subm.add(showAll); + subm.addSeparator(); + } + + JMenu parent = classMenus.get(cls); + parent.add(buildMenuItem("Show " + obj.name(), ev -> presenter.onShowHiddenElements())); + } + + List classes = new ArrayList<>(classMenus.keySet()); + classes.sort(new MNamedElementComparator()); + for (MClass cls : classes) { + menu.add(classMenus.get(cls)); + } + + return menu; + } + + private JMenu buildShowHideCropMenu(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedObjects) { + JMenu menu = new JMenu("Show/hide/crop objects"); + if (presenter == null) { return menu; } - TreeMap> grouped = newDiagram.mapLinksToKindOfAssociation(); + ObjectSelection selection = diagram != null ? diagram.getObjectSelection() : null; + presenter.onBuildShowHideCropMenu(new ShowHideCropMenuBuilder() { + @Override + public void addSelectedObjectPathView(Set selectedObjects) { + if (selection != null && selectedObjects != null && !selectedObjects.isEmpty()) { + menu.add(selection.getSelectedObjectPathView("By path length...", selectedObjects)); + } + } + + @Override + public void addSelectionWithOCLViewAction() { + if (selection != null) { + menu.add(selection.getSelectionWithOCLViewAction()); + } + } + + @Override + public void addSelectionObjectView() { + if (selection != null) { + menu.add(selection.getSelectionObjectView()); + } + } + }, selectedObjects); + return menu; + } + + private JMenuItem buildHideSelectedLinksItem(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedLinks) { + List links = sortedSelectedLinks(selectedLinks); + if (presenter == null || links.isEmpty()) { + return null; + } + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + return buildMenuItem("Hide " + label, ev -> presenter.onHideLinks(links)); + } + + private JMenuItem buildCropSelectedLinksItem(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedLinks, + Set selectedAssocObjects) { + List links = sortedSelectedLinks(selectedLinks); + if (presenter == null || links.isEmpty() || !(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + Set keepObjects = selectedAssocObjects == null ? Set.of() : new LinkedHashSet<>(selectedAssocObjects); + return buildMenuItem("Crop " + label, ev -> cropSelectedLinks(presenter, newDiagram, links, keepObjects)); + } + + private void cropSelectedLinks(NewObjectDiagramPresenter presenter, + NewObjectDiagram newDiagram, + Collection selectedLinks, + Set keepObjects) { + Set selected = new LinkedHashSet<>(selectedLinks); + Set visibleObjects = new LinkedHashSet<>(newDiagram.getVisibleData().getObjectToNodeMap().keySet()); + visibleObjects.removeAll(keepObjects); + + List visibleLinks = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getVisibleData().getEdges())); + visibleLinks.removeIf(selected::contains); + + if (!visibleObjects.isEmpty()) { + presenter.onHideObjects(visibleObjects); + } + if (!visibleLinks.isEmpty()) { + presenter.onHideLinks(visibleLinks); + } + } + + private List sortedSelectedLinks(Set selectedLinks) { + List links = new ArrayList<>(selectedLinks == null ? Set.of() : selectedLinks); + links.removeIf(Objects::isNull); + links.sort(linkComparator()); + return links; + } + + private JMenu buildLinksByKindMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show/hide links-by-kind"); + if (!(diagram instanceof NewObjectDiagram newDiagram) || presenter == null) { + return null; + } + + TreeMap> grouped = mapLinksToKindOfAssociation(presenter); if (grouped.isEmpty()) { - menu.add(buildMenuItem("No associations", ev -> {})); - return menu; + return null; } MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); - menu.add(buildMenuItem("Show all links", ev -> { - newDiagram.showAllLinks(); - newDiagram.repaint(); - })); - menu.add(buildMenuItem("Hide all links", ev -> { - newDiagram.hideAllLinks(); - newDiagram.repaint(); - })); + List allLinks = grouped.values().stream().flatMap(Collection::stream).distinct().toList(); + int linkState = newDiagram.isHidden(allLinks); + if (linkState == 1 || linkState == 2) { + menu.add(buildMenuItem("Show all links", ev -> presenter.onShowAllLinks())); + } + if (linkState == 0 || linkState == 2) { + menu.add(buildMenuItem("Hide all links", ev -> presenter.onHideAllLinks())); + } + menu.addSeparator(); for (Map.Entry> entry : grouped.entrySet()) { - JMenu assocMenu = new JMenu(entry.getKey()); List links = entry.getValue(); - assocMenu.add(buildMenuItem("Show all", ev -> { - newDiagram.showLink(links); - newDiagram.repaint(); - })); - assocMenu.add(buildMenuItem("Hide all", ev -> { - newDiagram.hideLink(links); - newDiagram.repaint(); - })); + if (links == null || links.isEmpty()) { + continue; + } + + JMenu assocMenu = new JMenu(entry.getKey()); + List assocLinks = new ArrayList<>(links); + int assocLinkState = newDiagram.isHidden(assocLinks); + if (assocLinkState == 1 || assocLinkState == 2) { + assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); + } + if (assocLinkState == 0 || assocLinkState == 2) { + assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); + } assocMenu.addSeparator(); - for (MLink link : links) { - assocMenu.add(buildMenuItem(formatLinkLabel("Show", link), ev -> { - newDiagram.showLink(link); - newDiagram.repaint(); - })); - assocMenu.add(buildMenuItem(formatLinkLabel("Hide", link), ev -> { - newDiagram.hideLink(link); - newDiagram.repaint(); - })); + List sortedLinks = new ArrayList<>(links); + sortedLinks.sort(linkComparator()); + for (MLink link : sortedLinks) { + if (newDiagram.isHidden(link)) { + assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); + } else { + assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); + } } menu.add(assocMenu); } return menu; } + private TreeMap> mapLinksToKindOfAssociation(NewObjectDiagramPresenter presenter) { + TreeMap> assocs = new TreeMap<>(); + Collection associations = presenter.fetchAllAssociations(); + if (associations == null) { + return assocs; + } + + final String derrivedLinks = "Derived links"; + final String associationClass = "Association class links"; + final String nAryLinks = "N-ary links"; + final String reflexivLinks = "Reflexive links"; + final String binaryLinks = "Binary links"; + final String aggregation = "Aggregation links"; + final String compositon = "Composition links"; + + for (MAssociation assoc : associations) { + if (assoc == null) { + continue; + } + Set links = presenter.fetchLinksOfAssociation(assoc); + if (links == null || links.isEmpty()) { + continue; + } + + switch (assoc.aggregationKind()) { + case 0: + for (MLink link : links) { + if (link.association().isDerived() || link.association().isUnion()) { + assocs.computeIfAbsent(derrivedLinks, k -> new ArrayList<>()).add(link); + } else if (link.association() instanceof MAssociationClassImpl) { + assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); + } else if (link.linkEnds().size() > 2) { + assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); + } else if (link.association().associatedClasses().size() == 1) { + assocs.computeIfAbsent(reflexivLinks, k -> new ArrayList<>()).add(link); + } else if (link.linkedObjects().size() == 2 + && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { + assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); + } + } + break; + case 1: + for (MLink link : links) { + assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(link); + } + break; + case 2: + for (MLink link : links) { + assocs.computeIfAbsent(compositon, k -> new ArrayList<>()).add(link); + } + break; + default: + break; + } + } + return assocs; + } + private String formatLinkLabel(String prefix, MLink link) { return prefix + " " + link.toString(); } - private JMenuItem buildProtocolStateMachineItem(NewObjectDiagramPresenter presenter) { - return buildMenuItem("Show protocol state machine...", ev -> presenter.onStatusMessage("Protocol state machine view not implemented yet.")); + private String formatLinkName(MLink link) { + if (link == null) { + return "()"; + } + StringBuilder label = new StringBuilder("("); + if (link.association().associatedClasses().size() == 1) { + label.append(link.getLinkEnd(0).associationEnd().nameAsRolename()).append(":"); + } + label.append(link.linkedObjects().get(0).toString()); + if (link.getLinkEnd(0).hasQualifiers()) { + label.append(",").append(link.getLinkEnd(0).getQualifierValues()); + } + label.append(", "); + if (link.association().associatedClasses().size() == 1) { + label.append(link.getLinkEnd(1).associationEnd().nameAsRolename()).append(":"); + } + label.append(link.linkedObjects().get(1).toString()); + if (link.getLinkEnd(1).hasQualifiers()) { + label.append(",").append(link.getLinkEnd(1).getQualifierValues()); + } + label.append(")"); + return label.toString(); + } + + private List collectUniqueLinks(Set edges) { + List links = new ArrayList<>(); + for (EdgeBase edge : edges) { + if (edge instanceof org.tzi.use.gui.views.diagrams.elements.edges.LinkEdge aEdge) { + MLink link = aEdge.getLink(); + if (!links.contains(link)) { + links.add(link); + } + } + } + return links; + } + + private Map> groupLinksByAssociation(List links) { + Map> grouped = new TreeMap<>(); + for (MLink link : links) { + grouped.computeIfAbsent(link.association().toString(), key -> new ArrayList<>()).add(link); + } + return grouped; + } + + private Comparator linkComparator() { + return Comparator + .comparing((MLink link) -> link.linkedObjects().get(0).toString(), new org.tzi.use.gui.util.AlphanumComparator()) + .thenComparing(link -> link.linkedObjects().get(1).toString(), new org.tzi.use.gui.util.AlphanumComparator()); + } + + private JMenu buildProtocolStateMachineMenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { + JMenu menu = new JMenu("Show protocol state machine..."); + menu.setEnabled(false); + + if (presenter == null || selectedObjects == null || selectedObjects.size() != 1) { + return menu; + } + + MObject obj = selectedObjects.iterator().next(); + List sortedPSMs = new LinkedList<>(presenter.fetchProtocolStateMachines(obj)); + sortedPSMs.removeIf(Objects::isNull); + sortedPSMs.sort(new MNamedElementComparator()); + + for (MProtocolStateMachine psm : sortedPSMs) { + menu.setEnabled(true); + final JMenuItem showGivenPSM = new JMenuItem(psm.name()); + showGivenPSM.addActionListener(ev -> presenter.onShowProtocolStateMachine(psm, obj)); + menu.add(showGivenPSM); + } + + return menu; } - private JMenuItem buildCommentNode(NewObjectDiagramPresenter presenter) { - return buildMenuItem("Add comment node", ev -> presenter.onStatusMessage("Add comment node not implemented in presenter menu")); + private JMenuItem buildCommentNode(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Point popupPosition) { + return buildMenuItem("Add comment node", ev -> { + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + if (presenter != null) { + presenter.onStatusMessage("Add comment node requires the object diagram."); + } + return; + } + + Point position = popupPosition != null ? popupPosition : new Point(); + CommentNode commentNode = new CommentNode(position.x, position.y, newDiagram); + newDiagram.getGraph().add(commentNode); + newDiagram.invalidateContent(true); + }); } private JMenuItem buildShowStatesToggle(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { @@ -431,6 +844,21 @@ private int[] radixConversion(int value, int radix, int length) { return digits; } + private List> castQualifiers(List qualifiers) { + if (qualifiers == null) { + return null; + } + List> casted = new ArrayList<>(qualifiers.size()); + for (Object qualifier : qualifiers) { + if (qualifier instanceof List list) { + casted.add(list); + } else { + casted.add(List.of()); + } + } + return casted; + } + private boolean isCompleteObjectCombination(int[] digits, int m) { boolean[] used = new boolean[m]; int usedCount = 0; @@ -443,20 +871,5 @@ private boolean isCompleteObjectCombination(int[] digits, int m) { return usedCount == m; } - private MLink findMatchingLink(MObject[] tuple, Collection associationLinks) { - outerLinks: for (MLink link : associationLinks) { - List linkObjects = link.linkedObjects(); - if (linkObjects == null || linkObjects.size() != tuple.length) { - continue; - } - for (int idx = 0; idx < tuple.length; idx++) { - if (linkObjects.get(idx) != tuple[idx]) { - continue outerLinks; - } - } - return link; - } - return null; - } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java new file mode 100644 index 000000000..e69de29bb diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index c23eb0556..c21cfef2c 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -878,6 +878,22 @@ public void updateObject(MInstance obj) { }); } + /** Clears the current node and edge selection. */ + public void clearSelection() { + if (model != null) { + model.replaceSelection(Set.of(), Set.of()); + applySelectionFromModel(); + } + fNodeSelection.clear(); + fEdgeSelection.clear(); + invalidateContent(true); + } + + public ObjectSelection getObjectSelection() { + return fSelection; + } + + /** * Adds a new Link to the objectdiagram. */ @@ -1008,7 +1024,7 @@ protected PopupMenuInfo unionOfPopUpMenu() { } } - presenter.onPopupMenuPrepared(popupMenu, selectedObjects, selectedLinks, selectedObjectsOfAssociation); + presenter.onPopupMenuPrepared(popupMenu, popupInfo.position, selectedObjects, selectedLinks, selectedObjectsOfAssociation); presenter.onStatusMessage("Object diagram context menu opened"); return popupInfo; } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java index 761cf8868..ade29ba09 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java @@ -10,10 +10,12 @@ import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.mm.MAssociation; import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; import org.tzi.use.gui.util.PersistHelper; import org.tzi.use.uml.sys.MSystem; import org.w3c.dom.Element; -import javax.swing.*; +import javax.swing.JPopupMenu; +import java.awt.Point; import java.util.Collection; import java.util.List; import java.util.Set; @@ -39,11 +41,14 @@ default void onLinkInserted(LinkInsertedEvent e) {} default void onLinkDeleted(LinkDeletedEvent e) {} default void onPopupMenuPrepared(JPopupMenu menu, + Point popupPosition, Set selectedObjects, Set selectedLinks, Set selectedAssocObjects) {} default void onStatusMessage(String status) {} + default void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set selectedObjects) {} + default void onInsertLink(MAssociation association, List participants) {} default void onDeleteLink(MLink link) {} default void onDeleteObjects(Set objects) {} @@ -57,9 +62,15 @@ default void onDragSelectionMoved(int dx, int dy) {} /** Show properties for the given object. */ default void onShowObjectProperties(MObject object) {} + /** Open the protocol state machine view for the given instance. */ + default void onShowProtocolStateMachine(MProtocolStateMachine stateMachine, MObject instance) {} + /** Fetch links of an association from the model/state. */ default Set fetchLinksOfAssociation(MAssociation association) { return Set.of(); } + /** Fetch protocol state machines available for the given object. */ + default Set fetchProtocolStateMachines(MObject object) { return Set.of(); } + /** Fetch all objects of the given class from the state. */ default Set fetchObjectsOfClass(MClass cls) { return Set.of(); } @@ -67,6 +78,7 @@ default void onShowObjectProperties(MObject object) {} default Collection fetchAllAssociations() { return Set.of(); } default void onHideLinks(Collection links) {} + default void onShowLinks(Collection links) {} default void onHideObjects(Collection objects) {} default void onHideAllLinks() {} default void onShowAllLinks() {} @@ -86,5 +98,4 @@ default Set onRestoreLayout(PersistHelper helper, /** Lifecycle hook to release resources (e.g., event bus). */ default void detach() {} - } - +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java index 956c14e43..4161a095e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java @@ -1,6 +1,8 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; import org.tzi.use.uml.ocl.value.Value; +import org.tzi.use.uml.sys.events.ObjectCreatedEvent; +import org.tzi.use.uml.sys.events.ObjectDestroyedEvent; import org.tzi.use.uml.sys.events.AttributeAssignedEvent; import org.tzi.use.uml.sys.events.LinkDeletedEvent; import org.tzi.use.uml.sys.events.LinkInsertedEvent; @@ -14,6 +16,7 @@ import com.google.common.eventbus.Subscribe; import javax.swing.JPopupMenu; +import java.awt.Point; import java.util.Collection; import java.util.Set; import java.util.List; @@ -115,8 +118,15 @@ private void refreshDiagram(boolean fullLayout) { } } - @Override @Subscribe + public void onObjectCreated(ObjectCreatedEvent e) { + if (e == null) { + return; + } + onObjectCreated(e.getCreatedObject()); + } + + @Override public void onObjectCreated(MObject obj) { if (diagram == null || obj == null || obj instanceof MLink) { return; @@ -125,8 +135,15 @@ public void onObjectCreated(MObject obj) { refreshDiagram(true); } - @Override @Subscribe + public void onObjectDestroyed(ObjectDestroyedEvent e) { + if (e == null) { + return; + } + onObjectDestroyed(e.getDestroyedObject()); + } + + @Override public void onObjectDestroyed(MObject obj) { if (diagram == null || obj == null || obj instanceof MLink) { return; @@ -181,11 +198,12 @@ public void onLinkDeleted(LinkDeletedEvent e) { @Override public void onPopupMenuPrepared(JPopupMenu menu, + Point popupPosition, Set selectedObjects, Set selectedLinks, Set selectedAssocObjects) { if (contextMenuProvider != null && menu != null) { - contextMenuProvider.enhanceMenu(menu, diagram, this, + contextMenuProvider.enhanceMenu(menu, diagram, this, popupPosition, selectedObjects, selectedLinks, selectedAssocObjects); } } @@ -197,6 +215,18 @@ public void onStatusMessage(String status) { } } + @Override + public void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set selectedObjects) { + if (builder == null) { + return; + } + if (selectedObjects != null && !selectedObjects.isEmpty()) { + builder.addSelectedObjectPathView(selectedObjects); + } + builder.addSelectionWithOCLViewAction(); + builder.addSelectionObjectView(); + } + @Override public void onInsertLink(MAssociation association, List participants) { if (applicationController != null) { @@ -213,6 +243,9 @@ public void onDeleteLink(MLink link) { } else if (view instanceof NewObjectDiagramView v) { v.deleteLink(link); } + if (diagram != null) { + diagram.clearSelection(); + } } @Override @@ -222,6 +255,9 @@ public void onDeleteObjects(Set objects) { } else if (view instanceof NewObjectDiagramView v) { v.deleteObjects(objects); } + if (diagram != null) { + diagram.clearSelection(); + } } @Override @@ -264,6 +300,17 @@ public void onHideLinks(Collection links) { refreshDiagram(true); } + @Override + public void onShowLinks(Collection links) { + if (diagram == null || links == null) { + return; + } + if (diagram instanceof NewObjectDiagram newDiagram) { + newDiagram.showLink(new java.util.ArrayList<>(links)); + refreshDiagram(true); + } + } + @Override public void onHideObjects(Collection objects) { if (diagram == null || objects == null) { diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java index de53e4671..cbeb6e9be 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramInteractor.java @@ -3,6 +3,7 @@ import org.tzi.use.uml.sys.MInstance; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MObject; +import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; /** * Facade for diagram operations that the presenter can trigger without reaching @@ -15,6 +16,8 @@ public interface ObjectDiagramInteractor { void deleteLink(MLink link); void updateObject(MInstance obj); void invalidateContent(boolean fullLayout); + void clearSelection(); + ObjectSelection getObjectSelection(); void hideLink(MLink link); void hideObject(MObject obj); void hideAllLinks(); diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java new file mode 100644 index 000000000..f72370484 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java @@ -0,0 +1,146 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.nio.file.StandardOpenOption; + +/** + * Simple file logger used for collecting presenter/view event traces per test case. + *

+ * Usage: set system property TEST_NAME to separate logs per test, e.g. + * -DTEST_NAME=t01 + * or set environment variable TEST_NAME before starting the application. + * Default test name is "default". + */ +public final class PresenterFileLogger { + // store logs in a user-writable directory under the user's home so they are easy to find + private static final Path LOG_DIR = Paths.get(System.getProperty("user.home"), "use_refactor_logs"); + // also write a copy to the current working directory to make logs visible in the project tree + private static final Path WORK_DIR_LOG = Paths.get(System.getProperty("user.dir"), "use_refactor_logs"); + + private static volatile String currentTest = System.getProperty("TEST_NAME", System.getenv().getOrDefault("TEST_NAME", "default")); + private static final DateTimeFormatter TS_FORMAT = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()); + + static { + // Best-effort: create directories and write an initialization line into the test log. + try { + Files.createDirectories(LOG_DIR); + Files.createDirectories(WORK_DIR_LOG); + // write an init line into the current test log file (no stdout/stderr) using structured format + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#init] initialized test=" + currentTest + System.lineSeparator(); + try { + Path p = LOG_DIR.resolve(currentTest + ".log"); + Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore — best-effort + } + try { + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } catch (IOException ignored) { + // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr + } + } + + private PresenterFileLogger() { + // utility + } + + public static synchronized void setCurrentTest(String testName) { + if (testName == null || testName.isEmpty()) { + testName = "default"; + } + currentTest = testName; + try { + // Ensure both directories exist when changing the test name so subsequent writes succeed + Files.createDirectories(LOG_DIR); + Files.createDirectories(WORK_DIR_LOG); + // write an init line into the new current test log file (best-effort, no stdout/stderr) + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#setCurrentTest] switched test=" + currentTest + System.lineSeparator(); + try { + Path p = LOG_DIR.resolve(currentTest + ".log"); + Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore — best-effort + } + try { + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } catch (IOException ignored) { + // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr + } + } + + // Core write helper (best-effort) + private static void writeLineToFiles(String line) { + String fileName = currentTest + ".log"; + Path p = LOG_DIR.resolve(fileName); + Path pWork = WORK_DIR_LOG.resolve(fileName); + try { + // ensure directories exist (in case setCurrentTest wasn't called since class init) + Files.createDirectories(LOG_DIR); + } catch (IOException ignored) { + // ignore + } + try { + Files.createDirectories(WORK_DIR_LOG); + } catch (IOException ignored) { + // ignore + } + try { + Files.writeString(p, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + try { + Files.writeString(pWork, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } + + /** + * Structured log entry: className and methodName are required to identify the call site. + */ + public static synchronized void log(String className, String methodName, String message) { + if (className == null) className = ""; + if (methodName == null) methodName = ""; + if (message == null) message = ""; + String ts = TS_FORMAT.format(Instant.now()); + String line = ts + " [" + className + "#" + methodName + "] " + message + System.lineSeparator(); + writeLineToFiles(line); + } + + /** + * Convenience overload accepting a Class object. + */ + public static synchronized void log(Class cls, String methodName, String message) { + String className = (cls == null) ? "" : cls.getSimpleName(); + log(className, methodName, message); + } + + /** + * Backwards-compatible single-string log; maps to GLOBAL#log for traceability. + */ + public static synchronized void log(String message) { + log("GLOBAL", "log", message); + } + + public static synchronized void log(String testName, String message) { + setCurrentTest(testName); + log(message); + } +} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java new file mode 100644 index 000000000..40459ba6d --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java @@ -0,0 +1,20 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +/** + * Small test runner to validate PresenterFileLogger behaviour at runtime. + */ +public class PresenterFileLoggerTestMain { + public static void main(String[] args) { + // write a few entries using different overloads + PresenterFileLogger.log("Startup test: should appear in default.log"); + PresenterFileLogger.log(PresenterFileLoggerTestMain.class, "main", "class-based entry"); + + // switch test name and write more + PresenterFileLogger.setCurrentTest("t_test_manual"); + PresenterFileLogger.log("afterSwitch", "main", "entry after switching test name"); + PresenterFileLogger.log("t_test_manual", "explicit-message-after-switch"); + + System.out.println("PresenterFileLoggerTestMain finished — check use_refactor_logs in user home and working dir."); + } +} + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java new file mode 100644 index 000000000..e624d2201 --- /dev/null +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java @@ -0,0 +1,16 @@ +package org.tzi.use.gui.views.diagrams.objectdiagram; + +import org.tzi.use.uml.sys.MObject; + +import java.util.Set; + +/** + * Package-local helper used by the presenter hook to contribute the + * Show/hide/crop submenu entries without exposing Swing types to the interface. + */ +public interface ShowHideCropMenuBuilder { + void addSelectedObjectPathView(Set selectedObjects); + void addSelectionWithOCLViewAction(); + void addSelectionObjectView(); +} + diff --git a/use-gui/src/main/resources/images/_image_licenses.txt b/use-gui/src/main/resources/images/_image_licenses.txt deleted file mode 100644 index 640b8a908..000000000 --- a/use-gui/src/main/resources/images/_image_licenses.txt +++ /dev/null @@ -1,20 +0,0 @@ -Image sources and licenses: - -Image name | Author | License | Source -------------------------------------------------------------------------------------------------------------------------- -export_pdf.png | AMAZIGH Aneglus | GNU/GPL | http://findicons.com/icon/188108/stock_save_pdf?id=189458# -invariant-view.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -document-open.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 -document-print.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 -save.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 -undo.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 -redo.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 -line-chart.png | Oxygen Team | GNU/LGPL | http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-office-chart-line-icon.html -blue-chart-icon.png | Double-J Design | CC Attribution 3.0 | http://www.iconarchive.com/show/origami-colored-pencil-icons-by-double-j-design/blue-chart-icon.html -red-chart-icon.png | Double-J Design | CC Attribution 3.0 | http://www.iconarchive.com/show/origami-colored-pencil-icons-by-double-j-design/red-chart-icon.html -shape-align-left-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -shape-align-right-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -shape-align-center-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -shape-align-top-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -shape-align-middle-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons -shape-align-bottom-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons From b1c9a99c42dedd2647e1d23eacdd6df2bf47eb4a Mon Sep 17 00:00:00 2001 From: ahmed Date: Tue, 7 Apr 2026 00:24:14 +0200 Subject: [PATCH 28/34] - Cleaned Branch - Further Refinements and Logging added --- .../DefaultContextMenuProvider.java | 784 ++++++++++++++++-- .../diagrams/objectdiagram/MenuEntry.java | 0 .../NewObjectDiagramPresenterImpl.java | 501 ++++++++++- .../objectdiagram/PresenterFileLogger.java | 177 +++- 4 files changed, 1385 insertions(+), 77 deletions(-) delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index 948ab5b52..df5c2ab5c 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -1,875 +1,1559 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; +import org.tzi.use.gui.views.diagrams.ObjectNodeActivity; import org.tzi.use.gui.views.diagrams.elements.CommentNode; import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; +import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; import org.tzi.use.gui.views.diagrams.util.MenuScroller; -import org.tzi.use.gui.views.diagrams.ObjectNodeActivity; -import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MAssociationEnd; -import org.tzi.use.uml.mm.MAssociationClassImpl; -import org.tzi.use.uml.mm.MClass; -import org.tzi.use.uml.mm.MNamedElementComparator; +import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; +import org.tzi.use.uml.mm.*; import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MObject; -import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; import org.tzi.use.util.collections.CollectionUtil; -import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; import javax.swing.*; -import java.awt.Component; -import java.awt.Point; +import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.util.*; +import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; public class DefaultContextMenuProvider implements ContextMenuProvider { @Override + public void enhanceMenu(JPopupMenu popupMenu, + ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Point popupPosition, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects) { + if (popupMenu == null || presenter == null) { + return; + } List baseItems = new ArrayList<>(Arrays.asList(popupMenu.getComponents())); + popupMenu.removeAll(); Set safeObjects = selectedObjects == null ? Set.of() : selectedObjects; + Set safeLinks = selectedLinks == null ? Set.of() : selectedLinks; + Set safeAssocObjects = selectedAssocObjects == null ? Set.of() : selectedAssocObjects; + boolean hasSelectedObjects = !safeObjects.isEmpty(); + boolean hasSelectedLinks = !safeLinks.isEmpty(); + boolean blankCanvas = !hasSelectedObjects && !hasSelectedLinks && safeAssocObjects.isEmpty(); + List ordered = new ArrayList<>(); + if (diagram instanceof NewObjectDiagram newDiagram + + && hasHiddenElements(newDiagram) + + && (blankCanvas || hasSelectedLinks)) { + + addComponent(ordered, buildMenuItem("Show Hidden Elements", ev -> presenter.onShowHiddenElements())); + + } + if (hasSelectedObjects) { + addComponent(ordered, buildEditPropertiesItem(presenter, safeObjects)); + addComponent(ordered, buildDestroyItem(presenter, safeObjects)); + addSeparator(ordered); + } if (hasSelectedObjects) { + addComponents(ordered, buildInsertItems(presenter, safeObjects)); + addSeparator(ordered); + } if (hasSelectedObjects) { + addComponent(ordered, buildHideSelectedItem(presenter, safeObjects)); + addComponent(ordered, buildCropSelectedItem(presenter, safeObjects)); - addComponent(ordered, buildGreyOutItem(presenter, safeObjects)); + + addComponent(ordered, buildGreyOutItem(diagram, presenter, safeObjects)); + addSeparator(ordered); + } if (hasSelectedLinks) { + addComponent(ordered, buildHideSelectedLinksItem(diagram, presenter, safeLinks)); + addComponent(ordered, buildCropSelectedLinksItem(diagram, presenter, safeLinks, safeAssocObjects)); + addSeparator(ordered); + } addComponent(ordered, buildShowHideCropMenu(diagram, presenter, safeObjects)); + addComponent(ordered, buildHideObjectsMenu(diagram, presenter)); + addComponent(ordered, buildHideLinksMenu(diagram, presenter)); + addComponent(ordered, buildShowObjectsMenu(diagram, presenter)); + addComponent(ordered, buildShowLinksMenu(diagram, presenter)); + addSeparator(ordered); + addComponent(ordered, buildLinksByKindMenu(diagram, presenter)); - addSeparator(ordered); - addComponent(ordered, buildProtocolStateMachineMenu(presenter, safeObjects)); addSeparator(ordered); + if (hasSelectedObjects && safeObjects.size() == 1 && !hasSelectedLinks) { + + addComponent(ordered, buildProtocolStateMachineMenu(presenter, safeObjects)); + + addSeparator(ordered); + + } + addComponent(ordered, buildCommentNode(diagram, presenter, popupPosition)); + addSeparator(ordered); addComponent(ordered, extractOrFallback(baseItems, "Show attributes", () -> buildStatusItem("Show attributes", presenter))); + addComponent(ordered, buildShowStatesToggle(diagram, presenter)); + addComponent(ordered, extractOrFallback(baseItems, "Show association names", () -> buildStatusItem("Show association names", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show role names", () -> buildStatusItem("Show role names", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Align elements", () -> new JMenu("Align elements"))); + addComponent(ordered, extractOrFallback(baseItems, "Anti-aliasing", () -> buildStatusItem("Anti-aliasing", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show grid", () -> buildStatusItem("Show grid", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Grayscale view", () -> buildStatusItem("Grayscale view", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Auto-Layout", () -> buildStatusItem("Auto-Layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Layouts", () -> new JMenu("Layouts"))); + addComponent(ordered, extractOrFallback(baseItems, "Reset layout", () -> buildStatusItem("Reset layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Load layout...", () -> buildStatusItem("Load layout...", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Save layout...", () -> buildStatusItem("Save layout...", presenter))); - addSeparator(ordered); - addComponent(ordered, extractOrFallback(baseItems, "Select all nodes", () -> buildStatusItem("Select all nodes", presenter))); - addComponent(ordered, extractOrFallback(baseItems, "Select all edges", () -> buildStatusItem("Select all edges", presenter))); + + if (diagram instanceof NewObjectDiagram newDiagram && newDiagram.getVisibleData() != null + + && newDiagram.getVisibleData().hasNodes()) { + + addSeparator(ordered); + + addComponent(ordered, extractOrFallback(baseItems, "Select all nodes", () -> buildStatusItem("Select all nodes", presenter))); + + addComponent(ordered, extractOrFallback(baseItems, "Select all edges", () -> buildStatusItem("Select all edges", presenter))); + + } ordered.stream().filter(Objects::nonNull).forEach(popupMenu::add); + } private void addComponent(List target, Component component) { + if (component != null) { + target.add(component); + } + } private void addComponents(List target, List components) { + components.stream().filter(Objects::nonNull).forEach(target::add); + } private void addSeparator(List target) { + if (target.isEmpty() || target.getLast() instanceof JSeparator) { + return; + } + target.add(new JSeparator()); + } private Component extractOrFallback(List baseItems, String text, Supplier fallback) { + Component extracted = takeAndRemove(baseItems, text); + if (extracted != null) { + return extracted; + } + return fallback == null ? null : fallback.get(); + } private Component takeAndRemove(List components, String text) { + for (Iterator it = components.iterator(); it.hasNext(); ) { + Component candidate = it.next(); + if (candidate instanceof JMenuItem item && text.equals(item.getText())) { + it.remove(); + return item; + } + if (candidate instanceof JMenu menu && text.equals(menu.getText())) { + it.remove(); + return menu; + } + } + return null; + } private JMenuItem buildEditPropertiesItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + MObject first = selectedObjects == null || selectedObjects.isEmpty() ? null : selectedObjects.iterator().next(); + return buildMenuItem("Edit properties of '" + safeName(first) + "'", ev -> { + if (first == null) { + presenter.onStatusMessage("Select an object to edit its properties."); + } else { + presenter.onShowObjectProperties(first); + } + }); + } private JMenuItem buildDestroyItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + MObject first = selectedObjects == null || selectedObjects.isEmpty() ? null : selectedObjects.iterator().next(); + return buildMenuItem("Destroy '" + safeName(first) + "'", ev -> { + if (selectedObjects == null || selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select at least one object to destroy."); + } else { + presenter.onDeleteObjects(selectedObjects); + } + }); + } private List buildInsertItems(NewObjectDiagramPresenter presenter, Set selectedObjects) { + List items = new ArrayList<>(); + if (presenter == null) { + return items; + } Collection assocCollection = presenter.fetchAllAssociations(); + List associations = assocCollection == null ? new ArrayList<>() : new ArrayList<>(assocCollection); + associations.removeIf(Objects::isNull); + associations.sort(Comparator.comparing( + MAssociation::name, + Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); if (selectedObjects == null || selectedObjects.isEmpty() || associations.isEmpty()) { + return items; + } List selList = new ArrayList<>(selectedObjects); + selList.removeIf(Objects::isNull); + selList.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); + int m = selList.size(); + if (m == 0) { + return items; + } for (MAssociation assoc : associations) { + if (assoc == null || assoc.isReadOnly()) { + continue; + } List ends = assoc.associationEnds(); + int n = ends == null ? 0 : ends.size(); + if (n == 0) { + continue; + } Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); + if (associationLinks == null) { + associationLinks = List.of(); + } int pow = 1; + for (int i = 0; i < n; i++) { + pow *= m; + } for (int value = 0; value < pow; value++) { + int[] digits = radixConversion(value, m, n); + if (!isCompleteObjectCombination(digits, m)) { + continue; + } MObject[] tuple = new MObject[n]; + MClass[] types = new MClass[n]; + for (int idx = 0; idx < n; idx++) { + tuple[idx] = selList.get(digits[idx]); + types[idx] = tuple[idx].cls(); + } + if (!assoc.isAssignableFrom(types)) { + continue; + } StringBuilder joined = new StringBuilder(); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + joined.append(','); + } + joined.append(safeName(tuple[idx])); + } List matchingLinks = new ArrayList<>(); + for (MLink link : associationLinks) { + List linkObjects = link.linkedObjects(); + if (linkObjects == null || linkObjects.size() != tuple.length) { + continue; + } boolean sameTuple = true; + for (int idx = 0; idx < tuple.length; idx++) { + if (linkObjects.get(idx) != tuple[idx]) { + sameTuple = false; + break; + } + } if (sameTuple) { + matchingLinks.add(link); + } + } if (matchingLinks.isEmpty()) { + List tupleList = Arrays.asList(tuple.clone()); + items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), + ev -> presenter.onInsertLink(assoc, tupleList))); + } else { + for (MLink link : matchingLinks) { + StringBuilder deleteLabel = new StringBuilder("delete ("); + List> qualifiers = castQualifiers(link.getQualifier()); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + deleteLabel.append(','); + } + deleteLabel.append(safeName(tuple[idx])); + if (qualifiers != null && idx < qualifiers.size()) { + List qualifierForEnd = qualifiers.get(idx); + if (qualifierForEnd != null && !qualifierForEnd.isEmpty()) { + deleteLabel.append('{'); + for (int q = 0; q < qualifierForEnd.size(); q++) { + if (q > 0) { + deleteLabel.append(','); + } + deleteLabel.append(qualifierForEnd.get(q)); + } + deleteLabel.append('}'); + } + } + } + deleteLabel.append(") from ").append(assoc.name()); + items.add(buildMenuItem(deleteLabel.toString(), ev -> presenter.onDeleteLink(link))); + } + } + } + } return items; + } private JMenuItem buildHideSelectedItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Hide " + describeSelection(selectedObjects), + ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs))); + } private JMenuItem buildCropSelectedItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { + return buildMenuItem("Crop " + describeSelection(selectedObjects), ev -> { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select objects before cropping."); + } else { + presenter.onCropSelection(new HashSet<>(selectedObjects)); + } + }); + } - private JMenuItem buildGreyOutItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { - return buildMenuItem("Grey out " + describeSelection(selectedObjects), - ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onGrayOut(objs))); + private JMenuItem buildGreyOutItem(ObjectDiagramInteractor diagram, + + NewObjectDiagramPresenter presenter, + + Set selectedObjects) { + + boolean allGreyed = areAllSelectedObjectsGreyed(diagram, selectedObjects); + + String label = (allGreyed ? "Grey in " : "Grey out ") + describeSelection(selectedObjects); + + return buildMenuItem(label, ev -> hideOrWarn(presenter, selectedObjects, + + objs -> { + + if (areAllSelectedObjectsGreyed(diagram, objs)) { + + presenter.onGrayIn(objs); + + } else { + + presenter.onGrayOut(objs); + + } + + })); + } private JMenu buildHideObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Hide objects"); + MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return menu; + } Set visibleObjects = new LinkedHashSet<>(newDiagram.getVisibleData().getObjectToNodeMap().keySet()); + if (visibleObjects.isEmpty()) { + return null; + } JMenuItem hideAllObjects = new JMenuItem("Hide all objects"); + hideAllObjects.setEnabled(!visibleObjects.isEmpty()); + hideAllObjects.addActionListener(ev -> presenter.onHideObjects(new LinkedHashSet<>(visibleObjects))); + menu.add(hideAllObjects); + menu.addSeparator(); Map> objectsByClass = new HashMap<>(); + for (MObject obj : visibleObjects) { + objectsByClass.computeIfAbsent(obj.cls(), key -> new ArrayList<>()).add(obj); + } List classes = new ArrayList<>(objectsByClass.keySet()); + classes.sort(new MNamedElementComparator()); for (MClass cls : classes) { + JMenu classMenu = new JMenu("Class " + cls.name()); + MenuScroller.setScrollerFor(classMenu, 15, 125, 0, 0); List classObjects = new ArrayList<>(objectsByClass.getOrDefault(cls, List.of())); + classObjects.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); JMenuItem hideClassAll = new JMenuItem("Hide all"); + hideClassAll.addActionListener(ev -> presenter.onHideObjects(new LinkedHashSet<>(classObjects))); + classMenu.add(hideClassAll); + classMenu.addSeparator(); for (MObject obj : classObjects) { + classMenu.add(buildMenuItem("Hide " + obj.name(), ev -> presenter.onHideObjects(Set.of(obj)))); + } menu.add(classMenu); + } return menu; + } private JMenu buildHideLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Hide links"); + MenuScroller.setScrollerFor(menu, 20, 125, 0, 0); if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } List links = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getVisibleData().getEdges())); + if (links.isEmpty()) { + return null; + } JMenuItem hideAllLinks = new JMenuItem("Hide all links"); + hideAllLinks.setEnabled(!newDiagram.getVisibleData().getEdges().isEmpty()); + hideAllLinks.addActionListener(ev -> presenter.onHideAllLinks()); + menu.add(hideAllLinks); + menu.addSeparator(); Map> grouped = groupLinksByAssociation(links); + for (Map.Entry> entry : grouped.entrySet()) { + JMenu assocMenu = new JMenu(entry.getKey()); + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = entry.getValue(); + assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); + assocMenu.addSeparator(); + assocLinks.sort(linkComparator()); + for (MLink link : assocLinks) { + assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); + } + menu.add(assocMenu); + } + return menu; + } private JMenu buildShowLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show links"); + MenuScroller.setScrollerFor(menu, 20, 125, 0, 0); if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } List links = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getHiddenData().getEdges())); + if (links.isEmpty()) { + return null; + } JMenuItem showAllLinks = new JMenuItem("Show all links"); + showAllLinks.setEnabled(!newDiagram.getHiddenData().getEdges().isEmpty()); + showAllLinks.addActionListener(ev -> presenter.onShowAllLinks()); + menu.add(showAllLinks); + menu.addSeparator(); Map> grouped = groupLinksByAssociation(links); + for (Map.Entry> entry : grouped.entrySet()) { + JMenu assocMenu = new JMenu(entry.getKey()); + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = entry.getValue(); + assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); + assocMenu.addSeparator(); + assocLinks.sort(linkComparator()); + for (MLink link : assocLinks) { + assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); + } + menu.add(assocMenu); + } return menu; + } private JMenu buildShowObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show objects"); + MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); if (!(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } Set hiddenNodes = newDiagram.getHiddenNodes(); + Set hiddenObjectNodes = CollectionUtil.filterByType(hiddenNodes, ObjectNodeActivity.class); + if (hiddenObjectNodes.isEmpty()) { + return null; + } JMenuItem showAllObjects = new JMenuItem("Show all hidden objects"); + showAllObjects.setEnabled(true); + showAllObjects.addActionListener(ev -> presenter.onShowHiddenElements()); + menu.add(showAllObjects); + menu.addSeparator(); TreeSet sortedNodes = new TreeSet<>(Comparator.comparing((ObjectNodeActivity n) -> n.object().name(), new org.tzi.use.gui.util.AlphanumComparator())); + sortedNodes.addAll(hiddenObjectNodes); Map classMenus = new HashMap<>(); + for (ObjectNodeActivity node : sortedNodes) { + MClass cls = node.cls(); + MObject obj = node.object(); if (!classMenus.containsKey(cls)) { + JMenu subm = new JMenu("Class " + cls.name()); + MenuScroller.setScrollerFor(subm, 15, 125, 0, 0); + classMenus.put(cls, subm); JMenuItem showAll = new JMenuItem("Show all"); + showAll.addActionListener(e -> presenter.onShowHiddenElements()); + subm.add(showAll); + subm.addSeparator(); + } JMenu parent = classMenus.get(cls); + parent.add(buildMenuItem("Show " + obj.name(), ev -> presenter.onShowHiddenElements())); + } List classes = new ArrayList<>(classMenus.keySet()); + classes.sort(new MNamedElementComparator()); + for (MClass cls : classes) { + menu.add(classMenus.get(cls)); + } return menu; + } private JMenu buildShowHideCropMenu(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedObjects) { + JMenu menu = new JMenu("Show/hide/crop objects"); + if (presenter == null) { + return menu; + } ObjectSelection selection = diagram != null ? diagram.getObjectSelection() : null; + presenter.onBuildShowHideCropMenu(new ShowHideCropMenuBuilder() { + @Override + public void addSelectedObjectPathView(Set selectedObjects) { + if (selection != null && selectedObjects != null && !selectedObjects.isEmpty()) { + menu.add(selection.getSelectedObjectPathView("By path length...", selectedObjects)); + } + } @Override + public void addSelectionWithOCLViewAction() { + if (selection != null) { + menu.add(selection.getSelectionWithOCLViewAction()); + } + } @Override + public void addSelectionObjectView() { + if (selection != null) { + menu.add(selection.getSelectionObjectView()); + } + } + }, selectedObjects); + return menu; + } private JMenuItem buildHideSelectedLinksItem(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedLinks) { + List links = sortedSelectedLinks(selectedLinks); + if (presenter == null || links.isEmpty()) { + return null; + } + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + return buildMenuItem("Hide " + label, ev -> presenter.onHideLinks(links)); + } private JMenuItem buildCropSelectedLinksItem(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Set selectedLinks, + Set selectedAssocObjects) { + List links = sortedSelectedLinks(selectedLinks); + if (presenter == null || links.isEmpty() || !(diagram instanceof NewObjectDiagram newDiagram)) { + return null; + } + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + Set keepObjects = selectedAssocObjects == null ? Set.of() : new LinkedHashSet<>(selectedAssocObjects); + return buildMenuItem("Crop " + label, ev -> cropSelectedLinks(presenter, newDiagram, links, keepObjects)); + } private void cropSelectedLinks(NewObjectDiagramPresenter presenter, + NewObjectDiagram newDiagram, + Collection selectedLinks, + Set keepObjects) { + Set selected = new LinkedHashSet<>(selectedLinks); + Set visibleObjects = new LinkedHashSet<>(newDiagram.getVisibleData().getObjectToNodeMap().keySet()); + visibleObjects.removeAll(keepObjects); List visibleLinks = collectUniqueLinks(new LinkedHashSet<>(newDiagram.getVisibleData().getEdges())); + visibleLinks.removeIf(selected::contains); if (!visibleObjects.isEmpty()) { + presenter.onHideObjects(visibleObjects); + } + if (!visibleLinks.isEmpty()) { + presenter.onHideLinks(visibleLinks); + } + } private List sortedSelectedLinks(Set selectedLinks) { + List links = new ArrayList<>(selectedLinks == null ? Set.of() : selectedLinks); + links.removeIf(Objects::isNull); + links.sort(linkComparator()); + return links; + } private JMenu buildLinksByKindMenu(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + JMenu menu = new JMenu("Show/hide links-by-kind"); + if (!(diagram instanceof NewObjectDiagram newDiagram) || presenter == null) { + return null; + } TreeMap> grouped = mapLinksToKindOfAssociation(presenter); + if (grouped.isEmpty()) { + return null; + } MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); + List allLinks = grouped.values().stream().flatMap(Collection::stream).distinct().toList(); + int linkState = newDiagram.isHidden(allLinks); + if (linkState == 1 || linkState == 2) { + menu.add(buildMenuItem("Show all links", ev -> presenter.onShowAllLinks())); + } + if (linkState == 0 || linkState == 2) { + menu.add(buildMenuItem("Hide all links", ev -> presenter.onHideAllLinks())); + } menu.addSeparator(); for (Map.Entry> entry : grouped.entrySet()) { + List links = entry.getValue(); + if (links == null || links.isEmpty()) { + continue; + } JMenu assocMenu = new JMenu(entry.getKey()); + + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = new ArrayList<>(links); + int assocLinkState = newDiagram.isHidden(assocLinks); + if (assocLinkState == 1 || assocLinkState == 2) { + assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); + } + if (assocLinkState == 0 || assocLinkState == 2) { + assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); + } + assocMenu.addSeparator(); + List sortedLinks = new ArrayList<>(links); + sortedLinks.sort(linkComparator()); + for (MLink link : sortedLinks) { + if (newDiagram.isHidden(link)) { + assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); + } else { + assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); + } + } + menu.add(assocMenu); + } + return menu; + } private TreeMap> mapLinksToKindOfAssociation(NewObjectDiagramPresenter presenter) { + TreeMap> assocs = new TreeMap<>(); + Collection associations = presenter.fetchAllAssociations(); + if (associations == null) { + return assocs; + } final String derrivedLinks = "Derived links"; + final String associationClass = "Association class links"; + final String nAryLinks = "N-ary links"; + final String reflexivLinks = "Reflexive links"; + final String binaryLinks = "Binary links"; + final String aggregation = "Aggregation links"; + final String compositon = "Composition links"; for (MAssociation assoc : associations) { + if (assoc == null) { + continue; + } + Set links = presenter.fetchLinksOfAssociation(assoc); + if (links == null || links.isEmpty()) { + continue; + } switch (assoc.aggregationKind()) { - case 0: - for (MLink link : links) { - if (link.association().isDerived() || link.association().isUnion()) { - assocs.computeIfAbsent(derrivedLinks, k -> new ArrayList<>()).add(link); - } else if (link.association() instanceof MAssociationClassImpl) { - assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); - } else if (link.linkEnds().size() > 2) { - assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); - } else if (link.association().associatedClasses().size() == 1) { - assocs.computeIfAbsent(reflexivLinks, k -> new ArrayList<>()).add(link); - } else if (link.linkedObjects().size() == 2 - && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); + + case 0: + + for (MLink link : links) { + + if (link.association().isDerived() || link.association().isUnion()) { + + assocs.computeIfAbsent(derrivedLinks, k -> new ArrayList<>()).add(link); + + } else if (link.association() instanceof MAssociationClassImpl) { + + assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); + + } else if (link.linkEnds().size() > 2) { + + assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); + + } else if (link.association().associatedClasses().size() == 1) { + + assocs.computeIfAbsent(reflexivLinks, k -> new ArrayList<>()).add(link); + + } else if (link.linkedObjects().size() == 2 + + && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { + + assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); + + } + } - } - break; - case 1: - for (MLink link : links) { - assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(link); - } - break; - case 2: - for (MLink link : links) { - assocs.computeIfAbsent(compositon, k -> new ArrayList<>()).add(link); - } - break; - default: - break; + + break; + + case 1: + + for (MLink link : links) { + + assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(link); + + } + + break; + + case 2: + + for (MLink link : links) { + + assocs.computeIfAbsent(compositon, k -> new ArrayList<>()).add(link); + + } + + break; + + default: + + break; + } + } + return assocs; + } private String formatLinkLabel(String prefix, MLink link) { + return prefix + " " + link.toString(); + } private String formatLinkName(MLink link) { + if (link == null) { + return "()"; + } + StringBuilder label = new StringBuilder("("); + if (link.association().associatedClasses().size() == 1) { + label.append(link.getLinkEnd(0).associationEnd().nameAsRolename()).append(":"); + } + label.append(link.linkedObjects().get(0).toString()); + if (link.getLinkEnd(0).hasQualifiers()) { + label.append(",").append(link.getLinkEnd(0).getQualifierValues()); + } + label.append(", "); + if (link.association().associatedClasses().size() == 1) { + label.append(link.getLinkEnd(1).associationEnd().nameAsRolename()).append(":"); + } + label.append(link.linkedObjects().get(1).toString()); + if (link.getLinkEnd(1).hasQualifiers()) { + label.append(",").append(link.getLinkEnd(1).getQualifierValues()); + } + label.append(")"); + return label.toString(); + } private List collectUniqueLinks(Set edges) { + List links = new ArrayList<>(); + for (EdgeBase edge : edges) { + if (edge instanceof org.tzi.use.gui.views.diagrams.elements.edges.LinkEdge aEdge) { + MLink link = aEdge.getLink(); + if (!links.contains(link)) { + links.add(link); + } + } + } + return links; + } private Map> groupLinksByAssociation(List links) { + Map> grouped = new TreeMap<>(); + for (MLink link : links) { + grouped.computeIfAbsent(link.association().toString(), key -> new ArrayList<>()).add(link); + } + return grouped; + } private Comparator linkComparator() { + return Comparator + .comparing((MLink link) -> link.linkedObjects().get(0).toString(), new org.tzi.use.gui.util.AlphanumComparator()) + .thenComparing(link -> link.linkedObjects().get(1).toString(), new org.tzi.use.gui.util.AlphanumComparator()); + } private JMenu buildProtocolStateMachineMenu(NewObjectDiagramPresenter presenter, Set selectedObjects) { + JMenu menu = new JMenu("Show protocol state machine..."); + menu.setEnabled(false); if (presenter == null || selectedObjects == null || selectedObjects.size() != 1) { + return menu; + } MObject obj = selectedObjects.iterator().next(); + List sortedPSMs = new LinkedList<>(presenter.fetchProtocolStateMachines(obj)); + sortedPSMs.removeIf(Objects::isNull); + sortedPSMs.sort(new MNamedElementComparator()); for (MProtocolStateMachine psm : sortedPSMs) { + menu.setEnabled(true); + final JMenuItem showGivenPSM = new JMenuItem(psm.name()); + showGivenPSM.addActionListener(ev -> presenter.onShowProtocolStateMachine(psm, obj)); + menu.add(showGivenPSM); + } return menu; + } private JMenuItem buildCommentNode(ObjectDiagramInteractor diagram, + NewObjectDiagramPresenter presenter, + Point popupPosition) { + return buildMenuItem("Add comment node", ev -> { + if (!(diagram instanceof NewObjectDiagram newDiagram)) { + if (presenter != null) { + presenter.onStatusMessage("Add comment node requires the object diagram."); + } + return; + } Point position = popupPosition != null ? popupPosition : new Point(); + CommentNode commentNode = new CommentNode(position.x, position.y, newDiagram); + newDiagram.getGraph().add(commentNode); + newDiagram.invalidateContent(true); + }); + } private JMenuItem buildShowStatesToggle(ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + boolean initial = diagram != null && diagram.isShowStates(); + JCheckBoxMenuItem item = new JCheckBoxMenuItem("Show states", initial); + item.addItemListener(ev -> { + boolean selected = ev.getStateChange() == ItemEvent.SELECTED; + presenter.onToggleShowStates(selected); + if (diagram != null) { + diagram.setShowStates(selected); + diagram.invalidateContent(true); + } + }); + return item; + } private JMenuItem buildStatusItem(String label, NewObjectDiagramPresenter presenter) { + return buildMenuItem(label, ev -> presenter.onStatusMessage(label + " is managed by the base view.")); + } private JMenuItem buildMenuItem(String label, ActionListener listener) { + JMenuItem item = new JMenuItem(label); + item.addActionListener(listener); + return item; + + } + + private boolean hasHiddenElements(NewObjectDiagram diagram) { + + return diagram != null + + && (diagram.getHiddenNodes() != null && !diagram.getHiddenNodes().isEmpty() + + || diagram.getHiddenData() != null && !diagram.getHiddenData().getEdges().isEmpty()); + + } + + private boolean areAllSelectedObjectsGreyed(ObjectDiagramInteractor diagram, Set selectedObjects) { + + if (diagram == null || selectedObjects == null || selectedObjects.isEmpty()) { + + return false; + + } + + for (MObject obj : selectedObjects) { + + if (!diagram.isGreyed(obj)) { + + return false; + + } + + } + + return true; + } private String safeName(MObject obj) { + try { + return obj == null ? "" : obj.name(); + } catch (Exception e) { + return ""; + } + } private String describeSelection(Set selectedObjects) { + if (selectedObjects.isEmpty()) { + return ""; + } + if (selectedObjects.size() == 1) { + return safeName(selectedObjects.iterator().next()); + } + return selectedObjects.size() + " objects"; + } private void hideOrWarn(NewObjectDiagramPresenter presenter, - Set selectedObjects, - Consumer> action) { + + Set selectedObjects, + + Consumer> action) { + if (selectedObjects.isEmpty()) { + presenter.onStatusMessage("Select at least one object to perform this action."); + return; + } + action.accept(selectedObjects); + } private int[] radixConversion(int value, int radix, int length) { + int[] digits = new int[length]; + for (int i = 0; i < length; i++) { + digits[i] = value % radix; + value /= radix; + } + return digits; + } private List> castQualifiers(List qualifiers) { + if (qualifiers == null) { + return null; + } + List> casted = new ArrayList<>(qualifiers.size()); + for (Object qualifier : qualifiers) { + if (qualifier instanceof List list) { + casted.add(list); + } else { + casted.add(List.of()); + } + } + return casted; + } private boolean isCompleteObjectCombination(int[] digits, int m) { + boolean[] used = new boolean[m]; + int usedCount = 0; + for (int d : digits) { + if (!used[d]) { + used[d] = true; + usedCount++; } } return usedCount == m; - } -} + } +} \ No newline at end of file diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/MenuEntry.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java index 4161a095e..514345e1e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java @@ -1,427 +1,882 @@ package org.tzi.use.gui.views.diagrams.objectdiagram; +import com.google.common.eventbus.Subscribe; +import org.tzi.use.gui.util.PersistHelper; +import org.tzi.use.gui.views.diagrams.event.HighlightChangeEvent; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MClass; import org.tzi.use.uml.ocl.value.Value; -import org.tzi.use.uml.sys.events.ObjectCreatedEvent; -import org.tzi.use.uml.sys.events.ObjectDestroyedEvent; -import org.tzi.use.uml.sys.events.AttributeAssignedEvent; -import org.tzi.use.uml.sys.events.LinkDeletedEvent; -import org.tzi.use.uml.sys.events.LinkInsertedEvent; -import org.tzi.use.uml.sys.events.TransitionEvent; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MLinkObject; import org.tzi.use.uml.sys.MObject; -import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MClass; import org.tzi.use.uml.sys.MSystem; -import com.google.common.eventbus.Subscribe; +import org.tzi.use.uml.sys.events.*; +import org.w3c.dom.Element; -import javax.swing.JPopupMenu; -import java.awt.Point; +import javax.swing.*; +import java.awt.*; import java.util.Collection; -import java.util.Set; import java.util.List; -import org.tzi.use.gui.util.PersistHelper; -import org.w3c.dom.Element; -import org.tzi.use.gui.views.diagrams.event.HighlightChangeEvent; +import java.util.Set; /** * MVP presenter for the object diagram. Currently a skeleton with no logic; wiring will be added incrementally. */ + public class NewObjectDiagramPresenterImpl implements NewObjectDiagramPresenter { private final NewObjectDiagramUI view; + private final ObjectDiagramInteractor diagram; + private final NewObjectDiagramModel model; + private final ApplicationController applicationController; + private final ContextMenuProvider contextMenuProvider; + private final PlacementRepository placementRepository; + private final MSystem system; public NewObjectDiagramPresenterImpl(NewObjectDiagramUI view, + ObjectDiagramInteractor diagram, + NewObjectDiagramModel model, + ApplicationController applicationController, + ContextMenuProvider contextMenuProvider, + PlacementRepository placementRepository, + MSystem system) { + this.view = view; + this.diagram = diagram; + this.model = model; + this.applicationController = applicationController; + this.contextMenuProvider = contextMenuProvider; + this.placementRepository = placementRepository; + this.system = system; + + log("", "constructed; view=" + (view == null ? "null" : view.getClass().getSimpleName()) + + + ", diagram=" + (diagram == null ? "null" : diagram.getClass().getSimpleName()) + + + ", model=" + (model == null ? "null" : model.getClass().getSimpleName())); + if (this.system != null) { + this.system.getEventBus().register(this); + } + + } + + private static int sizeOf(Collection values) { + + return values == null ? 0 : values.size(); + + } + + private static int sizeOf(Set values) { + + return values == null ? 0 : values.size(); + + } + + private static int sizeOf(List values) { + + return values == null ? 0 : values.size(); + + } + + private void log(String method, String message) { + + PresenterFileLogger.log(getClass(), method, message); + } @Override + public void onRequestPopup() { + + log("onRequestPopup", "requested popup menu"); + // will be implemented when ContextMenuProvider is wired + } @Override + public void onAddObject(Value value) { + + log("onAddObject", "value=" + value); + // will be implemented during migration + } @Override + public void onRefreshRequested() { + + log("onRefreshRequested", "refresh requested"); + refreshDiagram(true); + onStatusMessage("Diagram refreshed"); + } @Override + public void onCreateObject(String clsName) { + + log("onCreateObject", "clsName=" + clsName); + if (applicationController != null) { + applicationController.createObject(clsName); + onStatusMessage("Create object: " + clsName); + } + } @Override + public void onResetDiagram(ObjDiagramOptions options) { + + log("onResetDiagram", "options=" + options); + if (applicationController != null) { + applicationController.resetDiagram(options); + } + if (model != null) { + model.reset(); + } + refreshDiagram(true); + onStatusMessage("Diagram reset"); + } @Override + public void onHighlightChange(HighlightChangeEvent e) { + + log("onHighlightChange", "event=" + e); + if (diagram instanceof NewObjectDiagram diag && e != null) { + diag.handleHighlightChange(e); + } + } @Override + @Subscribe + public void onTransition(TransitionEvent e) { + + log("onTransition", "event=" + e); + if (diagram == null || e == null) { + return; + } + diagram.updateObject(e.getSource()); + refreshDiagram(true); + } private void refreshDiagram(boolean fullLayout) { + if (diagram != null) { + diagram.invalidateContent(fullLayout); + } + if (view != null) { + view.refresh(); + } + } @Subscribe + public void onObjectCreated(ObjectCreatedEvent e) { + if (e == null) { + return; + } + onObjectCreated(e.getCreatedObject()); + } @Override + public void onObjectCreated(MObject obj) { + + log("onObjectCreated", "object=" + obj); + if (diagram == null || obj == null || obj instanceof MLink) { + return; + } + diagram.addObject(obj); + refreshDiagram(true); + } @Subscribe + public void onObjectDestroyed(ObjectDestroyedEvent e) { + if (e == null) { + return; + } + onObjectDestroyed(e.getDestroyedObject()); + } @Override + public void onObjectDestroyed(MObject obj) { + + log("onObjectDestroyed", "object=" + obj); + if (diagram == null || obj == null || obj instanceof MLink) { + return; + } + diagram.deleteObject(obj); + refreshDiagram(true); + } @Override + @Subscribe + public void onAttributeAssigned(AttributeAssignedEvent e) { + + log("onAttributeAssigned", "event=" + e); + if (diagram == null || e == null || e.getObject() == null) { + return; + } + diagram.updateObject(e.getObject()); + refreshDiagram(true); + } @Override + @Subscribe + public void onLinkInserted(LinkInsertedEvent e) { + + log("onLinkInserted", "event=" + e); + if (diagram == null || e == null) { + return; + } + MLink link = e.getLink(); + if (link == null) { + return; + } + if (link instanceof MLinkObject linkObject) { + diagram.addObject(linkObject); + } + diagram.addLink(link); + refreshDiagram(true); + } @Override + @Subscribe + public void onLinkDeleted(LinkDeletedEvent e) { + + log("onLinkDeleted", "event=" + e); + if (diagram == null || e == null) { + return; + } + MLink link = e.getLink(); + if (link == null) { + return; + } + if (link instanceof MLinkObject linkObject) { + diagram.deleteObject(linkObject); + } + diagram.deleteLink(link); + refreshDiagram(true); + } @Override + public void onPopupMenuPrepared(JPopupMenu menu, + Point popupPosition, + Set selectedObjects, + Set selectedLinks, + Set selectedAssocObjects) { + + log("onPopupMenuPrepared", "popupPosition=" + popupPosition + ", selectedObjects=" + sizeOf(selectedObjects) + + + ", selectedLinks=" + sizeOf(selectedLinks) + ", selectedAssocObjects=" + sizeOf(selectedAssocObjects)); + if (contextMenuProvider != null && menu != null) { + contextMenuProvider.enhanceMenu(menu, diagram, this, popupPosition, + selectedObjects, selectedLinks, selectedAssocObjects); + } + } @Override + public void onStatusMessage(String status) { + + log("onStatusMessage", status); + if (view != null && status != null) { + view.setStatus(status); + } + } @Override + public void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set selectedObjects) { + + log("onBuildShowHideCropMenu", "selectedObjects=" + sizeOf(selectedObjects)); + if (builder == null) { + return; + } + if (selectedObjects != null && !selectedObjects.isEmpty()) { + builder.addSelectedObjectPathView(selectedObjects); + } + builder.addSelectionWithOCLViewAction(); + builder.addSelectionObjectView(); + } @Override + public void onInsertLink(MAssociation association, List participants) { + + log("onInsertLink", "association=" + association + ", participants=" + sizeOf(participants)); + if (applicationController != null) { + applicationController.insertLink(association, participants); + } else if (view instanceof NewObjectDiagramView v) { + v.insertLink(association, participants.toArray(new MObject[0])); + } + } @Override + public void onDeleteLink(MLink link) { + + log("onDeleteLink", "link=" + link); + if (applicationController != null) { + applicationController.deleteLink(link); + } else if (view instanceof NewObjectDiagramView v) { + v.deleteLink(link); + } + if (diagram != null) { + diagram.clearSelection(); + } + } @Override + public void onDeleteObjects(Set objects) { + + log("onDeleteObjects", "count=" + sizeOf(objects)); + if (applicationController != null) { + applicationController.deleteObjects(objects); + } else if (view instanceof NewObjectDiagramView v) { + v.deleteObjects(objects); + } + if (diagram != null) { + diagram.clearSelection(); + } + } @Override + public void onShowObjectProperties(MObject object) { + + log("onShowObjectProperties", "object=" + object); + if (applicationController != null && object != null) { + applicationController.showObjectProperties(object.name()); + } + } @Override + public Set fetchLinksOfAssociation(MAssociation association) { + + log("fetchLinksOfAssociation", "association=" + association); + if (association == null || system == null) { + return Set.of(); + } + return system.state().linksOfAssociation(association).links(); + } @Override + public Set fetchObjectsOfClass(MClass cls) { + + log("fetchObjectsOfClass", "class=" + cls); + if (cls == null || system == null) { + return Set.of(); + } + return system.state().objectsOfClass(cls); + } @Override + public Collection fetchAllAssociations() { + + log("fetchAllAssociations", "requested"); + if (system == null) { + return Set.of(); + } + return system.model().associations(); + } @Override + public void onHideLinks(Collection links) { + + log("onHideLinks", "count=" + sizeOf(links)); + if (diagram == null || links == null) { + return; + } + links.forEach(diagram::hideLink); + refreshDiagram(true); + } @Override + public void onShowLinks(Collection links) { + + log("onShowLinks", "count=" + sizeOf(links)); + if (diagram == null || links == null) { + return; + } + if (diagram instanceof NewObjectDiagram newDiagram) { + newDiagram.showLink(new java.util.ArrayList<>(links)); + refreshDiagram(true); + } + } @Override + public void onHideObjects(Collection objects) { + + log("onHideObjects", "count=" + sizeOf(objects)); + if (diagram == null || objects == null) { + return; + } + objects.forEach(diagram::hideObject); + refreshDiagram(true); + } @Override + public void onHideAllLinks() { + + log("onHideAllLinks", "requested"); + if (diagram == null) { + return; + } + diagram.hideAllLinks(); + refreshDiagram(true); + } @Override + public void onShowAllLinks() { + + log("onShowAllLinks", "requested"); + if (diagram == null) { + return; + } + diagram.showAllLinks(); + refreshDiagram(true); + } @Override + public void onShowHiddenElements() { + + log("onShowHiddenElements", "requested; hiddenObjects=" + hiddenObjectCount() + ", hiddenLinks=" + hiddenLinkCount()); + if (diagram == null) { + return; + } + diagram.showAll(); + diagram.showAllLinks(); + refreshDiagram(true); + } @Override + public void onCropSelection(Collection objectsToHide) { - if (diagram == null || objectsToHide == null) { + + log("onCropSelection", "keepCount=" + sizeOf(objectsToHide)); + + if (diagram == null || objectsToHide == null || objectsToHide.isEmpty()) { + return; + + } + + if (diagram instanceof NewObjectDiagram newDiagram) { + + Set keepObjects = new java.util.LinkedHashSet<>(objectsToHide); + + Set visibleObjects = new java.util.LinkedHashSet<>(newDiagram.getVisibleData().getObjectToNodeMap().keySet()); + + visibleObjects.removeAll(keepObjects); + + visibleObjects.forEach(diagram::hideObject); + + } else { + + objectsToHide.forEach(diagram::hideObject); + } - objectsToHide.forEach(diagram::hideObject); + + diagram.clearSelection(); + refreshDiagram(true); + } @Override + public void onGrayOut(Collection objects) { + + log("onGrayOut", "count=" + sizeOf(objects)); + if (diagram == null || objects == null) { + return; + } + objects.forEach(obj -> diagram.setGreyed(obj, true)); + refreshDiagram(false); + } @Override + public void onGrayIn(Collection objects) { + + log("onGrayIn", "count=" + sizeOf(objects)); + if (diagram == null || objects == null) { + return; + } + objects.forEach(obj -> diagram.setGreyed(obj, false)); + refreshDiagram(false); + } @Override + public void onToggleShowStates(boolean show) { + + log("onToggleShowStates", "show=" + show); + if (diagram == null) { + return; + } + diagram.setShowStates(show); + refreshDiagram(true); + } @Override + public void onStoreLayout(PersistHelper helper, - Element root, - NewObjectDiagramModel model) { + + Element root, + + NewObjectDiagramModel model) { + + log("onStoreLayout", "helper=" + helper + ", root=" + root + ", model=" + model); + if (placementRepository != null && helper != null && root != null) { + placementRepository.storeLayout(model, helper, root); + } + } @Override + public Set onRestoreLayout(PersistHelper helper, - int version, - NewObjectDiagramModel model, - MSystem system) { + + int version, + + NewObjectDiagramModel model, + + MSystem system) { + + log("onRestoreLayout", "version=" + version + ", helper=" + helper + ", model=" + model); + if (placementRepository != null && helper != null) { + return placementRepository.restoreLayout(model, helper, version, system); + } + return Set.of(); + } public NewObjectDiagramModel getModel() { + return model; + } MSystem getSystem() { + return system; + } @Override + public void detach() { + + log("detach", "requested"); + if (system != null) { + try { + system.getEventBus().unregister(this); + } catch (Exception ignored) { + // ignore if already unregistered + } + } + // ensure diagram refresh stops referencing this presenter + refreshDiagram(false); + } -} + + private int hiddenObjectCount() { + + if (!(diagram instanceof NewObjectDiagram newDiagram) || newDiagram.getHiddenNodes() == null) { + + return 0; + + } + + return newDiagram.getHiddenNodes().size(); + + } + + private int hiddenLinkCount() { + + if (!(diagram instanceof NewObjectDiagram newDiagram) + + || newDiagram.getHiddenData() == null + + || newDiagram.getHiddenData().getEdges() == null) { + + return 0; + + } + + return newDiagram.getHiddenData().getEdges().size(); + + } + +} \ No newline at end of file diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java index f72370484..10cec5030 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java @@ -4,143 +4,312 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.nio.file.StandardOpenOption; /** * Simple file logger used for collecting presenter/view event traces per test case. + * + *

*

* Usage: set system property TEST_NAME to separate logs per test, e.g. + *

* -DTEST_NAME=t01 + *

* or set environment variable TEST_NAME before starting the application. + *

* Default test name is "default". */ + public final class PresenterFileLogger { + // store logs in a user-writable directory under the user's home so they are easy to find + private static final Path LOG_DIR = Paths.get(System.getProperty("user.home"), "use_refactor_logs"); + // also write a copy to the current working directory to make logs visible in the project tree - private static final Path WORK_DIR_LOG = Paths.get(System.getProperty("user.dir"), "use_refactor_logs"); - private static volatile String currentTest = System.getProperty("TEST_NAME", System.getenv().getOrDefault("TEST_NAME", "default")); + private static final Path WORK_DIR_LOG = Paths.get(System.getProperty("user.dir"), "use_refactor_logs"); private static final DateTimeFormatter TS_FORMAT = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()); + private static volatile String currentTest = System.getProperty("TEST_NAME", System.getenv().getOrDefault("TEST_NAME", "default")); + private static volatile boolean enabled = readEnabledFlag(); static { + // Best-effort: create directories and write an initialization line into the test log. + try { + Files.createDirectories(LOG_DIR); + Files.createDirectories(WORK_DIR_LOG); + // write an init line into the current test log file (no stdout/stderr) using structured format + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#init] initialized test=" + currentTest + System.lineSeparator(); + try { + Path p = LOG_DIR.resolve(currentTest + ".log"); + Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore — best-effort + } + try { + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } catch (IOException ignored) { + // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr + } + } private PresenterFileLogger() { + // utility + + } + + private static boolean readEnabledFlag() { + + String value = System.getProperty("PRESENTER_LOGGING_ENABLED"); + + if (value == null) { + + value = System.getenv("PRESENTER_LOGGING_ENABLED"); + + } + + return Boolean.parseBoolean(value); + + } + + public static boolean isEnabled() { + + return enabled; + + } + + public static void setEnabled(boolean enabled) { + + PresenterFileLogger.enabled = enabled; + } public static synchronized void setCurrentTest(String testName) { + if (testName == null || testName.isEmpty()) { + testName = "default"; + } + currentTest = testName; + + if (!enabled) { + + return; + + } + try { + // Ensure both directories exist when changing the test name so subsequent writes succeed + Files.createDirectories(LOG_DIR); + Files.createDirectories(WORK_DIR_LOG); + // write an init line into the new current test log file (best-effort, no stdout/stderr) + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#setCurrentTest] switched test=" + currentTest + System.lineSeparator(); + try { + Path p = LOG_DIR.resolve(currentTest + ".log"); + Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore — best-effort + } + try { + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } catch (IOException ignored) { + // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr + } + } // Core write helper (best-effort) + private static void writeLineToFiles(String line) { + + if (!enabled) { + + return; + + } + String fileName = currentTest + ".log"; + Path p = LOG_DIR.resolve(fileName); + Path pWork = WORK_DIR_LOG.resolve(fileName); + try { + // ensure directories exist (in case setCurrentTest wasn't called since class init) + Files.createDirectories(LOG_DIR); + } catch (IOException ignored) { + // ignore + } + try { + Files.createDirectories(WORK_DIR_LOG); + } catch (IOException ignored) { + // ignore + } + try { + Files.writeString(p, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + try { + Files.writeString(pWork, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // ignore + } + } /** * Structured log entry: className and methodName are required to identify the call site. */ + public static synchronized void log(String className, String methodName, String message) { + + if (!enabled) { + + return; + + } + if (className == null) className = ""; + if (methodName == null) methodName = ""; + if (message == null) message = ""; + String ts = TS_FORMAT.format(Instant.now()); + String line = ts + " [" + className + "#" + methodName + "] " + message + System.lineSeparator(); + writeLineToFiles(line); + } /** * Convenience overload accepting a Class object. */ + public static synchronized void log(Class cls, String methodName, String message) { + + if (!enabled) { + + return; + + } + String className = (cls == null) ? "" : cls.getSimpleName(); + log(className, methodName, message); + } /** * Backwards-compatible single-string log; maps to GLOBAL#log for traceability. */ + public static synchronized void log(String message) { + + if (!enabled) { + + return; + + } + log("GLOBAL", "log", message); + } public static synchronized void log(String testName, String message) { + + if (!enabled) { + + return; + + } + setCurrentTest(testName); + log(message); + } -} + +} \ No newline at end of file From fb457de1b31558bb0385bb300fc39fb592f535a0 Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 9 Apr 2026 21:08:05 +0200 Subject: [PATCH 29/34] - added back falsely deleted folder /docs --- .../ant_cycles_history_no_tests.csv | 637 ++++++++++++++++++ .../ant_cycles_history_with_tests.csv | 637 ++++++++++++++++++ docs/archunit-history/ant_layers_history.csv | 637 ++++++++++++++++++ .../maven_build_time_history.csv | 65 ++ .../archunit-history/maven_cycles_history.csv | 64 ++ .../archunit-history/maven_layers_history.csv | 65 ++ docs/scripts/Ant/ant_cycles_test.ps1 | 284 ++++++++ docs/scripts/Ant/ant_layer_test.ps1 | 190 ++++++ docs/scripts/Ant/ant_utilities.ps1 | 297 ++++++++ docs/scripts/Maven/maven_buildtime_test.ps1 | 139 ++++ docs/scripts/Maven/maven_cycles_test.ps1 | 288 ++++++++ docs/scripts/Maven/maven_layer_test.ps1 | 218 ++++++ docs/scripts/Maven/maven_utilities.ps1 | 102 +++ docs/scripts/general_utilities.ps1 | 204 ++++++ 14 files changed, 3827 insertions(+) create mode 100644 docs/archunit-history/ant_cycles_history_no_tests.csv create mode 100644 docs/archunit-history/ant_cycles_history_with_tests.csv create mode 100644 docs/archunit-history/ant_layers_history.csv create mode 100644 docs/archunit-history/maven_build_time_history.csv create mode 100644 docs/archunit-history/maven_cycles_history.csv create mode 100644 docs/archunit-history/maven_layers_history.csv create mode 100644 docs/scripts/Ant/ant_cycles_test.ps1 create mode 100644 docs/scripts/Ant/ant_layer_test.ps1 create mode 100644 docs/scripts/Ant/ant_utilities.ps1 create mode 100644 docs/scripts/Maven/maven_buildtime_test.ps1 create mode 100644 docs/scripts/Maven/maven_cycles_test.ps1 create mode 100644 docs/scripts/Maven/maven_layer_test.ps1 create mode 100644 docs/scripts/Maven/maven_utilities.ps1 create mode 100644 docs/scripts/general_utilities.ps1 diff --git a/docs/archunit-history/ant_cycles_history_no_tests.csv b/docs/archunit-history/ant_cycles_history_no_tests.csv new file mode 100644 index 000000000..e2eb033c1 --- /dev/null +++ b/docs/archunit-history/ant_cycles_history_no_tests.csv @@ -0,0 +1,637 @@ +date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util +2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,26,0,0,0,1,0,1,0,5,0 +2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,26,0,0,0,1,0,1,0,5,0 +2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,26,0,0,0,1,0,1,0,5,0 +2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,26,0,0,0,1,0,1,0,5,0 +2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,26,0,0,0,1,0,1,0,5,0 +2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,26,0,0,0,1,0,1,0,5,0 +2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,26,0,0,0,1,0,1,0,5,0 +2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,26,0,0,0,1,0,1,0,5,0 +2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,26,0,0,0,1,0,1,0,5,0 +2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,26,0,0,0,1,0,1,0,5,0 +2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,26,0,0,0,1,0,1,0,5,0 +2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,26,0,0,0,1,0,1,0,5,0 +2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,26,0,0,0,1,0,1,0,5,0 +2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,26,0,0,0,1,0,1,0,5,0 +2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,26,0,0,0,1,0,1,0,5,0 +2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,26,0,0,0,1,0,1,0,5,0 +2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,26,0,0,0,1,0,1,0,5,0 +2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,26,0,0,0,1,0,1,0,5,0 +2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,26,0,0,0,1,0,1,0,5,0 +2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,26,0,0,0,1,0,1,0,5,0 +2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,26,0,0,0,1,0,1,0,5,0 +2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,26,0,0,0,1,0,1,0,5,0 +2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,26,0,0,0,1,0,1,0,5,0 +2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,26,0,0,0,1,0,1,0,5,0 +2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,26,0,0,0,1,0,1,0,5,0 +2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,26,0,0,0,1,0,1,0,5,0 +2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,26,0,0,0,1,0,1,0,5,0 +2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,26,0,0,0,1,0,1,0,5,0 +2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,26,0,0,0,1,0,1,0,5,0 +2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,26,0,0,0,1,0,1,0,5,0 +2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,26,0,0,0,1,0,1,0,5,0 +2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,26,0,0,0,1,0,1,0,5,0 +2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,26,0,0,0,1,0,1,0,5,0 +2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,26,0,0,0,1,0,1,0,5,0 +2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,26,0,0,0,1,0,1,0,5,0 +2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,26,0,0,0,1,0,1,0,5,0 +2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,26,0,0,0,1,0,1,0,5,0 +2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,26,0,0,0,1,0,1,0,5,0 +2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,26,0,0,0,1,0,1,0,5,0 +2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,26,0,0,0,1,0,1,0,5,0 +2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,26,0,0,0,1,0,1,0,5,0 +2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,26,0,0,0,1,0,1,0,5,0 +2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,26,0,0,0,1,0,1,0,5,0 +2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,26,0,0,0,1,0,1,0,5,0 +2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,26,0,0,0,1,0,1,0,5,0 +2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,26,0,0,0,1,0,1,0,5,0 +2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,26,0,0,0,1,0,1,0,5,0 +2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,26,0,0,0,1,0,1,0,5,0 +2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,26,0,0,0,1,0,1,0,5,0 +2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,26,0,0,0,1,0,1,0,5,0 +2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,26,0,0,0,1,0,1,0,5,0 +2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,26,0,0,0,1,0,1,0,5,0 +2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,26,0,0,0,1,0,1,0,5,0 +2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,26,0,0,0,1,0,1,0,5,0 +2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,26,0,0,0,1,0,1,0,5,0 +2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,26,0,0,0,1,0,1,0,5,0 +2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,26,0,0,0,1,0,1,0,5,0 +2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,26,0,0,0,1,0,1,0,5,0 +2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,26,0,0,0,1,0,1,0,5,0 +2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,26,0,0,0,1,0,1,0,5,0 +2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,26,0,0,0,1,0,1,0,5,0 +2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,26,0,0,0,1,0,1,0,5,0 +2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,26,0,0,0,1,0,1,0,5,0 +2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,26,0,0,0,1,0,1,0,5,0 +2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,26,0,0,0,1,0,1,0,5,0 +2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,26,0,0,0,1,0,1,2,5,0 +2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,26,0,0,0,1,0,1,2,5,0 +2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,26,0,0,0,1,0,1,2,5,0 +2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,26,0,0,0,1,0,1,2,5,0 +2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,26,0,0,0,1,0,1,2,5,0 +2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,26,0,0,0,1,0,1,2,5,0 +2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,26,0,0,0,1,0,1,2,5,0 +2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,26,0,0,0,1,0,1,2,5,0 +2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,26,0,0,0,1,0,1,2,5,0 +2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,26,0,0,0,1,0,1,2,5,0 +2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,26,0,0,0,1,0,1,2,5,0 +2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,26,0,0,0,1,0,1,2,5,0 +2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,26,0,0,0,1,0,1,2,5,0 +2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,26,0,0,0,1,0,1,2,5,0 +2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,26,0,0,0,1,0,1,2,5,0 +2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,26,0,0,0,1,0,1,2,5,0 +2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,26,0,0,0,1,0,1,2,5,0 +2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,26,0,0,0,1,0,1,2,5,0 +2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,26,0,0,0,1,0,1,2,5,0 +2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,26,0,0,0,1,0,1,2,5,0 +2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,26,0,0,0,1,0,1,2,5,0 +2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,26,0,0,0,1,0,1,2,5,0 +2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,26,0,0,0,1,0,1,2,5,0 +2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,26,0,0,0,1,0,1,2,5,0 +2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,26,0,0,0,1,0,1,2,5,0 +2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,26,0,0,0,1,0,1,2,5,0 +2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,26,0,0,0,1,0,1,2,5,0 +2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,26,0,0,0,1,0,1,2,5,0 +2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,26,0,0,0,1,0,1,2,5,0 +2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,26,0,0,0,1,0,1,2,5,0 +2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,26,0,0,0,1,0,1,2,5,0 +2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,26,0,0,0,1,0,1,2,5,0 +2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,26,0,0,0,1,0,1,2,5,0 +2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,26,0,0,0,1,0,1,2,5,0 +2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,26,0,0,0,1,0,1,2,5,0 +2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,26,0,0,0,1,0,1,2,5,0 +2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,26,0,0,0,1,0,1,2,5,0 +2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,26,0,0,0,1,0,1,2,5,0 +2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,26,0,0,0,1,0,1,2,5,0 +2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,26,0,0,0,1,0,1,2,5,0 +2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,26,0,0,0,1,0,1,2,5,0 +2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,26,0,0,0,1,0,1,2,5,0 +2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,26,0,0,0,1,0,1,2,5,0 +2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,26,0,0,0,1,0,1,2,5,0 +2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,26,0,0,0,1,0,1,2,5,0 +2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,26,0,0,0,1,0,1,2,5,0 +2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,26,0,0,0,1,0,1,2,5,0 +2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,26,0,0,0,1,0,1,2,5,0 +2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,26,0,0,0,1,0,1,2,5,0 +2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,26,0,0,0,1,0,1,2,5,0 +2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,26,0,0,0,1,0,1,2,5,0 +2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,26,0,0,0,1,0,1,2,5,0 +2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,26,0,0,0,1,0,1,2,5,0 +2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,26,0,0,0,1,0,1,2,5,0 +2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,26,0,0,0,1,0,1,2,5,0 +2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,26,0,0,0,1,0,1,2,5,0 +2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,26,0,0,0,1,0,1,2,5,0 +2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,26,0,0,0,1,0,1,2,5,0 +2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,26,0,0,0,1,0,1,2,5,0 +2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,26,0,0,0,1,0,1,2,5,0 +2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,26,0,0,0,1,0,1,2,5,0 +2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,26,0,0,0,1,0,1,2,5,0 +2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,26,0,0,0,1,0,1,2,5,0 +2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,26,0,0,0,1,0,1,2,5,0 +2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,26,0,0,0,1,0,1,2,5,0 +2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,26,0,0,0,1,0,1,2,5,0 +2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,26,0,0,0,1,0,1,2,5,0 +2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,26,0,0,0,1,0,1,2,5,0 +2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,26,0,0,0,1,0,1,2,5,0 +2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,26,0,0,0,1,0,1,2,5,0 +2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,26,0,0,0,1,0,1,2,5,0 +2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,26,0,0,0,1,0,1,2,5,0 +2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,26,0,0,0,1,0,1,2,5,0 +2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,26,0,0,0,1,0,1,2,5,0 +2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,26,0,0,0,1,0,1,2,5,0 +2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,26,0,0,0,1,0,1,2,5,0 +2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,26,0,0,0,1,0,1,2,5,0 +2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,26,0,0,0,1,0,1,2,5,0 +2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,26,0,0,0,1,0,1,2,5,0 +2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,26,0,0,0,1,0,1,2,5,0 +2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,26,0,0,0,1,0,1,2,5,0 +2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,26,0,0,0,1,0,1,2,5,0 +2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,26,0,0,0,1,0,1,2,5,0 +2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,26,0,0,0,1,0,1,2,5,0 +2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,26,0,0,0,1,0,1,2,5,0 +2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,26,0,0,0,1,0,1,2,5,0 +2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,26,0,0,0,1,0,1,2,5,0 +2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,26,0,0,0,1,0,1,2,5,0 +2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,26,0,0,0,1,0,1,2,5,0 +2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,26,0,0,0,1,0,1,2,5,0 +2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,26,0,0,0,1,0,1,2,5,0 +2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,26,0,0,0,1,0,1,2,5,0 +2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,26,0,0,0,1,0,1,2,5,0 +2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,26,0,0,0,1,0,1,2,5,0 +2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,26,0,0,0,1,0,1,2,5,0 +2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,26,0,0,0,1,0,1,2,5,0 +2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,26,0,0,0,1,0,1,2,5,0 +2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,26,0,0,0,1,0,1,2,5,0 +2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,26,0,0,0,1,0,1,2,5,0 +2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,26,0,0,0,1,0,1,2,5,0 +2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,26,0,0,0,1,0,1,2,5,0 +2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,26,0,0,0,1,0,1,2,5,0 +2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,26,0,0,0,1,0,1,2,5,0 +2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,26,0,0,0,1,0,1,2,5,0 +2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,26,0,0,0,1,0,1,2,5,0 +2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,26,0,0,0,1,0,1,2,5,0 +2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,26,0,0,0,1,0,1,2,5,0 +2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,26,0,0,0,1,0,1,2,5,0 +2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,26,0,0,0,1,0,1,2,5,0 +2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,26,0,0,0,1,0,1,2,5,0 +2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,26,0,0,0,1,0,1,2,5,0 +2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,26,0,0,0,1,0,1,2,5,0 +2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,26,0,0,0,1,0,1,2,5,0 +2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,26,0,0,0,1,0,1,2,5,0 +2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,26,0,0,0,1,0,1,2,5,0 +2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,26,0,0,0,1,0,1,2,5,0 +2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,26,0,0,0,1,0,1,2,5,0 +2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,26,0,0,0,1,0,1,2,5,0 +2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,26,0,0,0,1,0,1,2,5,0 +2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,26,0,0,0,1,0,1,2,5,0 +2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,26,0,0,0,1,0,1,2,5,0 +2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,26,0,0,0,1,0,1,2,5,0 +2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,26,0,0,0,1,0,1,2,5,0 +2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,26,0,0,0,1,0,1,2,5,0 +2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,26,0,0,0,1,0,1,2,5,0 +2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,26,0,0,0,1,0,1,2,5,0 +2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,26,0,0,0,1,0,1,2,5,0 +2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,26,0,0,0,1,0,1,2,5,0 +2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,26,0,0,0,1,0,1,2,5,0 +2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,26,0,0,0,1,0,1,2,5,0 +2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,26,0,0,0,1,0,1,2,5,0 +2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,26,0,0,0,1,0,1,2,5,0 +2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,26,0,0,0,1,0,1,2,5,0 +2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,26,0,0,0,1,0,1,2,5,0 +2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,26,0,0,0,1,0,1,2,5,0 +2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,26,0,0,0,1,0,1,2,5,0 +2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,26,0,0,0,1,0,1,2,5,0 +2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,26,0,0,0,1,0,1,2,5,0 +2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,26,0,0,0,1,0,1,2,5,0 +2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,26,0,0,0,1,0,1,2,5,0 +2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,26,0,0,0,1,0,1,2,5,0 +2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,26,0,0,0,1,0,1,2,5,0 +2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,26,0,0,0,1,0,1,2,5,0 +2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,26,0,0,0,1,0,1,2,5,0 +2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,26,0,0,0,1,0,1,2,5,0 +2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,26,0,0,0,1,0,1,2,5,0 +2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,26,0,0,0,1,0,1,2,5,0 +2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,26,0,0,0,1,0,1,2,5,0 +2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,26,0,0,0,1,0,1,2,5,0 +2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,26,0,0,0,1,0,1,2,5,0 +2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,26,0,0,0,1,0,1,2,5,0 +2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,26,0,0,0,1,0,1,2,5,0 +2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,26,0,0,0,1,0,1,2,5,0 +2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,26,0,0,0,1,0,1,2,5,0 +2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,26,0,0,0,1,0,1,2,5,0 +2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,26,0,0,0,1,0,1,2,5,0 +2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,26,0,0,0,1,0,1,2,5,0 +2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,26,0,0,0,1,0,1,2,5,0 +2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,26,0,0,0,1,0,1,2,5,0 +2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,26,0,0,0,1,0,1,2,5,0 +2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,26,0,0,0,1,0,1,2,5,0 +2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,26,0,0,0,1,0,1,2,5,0 +2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,26,0,0,0,1,0,1,2,5,0 +2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,26,0,0,0,1,0,1,2,5,0 +2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,26,0,0,0,1,0,1,2,5,0 +2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,26,0,0,0,1,0,1,2,5,0 +2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,26,0,0,0,1,0,1,2,5,0 +2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,26,0,0,0,1,0,1,2,5,0 +2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,26,0,0,0,1,0,1,2,5,0 +2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,26,0,0,0,1,0,1,2,5,0 +2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,26,0,0,0,1,0,1,2,5,0 +2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,26,0,0,0,1,0,1,2,5,0 +2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,26,0,0,0,1,0,1,2,5,0 +2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,26,0,0,0,1,0,1,2,5,0 +2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,26,0,0,0,1,0,1,2,5,0 +2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,26,0,0,0,1,0,1,2,5,0 +2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,26,0,0,0,1,0,1,2,5,0 +2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,26,0,0,0,1,0,1,2,5,0 +2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,26,0,0,0,1,0,1,2,5,0 +2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,26,0,0,0,1,0,1,2,5,0 +2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,26,0,0,0,1,0,1,2,5,0 +2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,26,0,0,0,1,0,1,2,5,0 +2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,26,0,0,0,1,0,1,2,5,0 +2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,26,0,0,0,1,0,1,2,5,0 +2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,26,0,0,0,1,0,1,2,5,0 +2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,26,0,0,0,1,0,1,2,5,0 +2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,26,0,0,0,1,0,1,2,5,0 +2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,26,0,0,0,1,0,1,2,5,0 +2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,26,0,0,0,1,0,1,2,5,0 +2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,26,0,0,0,1,0,1,2,5,0 +2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,26,0,0,0,1,0,1,2,5,0 +2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,26,0,0,0,1,0,1,2,5,0 +2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,26,0,0,0,1,0,1,2,5,0 +2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,26,0,0,0,1,0,1,2,5,0 +2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,26,0,0,0,1,0,1,2,5,0 +2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,26,0,0,0,1,0,1,2,5,0 +2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,26,0,0,0,1,0,1,2,5,0 +2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,26,0,0,0,1,0,1,2,5,0 +2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,26,0,0,0,1,0,1,2,5,0 +2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,26,0,0,0,1,0,1,2,5,0 +2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,26,0,0,0,1,0,1,2,5,0 +2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,26,0,0,0,1,0,1,2,5,0 +2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,26,0,0,0,1,0,1,2,5,0 +2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,26,0,0,0,1,0,1,2,5,0 +2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,26,0,0,0,1,0,1,2,5,0 +2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,26,0,0,0,1,0,1,2,5,0 +2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,26,0,0,0,1,0,1,2,5,0 +2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,26,0,0,0,1,0,1,2,5,0 +2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,26,0,0,0,1,0,1,2,5,0 +2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,26,0,0,0,1,0,1,2,5,0 +2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,26,0,0,0,1,0,1,2,5,0 +2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,26,0,0,0,1,0,1,2,5,0 +2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,26,0,0,0,1,0,1,2,5,0 +2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,26,0,0,0,1,0,1,2,5,0 +2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,26,0,0,0,1,0,1,2,5,0 +2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,26,0,0,0,1,0,1,2,5,0 +2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,26,0,0,0,1,0,1,2,5,0 +2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,26,0,0,0,1,0,1,2,5,0 +2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,26,0,0,0,1,0,1,2,5,0 +2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,26,0,0,0,1,0,1,2,5,0 +2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,26,0,0,0,1,0,1,2,5,0 +2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,26,0,0,0,1,0,1,2,5,0 +2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,26,0,0,0,1,0,1,2,5,0 +2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,26,0,0,0,1,0,1,2,5,0 +2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,26,0,0,0,1,0,1,2,5,0 +2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,26,0,0,0,1,0,1,2,5,0 +2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,26,0,0,0,1,0,1,2,5,0 +2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,26,0,0,0,1,0,1,2,5,0 +2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,26,0,0,0,1,0,1,2,5,0 +2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,26,0,0,0,1,0,1,2,5,0 +2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,26,0,0,0,2,0,1,2,5,0 +2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,26,0,0,0,2,0,1,2,5,0 +2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,26,0,0,0,2,0,1,2,5,0 +2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,26,0,0,0,2,0,1,2,5,0 +2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,30,0,0,0,3,0,1,2,5,0 +2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,30,0,0,0,3,0,1,2,5,0 +2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,30,0,0,0,3,0,1,2,5,0 +2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,30,0,0,0,3,0,1,2,5,0 +2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,30,0,0,0,3,0,1,2,5,0 +2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,30,0,0,0,3,0,1,2,5,0 +2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,30,0,0,0,3,0,1,2,5,0 +2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,30,0,0,0,3,0,1,2,5,0 +2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,30,0,0,0,3,0,1,2,5,0 +2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,30,0,0,0,3,0,1,2,5,0 +2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,30,0,0,0,3,0,1,2,5,0 +2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,30,0,0,0,3,0,1,2,5,0 +2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,30,0,0,0,3,0,1,2,5,0 +2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,30,0,0,0,3,0,1,2,5,0 +2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,30,0,0,0,3,0,1,2,5,0 +2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,30,0,0,0,3,0,1,2,5,0 +2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,30,0,0,0,3,0,1,2,5,0 +2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,30,0,0,0,3,0,1,2,5,0 +2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,30,0,0,0,3,0,1,2,5,0 +2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,30,0,0,0,3,0,1,2,5,0 +2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,30,0,0,0,3,0,1,2,5,0 +2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,30,0,0,0,3,0,1,2,5,0 +2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,30,0,0,0,3,0,1,2,5,0 +2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,30,0,0,0,3,0,1,2,5,0 +2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,30,0,0,0,3,0,1,2,5,0 +2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,30,0,0,0,3,0,1,2,5,0 +2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,30,0,0,0,3,0,1,2,5,0 +2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,30,0,0,0,3,0,1,2,5,0 +2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,30,0,0,0,3,0,1,2,5,0 +2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,30,0,0,0,3,0,1,2,5,0 +2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,30,0,0,0,3,0,1,2,5,0 +2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,30,0,0,0,3,0,1,2,5,0 +2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,30,0,0,0,3,0,1,2,5,0 +2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,30,0,0,0,3,0,1,2,5,0 +2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,30,0,0,0,3,0,1,2,5,0 +2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,30,0,0,0,3,0,1,2,5,0 +2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,30,0,0,0,3,0,1,2,5,0 +2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,30,0,0,0,3,0,1,2,5,0 +2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,30,0,0,0,3,0,1,2,5,0 +2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,30,0,0,0,3,0,1,2,5,0 +2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,30,0,0,0,3,0,1,2,5,0 +2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,30,0,0,0,3,0,1,2,5,0 +2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,30,0,0,0,3,0,1,2,5,0 +2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,30,0,0,0,3,0,1,2,5,0 +2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,30,0,0,0,3,0,1,2,5,0 +2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,30,0,0,0,3,0,1,2,5,0 +2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,30,0,0,0,3,0,1,2,5,0 +2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,30,0,0,0,3,0,1,2,5,0 +2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,30,0,0,0,3,0,1,2,5,0 +2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,30,0,0,0,3,0,1,2,5,0 +2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,30,0,0,0,3,0,1,2,5,0 +2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,30,0,0,0,3,0,1,2,5,0 +2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,30,0,0,0,3,0,1,2,5,0 +2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,30,0,0,0,3,0,1,2,5,0 +2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,30,0,0,0,3,0,1,2,5,0 +2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,30,0,0,0,3,0,1,2,5,0 +2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,30,0,0,0,3,0,1,2,5,0 +2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,30,0,0,0,3,0,1,2,5,0 +2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,30,0,0,0,3,0,1,2,5,0 +2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,30,0,0,0,3,0,1,2,5,0 +2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,30,0,0,0,3,0,1,2,5,0 +2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,30,0,0,0,3,0,1,2,5,0 +2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,30,0,0,0,3,0,1,2,5,0 +2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,30,0,0,0,3,0,1,2,5,0 +2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,30,0,0,0,3,0,1,2,5,0 +2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,30,0,0,0,3,0,1,2,5,0 +2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,30,0,0,0,3,0,1,2,5,0 +2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,30,0,0,0,3,0,1,2,5,0 +2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,30,0,0,0,3,0,1,2,5,0 +2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,30,0,0,0,3,0,1,2,5,0 +2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,30,0,0,0,3,0,1,2,5,0 +2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,30,0,0,0,3,0,1,2,5,0 +2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,30,0,0,0,3,0,1,2,5,0 +2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,30,0,0,0,3,0,1,2,5,0 +2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,30,0,0,0,3,0,1,2,5,0 +2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,30,0,0,0,3,0,1,2,5,0 +2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,30,0,0,0,3,0,1,2,5,0 +2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,30,0,0,0,3,0,1,2,5,0 +2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,30,0,0,0,3,0,1,2,5,0 +2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,30,0,0,0,3,0,1,2,5,0 +2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,30,0,0,0,3,0,1,2,5,0 +2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,30,0,0,0,3,0,1,2,5,0 +2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,30,0,0,0,3,0,1,2,5,0 +2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,30,0,0,0,3,0,1,2,5,0 +2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,30,0,0,0,3,0,1,2,5,0 +2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,30,0,0,0,3,0,1,2,5,0 +2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,30,0,0,0,3,0,1,2,5,0 +2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,30,0,0,0,3,0,1,2,5,0 +2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,30,0,0,0,3,0,1,2,5,0 +2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,30,0,0,0,3,0,1,2,5,0 +2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,30,0,0,0,3,0,1,2,5,0 +2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,30,0,0,0,3,0,1,2,5,0 +2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,30,0,1,0,3,0,1,2,5,0 +2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,30,0,1,0,3,0,1,2,5,0 +2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,30,0,1,0,3,0,1,2,5,0 +2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,30,0,1,0,3,0,1,2,5,0 +2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,30,0,1,0,3,0,1,2,5,0 +2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,30,0,1,0,3,0,1,2,5,0 +2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,30,0,1,0,3,0,1,2,5,0 +2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,30,0,1,0,3,0,1,2,5,0 +2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,30,0,1,0,3,0,1,2,5,0 +2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,30,0,1,0,3,0,1,2,5,0 +2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,30,0,1,0,3,0,1,2,5,0 +2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,30,0,1,0,3,0,1,2,5,0 +2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,30,0,1,0,3,0,1,2,5,0 +2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,30,0,1,0,3,0,1,2,5,0 +2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,30,0,1,0,3,0,1,2,5,0 +2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,30,0,1,0,3,0,1,2,5,0 +2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,30,0,1,0,3,0,1,2,5,0 +2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,30,0,1,0,3,0,1,2,5,0 +2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,35,0,1,0,1,0,1,2,5,0 +2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,35,0,1,0,1,0,1,2,5,0 +2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,35,0,1,0,1,0,1,2,5,0 +2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,35,0,1,0,1,0,1,2,5,0 +2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,35,0,1,0,1,0,1,2,5,0 +2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,35,0,1,0,1,0,1,2,5,0 +2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,35,0,1,0,1,0,1,2,5,0 +2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,35,0,1,0,1,0,1,2,5,0 +2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,35,0,1,0,1,0,1,2,5,0 +2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,35,0,1,0,1,0,1,2,5,0 +2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,35,0,1,0,1,0,1,2,5,0 +2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,35,0,1,0,1,0,1,2,5,0 +2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,35,0,1,0,1,0,1,2,5,0 +2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,35,0,1,0,1,0,1,2,5,0 +2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,35,0,1,0,1,0,1,2,5,0 +2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,35,0,1,0,1,0,1,2,5,0 +2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,35,0,1,0,1,0,1,2,5,0 +2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,35,0,1,0,1,0,1,2,5,0 +2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,35,0,1,0,1,0,1,2,5,0 +2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,35,0,1,0,1,0,1,2,5,0 +2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,35,0,1,0,1,0,1,2,5,0 +2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,35,0,1,0,1,0,1,2,5,0 +2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,35,0,1,0,1,0,1,2,5,0 +2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,35,0,1,0,1,0,1,2,5,0 +2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,35,0,1,0,1,0,1,2,5,0 +2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,35,0,1,0,1,0,1,2,5,0 +2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,35,0,1,0,1,0,1,2,5,0 +2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,35,0,1,0,1,0,1,2,5,0 +2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,35,0,1,0,1,0,1,2,5,0 +2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,35,0,1,0,1,0,1,2,5,0 +2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,35,0,1,0,1,0,1,2,5,0 +2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,35,0,1,0,1,0,1,2,5,0 +2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,35,0,1,0,1,0,1,2,5,0 +2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,35,0,1,0,1,0,1,2,5,0 +2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,35,0,1,0,1,0,1,2,5,0 +2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,35,0,1,0,1,0,1,2,5,0 +2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,35,0,1,0,1,0,1,2,5,0 +2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,35,0,1,0,1,0,1,2,5,0 +2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,35,0,1,0,1,0,1,2,5,0 +2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,35,0,1,0,1,0,1,2,5,0 +2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,35,0,1,0,1,0,1,2,5,0 +2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,35,0,1,0,1,0,1,2,5,0 +2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,35,0,1,0,1,0,1,2,5,0 +2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,35,0,1,0,1,0,1,2,5,0 +2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,35,0,1,0,1,0,1,2,5,0 +2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,35,0,1,0,1,0,1,2,5,0 +2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,35,0,1,0,1,0,1,2,5,0 +2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,35,0,1,0,1,0,1,2,5,0 +2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,35,0,1,0,1,0,1,2,5,0 +2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,35,0,1,0,1,0,1,2,5,0 +2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,35,0,1,0,1,0,1,2,5,0 +2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,35,0,1,0,1,0,1,2,5,0 +2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,35,0,1,0,1,0,1,2,5,0 +2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,35,0,1,0,1,0,1,2,5,0 +2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,35,0,1,0,1,0,1,2,5,0 +2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,35,0,1,0,1,0,1,2,5,0 +2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,35,0,1,0,1,0,1,2,5,0 +2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,35,0,1,0,1,0,1,2,5,0 +2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,35,0,1,0,1,0,1,2,5,0 +2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,35,0,1,0,1,0,1,2,5,0 +2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,35,0,1,0,1,0,1,2,5,0 +2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,35,0,1,0,1,0,1,2,5,0 +2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,35,0,1,0,1,0,1,2,5,0 +2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,35,0,1,0,1,0,1,2,5,0 +2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,35,0,1,0,1,0,1,2,5,0 +2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,35,0,1,0,1,0,1,2,5,0 +2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,35,0,1,0,1,0,1,2,5,0 +2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,35,0,1,0,1,0,1,2,5,0 +2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,35,0,1,0,1,0,1,2,5,0 +2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,35,0,1,0,1,0,1,2,5,0 +2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,35,0,1,0,1,0,1,2,5,0 +2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,35,0,1,0,1,0,1,2,5,0 +2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,35,0,1,0,1,0,1,2,5,0 +2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,35,0,1,0,1,0,1,2,5,0 +2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,35,0,1,0,1,0,1,2,5,0 +2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,35,0,1,0,1,0,1,2,5,0 +2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,35,0,1,0,1,0,1,2,5,0 +2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,35,0,1,0,1,0,1,2,5,0 +2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,42,0,1,0,1,0,1,2,5,0 +2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,35,0,1,0,1,0,1,2,5,0 +2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,35,0,1,0,1,0,1,2,5,0 +2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,35,0,1,0,1,0,1,2,5,0 +2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,35,0,1,0,1,0,1,2,5,0 +2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,35,0,1,0,1,0,1,2,5,0 +2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,35,0,1,0,1,0,1,2,5,0 +2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,35,0,1,0,1,0,1,2,5,0 +2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,42,0,1,0,1,0,1,2,5,0 +2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,42,0,1,0,1,0,1,2,5,0 +2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,42,0,1,0,1,0,1,2,5,0 +2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,42,0,1,0,1,0,1,2,5,0 +2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,42,0,1,0,1,0,1,2,5,0 +2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,42,0,1,0,1,0,1,2,5,0 +2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,42,0,1,0,1,0,1,2,5,0 +2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,110,0,1,0,1,0,1,2,5,0 +2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,110,0,1,0,1,0,1,2,5,0 +2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,110,0,1,0,1,0,1,2,5,0 +2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,110,0,1,0,1,0,1,2,5,0 +2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,110,0,1,0,1,0,1,2,5,0 +2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,110,0,1,0,1,0,1,2,5,0 +2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,110,0,1,0,1,0,1,2,5,0 +2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,110,0,1,0,1,0,1,2,5,0 +2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,110,0,1,0,1,0,1,2,5,0 +2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,110,0,1,0,1,0,1,2,5,0 +2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,110,0,1,0,1,0,1,2,5,0 +2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,110,0,1,0,1,0,1,2,5,0 +2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,110,0,1,0,1,0,1,2,5,0 +2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,110,0,1,0,1,0,1,2,5,0 +2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,110,0,1,0,1,0,1,2,5,0 +2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,110,0,1,0,1,0,1,2,5,0 +2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,110,0,1,0,1,0,1,2,5,0 +2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,110,0,1,0,1,0,1,2,5,0 +2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,110,0,1,0,1,0,1,2,5,0 +2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,110,0,1,0,1,0,1,2,5,0 +2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,110,0,1,0,1,0,1,2,5,0 +2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,110,0,1,0,1,0,1,2,5,0 +2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,110,0,1,0,1,0,1,2,5,0 +2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,110,0,1,0,1,0,1,2,5,0 +2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,110,0,1,0,1,0,1,2,5,0 +2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,110,0,1,0,1,0,1,2,5,0 +2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,110,0,1,0,1,0,1,2,5,0 +2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,110,0,1,0,1,0,1,2,5,0 +2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,110,0,1,0,1,0,1,2,5,0 +2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,110,0,1,0,1,0,1,2,5,0 +2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,110,0,1,0,1,0,1,2,5,0 +2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,110,0,1,0,1,0,1,2,5,0 +2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,110,0,1,0,1,0,1,2,5,0 +2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,110,0,1,0,1,0,1,2,5,0 +2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,110,0,1,0,1,0,1,2,5,0 +2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,110,0,1,0,1,0,1,2,5,0 +2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,110,0,1,0,1,0,1,2,5,0 +2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,110,0,1,0,1,0,1,2,5,0 +2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,110,0,1,0,1,0,1,2,5,0 +2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,110,0,1,0,1,0,1,2,5,0 +2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,110,0,1,0,1,0,1,2,5,0 +2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,110,0,1,0,1,0,1,2,5,0 +2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,110,0,1,0,1,0,1,2,5,0 +2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,110,0,1,0,1,0,1,2,5,0 +2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,110,0,1,0,1,0,1,2,5,0 +2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,110,0,1,0,1,0,1,2,5,0 +2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,110,0,1,0,1,0,1,2,5,0 +2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,110,0,1,0,1,0,1,2,5,0 +2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,110,0,1,0,1,0,1,2,5,0 +2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,110,0,1,0,1,0,1,2,5,0 +2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,110,0,1,0,1,0,1,2,5,0 +2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,110,0,1,0,1,0,1,2,5,0 +2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,110,0,1,0,1,0,1,2,5,0 +2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,110,0,1,0,1,0,1,2,5,0 +2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,110,0,1,0,1,0,1,2,5,0 +2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,110,0,1,0,1,0,1,2,5,0 +2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,110,0,1,0,1,0,1,2,5,0 +2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,110,0,1,0,1,0,1,2,5,0 +2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,110,0,1,0,1,0,1,2,5,0 +2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,110,0,1,0,1,0,1,2,5,0 +2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,110,0,1,0,1,0,1,2,5,0 +2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,110,0,1,0,1,0,1,2,5,0 +2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,110,0,1,0,1,0,1,2,5,0 +2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,110,0,1,0,1,0,1,2,5,0 +2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,110,0,1,0,1,0,1,2,5,0 +2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,110,0,1,0,1,0,1,2,5,0 +2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,110,0,1,0,1,0,1,2,5,0 +2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,110,0,1,0,1,0,1,2,5,0 +2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,110,0,1,0,1,0,1,2,5,0 +2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,110,0,1,0,1,0,1,2,5,0 +2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,110,0,1,0,1,0,1,2,5,0 +2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,110,0,1,0,1,0,1,2,5,0 +2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,110,0,1,0,1,0,1,2,5,0 +2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,110,0,1,0,1,0,1,2,5,0 +2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,110,0,1,0,1,0,1,2,5,0 +2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,110,0,1,0,1,0,1,2,5,0 +2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,110,0,1,0,1,0,1,2,5,0 +2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,110,0,1,0,1,0,1,2,5,0 +2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,110,0,1,0,1,0,1,2,5,0 +2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,110,0,1,0,1,0,1,2,5,0 +2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,110,0,1,0,1,0,1,2,5,0 +2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,110,0,1,0,1,0,1,2,5,0 +2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,110,0,1,0,1,0,1,2,5,0 +2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,110,0,1,0,1,0,1,2,5,0 +2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,110,0,1,0,1,0,1,2,5,0 +2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,110,0,1,0,1,0,1,2,5,0 +2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,110,0,1,0,1,0,1,2,5,0 +2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,110,0,1,0,1,0,1,2,5,0 +2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,110,0,1,0,1,0,1,2,5,0 +2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,110,0,1,0,1,0,1,2,5,0 +2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,110,0,1,0,1,0,1,2,5,0 +2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,110,0,1,0,1,0,1,2,5,0 +2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,110,0,1,0,1,0,1,2,5,0 +2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,110,0,1,0,1,0,1,2,5,0 +2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,110,0,1,0,1,0,1,2,5,0 +2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,110,0,1,0,1,0,1,2,5,0 +2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,110,0,1,0,1,0,1,2,5,0 +2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,110,0,1,0,1,0,1,2,5,0 +2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,110,0,1,0,1,0,1,2,5,0 \ No newline at end of file diff --git a/docs/archunit-history/ant_cycles_history_with_tests.csv b/docs/archunit-history/ant_cycles_history_with_tests.csv new file mode 100644 index 000000000..913514dc6 --- /dev/null +++ b/docs/archunit-history/ant_cycles_history_with_tests.csv @@ -0,0 +1,637 @@ +date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util +2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,67,0,0,0,1,0,1,22,5,1 +2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,67,0,0,0,1,0,1,22,5,1 +2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,67,0,0,0,1,0,1,22,5,1 +2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,67,0,0,0,1,0,1,22,5,1 +2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,67,0,0,0,1,0,1,22,5,1 +2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,67,0,0,0,1,0,1,22,5,1 +2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,67,0,0,0,1,0,1,22,5,1 +2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,67,0,0,0,1,0,1,22,5,1 +2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,67,0,0,0,1,0,1,22,5,1 +2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,67,0,0,0,1,0,1,22,5,1 +2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,67,0,0,0,1,0,1,22,5,1 +2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,67,0,0,0,1,0,1,22,5,1 +2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,67,0,0,0,1,0,1,22,5,1 +2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,67,0,0,0,1,0,1,22,5,1 +2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,67,0,0,0,1,0,1,22,5,1 +2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,67,0,0,0,1,0,1,22,5,1 +2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,67,0,0,0,1,0,1,22,5,1 +2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,67,0,0,0,1,0,1,22,5,1 +2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,67,0,0,0,1,0,1,22,5,1 +2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,67,0,0,0,1,0,1,22,5,1 +2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,67,0,0,0,1,0,1,22,5,1 +2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,67,0,0,0,1,0,1,22,5,1 +2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,67,0,0,0,1,0,1,22,5,1 +2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,67,0,0,0,1,0,1,22,5,1 +2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,67,0,0,0,1,0,1,22,5,1 +2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,67,0,0,0,1,0,1,22,5,1 +2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,67,0,0,0,1,0,1,22,5,1 +2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,67,0,0,0,1,0,1,22,5,1 +2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,67,0,0,0,1,0,1,22,5,1 +2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,67,0,0,0,1,0,1,22,5,1 +2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,67,0,0,0,1,0,1,22,5,1 +2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,67,0,0,0,1,0,1,22,5,1 +2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,67,0,0,0,1,0,1,22,5,1 +2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,67,0,0,0,1,0,1,22,5,1 +2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,67,0,0,0,1,0,1,22,5,1 +2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,67,0,0,0,1,0,1,22,5,1 +2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,67,0,0,0,1,0,1,22,5,1 +2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,67,0,0,0,1,0,1,22,5,1 +2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,67,0,0,0,1,0,1,22,5,1 +2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,67,0,0,0,1,0,1,22,5,1 +2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,67,0,0,0,1,0,1,22,5,1 +2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,67,0,0,0,1,0,1,22,5,1 +2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,67,0,0,0,1,0,1,22,5,1 +2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,67,0,0,0,1,0,1,22,5,1 +2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,67,0,0,0,1,0,1,22,5,1 +2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,67,0,0,0,1,0,1,22,5,1 +2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,67,0,0,0,1,0,1,22,5,1 +2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,67,0,0,0,1,0,1,22,5,1 +2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,67,0,0,0,1,0,1,22,5,1 +2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,67,0,0,0,1,0,1,22,5,1 +2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,67,0,0,0,1,0,1,22,5,1 +2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,67,0,0,0,1,0,1,22,5,1 +2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,67,0,0,0,1,0,1,22,5,1 +2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,67,0,0,0,1,0,1,22,5,1 +2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,67,0,0,0,1,0,1,22,5,1 +2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,67,0,0,0,1,0,1,22,5,1 +2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,67,0,0,0,1,0,1,22,5,1 +2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,67,0,0,0,1,0,1,22,5,1 +2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,67,0,0,0,1,0,1,22,5,1 +2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,67,0,0,0,1,0,1,22,5,1 +2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,67,0,0,0,1,0,1,22,5,1 +2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,67,0,0,0,1,0,1,22,5,1 +2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,67,0,0,0,1,0,1,22,5,1 +2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,67,0,0,0,1,0,1,22,5,1 +2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,67,0,0,0,1,0,1,22,5,1 +2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,67,0,0,0,1,0,1,36,5,1 +2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,67,0,0,0,1,0,1,36,5,1 +2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,67,0,0,0,1,0,1,36,5,1 +2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,67,0,0,0,1,0,1,36,5,1 +2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,67,0,0,0,1,0,1,36,5,1 +2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,67,0,0,0,1,0,1,36,5,1 +2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,67,0,0,0,1,0,1,36,5,1 +2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,67,0,0,0,1,0,1,36,5,1 +2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,67,0,0,0,1,0,1,36,5,1 +2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,67,0,0,0,1,0,1,36,5,1 +2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,67,0,0,0,1,0,1,36,5,1 +2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,67,0,0,0,1,0,1,36,5,1 +2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,67,0,0,0,1,0,1,36,5,1 +2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,67,0,0,0,1,0,1,36,5,1 +2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,67,0,0,0,1,0,1,36,5,1 +2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,67,0,0,0,1,0,1,36,5,1 +2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,67,0,0,0,1,0,1,36,5,1 +2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,67,0,0,0,1,0,1,36,5,1 +2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,67,0,0,0,1,0,1,36,5,1 +2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,67,0,0,0,1,0,1,36,5,1 +2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,67,0,0,0,1,0,1,36,5,1 +2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,67,0,0,0,1,0,1,36,5,1 +2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,67,0,0,0,1,0,1,36,5,1 +2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,67,0,0,0,1,0,1,36,5,1 +2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,67,0,0,0,1,0,1,36,5,1 +2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,67,0,0,0,1,0,1,36,5,1 +2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,67,0,0,0,1,0,1,36,5,1 +2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,67,0,0,0,1,0,1,36,5,1 +2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,67,0,0,0,1,0,1,36,5,1 +2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,67,0,0,0,1,0,1,36,5,1 +2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,67,0,0,0,1,0,1,36,5,1 +2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,67,0,0,0,1,0,1,36,5,1 +2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,67,0,0,0,1,0,1,36,5,1 +2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,67,0,0,0,1,0,1,36,5,1 +2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,67,0,0,0,1,0,1,36,5,1 +2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,67,0,0,0,1,0,1,36,5,1 +2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,67,0,0,0,1,0,1,36,5,1 +2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,67,0,0,0,1,0,1,36,5,1 +2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,67,0,0,0,1,0,1,36,5,1 +2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,67,0,0,0,1,0,1,36,5,1 +2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,67,0,0,0,1,0,1,36,5,1 +2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,67,0,0,0,1,0,1,36,5,1 +2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,67,0,0,0,1,0,1,36,5,1 +2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,67,0,0,0,1,0,1,36,5,1 +2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,67,0,0,0,1,0,1,36,5,1 +2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,67,0,0,0,1,0,1,36,5,1 +2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,67,0,0,0,1,0,1,36,5,1 +2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,67,0,0,0,1,0,1,36,5,1 +2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,67,0,0,0,1,0,1,36,5,1 +2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,67,0,0,0,1,0,1,36,5,1 +2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,67,0,0,0,1,0,1,36,5,1 +2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,67,0,0,0,1,0,1,36,5,1 +2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,67,0,0,0,1,0,1,36,5,1 +2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,67,0,0,0,1,0,1,36,5,1 +2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,67,0,0,0,1,0,1,36,5,1 +2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,67,0,0,0,1,0,1,36,5,1 +2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,67,0,0,0,1,0,1,36,5,1 +2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,67,0,0,0,1,0,1,36,5,1 +2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,67,0,0,0,1,0,1,36,5,1 +2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,67,0,0,0,1,0,1,36,5,1 +2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,67,0,0,0,1,0,1,36,5,1 +2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,67,0,0,0,1,0,1,36,5,1 +2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,67,0,0,0,1,0,1,36,5,1 +2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,67,0,0,0,1,0,1,36,5,1 +2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,67,0,0,0,1,0,1,36,5,1 +2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,67,0,0,0,1,0,1,36,5,1 +2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,67,0,0,0,1,0,1,36,5,1 +2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,67,0,0,0,1,0,1,36,5,1 +2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,67,0,0,0,1,0,1,36,5,1 +2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,67,0,0,0,1,0,1,36,5,1 +2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,67,0,0,0,1,0,1,36,5,1 +2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,67,0,0,0,1,0,1,36,5,1 +2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,67,0,0,0,1,0,1,36,5,1 +2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,67,0,0,0,1,0,1,36,5,1 +2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,67,0,0,0,1,0,1,36,5,1 +2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,67,0,0,0,1,0,1,36,5,1 +2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,67,0,0,0,1,0,1,36,5,1 +2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,67,0,0,0,1,0,1,36,5,1 +2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,67,0,0,0,1,0,1,36,5,1 +2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,67,0,0,0,1,0,1,36,5,1 +2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,67,0,0,0,1,0,1,36,5,1 +2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,67,0,0,0,1,0,1,36,5,1 +2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,67,0,0,0,1,0,1,36,5,1 +2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,67,0,0,0,1,0,1,36,5,1 +2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,67,0,0,0,1,0,1,36,5,1 +2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,67,0,0,0,1,0,1,36,5,1 +2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,67,0,0,0,1,0,1,36,5,1 +2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,67,0,0,0,1,0,1,36,5,1 +2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,67,0,0,0,1,0,1,36,5,1 +2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,67,0,0,0,1,0,1,36,5,1 +2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,67,0,0,0,1,0,1,36,5,1 +2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,67,0,0,0,1,0,1,36,5,1 +2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,67,0,0,0,1,0,1,36,5,1 +2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,67,0,0,0,1,0,1,36,5,1 +2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,67,0,0,0,1,0,1,36,5,1 +2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,67,0,0,0,1,0,1,36,5,1 +2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,67,0,0,0,1,0,1,36,5,1 +2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,67,0,0,0,1,0,1,36,5,1 +2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,67,0,0,0,1,0,1,36,5,1 +2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,67,0,0,0,1,0,1,36,5,1 +2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,67,0,0,0,1,0,1,36,5,1 +2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,67,0,0,0,1,0,1,36,5,1 +2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,67,0,0,0,1,0,1,36,5,1 +2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,67,0,0,0,1,0,1,36,5,1 +2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,67,0,0,0,1,0,1,36,5,1 +2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,67,0,0,0,1,0,1,36,5,1 +2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,67,0,0,0,1,0,1,36,5,1 +2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,67,0,0,0,1,0,1,36,5,1 +2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,67,0,0,0,1,0,1,36,5,1 +2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,67,0,0,0,1,0,1,36,5,1 +2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,67,0,0,0,1,0,1,36,5,1 +2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,67,0,0,0,1,0,1,36,5,1 +2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,67,0,0,0,1,0,1,36,5,1 +2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,67,0,0,0,1,0,1,36,5,1 +2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,67,0,0,0,1,0,1,36,5,1 +2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,67,0,0,0,1,0,1,36,5,1 +2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,67,0,0,0,1,0,1,36,5,1 +2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,67,0,0,0,1,0,1,36,5,1 +2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,67,0,0,0,1,0,1,36,5,1 +2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,67,0,0,0,1,0,1,36,5,1 +2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,67,0,0,0,1,0,1,36,5,1 +2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,67,0,0,0,1,0,1,36,5,1 +2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,67,0,0,0,1,0,1,36,5,1 +2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,67,0,0,0,1,0,1,36,5,1 +2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,67,0,0,0,1,0,1,36,5,1 +2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,67,0,0,0,1,0,1,36,5,1 +2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,67,0,0,0,1,0,1,36,5,1 +2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,67,0,0,0,1,0,1,36,5,1 +2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,67,0,0,0,1,0,1,36,5,1 +2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,67,0,0,0,1,0,1,36,5,1 +2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,67,0,0,0,1,0,1,36,5,1 +2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,67,0,0,0,1,0,1,36,5,1 +2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,67,0,0,0,1,0,1,36,5,1 +2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,67,0,0,0,1,0,1,36,5,1 +2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,67,0,0,0,1,0,1,36,5,1 +2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,67,0,0,0,1,0,1,36,5,1 +2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,67,0,0,0,1,0,1,36,5,1 +2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,67,0,0,0,1,0,1,36,5,1 +2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,67,0,0,0,1,0,1,36,5,1 +2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,67,0,0,0,1,0,1,36,5,1 +2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,67,0,0,0,1,0,1,36,5,1 +2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,67,0,0,0,1,0,1,36,5,1 +2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,67,0,0,0,1,0,1,36,5,1 +2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,67,0,0,0,1,0,1,36,5,1 +2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,67,0,0,0,1,0,1,36,5,1 +2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,67,0,0,0,1,0,1,36,5,1 +2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,67,0,0,0,1,0,1,36,5,1 +2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,67,0,0,0,1,0,1,36,5,1 +2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,67,0,0,0,1,0,1,36,5,1 +2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,67,0,0,0,1,0,1,36,5,1 +2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,67,0,0,0,1,0,1,36,5,1 +2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,67,0,0,0,1,0,1,36,5,1 +2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,67,0,0,0,1,0,1,36,5,1 +2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,67,0,0,0,1,0,1,36,5,1 +2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,67,0,0,0,1,0,1,36,5,1 +2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,67,0,0,0,1,0,1,36,5,1 +2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,67,0,0,0,1,0,1,36,5,1 +2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,67,0,0,0,1,0,1,36,5,1 +2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,67,0,0,0,1,0,1,36,5,1 +2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,67,0,0,0,1,0,1,36,5,1 +2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,67,0,0,0,1,0,1,36,5,1 +2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,67,0,0,0,1,0,1,36,5,1 +2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,67,0,0,0,1,0,1,36,5,1 +2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,67,0,0,0,1,0,1,36,5,1 +2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,67,0,0,0,1,0,1,36,5,1 +2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,67,0,0,0,1,0,1,36,5,1 +2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,67,0,0,0,1,0,1,36,5,1 +2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,67,0,0,0,1,0,1,36,5,1 +2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,67,0,0,0,1,0,1,36,5,1 +2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,67,0,0,0,1,0,1,36,5,1 +2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,67,0,0,0,1,0,1,36,5,1 +2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,67,0,0,0,1,0,1,36,5,1 +2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,67,0,0,0,1,0,1,36,5,1 +2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,67,0,0,0,1,0,1,36,5,1 +2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,67,0,0,0,1,0,1,36,5,1 +2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,67,0,0,0,1,0,1,36,5,1 +2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,67,0,0,0,1,0,1,36,5,1 +2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,67,0,0,0,1,0,1,36,5,1 +2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,67,0,0,0,1,0,1,36,5,1 +2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,67,0,0,0,1,0,1,36,5,1 +2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,67,0,0,0,1,0,1,36,5,1 +2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,67,0,0,0,1,0,1,36,5,1 +2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,67,0,0,0,1,0,1,36,5,1 +2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,67,0,0,0,1,0,1,36,5,1 +2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,67,0,0,0,1,0,1,36,5,1 +2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,67,0,0,0,1,0,1,36,5,1 +2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,67,0,0,0,1,0,1,36,5,1 +2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,67,0,0,0,1,0,1,36,5,1 +2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,67,0,0,0,1,0,1,36,5,1 +2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,67,0,0,0,1,0,1,36,5,1 +2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,67,0,0,0,1,0,1,36,5,1 +2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,67,0,0,0,1,0,1,36,5,1 +2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,67,0,0,0,1,0,1,36,5,1 +2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,67,0,0,0,1,0,1,36,5,1 +2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,67,0,0,0,1,0,1,36,5,1 +2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,67,0,0,0,1,0,1,36,5,1 +2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,67,0,0,0,1,0,1,36,5,1 +2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,67,0,0,0,1,0,1,36,5,1 +2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,67,0,0,0,1,0,1,36,5,1 +2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,67,0,0,0,1,0,1,36,5,1 +2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,67,0,0,0,1,0,1,36,5,1 +2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,67,0,0,0,1,0,1,36,5,1 +2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,67,0,0,0,1,0,1,36,5,1 +2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,67,0,0,0,1,0,1,36,5,1 +2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,67,0,0,0,1,0,1,36,5,1 +2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,67,0,0,0,1,0,1,36,5,1 +2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,67,0,0,0,1,0,1,36,5,1 +2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,67,0,0,0,1,0,1,36,5,2 +2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,67,0,0,0,1,0,1,36,5,2 +2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,67,0,0,0,1,0,1,36,5,2 +2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,67,0,0,0,1,0,1,36,5,2 +2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,67,0,0,0,1,0,1,36,5,2 +2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,67,0,0,0,1,0,1,36,5,2 +2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,67,0,0,0,1,0,1,36,5,2 +2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,67,0,0,0,1,0,1,36,5,2 +2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,67,0,0,0,1,0,1,36,5,2 +2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,67,0,0,0,1,0,1,36,5,2 +2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,67,0,0,0,1,0,1,36,5,2 +2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,67,0,0,0,1,0,1,36,5,2 +2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,67,0,0,0,1,0,1,36,5,2 +2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,67,0,0,0,1,0,1,36,5,2 +2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,67,0,0,0,1,0,1,36,5,2 +2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,67,0,0,0,1,0,1,36,5,2 +2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,67,0,0,0,1,0,1,36,5,2 +2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,67,0,0,0,1,0,1,36,5,2 +2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,67,0,0,0,1,0,1,36,5,2 +2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,67,0,0,0,1,0,1,36,5,2 +2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,67,0,0,0,1,0,1,36,5,2 +2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,67,0,0,0,1,0,1,36,5,2 +2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,67,0,0,0,1,0,1,36,5,2 +2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,67,0,0,0,2,0,1,36,5,2 +2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,67,0,0,0,2,0,1,36,5,2 +2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,67,0,0,0,2,0,1,36,5,2 +2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,67,0,0,0,2,0,1,36,5,2 +2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,75,0,0,0,3,0,1,36,5,2 +2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,75,0,0,0,3,0,1,36,5,2 +2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,75,0,0,0,3,0,1,36,5,2 +2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,75,0,0,0,3,0,1,36,5,2 +2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,75,0,0,0,3,0,1,36,5,2 +2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,75,0,0,0,3,0,1,36,5,2 +2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,75,0,0,0,3,0,1,36,5,2 +2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,75,0,0,0,3,0,1,36,5,2 +2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,75,0,0,0,3,0,1,36,5,2 +2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,75,0,0,0,3,0,1,36,5,2 +2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,75,0,0,0,3,0,1,36,5,1 +2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,75,0,0,0,3,0,1,36,5,1 +2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,75,0,0,0,3,0,1,36,5,1 +2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,75,0,0,0,3,0,1,36,5,1 +2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,75,0,0,0,3,0,1,36,5,1 +2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,75,0,0,0,3,0,1,36,5,1 +2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,75,0,0,0,3,0,1,36,5,1 +2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,75,0,0,0,3,0,1,36,5,1 +2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,75,0,0,0,3,0,1,36,5,1 +2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,75,0,0,0,3,0,1,36,5,1 +2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,75,0,0,0,3,0,1,36,5,1 +2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,75,0,0,0,3,0,1,36,5,1 +2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,75,0,0,0,3,0,1,36,5,1 +2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,75,0,0,0,3,0,1,36,5,1 +2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,75,0,0,0,3,0,1,36,5,1 +2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,75,0,0,0,3,0,1,36,5,1 +2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,75,0,0,0,3,0,1,36,5,1 +2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,75,0,0,0,3,0,1,36,5,1 +2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,75,0,0,0,3,0,1,36,5,1 +2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,75,0,0,0,3,0,1,36,5,1 +2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,75,0,0,0,3,0,1,36,5,1 +2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,75,0,0,0,3,0,1,36,5,1 +2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,75,0,0,0,3,0,1,36,5,1 +2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,75,0,0,0,3,0,1,36,5,1 +2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,75,0,0,0,3,0,1,36,5,1 +2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,75,0,0,0,3,0,1,36,5,1 +2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,75,0,0,0,3,0,1,36,5,1 +2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,75,0,0,0,3,0,1,36,5,1 +2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,75,0,0,0,3,0,1,36,5,1 +2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,75,0,0,0,3,0,1,36,5,1 +2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,75,0,0,0,3,0,1,36,5,1 +2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,75,0,0,0,3,0,1,36,5,1 +2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,75,0,0,0,3,0,1,36,5,1 +2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,75,0,0,0,3,0,1,36,5,1 +2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,75,0,0,0,3,0,1,36,5,1 +2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,75,0,0,0,3,0,1,36,5,1 +2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,75,0,0,0,3,0,1,36,5,1 +2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,75,0,0,0,3,0,1,36,5,1 +2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,75,0,0,0,3,0,1,36,5,1 +2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,75,0,0,0,3,0,1,36,5,1 +2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,75,0,0,0,3,0,1,36,5,1 +2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,75,0,0,0,3,0,1,36,5,1 +2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,75,0,0,0,3,0,1,36,5,1 +2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,75,0,0,0,3,0,1,36,5,1 +2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,75,0,0,0,3,0,1,36,5,1 +2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,75,0,0,0,3,0,1,36,5,1 +2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,75,0,0,0,3,0,1,36,5,1 +2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,75,0,0,0,3,0,1,36,5,1 +2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,75,0,0,0,3,0,1,36,5,1 +2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,75,0,0,0,3,0,1,36,5,1 +2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,75,0,0,0,3,0,1,36,5,1 +2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,75,0,0,0,3,0,1,36,5,1 +2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,75,0,0,0,3,0,1,36,5,1 +2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,75,0,0,0,3,0,1,36,5,1 +2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,75,0,0,0,3,0,1,36,5,1 +2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,75,0,0,0,3,0,1,36,5,1 +2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,75,0,0,0,3,0,1,36,5,1 +2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,75,0,0,0,3,0,1,36,5,1 +2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,75,0,0,0,3,0,1,36,5,1 +2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,75,0,0,0,3,0,1,36,5,1 +2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,75,0,0,0,3,0,1,36,5,1 +2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,75,0,0,0,3,0,1,36,5,1 +2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,75,0,0,0,3,0,1,36,5,1 +2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,75,0,0,0,3,0,1,36,5,1 +2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,75,0,0,0,3,0,1,36,5,1 +2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,75,0,0,0,3,0,1,36,5,1 +2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,75,0,0,0,3,0,1,36,5,1 +2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,75,0,0,0,3,0,1,36,5,1 +2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,75,0,0,0,3,0,1,36,5,1 +2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,75,0,0,0,3,0,1,36,5,1 +2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,75,0,0,0,3,0,1,36,5,1 +2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,75,0,0,0,3,0,1,36,5,1 +2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,75,0,0,0,3,0,1,36,5,1 +2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,75,0,0,0,3,0,1,36,5,1 +2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,75,0,0,0,3,0,1,36,5,1 +2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,75,0,0,0,3,0,1,36,5,1 +2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,75,0,0,0,3,0,1,36,5,1 +2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,75,0,0,0,3,0,1,36,5,1 +2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,75,0,0,0,3,0,1,36,5,1 +2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,75,0,0,0,3,0,1,36,5,1 +2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,75,0,0,0,3,0,1,36,5,1 +2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,75,0,0,0,3,0,1,36,5,1 +2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,280,0,1,0,3,0,1,36,5,1 +2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,280,0,1,0,3,0,1,36,5,1 +2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,280,0,1,0,3,0,1,36,5,1 +2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,280,0,1,0,3,0,1,36,5,1 +2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,280,0,1,0,3,0,1,36,5,1 +2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,280,0,1,0,3,0,1,36,5,1 +2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,280,0,1,0,3,0,1,36,5,1 +2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,280,0,1,0,3,0,1,36,5,1 +2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,280,0,1,0,3,0,1,36,5,1 +2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,280,0,1,0,3,0,1,36,5,1 +2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,280,0,1,0,3,0,1,36,5,1 +2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,280,0,1,0,3,0,1,36,5,1 +2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,280,0,1,0,3,0,1,36,5,1 +2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,280,0,1,0,3,0,1,36,5,1 +2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,280,0,1,0,3,0,1,36,5,1 +2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,280,0,1,0,3,0,1,36,5,1 +2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,280,0,1,0,3,0,1,36,5,1 +2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,280,0,1,0,3,0,1,36,5,1 +2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,349,0,1,0,1,0,1,36,5,2 +2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,349,0,1,0,1,0,1,36,5,2 +2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,349,0,1,0,1,0,1,36,5,2 +2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,349,0,1,0,1,0,1,36,5,2 +2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,349,0,1,0,1,0,1,36,5,2 +2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,349,0,1,0,1,0,1,36,5,2 +2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,349,0,1,0,1,0,1,36,5,2 +2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,349,0,1,0,1,0,1,36,5,2 +2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,349,0,1,0,1,0,1,36,5,2 +2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,349,0,1,0,1,0,1,36,5,2 +2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,349,0,1,0,1,0,1,36,5,2 +2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,349,0,1,0,1,0,1,36,5,2 +2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,349,0,1,0,1,0,1,36,5,2 +2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,349,0,1,0,1,0,1,36,5,2 +2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,349,0,1,0,1,0,1,36,5,2 +2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,349,0,1,0,1,0,1,36,5,2 +2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,349,0,1,0,1,0,1,36,5,2 +2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,349,0,1,0,1,0,1,36,5,2 +2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,349,0,1,0,1,0,1,36,5,2 +2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,349,0,1,0,1,0,1,36,5,2 +2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,349,0,1,0,1,0,1,36,5,2 +2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,349,0,1,0,1,0,1,36,5,2 +2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,349,0,1,0,1,0,1,36,5,2 +2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,349,0,1,0,1,0,1,36,5,2 +2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,349,0,1,0,1,0,1,36,5,2 +2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,349,0,1,0,1,0,1,36,5,2 +2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,349,0,1,0,1,0,1,36,5,2 +2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,349,0,1,0,1,0,1,36,5,2 +2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,349,0,1,0,1,0,1,36,5,2 +2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,349,0,1,0,1,0,1,36,5,2 +2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,349,0,1,0,1,0,1,36,5,2 +2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,349,0,1,0,1,0,1,36,5,2 +2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,349,0,1,0,1,0,1,36,5,2 +2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,349,0,1,0,1,0,1,36,5,2 +2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,349,0,1,0,1,0,1,36,5,2 +2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,349,0,1,0,1,0,1,36,5,2 +2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,349,0,1,0,1,0,1,36,5,2 +2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,349,0,1,0,1,0,1,36,5,2 +2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,349,0,1,0,1,0,1,36,5,2 +2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,349,0,1,0,1,0,1,36,5,2 +2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,349,0,1,0,1,0,1,36,5,2 +2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,349,0,1,0,1,0,1,36,5,2 +2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,349,0,1,0,1,0,1,36,5,2 +2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,349,0,1,0,1,0,1,36,5,2 +2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,349,0,1,0,1,0,1,36,5,2 +2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,349,0,1,0,1,0,1,36,5,2 +2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,349,0,1,0,1,0,1,36,5,2 +2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,349,0,1,0,1,0,1,36,5,2 +2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,349,0,1,0,1,0,1,36,5,2 +2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,349,0,1,0,1,0,1,36,5,2 +2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,349,0,1,0,1,0,1,36,5,2 +2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,349,0,1,0,1,0,1,36,5,2 +2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,349,0,1,0,1,0,1,36,5,2 +2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,349,0,1,0,1,0,1,36,5,2 +2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,349,0,1,0,1,0,1,36,5,2 +2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,349,0,1,0,1,0,1,36,5,2 +2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,349,0,1,0,1,0,1,36,5,2 +2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,349,0,1,0,1,0,1,36,5,2 +2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,349,0,1,0,1,0,1,36,5,2 +2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,349,0,1,0,1,0,1,36,5,2 +2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,349,0,1,0,1,0,1,36,5,2 +2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,349,0,1,0,1,0,1,36,5,2 +2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,349,0,1,0,1,0,1,36,5,2 +2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,349,0,1,0,1,0,1,36,5,2 +2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,349,0,1,0,1,0,1,36,5,2 +2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,349,0,1,0,1,0,1,36,5,2 +2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,349,0,1,0,1,0,1,36,5,2 +2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,349,0,1,0,1,0,1,36,5,2 +2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,349,0,1,0,1,0,1,36,5,2 +2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,349,0,1,0,1,0,1,36,5,2 +2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,349,0,1,0,1,0,1,36,5,2 +2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,349,0,1,0,1,0,1,36,5,2 +2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,349,0,1,0,1,0,1,36,5,2 +2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,349,0,1,0,1,0,1,36,5,2 +2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,349,0,1,0,1,0,1,36,5,2 +2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,349,0,1,0,1,0,1,36,5,2 +2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,349,0,1,0,1,0,1,36,5,2 +2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,349,0,1,0,1,0,1,36,5,2 +2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,407,0,1,0,1,0,1,36,5,2 +2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,349,0,1,0,1,0,1,36,5,2 +2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,349,0,1,0,1,0,1,36,5,2 +2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,349,0,1,0,1,0,1,36,5,2 +2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,349,0,1,0,1,0,1,36,5,2 +2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,349,0,1,0,1,0,1,36,5,2 +2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,349,0,1,0,1,0,1,36,5,2 +2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,349,0,1,0,1,0,1,36,5,2 +2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,407,0,1,0,1,0,1,36,5,2 +2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,407,0,1,0,1,0,1,36,5,2 +2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,407,0,1,0,1,0,1,36,5,2 +2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,407,0,1,0,1,0,1,36,5,2 +2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,407,0,1,0,1,0,1,36,5,2 +2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,407,0,1,0,1,0,1,36,5,2 +2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,407,0,1,0,1,0,1,36,5,2 +2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,407,0,1,0,1,0,1,36,5,2 +2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,572,0,1,0,1,0,1,36,5,2 +2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,572,0,1,0,1,0,1,36,5,2 +2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,572,0,1,0,1,0,1,36,5,2 +2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,572,0,1,0,1,0,1,36,5,2 +2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,572,0,1,0,1,0,1,36,5,2 +2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,572,0,1,0,1,0,1,36,5,2 +2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,572,0,1,0,1,0,1,36,5,2 +2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,572,0,1,0,1,0,1,36,5,2 +2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,572,0,1,0,1,0,1,36,5,2 +2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,572,0,1,0,1,0,1,36,5,2 +2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,572,0,1,0,1,0,1,36,5,2 +2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,572,0,1,0,1,0,1,36,5,2 +2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,572,0,1,0,1,0,1,36,5,2 +2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,572,0,1,0,1,0,1,36,5,2 +2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,572,0,1,0,1,0,1,36,5,2 +2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,572,0,1,0,1,0,1,36,5,2 +2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,572,0,1,0,1,0,1,36,5,2 +2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,572,0,1,0,1,0,1,36,5,2 +2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,572,0,1,0,1,0,1,36,5,2 +2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,572,0,1,0,1,0,1,36,5,2 +2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,572,0,1,0,1,0,1,36,5,2 +2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,572,0,1,0,1,0,1,36,5,2 +2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,572,0,1,0,1,0,1,36,5,2 +2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,572,0,1,0,1,0,1,36,5,2 +2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,572,0,1,0,1,0,1,36,5,2 +2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,572,0,1,0,1,0,1,36,5,2 +2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,572,0,1,0,1,0,1,36,5,2 +2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,572,0,1,0,1,0,1,36,5,2 +2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,572,0,1,0,1,0,1,36,5,2 +2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,572,0,1,0,1,0,1,36,5,2 +2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,572,0,1,0,1,0,1,36,5,2 +2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,572,0,1,0,1,0,1,36,5,2 +2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,572,0,1,0,1,0,1,36,5,2 +2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,572,0,1,0,1,0,1,36,5,2 +2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,572,0,1,0,1,0,1,36,5,2 +2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,572,0,1,0,1,0,1,36,5,2 +2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,572,0,1,0,1,0,1,36,5,2 +2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,572,0,1,0,1,0,1,36,5,2 +2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,572,0,1,0,1,0,1,36,5,2 +2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,572,0,1,0,1,0,1,36,5,2 +2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,572,0,1,0,1,0,1,36,5,2 +2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,572,0,1,0,1,0,1,36,5,2 +2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,572,0,1,0,1,0,1,36,5,2 +2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,572,0,1,0,1,0,1,36,5,2 +2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,572,0,1,0,1,0,1,36,5,2 +2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,572,0,1,0,1,0,1,36,5,2 +2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,572,0,1,0,1,0,1,36,5,2 +2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,572,0,1,0,1,0,1,36,5,2 +2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,572,0,1,0,1,0,1,36,5,2 +2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,572,0,1,0,1,0,1,36,5,2 +2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,572,0,1,0,1,0,1,36,5,2 +2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,572,0,1,0,1,0,1,36,5,2 +2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,572,0,1,0,1,0,1,36,5,2 +2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,572,0,1,0,1,0,1,36,5,2 +2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,572,0,1,0,1,0,1,36,5,2 +2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,572,0,1,0,1,0,1,36,5,2 +2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,572,0,1,0,1,0,1,36,5,2 +2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,572,0,1,0,1,0,1,36,5,2 +2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,572,0,1,0,1,0,1,36,5,2 +2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,572,0,1,0,1,0,1,36,5,2 +2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,572,0,1,0,1,0,1,36,5,2 +2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,572,0,1,0,1,0,1,36,5,2 +2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,572,0,1,0,1,0,1,36,5,2 +2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,572,0,1,0,1,0,1,36,5,2 +2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,572,0,1,0,1,0,1,36,5,2 +2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,572,0,1,0,1,0,1,36,5,2 +2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,572,0,1,0,1,0,1,36,5,2 +2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,572,0,1,0,1,0,1,36,5,2 +2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,572,0,1,0,1,0,1,36,5,2 +2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,572,0,1,0,1,0,1,36,5,2 +2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,572,0,1,0,1,0,1,36,5,2 +2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,572,0,1,0,1,0,1,36,5,2 +2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,572,0,1,0,1,0,1,36,5,2 +2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,572,0,1,0,1,0,1,36,5,2 +2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,572,0,1,0,1,0,1,36,5,2 +2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,572,0,1,0,1,0,1,36,5,2 +2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,572,0,1,0,1,0,1,36,5,2 +2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,572,0,1,0,1,0,1,36,5,2 +2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,572,0,1,0,1,0,1,36,5,2 +2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,572,0,1,0,1,0,1,36,5,2 +2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,572,0,1,0,1,0,1,36,5,2 +2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,572,0,1,0,1,0,1,36,5,2 +2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,572,0,1,0,1,0,1,36,5,2 +2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,572,0,1,0,1,0,1,36,5,2 +2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,572,0,1,0,1,0,1,36,5,2 +2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,572,0,1,0,1,0,1,36,5,2 +2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,572,0,1,0,1,0,1,36,5,2 +2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,572,0,1,0,1,0,1,36,5,2 +2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,572,0,1,0,1,0,1,36,5,2 +2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,572,0,1,0,1,0,1,36,5,2 +2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,572,0,1,0,1,0,1,36,5,2 +2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,572,0,1,0,1,0,1,36,5,2 +2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,572,0,1,0,1,0,1,36,5,2 +2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,572,0,1,0,1,0,1,36,5,2 +2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,572,0,1,0,1,0,1,36,5,2 +2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,572,0,1,0,1,0,1,36,5,2 +2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,572,0,1,0,1,0,1,36,5,2 +2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,572,0,1,0,1,0,1,36,5,2 +2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,572,0,1,0,1,0,1,36,5,2 \ No newline at end of file diff --git a/docs/archunit-history/ant_layers_history.csv b/docs/archunit-history/ant_layers_history.csv new file mode 100644 index 000000000..f0bb0048e --- /dev/null +++ b/docs/archunit-history/ant_layers_history.csv @@ -0,0 +1,637 @@ +date,time,commit,violations +2010-09-09,14:29:42,4cdc2d1294593d2fec22b72c7a42bff1de5823d4,0 +2010-09-09,15:05:27,a6eb1366851b2b8a8ad63160dff70498d425d8c5,0 +2010-09-09,15:20:32,3d29557fb79f8bb78f1e36779145d42ec4cf2872,0 +2010-09-09,17:09:43,ffe3c808ad44bf1bafc006084ad8d4345c7507d2,0 +2010-09-09,17:38:57,19565962281ec2bb9c5b4541e994fe6c732e3197,0 +2010-09-10,07:22:54,8479c821d021a16090e8bc3dc9657a3a0e9e3e2b,0 +2010-09-10,08:04:50,0a9aed2a8d7118a4b593037fe1194fe3884b5582,0 +2010-09-10,09:30:12,71be58eaa293939ba56ca8580d569caae4772072,0 +2010-09-10,09:32:02,44ffae8ffdd400ce3d7399c7ba0846b0c1887eed,0 +2010-09-10,10:04:03,4637938650a1f0a11725c427d355e31cc3671959,0 +2010-09-10,10:51:42,5f9bba73320f8e6543202ef0fc1b6bc2a20955f0,0 +2010-09-10,12:00:25,777a54755cf6de8836aa991be8e30bf00c218665,0 +2010-09-10,12:32:19,52817dde3a286c9aad62e00d203d0510c929b69c,0 +2010-09-10,13:54:59,e2684d80e3c916e35625328d549a38f6871db91d,0 +2010-09-10,14:29:13,8fa4922971ea12705ae8ddc91db625547d042440,0 +2010-09-16,10:06:55,3c28e5573d44984542efa5546daa752b32b4a1c9,0 +2010-09-16,10:07:44,df355f1bc30390524c727f8a4e89869df479aebd,0 +2010-09-16,10:08:17,d8212a565749be8b325df9d0298ac1a3b59f1612,0 +2010-09-16,10:15:45,164e4f25d9a993d298944c611bed182521de8737,0 +2010-09-16,10:48:17,1564fef388d90b0e6f51fc617d3ac90b2406cf15,0 +2010-09-16,10:51:06,454047cf15e11dc6367791ce7259414cb21f365f,0 +2010-09-16,10:56:00,1a62d564318caf11aa6298ed9aa5946510135e2c,0 +2010-09-17,08:31:38,df6e19163f775513a3f5c297c8e09b7b8db4fe87,0 +2010-09-17,08:36:20,3f7511b30f9149db4c94233df3fab5d2ab8b44b1,0 +2010-09-17,09:06:38,62e4942ad767a0fe42c46017ceee195849ebec80,0 +2010-09-17,09:10:38,56e81ea28e6220a501ed1504c9cf8b5c5d6e148c,0 +2010-09-17,09:12:42,8ad572cbaa714cef62057496f2aea44c4045955a,0 +2010-09-17,09:37:16,2d54b480a41374b85d7261d4303e23f41766c0be,0 +2010-09-22,12:00:12,7a05c8634b2e8c33936e8b9ebdb7762050cd7618,0 +2010-09-28,07:56:12,441e5f052679e25ba974700f31e1f420d1319e5a,0 +2010-09-28,07:56:40,ecdadec165c26e70bed46936142e3dd6c0af798a,0 +2010-09-28,13:18:06,49f36c08d547b83f5a9242a6abcae72438fffb20,-1 +2010-09-28,13:19:21,ba6091a3982e544b87eb417b17e5293cc4c8ec33,0 +2010-09-28,13:23:02,0a86e54117c30f43a2cf323030e6694a7f8fb4af,0 +2010-09-28,13:34:27,19007b5f0dd87e5867ebb3e059f0f08858dd3015,0 +2010-09-28,15:11:37,a5ec76f20128f2fde3bfa0894fa4d9a03706697f,0 +2010-09-28,15:13:10,7d3c69b0f99b578b34cd03f57fdb8a258a84e69b,0 +2010-10-04,09:00:46,d84771421039bb6ed1ee12af09eb65b934a3c0b1,0 +2010-10-04,15:17:17,b4e38b8e084ec2692d867dbfa6fe817501d32a79,0 +2010-10-07,08:59:44,d5c08065c13ae1775728a6eb233939a9274e9b4d,0 +2010-10-07,12:32:45,14a78c115522d983c6cdab1dc96154aca821160c,0 +2010-10-12,15:47:54,e512928d62dda29361f5a5423b302fe8aa4fde8e,0 +2010-10-27,10:02:47,6e50481e7abaf0e33cad7d2ad09ce70fb67a6b65,0 +2010-10-29,09:15:47,c9f27e892ea04ade401a9632e587f4636890ff91,0 +2010-10-29,09:55:11,072f4e1fdf9baa873896f006899107f0d4d3494a,0 +2010-10-29,10:47:19,76f9e6945c0e255215fb2aa40bfd04c9bcaa4337,0 +2010-10-29,10:48:30,d8d3367cfaf36758217a72d8bd51160fd4d44c79,0 +2010-10-29,10:50:17,622c83e2520cad3fae1948b700d543810b9df555,0 +2010-11-01,11:04:57,1550177166eadd0e17908155272b26b85f1b155b,0 +2010-12-16,12:07:29,6aee008fe3bc8642a7fcb3d448240e89f71ad0d2,0 +2010-12-17,07:32:28,50e172d41049abfeb7bb786aa591a2234ccebbd2,0 +2010-12-17,07:34:53,779aac8187821075c784bd52ca43f6f1bb67ac3b,0 +2010-12-17,07:36:23,ac3917bbd1e3128b64b6b2732557ed2f7d566951,0 +2010-12-17,07:36:51,03bf1aaa2d7d7a0e23277618386be5ae25e784c8,0 +2010-12-17,07:37:33,96a7f91517e1bd52f6608e09de1446bc2df38d85,0 +2011-02-03,16:16:14,6cb73dc8726d5f808553f045400b1748a6638913,0 +2011-02-08,13:14:14,ca04b3471c6cf621b9c281c9f92ab09647c94df8,0 +2011-02-09,11:20:29,3734c0685fd32a62de768d37511df9351a4acad9,0 +2011-02-09,11:26:06,3c448310cbda7ba40936148f6433e9ef0e9ea4ea,0 +2011-02-09,11:28:11,8748c0b5c2c0be0d967a9a632dbebf71d28e510e,0 +2011-02-09,11:32:04,2ddedfab57cb8f51b4c11c674b739456182137e8,0 +2011-02-11,09:06:56,d7c9e5d04d39b8aa164e9ba8e4d9fc2df78c0304,-1 +2011-02-11,09:10:52,6982286205bb71b98d4db1e16856a568fd10babd,-1 +2011-02-11,09:11:28,b208c2ea610a7095c45c04eca5363224e248836a,0 +2011-02-11,09:13:59,9e56c0d4ce0e37c4f5c75399ab3cf02787e82598,0 +2011-02-11,15:32:33,5169d22784f15c14b7c3531ec47aa998b742a7fa,0 +2011-03-07,12:21:48,d40f62c47afa7145fa864abda76a67f2aa86b312,0 +2011-03-07,12:31:42,290d0f6d659b11a544e0b5c8d9f2d0e083c30d67,0 +2011-03-07,14:09:51,1169d93f923bee05d3765923dc51eb600bb2a158,0 +2011-03-09,15:25:35,14aae2fc5732cc4cf74305cf997e647261e90f45,0 +2011-03-09,15:27:14,d520739ae242969cfd22446a7300f62c4ec7fad2,0 +2011-03-09,15:28:28,96a3d48163cadb56623a54ef9eb807603bc1c146,0 +2011-04-28,13:09:37,62aa08dfb2db539eb0755524477ff50e74a398fa,-1 +2011-04-28,13:29:25,24a0b6e5c486c1cba83aee5027770679e5eb10fc,0 +2011-04-28,13:48:58,9175317c082c2d3982c79b49271c672d0b9c56a9,0 +2011-04-28,13:54:10,e67ec47179dc8417233a4375a39aeb6e7944c18b,0 +2011-04-29,12:34:39,e3386bb33d4abbf7ef1a9e05c1c6a503b7d6a12a,0 +2011-04-29,14:17:36,97ba68533f8e23622996f9e29f5cdc4176e8ae65,0 +2011-04-29,14:20:13,db7c5872af40e54a9ac04e1e9c7f7354f61cf391,0 +2011-04-29,14:50:46,63efdb1a5782eb9b42dbbccd65440e467662eb7a,0 +2011-04-29,14:51:46,a8b306fad7fbf51ce6dc96bd0ec18755132e0797,0 +2011-04-29,15:07:40,95cbc116a9619aa9882756fcb0b91c67f2a4bc1a,0 +2011-05-02,13:13:56,17bafc913862ad2dd18d7823fefbe932001af5c2,0 +2011-05-02,14:56:11,050e2a9c6df162ac4e67f510e98ed431eb5df74a,0 +2011-05-02,15:13:12,e37699775457df6d4be554bfbbb9d8dac9e13637,0 +2011-05-02,15:16:43,21f022c27841ed7170f98eda3e7ac10e8b7e3ace,0 +2011-05-04,14:45:18,40373b1475d6f3058a4690b6228d7da73db76b87,0 +2011-05-04,15:43:52,ac49f4014737c9be9b406174f6de7a81d9ec4913,0 +2011-05-04,16:04:57,7322a5698635f52fd0e648af333f6d5c396d80dc,0 +2011-05-04,16:17:13,11546a9c5f5d217ca221c0e9c027500db654c03d,0 +2011-05-05,07:00:01,58d9a4b4a6c0c965ad7d783cd3fc3c2eda234f4e,0 +2011-05-05,07:14:04,042c9a5e569cd44a4397240ad32b348419c3f881,0 +2011-05-05,15:30:32,0cb14add24934d54497542138e087ead011d97e9,0 +2011-05-05,15:30:51,e77e97e07ee4bbac2094a7159bbfde1719b9c67c,0 +2011-05-10,14:29:34,518e2904c3e06444a03177e6e14e01dd3cfe212b,0 +2011-05-10,14:32:22,0427168adf10dcf5744e9dc91cccc0fc2f8304f2,0 +2011-05-10,14:33:00,fcdbff99c7c56fefd953d41463ab774f498bc5e3,0 +2011-05-10,15:08:59,956bf559c737bb29ad7ac8cb0cac53ec9db80c29,0 +2011-05-11,08:47:02,de6cd6cf07d4f3bc54c4afdb4d2d7a9a7db52bef,0 +2011-05-12,13:18:32,9d89e84e19d5d4140d1634a8e875c1512a848558,0 +2011-05-13,08:14:27,3d9ded8c2bc63fc01f364f7b78818520fee33bef,0 +2011-05-13,09:09:53,e314a550a291382e1928b2eb5174f82936a59b5e,0 +2011-05-13,09:30:08,d303a73776fc35d663cb2f68b75ee10237837b92,0 +2011-05-13,10:01:16,62a85bb210828a33687c0ba487d6d8073d6392a2,0 +2011-05-19,07:21:25,5ebc1f179c807cd7caef079f321176c13206f951,0 +2011-06-06,12:11:05,579c0f94eb6401391682e4e63bc33aab804a4b58,0 +2011-06-06,12:15:32,f1874f65708add3377d3738f7be3df1fe7096927,0 +2011-06-10,10:53:37,e966d7e9481a7921b8b2e8cfb24b4993a4729f9d,0 +2011-06-14,15:38:29,9f934651b31e3b61a58861af0d468d416d29fac4,0 +2011-06-15,11:24:08,4bd26c5e68ee703e60a77cecefabff904065e6f9,0 +2011-06-15,16:04:12,1a24def83f19baf71fcbf261d98130dfe9517a72,0 +2011-06-16,14:31:14,9924fd47178c3559581e68adc407461957ba2572,0 +2011-06-16,14:47:53,5b091b7ad2b45b2f22ad155d8ef386fe93f28dff,0 +2011-06-16,14:58:08,1b28adc550cf5b4bbe1ad5b7b5eef5f5a428ef62,0 +2011-06-16,15:14:39,f99fd6761cfec9c631a8712c82fc377167f225aa,0 +2011-06-16,15:21:46,09557fb15368ba4c76776c1537d9f003036e76fc,0 +2011-06-16,19:52:56,c91490ae0a566ec0cbc793e2a0f821a1bdc88dee,0 +2011-06-17,10:05:17,a0eb5300e7a8c0964671927dd0e05f5450ab6277,0 +2011-06-17,10:15:12,675dbce5297147874183ddd42c1c88babfe0fc3a,0 +2011-06-17,10:30:10,a683fb53f6d26a4338623a7ffb028dadaea53eba,0 +2011-06-17,10:50:26,1c69aecb1a220188da3e8d0bdfe7dacc02cba625,0 +2011-06-17,10:51:35,a621710dd1235f937d7e1e466f73730bb496c1a3,0 +2011-06-17,10:55:59,1842c125b81d86a759dc136a7e8c2bcd36646162,0 +2011-06-17,11:03:03,2e38094255332719f90b0f57a48840ebc83794e0,0 +2011-06-17,11:03:29,e0139fd8b2eb759dfc770f58ce13ea836d797821,0 +2011-06-17,11:16:06,26db982a26882768ad61ec11dbe167719a541d77,0 +2011-06-17,11:19:17,c3d4e0cf273fa996ce68d41ad026a1fc73380b1a,0 +2011-06-17,11:33:33,fceea4b9bf7c8c4590265b208f74063160f268de,0 +2011-06-17,14:21:47,c63271f2f62d6dc61a83df7aa60e4c766a9398df,0 +2011-06-20,15:19:45,872636752502353f7c02075e52172ce9d569f019,0 +2011-06-21,12:56:14,4d8eb0217c43f6cf58a344b2ba00baf03501a97b,0 +2011-06-21,15:25:36,96be049f0f3a5d5938130f01f50075ac2c440f01,0 +2011-06-21,18:45:11,de7298a1ca103f941eee44ee83d8b3edf0d83eb3,0 +2011-06-22,13:58:54,628d196c472ee1d27cd9f05a770928b4f156e0c9,0 +2011-06-22,17:42:17,ccd8b8d214440b6d8e5c84bf383c23e01a6cbf9a,0 +2011-06-23,14:51:00,a065904ddfbd7de1dbca7e0cb90fece65ea0e158,0 +2011-06-23,15:01:33,1a090b69a603bdfc34f0ff776e4c483dc587c3fb,0 +2011-06-25,11:28:22,d4d8690fb3c53b50c6fac353ce76455f300c95dc,0 +2011-07-06,14:01:37,e8ced4716c8307a610751b1b024ece356dbf8033,0 +2011-07-06,15:30:50,14baecacbbdfae6e69acfb0b0984a1110a7105fc,0 +2011-07-07,14:22:25,ca38b542abecedaa212455dd009d17956e1f6f6e,0 +2011-07-11,11:21:45,3ca4c72a2e60457d9f523a70533477ee4de66cf6,0 +2011-07-15,10:06:38,243438bddcb4f54045b8857aece04d4357ea0829,0 +2011-07-15,10:29:20,5917971ca8ec81935e2ef2de6edf7e150668e5c6,0 +2011-07-15,11:58:08,2a37b7a4c9f9a4ff88175693cf58925049221444,0 +2011-07-19,12:42:48,7cd2acd0882e40e5a6ac8cac90e3240e45a441fd,0 +2011-07-19,16:24:41,591942ccd7c5d45e488a62c5e392002f94fa844e,0 +2011-07-21,11:20:53,366b4c3c1745dafee90a935727d4dd5aa113821c,0 +2011-07-21,11:27:18,16b9315b91009390d063e886fd6558015b490c4c,0 +2011-07-21,13:51:53,4f5884f5f534e093c806188483e2fd816ee4c9ef,0 +2011-07-26,09:12:16,1a05931aaf35dc0a640b0a2a4d84d45e71fdc475,0 +2011-07-27,09:45:00,efb4a24d208f1108e090562d35085b616996bc88,0 +2011-07-27,12:23:55,7eaa3bec21100a87df428ca7ce717384addab46b,0 +2011-07-31,15:37:50,9bdbdfd3f6ba2831bae5f4559cde2da38ff2b6fc,0 +2011-08-01,17:31:40,901ab52541d6a1c28c37bb4c5d9cde2b2703fdf4,0 +2011-08-16,13:30:48,6d9de66ffac601f25d8c405d0803c733d59b5bf1,0 +2011-08-16,14:21:04,ec28166ae61dc6256af68f0f06af12f6bc6edf87,0 +2011-08-16,14:56:23,d852ff5af502ee59d618779801474d58ac34ca2b,0 +2011-08-19,10:37:15,27db3a996ea2874a16ba246b814fae1738de4103,0 +2011-08-23,11:13:01,121bd6af5410504f87bb6d25afb9a1a81415e7f1,0 +2011-08-23,11:56:20,ab1d2cd9b7a12269da11338158584f1fb3d693d1,0 +2011-08-23,14:44:56,94fabd7c7874df33efa2d43eac48293b3754ff49,0 +2011-08-25,08:52:19,d2c83b3e66137df8dc4b896f28d915f7157c9736,0 +2011-08-30,14:40:30,16e8b2aefc370ff14420acef098ea2e266f1864a,0 +2011-08-31,11:54:37,4e9297279b4005cd9a421d56d9df5d9d2e72cbb7,0 +2011-09-01,16:56:23,55c45a55a75095023a68bef031013b2b57660f46,-1 +2011-09-01,17:04:08,4bc83559deb0083dd7f0f9e7bc5cc1da73c83a73,0 +2011-09-01,17:14:07,945696b78f740adb42f634ce8c806ab2f75ca40d,0 +2011-09-01,17:16:22,3881ee5217e28c8d318812fd972ba0c1feaf97c2,0 +2011-09-02,07:22:19,8890b2b58a5108f172e79b89fdfa410880d43723,0 +2011-09-02,07:50:33,ead61f09dd7002da28cf680c205ffb2c9826a843,0 +2011-09-02,08:02:58,c9f26f388dd489ac1f1ddd0b55723572c9e888da,0 +2011-09-02,08:45:48,c3d94f7c927ab866538c8e047c58ec730255c591,0 +2011-09-02,08:50:22,8c00ca5b35ca523672dfe544996d0b554c232c10,0 +2011-09-02,11:25:18,747ba37f6912319fad153b7404aa6efbfa5743ad,0 +2011-09-02,12:25:07,67f16e97f1aa57ac7f453e37c6c4bf21143b0842,0 +2011-09-02,12:39:50,5c37ea07579cda1e3f85fe4fbd5734a546541ce2,0 +2011-09-02,13:30:57,17d873fa514cf21c280fb176b4c6ccb765bc166a,0 +2011-09-02,13:32:25,05e7a12585ae1d42225cc91aa3145fcc19c4f025,0 +2011-09-02,14:29:28,dbfce39eb6ad9c5ff2e130827cd1c31560cd2824,0 +2011-09-02,15:15:48,e0c8b14a79ade1dd75d3478ea185d6a2f2d86240,0 +2011-09-06,10:06:32,3e9253090a0e5690a9701504260d5417da7f2ebd,0 +2011-09-06,10:28:08,2ad56b74e9159c160b38c7e3af22664d45248c6f,0 +2011-09-06,11:29:56,74a75ab68c5f5f4eeb973fc71bdab0b692fe60d1,0 +2011-09-06,11:42:37,a36db8a2e1c75aaf9a34f059087b656bea009580,0 +2011-09-06,12:01:04,3bc3c7d5bb0bd09b33f1bbf0cc0b8e87d22170dd,0 +2011-09-06,14:11:09,48468b78f98269667de7a12f4ac70a9b1281d338,0 +2011-09-06,14:11:37,4b6a1f64c81ed249dc54a974122a14e92c65b06e,0 +2011-09-06,14:28:31,e96b4e6a0af74aa73e749c2bbbdf206eef8f54e2,0 +2011-09-06,14:31:42,d1df43548adc9c4a8c2de6823951c2ebcbf965d9,0 +2011-09-07,16:15:17,7e69caf086e3e4b8b2c4b483fdfbf5f60535fcea,0 +2011-09-08,12:52:13,eac8a28806a3f8f1c376d75e0cd3ca6b8d2eef39,0 +2011-09-08,13:27:54,a12adaf9f52c93fe2b8bd08df71faf1e7babe354,0 +2011-09-08,13:32:50,444445176dd4a5b924780f999f14f8228a067278,0 +2011-09-08,15:16:42,01b25840216c6397165d0b9aa30e453c7e6d0df5,0 +2011-09-08,15:28:44,25ffa8b4229cede0b0e4d00f98a1af23a286cf68,0 +2011-09-08,15:51:34,95f6dcc518773b7d6ecb271dbb5b8f7961c9d8be,0 +2011-09-09,12:05:42,b2694161bf47d88a51b962593f8d40ef8483e162,0 +2011-09-09,12:09:00,975d4b581e3e4e4fdc103f48ef447c46bed85c85,0 +2011-09-09,12:12:43,dbe3db2ab5668363c122c4bcf82eb59db005c016,0 +2011-09-09,13:20:31,20c67b5f0e576865b6b0b2b577e3383aaa89a004,0 +2011-09-09,14:29:03,26bd13e538f7555fb8a72c6c8fa37558c8c53c61,0 +2011-09-10,09:02:09,1103556bc32d07b9272e4f5de60cfcde45edb76d,0 +2011-09-10,09:03:06,ec390d0b44e20ec6ef1acf0a40bec22b18722afe,0 +2011-09-10,09:55:22,cc6b2477f41f4c98d7ad8970f92d0a13d8f04734,0 +2011-09-10,09:57:14,6c7d21e03eeb57621052cc13b730811d3b84df9a,0 +2011-09-10,10:22:02,30bc859c5c44055b219e833cf539fd833f40586d,0 +2011-09-10,10:30:40,5a102b968ec208c88323c30ef1259d66aed13645,0 +2011-09-10,10:33:29,67d25a7e7554e590af52f4b1e5199a9971d716da,0 +2011-09-10,10:35:33,b420d9b47493b111bb52f15192ade788243979b6,0 +2011-09-12,11:38:26,906107eb2171b152d791d91f8f5424c293ccd7cc,0 +2011-09-12,11:55:31,32644e6d90c6b09d40d6fb8e752693c436794b2f,0 +2011-09-12,11:59:00,6a17f2831647cb84e31b814cfd05801a78ba515f,0 +2011-09-12,12:08:36,a8ba5b9d973e75fa8bb72345c801d4f228728d94,0 +2011-09-13,09:43:46,e071fe4f692d2b218e07920035fd8812a6b1ae96,0 +2011-09-13,09:48:45,f4801c739c375b65d0f8439d9bae1e2fddee642c,0 +2011-09-13,10:08:25,cd7795cc48148d65df3ec8e7a79098eef67eee22,0 +2011-09-13,10:16:39,1a4d1dd5c7a679cf76f2e6642b11f2346a64f999,0 +2011-09-13,14:24:33,4045153717e51c7f2e33d9ec5df049b29c530f1f,0 +2011-09-14,11:44:42,b89aa69b36e1c49f1905e1c9b8c194be24ef5617,0 +2011-09-14,16:32:14,65539f623884a997a8bbc41c33e34e92a705f006,0 +2011-09-14,16:46:56,515a721c652bc7434565310fd719fbb188636dd1,0 +2011-09-14,17:05:15,f95c305c030e9d81a1300759ad334f539bcbd995,0 +2011-09-15,08:32:31,ca4f225b26bbd1d13f429b714f90e23a4e009f5c,0 +2011-09-15,15:47:23,11b51d68ef029ffab2f00b6b74872d55903cbf23,0 +2011-09-15,15:52:14,2b8eb4ac15b5aff71b051ad1e95df8ac5518b2d6,0 +2011-09-15,18:42:21,bd094cacb1afa1450ab046253f11dff7b839fa30,0 +2011-09-16,11:33:38,d77c8438664eb4b80e3f5791898e0c6948e34db8,0 +2011-09-20,10:04:15,b4ec4b43ace29f2ecdeacd2641e4f63abfb15ba6,0 +2011-09-20,15:22:56,430f7835cc583e5412b1f60d66f65e5ee242ab1f,0 +2011-09-20,15:34:02,2bcc202c19bf687f551ec1bfd62dc63adb7ad1da,0 +2011-09-26,15:35:28,e78d688273f705cbe6cb4657e3247319392c43fe,0 +2011-09-26,15:42:32,fecc06e4d9e1a75c83dbfdea7cae3d6e4f403d5f,0 +2011-09-26,15:57:47,28e494b1016a51c405c57bbef08a7291fb2dfe2a,0 +2011-09-26,16:13:08,b66931682e697a799173e333464a1e266d12c4b4,0 +2011-09-27,07:43:17,b2fa1d3f414478ea3c3279381c92acf8ff30d27c,0 +2011-09-27,08:14:54,24344f8e2243a646aeebfb81981864a51beac857,0 +2011-09-27,08:21:15,e5226e19e7e22368bdb454756ae7a7ff84dde625,0 +2011-09-27,08:30:49,453f0bea29c012331d59b703ea04a6f2da3deb95,0 +2011-09-27,08:42:07,5cddf339c5f4101e90529f513a44a26cab674be0,0 +2011-09-27,08:55:52,a48591b7720e7362611cf89256fcbb7337b2a2d6,0 +2011-09-27,11:07:27,80ca7deb1513c94d476fe671fd417517612ef7d8,0 +2011-09-27,11:16:28,749cee4677169326303c7094b5c6243c53ea68a5,0 +2011-09-27,11:30:34,64cf241b171b97e3e4db87032a464e8be654d7ae,0 +2011-09-27,11:33:27,0af14bf942d040868589e17669ef1dff13c4ff97,0 +2011-09-27,11:37:36,7c25f882d0c21a2d40e150235fa169d869e56abc,0 +2011-09-27,15:25:42,b10eb1491b58ae3ad3b9f481b2721329370318ff,0 +2011-09-27,15:29:57,f2f7443fb6a11d99f84613afaad70a3946ea3fa3,0 +2011-09-27,15:30:19,1821f2d39ced2e51f6ce46383291fee8f75072e2,0 +2011-09-27,15:49:16,b0b94d6d5e7cd456cc602e85de3b90e905cf00e8,0 +2011-09-27,15:56:04,705875a6c2e46ca621b48742932f56ba21cfaf39,0 +2011-09-27,16:01:30,63a17b0078fc0c3888c4b64690c7e4b3f809bdd9,0 +2011-09-28,08:32:35,9a4af599c1dbeea86248c7a78f683a41dbadc5fe,0 +2011-09-28,08:36:04,1b5635a4d28ae3eadcf968048e926da116d021c0,0 +2011-09-28,08:49:50,1ee38d3b67a2343bda8bfe2fff707df764e18885,0 +2011-09-28,09:30:37,fb14f8062d076ccba19b0743989a3df17a28fc21,0 +2011-09-29,12:15:42,7a89c76cf7df5d8132a83d1d8b2c5ff48b7cf10a,0 +2011-09-29,12:47:38,c887a0e31a6e547d061e57f10c302254e0f7caf2,0 +2011-09-29,13:14:52,92be6c3b699fa65a2a626a564722cfb28ef2043a,0 +2011-09-29,13:37:08,7da45e32f720a49009f56aa45e2021407243788d,0 +2011-09-29,14:10:54,d07f4741afb558c106a2ecc04f25d35107eca9c0,0 +2011-09-29,15:39:06,9244eb9f426450f29258d3f3b433c1b462010a73,0 +2011-09-29,15:41:05,d60a679deacae46387000625700aaf22efa475b3,0 +2011-09-29,16:07:06,78c5f0000f62de21f17c40099e15fd9ebaa0581c,0 +2011-09-29,16:19:37,821a3f97a2c2264ee3c2736d027e663a87980ecb,0 +2011-09-30,11:25:45,e26c06f82904fbf937dca5367dd4c7fe3cc7db75,0 +2011-09-30,11:27:04,46ff638cbdf18b9738486eeee666c13a6f57a871,0 +2011-10-04,10:35:13,ec35ae200c1fdd62eb841608a4e4502c4d9110b7,0 +2011-10-04,11:10:25,5d4ad0a3bb18a513f5ecfc9f2ba4f06287071d1f,0 +2011-10-04,14:53:14,dc36cae7842c1212b9ebf773285bd0e52ff366ea,0 +2011-10-04,15:49:08,82711ed08b264c278bf567efbe572c2480add7bf,0 +2011-10-05,10:02:51,582ca168b1cd9093a5b0d53ca29fd9a16072787d,0 +2011-10-05,10:36:35,969deb8710982878ce1f250d3f2eeaa3b4e55a3d,0 +2011-10-05,10:41:41,a696910e6513b63bdd40ed20ce0229682dbc52cc,0 +2011-10-05,11:08:01,766316addf28511a78468bf50daa4535eba5a4b6,0 +2011-10-05,11:15:36,4228097fe105db318a0eca3b70c1ddae99600b8c,0 +2011-10-05,11:20:11,c28741cb10739882da3e8a0cf19877a0077672cc,0 +2011-10-05,14:45:03,c701dad8f9ad8e7e39720f8f5d099f3f7a8b6ac7,0 +2011-10-05,14:55:39,2ff7bf4db4b7c6164a5719c6dd3d571afbf9998a,0 +2011-10-05,14:59:48,0f05484fa1151be3284e44bdeda80eadbbb3521f,0 +2011-10-07,13:26:27,3be327750b5c5d2adc929cfe328974c365795c6d,0 +2011-10-07,13:26:50,e2825c71065b279f232d6d67423ab608b018c9b8,0 +2011-10-07,14:29:35,d3897d860045b673f1116ed2ce69843a6a91d753,0 +2011-10-11,10:06:12,1cd61c5141c43db148a1486ffc27a481aa835e47,0 +2011-10-11,11:43:23,4ccdef6e00481885c0433d72077d5319cd519eea,0 +2011-10-13,13:37:13,7a0dcebf830ef720c2816f7f053a31e19a415085,0 +2011-10-13,13:49:13,9c466ab08274e2351216c1b398ed2a7b39eddc73,0 +2011-10-19,09:19:51,1fdd814d3194db10a9a40bfadd6e3c67fed30da2,0 +2011-10-19,21:06:13,aa62eb97fe0366c5dedf645f7efe588456b3417b,0 +2011-10-20,06:54:30,c7f3bf2e14447247155040ac9611d02b15b241ee,0 +2011-10-20,07:10:35,2ab2e9c3abf26d38f5024fc168baee56ff3ee83c,0 +2011-10-20,07:32:31,9ee902370fd2723df698be3793126bfc17c159a9,0 +2011-10-20,07:35:33,68da9ecf740f653861a041fc96144f6aef8f1d0a,0 +2011-10-20,10:21:50,d8d88e82939d5565ea586ed95651fdc4d8bdae7e,0 +2011-10-20,11:47:53,cb9a438b8c930e3b4536521a57e80a4eb6542d38,0 +2011-10-20,14:03:46,3e905c38ace6edb7ca56191d1f7fc84bde6fb94c,-1 +2011-10-20,14:14:08,2d08fdf1d4f7797532f77df48555ed65a7dc3da7,0 +2011-10-20,14:19:54,db9418177e678139615b1c346360b58aa5ff47c5,0 +2011-10-21,12:51:17,dbebf222a36d8d2d118d64705dd0c1974631d790,0 +2011-10-21,13:19:59,1c7722773180b1fea2cb095db7ef048b274e6000,0 +2011-10-22,09:40:15,4fd209ac015391476eae265a1786529c92cc4975,0 +2011-10-24,11:03:49,cb01d59203089e0e40089e0d843e569699e063c2,0 +2011-10-25,12:49:11,94f5c0d3f138f93e384e91c6fbada8d12a9ba2b2,0 +2011-10-31,19:13:27,ac97323468c005dda0c0fe8818c4f51f9381712e,0 +2011-10-31,21:28:28,331755ce3031d1db722c50f36f09ba08cb7ebf14,0 +2011-10-31,21:44:17,11a9eff375161f6a4f0bceb0c551b0d08023a6e0,0 +2011-11-01,10:01:30,171dda1ac5803f034b785acfde5e38e61be108e7,0 +2011-11-01,10:33:57,77480346a08f755c09b2b569158814195ea28ae4,0 +2011-11-01,12:17:38,418189da96b474db51487dbf3557adceaacb165a,0 +2011-11-01,12:19:11,24ee9a7401830223d3290b098f3f49e36dcdde51,0 +2011-11-01,18:04:00,785842ba97293ce8835407056dcc774428c32271,0 +2011-11-02,16:09:40,d8da28700c2dddec9d867ed96d6e4ff09a903d3e,0 +2011-11-03,16:37:34,bad298a2ab3daeecd631cff4b8a5a8a650baaae6,0 +2011-11-07,12:35:34,f3f72b12f740f9e6f7f927d8669c99b817a26c7f,0 +2011-11-07,12:44:00,f2ce0c5de53d60e8921ebb56579aa28158d2a45e,0 +2011-11-07,12:45:58,3741d8aba562be5b1d078c2a94488a00d86c31f6,0 +2011-11-08,15:52:14,0d577ea7573cbe3121837fc156beb105da0b3076,-1 +2011-11-08,15:53:57,f83452b37ad21a79e444a96f05cf43cc72f673c2,0 +2011-11-09,14:43:42,32beac5faec3eb20b386b5ccbf26cf033c417281,0 +2011-11-09,14:46:38,5807178d4737ae80f4d1eada6b286e9d1b7f6857,0 +2011-11-10,10:24:35,8be7bc8cc96e1a351577cda968e921aa2a307332,0 +2011-11-10,12:17:32,1aec58f05f56c6fea8cdd5ce7851f5bebcab4da7,0 +2011-11-11,14:23:16,f9da6b3b414c3da8066d8ae47de95db07fe16af6,0 +2011-11-11,14:48:32,21faaa84aa03857385deadefbd2a796a86a417d1,0 +2011-11-14,16:19:34,90ecc0134dc679d45bc9652dcf3899442063ac4a,0 +2011-11-14,16:56:10,208eec4834278ef536a2fb0542b4b2a3a41494f7,0 +2011-11-15,11:41:37,24225c764c94af1e8c0d860668bc1d592db24919,0 +2011-11-15,12:57:19,8748c8ee3fe2f37d175c903ea97fabece72b6b61,0 +2011-11-25,14:53:17,4a77af44c865954ab0b08e9faa38123886718878,0 +2011-11-25,15:00:50,0474a8369f29e4553d0038a68d16add219d27b03,0 +2011-11-28,12:57:17,00bca3ae9b00fab5ccdf76acacff59bd426b1db4,0 +2011-11-29,16:00:19,c83630dc4f3a4b2cab7a8193e03b4165660c84c3,0 +2011-11-29,16:06:48,b649ee7852a947d76049802c1bf2861c1ca5fb74,0 +2011-12-06,14:06:26,fdb867850626be3b279f8d12cb37a84cbeac4b1f,0 +2011-12-06,15:39:40,ab653eded836679ee6a60a258daa8450d1a4581f,0 +2011-12-12,16:48:51,f4811879221b6df2fa8935376f354d6cca21dbef,0 +2011-12-12,17:08:22,a7c6ac96f6ebe1bafc110ceef2a02b4d1ad8426f,0 +2011-12-13,13:40:29,bf69bb7cc35a9f2ac9170d9e649e919bbc3074d8,0 +2011-12-14,16:39:12,fec8778ad6f9f05a4bddc86e1c5560ca6921039e,0 +2011-12-15,12:01:20,038384fcb2e1ab8c57471abcfa250338ddda7b6e,0 +2011-12-15,17:03:15,666208eebd068739c9b80c4cac611d346bfa3e94,0 +2012-01-11,14:18:35,750aed127c72085e0144bce08fa00b4626985837,0 +2012-01-11,14:19:39,b960e79e9e6a990d4075bc459747887130390137,0 +2012-01-12,08:30:43,946cd7d1dbf4ffb4553f3bbf00daf49ccb3d4d60,0 +2012-01-13,14:06:14,d2864b3c8edf5ae7514c6312200bdc04f8c76253,0 +2012-02-02,09:32:53,a60e2463f23c80ced4638e2581a0c86a75ee2226,0 +2012-02-02,09:38:05,ec5ab7f7d12e6ffac1b683d43ef90966702d0c31,0 +2012-02-02,09:53:42,21ac9a576faca0db4a9b40b084e191bbc2918df6,0 +2012-02-02,10:18:22,b448c7674d6023a31f78351fb72a2c67e3e71e2a,0 +2012-02-02,10:50:56,24b50f1da1c2d04cd862900d736849ef284ad65a,0 +2012-02-02,15:09:43,1521d242abad444b3f2e06f877a5bc473d0d96a3,0 +2012-02-02,15:12:28,6396236ba02be80eddf0ae4d6cf2bd7ae7a5068c,0 +2012-02-08,10:47:16,06fbd48cb5f7f0e8d42b7f0d4275a35270e7bf48,0 +2012-02-09,12:42:20,318370f191fa0392a0cd8d94678311adbaf2ad09,0 +2012-02-14,14:34:17,0f400b46fa5015f82dd00706c7e2e73ceaec887d,0 +2012-02-20,16:14:22,3f2f5b1aa5e647f3c563bdc1564bbdc7e8ae8378,0 +2012-02-21,08:57:29,67f73fc8c947699eb448680d35c9c92c4402f197,0 +2012-02-27,12:15:38,c02701a4f6184c180a3e0dfc790128b8c397ba22,0 +2012-02-27,12:18:28,b82e8d783bf7a420d396c2449187a891b752470a,0 +2012-02-28,08:33:28,af75c061ff03c2d84b4af0726c35fecc77451965,0 +2012-02-28,10:07:13,f5d2d296028fe75019cae210cb7e9e223dcd3df8,0 +2012-03-09,13:50:13,4326fd2aa954b2b52bbfc50a0f31a17839675aeb,0 +2012-04-02,12:22:50,354ed07cf8c0c5eb94095bb21e80ca5c1ce65494,0 +2012-04-02,12:23:26,3738932e4a7f0249c03805e8962f40609efce6a0,0 +2012-04-08,14:21:30,b39ca0b88be729edc2445cefb2d95e32befa536b,-1 +2012-04-08,14:22:43,5082d8a6dca0e187c88977f4b05714f71df67a26,0 +2012-04-11,13:33:27,ffb1672866eb159071c3808152e01a14236ede0d,-1 +2012-04-11,13:43:11,de3d403906e34c992d7b11707aba386abd155032,0 +2012-04-11,14:15:10,68ec1e2a0a32fbafef86729a2e4080e8c4cd73e6,0 +2012-04-11,14:18:41,dc5a6049d8a509d9dceb8d657c518a30a98b7e10,0 +2012-04-11,14:21:51,5ea53603658c0a44e3fecb64258a6e5874de5409,0 +2012-04-11,14:24:07,ad9da705f80f927ef0c1a9c06616337494eb8a99,0 +2012-04-11,14:33:34,fff36f7d74ae24d8860e329eb4131b5a047baa17,0 +2012-04-11,14:36:30,6a42f6d49a0b0bd4a8f6739e482e8cf29e6c2641,0 +2012-04-11,14:42:03,b852ef0e88a51f70cea4cfecdfee6ebca996a8c6,0 +2012-04-11,15:53:54,5ce1e9f4bf6976cc1b03105e98c1b38a67ece539,0 +2012-04-11,16:02:57,1aeabdfb384a558b2cf5bdc6dbaaec8cbafad7ce,-1 +2012-04-11,16:04:30,5447a4db115311e8fe4b9a7787cc7a7ddcac9b23,0 +2012-04-12,11:09:00,1ee1dfe62c5b9f3aa368c97a1b118473253d24f7,0 +2012-04-12,13:08:41,ddea6e86c1779cc63af8f239a0b9a6b5db2e12ea,0 +2012-04-20,11:59:36,064d2a7b2e387c939f80dda1fac2813fc5d5e8f0,0 +2012-04-20,12:13:21,2074dbd28d75e91f9489db6a78fb34cf75de87c2,0 +2012-05-08,10:56:02,9ca1ab3b055ce2c376879ba5dfe137de6b051e4e,0 +2012-05-08,11:37:24,9f2145eaa07fe7f4264a1fa8dd47ae0c1f4271e3,0 +2012-05-08,12:47:32,761cb634473b2f4e8c4587c0e82fb26dfadc648b,0 +2012-05-08,14:04:18,3478636fd015639bc120a94c31effc7593bc486f,0 +2012-05-08,14:13:01,73f67cd58361cde9fdb613f98d639e4ff68985ae,0 +2012-05-08,15:34:19,ef05e5506651e698566adaacc05cafec5446621c,0 +2012-05-09,07:52:31,1c60d28e96177ac52d72c9753dbc2709af0972c7,0 +2012-05-09,09:26:32,aa776cf4093b3c03757783594b4ea8c4a4d3fd86,0 +2012-05-09,14:22:15,5517d0dc0cbac3970f45497d45e341f639a1e09f,0 +2012-05-09,15:07:22,eed3d1d4676e321423925731a886ceba3b53827a,0 +2012-05-09,15:21:27,ba7d7a0129b89c2e08a111607981a652610e0c8c,0 +2012-06-05,13:09:31,0983363ce8c9f29868902ce332f48692097e5fb9,0 +2012-06-20,12:30:31,16b82af5a93a7f7dc847de8148b33a0bc9da4592,0 +2012-06-20,12:49:51,1061cde3da27e279b7149bfdb8245078ac8dad24,0 +2012-06-20,14:45:05,e0977027053f233885f11f313e3ba34ab06b09b5,0 +2012-06-20,14:49:40,7fabdecfe5de83239a4db6571c7df73a389aa5e2,0 +2012-06-20,14:55:15,83727d32a7a191151ac3abbff8d63d6c62adac9b,0 +2012-06-20,14:58:57,68341fd9dcdf0c66e55b5ce8c159138d885d9abd,0 +2012-06-21,08:20:42,1d29c5913980551730a83b978cc2d8d8248d02ac,0 +2012-06-21,08:49:59,fefcbbc79fa55fdc44593c7f8459976f383be48a,0 +2012-06-21,08:56:14,861be38630c929e61feb7926b1cae1f86cd467c0,0 +2012-07-09,17:24:05,f90a791bd9989e06ecc29de5439980e23a94a384,0 +2012-07-10,12:41:29,2fa625716b9f135cdab61bff538a44a3c484bbfc,0 +2012-07-10,12:55:54,f633fa7d329578128ce5bc125f7fe678ec50e90a,0 +2012-07-10,13:04:29,19cacfb685916b972f921e37292eb66df86b4bfa,0 +2012-07-10,13:23:46,6aa65dc6f198e9ada3793244a55a818b4467e2cb,0 +2012-07-10,16:16:39,e4b322ac6554b65dd4cea47e5656df488c4c82d7,0 +2012-07-11,13:58:03,61f5972a980efc831a69abd4139898aa207150f3,0 +2012-07-11,15:48:35,2560ab6259faa6db77a95edd664de4257a36c480,0 +2012-07-11,17:02:32,d791f648ab24822211044ab289af1eeb3daf2ad1,0 +2012-10-18,11:17:50,25aebdaae585b417bb24e854914c8e08cad2578f,0 +2012-10-18,16:00:38,002cd3c85ef3908b673b6a768c72dd5cbc2fb002,0 +2012-10-18,16:01:20,e9c2cb88ebe03307da31b1d08f74e59b1d786b46,0 +2012-10-18,18:16:46,766978547f8e2a51dbbee1120c9f407293e26687,0 +2012-10-18,19:34:02,46b5f41d0c946c3e782c8c4bd8af2e693b09cbd4,0 +2012-10-20,08:03:51,3ecb37be2d616866b598da5c2cf1b7b4e7c9e04e,0 +2012-10-31,18:27:29,1c163c4a1c0482282e7b7e0a46e3f36d882389af,0 +2012-10-31,18:33:30,9e09fb32220aa115837c0f955a4603d40a2c7820,0 +2012-11-01,12:38:18,859fcef00c81e30616dba04806ae21ab6dbac6fc,0 +2012-11-01,16:55:40,9f5fdcf511b21d1ed8df05313694b5af88636406,0 +2013-02-28,12:25:07,2d6fd3ea4670898af73542744c31715325754db4,0 +2013-02-28,12:59:03,d898c04fdfa5afe8af0cf0e2a13ed62396fde519,0 +2013-03-09,10:31:02,50c3a07b7a552166dacbf7d131c1efe04ed99cdd,0 +2013-03-09,14:32:06,08636e008a242d8d6ea12dac803992dee00c812c,0 +2013-03-09,14:39:45,b45f16bff49bb5fe1083bd2452816a0a5a4ca08b,0 +2013-03-10,13:11:33,b9f38b414d2b5286fd85f60060c17530630db241,0 +2013-03-10,13:13:54,d82c7593b1d5aa0c9fa6435be4e4a412bb1a029d,0 +2013-06-12,10:52:50,3387ea379c9e060847345ccdb183095a8ae07309,0 +2013-06-12,11:09:09,a93584a0efce13d20aa98bc9817fbf68c5496d2a,0 +2013-06-12,11:20:13,c89ca83d5a479bf55f3175e5737bb0e2b8a3aae0,0 +2013-06-15,10:54:48,e3bf77e45373d9926454917b8b2dcd83c446e89f,0 +2013-06-21,15:47:09,79ccd452b7a76217e37a1c8863ca434f339464a0,0 +2013-06-22,09:35:20,926a2b491ead54669b506a5cb962cc5cba522a6d,0 +2013-06-28,08:54:00,7ce3df9255791ff4328a0e3bdd49ff8a1fa9058d,0 +2015-02-05,12:59:25,750fa544cf3d87129aa0b6d5ee5280ce0bce7557,14 +2015-02-05,13:59:31,b99a0a6170de1ad276f6a61c7e038b4f1b0adf57,14 +2015-02-05,16:49:42,5f5139fc1d6ce65043a906d812cac8ebc8ab6356,14 +2015-02-05,18:15:55,0e052bcb4d09be0934fcbb2f17a3ef623bd6c2dd,14 +2015-02-06,10:01:43,e82504c47bad7c69af0159ca96f820cc3d40114c,14 +2015-02-06,10:26:14,58fe66a65399876d1fadcfa0313a7686770d9019,14 +2015-02-06,11:54:19,fdc9065a6acc35bfdc0fe747eea0ea64e1151b83,14 +2015-02-06,11:56:26,160030d6807c45e626815d2b8e8b726ce3f70d24,14 +2015-02-09,11:24:57,49fbfab7a50d8e4432bead5695fe195630ebe21f,14 +2015-02-09,11:58:02,b8a2d1afdb7ab359201dc73d794d83146e3f35e6,14 +2015-02-11,16:49:01,eeae68e55946aa1534f01e381f933f9027b1091c,14 +2015-02-11,16:52:26,e9c96ef48f3f7842c36c6c6863cf6bdc85cc322b,14 +2015-02-12,09:59:10,b75fe039b430182db1b61ea7a07f8c89c30cf65d,14 +2015-02-12,13:46:19,d72994ebab67ebcfd6a209d4462394099890ecfd,14 +2015-02-12,16:18:41,9ac21e6dae1fdd5169189ba4b8a34b8a21a1a4c1,14 +2015-02-15,09:24:30,53ea65b74127c1ef1051d387a744c2985d99f41d,14 +2015-02-16,08:01:54,4ebc81b13e4787635a901f8334c1b0043bdbd55b,14 +2015-02-16,08:04:58,9d11ac808cbd66be9cfee772f5b0c2d81ec43258,14 +2015-02-18,13:46:32,aeafddf5d9fb9f5f73d70ed5acc1524f7f6d716d,14 +2015-02-18,14:01:27,72bde2e36beb2a41a5fe6b6c2dc16590df2e9a4d,14 +2015-02-18,14:04:19,c6e8a94f926a705d05c25d1e6139088245acbb2b,14 +2015-02-23,11:31:24,0fd71ac2f655a0a85b29dbe1100f50063caa9943,14 +2015-02-23,11:31:58,8dd02a6f19084d4e107d00ddc733e50f332eeb66,14 +2015-02-23,12:36:45,f5b24d4a01c4eced4d1b08ca2dd42f2f13c736a8,14 +2015-02-23,12:59:53,590becd8deb1617c25ddec3411e7e60f2df11404,14 +2015-02-23,13:24:07,1fa857e7c68aecdafa45f2281d0e0e8b211d6f97,14 +2015-03-09,13:35:16,c323c8cd10a6edad169dc235365db365edc1dfc1,14 +2015-03-09,13:39:44,1dd7b52a331397a7a5b1790c15fe7e0233f731e2,14 +2015-03-09,15:07:18,6b5a0e8a0815fe41fe4ce3e8346df3e173e2eff9,14 +2015-03-09,15:12:54,f3569caeb5c4a7fb1257ac41603b61e558cedc8e,14 +2015-03-11,10:51:07,7976531e907cde2734f64060d7bbd1216141aefa,14 +2015-03-11,13:16:24,b9b22bc0d43c9a88f4f99e4997dfb14fafb20526,14 +2015-03-11,13:30:56,75a73a18067afc242f6711ff1b5e75ba11fc5d50,14 +2015-03-11,13:45:05,1192317d34e4d554e1f6b7e7d80e80b3746494fb,14 +2015-03-11,14:03:25,94c20729199fb3b4f76f3a0a4a18ba7939cb6aed,14 +2015-03-11,14:27:36,55ca2fe6278d00e2a493e46a400b9d9c1a857434,14 +2015-04-10,09:33:16,3797654898f96272961dfee169fd18abc3c40ee6,14 +2015-04-13,09:32:38,567607057006eb01c378630bcfd30ff2a3e6fe0b,14 +2015-04-13,10:59:37,026b89853873b8605248d87d2cb9947644bf6f5d,14 +2015-05-11,10:56:23,172edc8360bc505ec09d5f0e51a3b731294286f2,14 +2015-05-26,18:19:02,a7028a2bab3b3f2d6854789845abfe110c2a00c5,14 +2015-05-27,10:15:23,6e278c4ff97eb56a9bc80d67352440b6375a3b36,14 +2015-05-27,14:13:06,5e95eaad34d5aa5e99262cb0fee79982f0dc9b5d,14 +2015-05-27,15:21:12,20b5ba82d546535ddd33431a1f0d67e8919467cc,14 +2015-05-27,16:03:28,3d38c9639d660ad749534d0cf40bc67d7bf4f62b,14 +2015-05-27,16:08:38,c6efdf081d603bdd21fd33163f48df03bc1a35f2,14 +2015-05-27,16:45:30,f201f0b0cd7e84a843ad77f7dddfd077271639f4,14 +2015-05-28,09:23:42,b714f20c67ec2fee3aad5b1d99ee8ae3ae4cd183,14 +2015-05-28,10:24:31,970c9b4887fb73c9690e1e8c08107a430234d43c,14 +2015-05-28,14:55:35,61f3f7a793dde9c85504b32ae1f199fb5ab8926e,14 +2015-05-29,09:13:14,64a6b676bb5145037f94393f340c22edbd757a9f,14 +2015-07-27,09:31:16,228dbc8d9b343c7549f90eb7ebea29aef92af6a3,14 +2015-07-27,09:32:55,4924adb0e30a94f5ae541731bbe15280285d70da,14 +2015-07-27,09:46:09,1a361e035637b5319bd896b0fb0df9b60d7f6e9c,14 +2015-07-27,10:21:23,5f83dfb64bbd0e0c7ec7c64037e34bcc705ee2cb,14 +2015-07-27,10:22:30,cc12b05fcc16b84e27bbc5fa5da379c087015509,14 +2015-07-27,12:00:32,68a8ef1cdf33bf2bfa94bbadb1e1e748af8f6607,2 +2015-07-27,12:08:35,55308f87e9b59542c873cc4d44c8968870a13b9d,2 +2015-07-27,12:26:52,2f68bdf367a282b76a43faf5192f8c8468aab34b,2 +2015-07-27,12:30:16,d2d58d658cc58750de0a83ce6b85529df56677dc,2 +2015-08-06,12:44:39,0f2b80924487620a365c3cb68a236db44bea1b3c,2 +2015-10-21,16:18:54,5cf86622f0a22430c1ac8be845c266ebbd04b772,2 +2015-11-03,13:03:14,f38176217f506dd781a06a3b1350b8cd3cfdf5fd,2 +2015-11-09,12:13:03,408cefede3d596de1039e1c01b894c1d17b8bf87,2 +2015-11-19,16:04:10,8626738895d6d35e5a8601f4486723740644a1a7,2 +2015-11-24,11:52:04,fed780d8754c7fbad12366c87effb40985aacdca,2 +2015-11-25,09:34:28,220abf44cb07a915fce5615e9d5a131124f10993,2 +2015-11-25,10:28:24,53759d2704790b141853f7b61d5c9f07f093017b,2 +2015-12-02,14:02:08,04bfacfb7abb420338ff4bbd98e20ad41d352aa1,2 +2016-01-20,09:37:45,82316b4033f6c3d7930179e1397ec7f63f636ce4,-1 +2016-01-20,09:47:45,c11f4e89aff54cff396a1a0f28b9c4416d20adab,2 +2016-02-02,11:33:19,6e71595920b9f03f24bc6da659eafbebb824f065,2 +2016-02-03,14:38:25,53c4903f9929ace05f388f1a9bac59aff35d9188,2 +2016-02-10,15:51:09,33ddce3a9fbc3fe74c4895ba29bf52eb0d701737,2 +2016-02-10,16:09:58,3e48d88aa95f14df4a812dae255ef0b12c4f9ff9,2 +2016-02-10,16:33:34,5a5aba0e8b7c75f2d6c0a4a7114296c8b7236abb,2 +2016-02-10,16:42:56,6fe1ccac4fbdd219db4f60d9f1da8905af2733bd,2 +2016-02-10,17:00:11,7a6fe3733ce7cf82e51ad5877bba487cc4e02993,2 +2016-02-11,12:21:25,2e40e30f13b505ef08a0ee2d534a2e25d24bc5ed,2 +2016-02-16,12:14:07,27e13a309f5075aad1879e55aa9d2f4321475225,2 +2016-02-16,14:52:29,722b8f1af2fb6ada423d6b35f5bf680edf215013,2 +2016-02-16,15:59:31,d0de9ec35dfde98ad272de3a14db9f9abde9a11c,2 +2016-02-18,11:15:42,eebbe64766412eff3e4d363623a8b9e15ba1ba63,2 +2016-02-18,13:25:43,eb28b2808e5bab6b37fe1dcd1269fb26468722a1,2 +2016-02-18,13:26:46,3ce8d996b25268c5d1718a05e564cecb1cb3fbca,2 +2016-02-18,14:12:01,9e37841841ac8de0c80662d397a90859f63c473c,2 +2016-02-18,14:42:09,32f2b457f30f08b86b8d9e395370c54054fd475d,-1 +2016-02-18,14:42:38,3a4326b18718584593c855960e1a04fe35f21dfa,2 +2016-02-23,18:42:55,660c7dbdf27f5aa63ad130c5ab89749b2801cef7,2 +2016-02-24,10:19:40,fae77ebbf8fff040e00a35462be0813996e8dc38,2 +2016-02-24,13:50:41,688b3f0955648f9c1a04598c367a15e6468e532e,2 +2016-02-24,17:15:34,2eafa0840fd2d4f6dffd108228e42d6c7978896f,2 +2016-03-03,12:52:34,5ab8ec1dcb8f57b436150c1757e32095ac71edf3,2 +2016-03-03,13:57:20,308040cfed16d254d735f4fdf9d4578f2eb4bb7e,2 +2016-03-07,14:56:17,e5d1b98d2c6f2b11897197a65ec8e4dcdc52c0da,2 +2016-03-07,15:21:07,eb6d6593d15dcb7f7cd8b50e9a953c28a17b7521,2 +2016-03-07,16:04:38,9cbdbc83c050ea2958d6c17679b587bba9831afd,2 +2016-03-07,16:26:37,3dcad08240b3eaf4a556472fb8a7074c06eb2ac2,2 +2016-03-07,18:42:30,6f895b1b2cd7d4ff989e453780b07a79b05273ce,2 +2016-03-14,13:21:50,60c808d57a9dd65dcfd374280512529adfe97b02,2 +2016-03-15,18:10:32,6c06af76b94169cf9cd238efcd7a162cb62214f9,2 +2016-03-16,13:56:27,56192ad92c619dcf692b2b4d574438921ed43ff8,2 +2016-03-16,18:01:32,a7350f4cb4182aa726948b4549ed2fe293ebd0dd,2 +2016-03-16,18:24:05,883266d3bc020b2d7805bc03290a7854a08dfeaa,2 +2016-03-17,11:39:47,46d9e668cea01bf7fa5db5a69333be64e7df1b7a,2 +2016-03-17,16:36:54,c9212bcc8ed7be3bc874308652cc02d85d9ed081,2 +2016-03-17,16:52:07,0bc08b48565f6113ad2e3fa7f460092f77f658ce,2 +2016-03-17,17:10:09,990ea82025af79d84b2c91f6708d0db3f7f37f7b,2 +2016-03-17,18:23:06,be8d4955e5683b9aa8110bdff4333e2fb57f18dc,2 +2016-04-11,13:52:20,f3bd3cccbe2cdf1854e620ccffe8d65db4c032cf,2 +2016-04-14,11:44:02,831e7435edc1fdddc65c8ab20a67ba10d1b12d3c,2 +2016-05-11,14:00:02,adf5862f9e3594a461aa89e034228fb14ff7c845,2 +2016-05-17,10:30:08,2c2a9b36fdd77bbea50c9d6b78224c45308cb9f9,2 +2016-05-19,13:46:21,580c707aa4c5bc265c7d1cbf46d60a5ad45b10a4,2 +2016-05-23,10:00:15,1a9017579fc8a64a45bcb4d65fe8f1e12e921a67,2 +2016-05-25,14:41:44,dc423189be650b151eef452e0c41744a6457e903,2 +2016-06-02,16:46:18,cdc66735ed7f7b9453e308829d745792c643f599,2 +2016-06-21,11:21:41,941fb76d92d42eb9da6c24e8ecc24109698cf8ad,2 +2016-08-16,13:08:24,396acd6fb6f8bdd9dc08c41c08ddc7a9eee1c37b,2 +2016-12-14,13:54:24,ba0f8366cbd97fd575530c17e9f646fce71026f1,2 +2016-12-20,18:29:04,eee6a63528187a454db09fd49f49ded64c56561c,2 +2016-12-22,14:42:00,e4f357f0d872c04c6726bf13ff9d91d608f85023,2 +2017-02-09,11:22:10,edac3ef9f9796ac713d5c2df2758f01c222c3062,2 +2017-02-09,15:42:15,38d6b9462358c319cc86596ab10950e6d41e1633,2 +2017-03-23,17:18:42,e4639d623b08d434da408df18c8b0546ab77e0bc,2 +2017-05-04,14:49:36,79facdcfd039d009738280bdb09da9d365eb133f,2 +2017-08-23,15:00:33,fe1c87b63724e47f320608b2e44dd9a0ba4902f3,2 +2017-08-24,13:27:48,b853c172364370521c9f7d9486b039b03942e54b,2 +2017-11-23,11:09:05,65cf28bb270becc227b2fb2b64bc357b2bf18aba,2 +2017-11-27,09:17:09,49595a3735f7180d73dad8154b179c5c3ce39a66,2 +2018-01-14,12:22:29,5d40e4af1f7be5f3f7cb71b772d5e14da6914e61,2 +2018-01-14,12:40:11,d34f767e948d9d89e3189fbf78e0aaac04c71845,2 +2018-04-05,08:29:40,a5c352999b4d4c4d42dc006f19e389c2e98e1897,2 +2018-04-05,09:40:23,de1029327ee00df6c21f93078acd8bb88a4c6049,2 +2018-08-09,11:35:50,bf1a2272e94e309543efd5812a6cfc54d754f007,2 +2019-01-16,10:48:52,c4d4bf2b950c017bc0047afa2b3d02e7b73018ff,2 +2019-01-16,11:10:56,3564a1df022b7357873ed4b750f15fd58286e4b3,2 +2019-01-17,15:49:15,0385a0a372e50ca9dc31340339520eb051623017,2 +2019-03-05,10:11:07,47a7b99b3767279ec93c7f0d60dea43f4b588f8d,2 +2019-03-13,12:41:38,e98dc1d146102fd58807cef21b6d1963c8bd75ca,2 +2019-03-13,14:36:40,12420502be08aceeb7ff73dd2cb32d8281ec11ce,2 +2019-03-13,15:55:59,e16f965427e920577687414229c92b81641a9108,2 +2019-03-19,13:37:56,076b7777fafc3df4dc107655806dd915ad96e5d1,2 +2019-03-19,15:34:20,457edeae3079af0cb85175a42ff9cb4886bfdb95,2 +2019-03-20,11:11:10,dbb938b5a42b0e3b2640231ac4e1a4e70dc099ef,2 +2019-03-20,14:22:24,2bae280afec2e6eb8242e20aa8e34ee4bc87f39a,2 +2019-03-20,16:12:25,7dbdeb1edef342f4a845788326a180374ffac01b,2 +2019-03-26,13:39:57,cab1d62705da66ba30848afc3bd41799308f5d9b,2 +2019-03-27,09:48:33,a9167a1ee98534d70988faca44b36184909be0d7,2 +2019-03-27,12:48:41,a3d92f36015c7e5d5c3653b8255ee4c825a071ef,2 +2019-03-27,13:33:06,a56c9c7f97419cfdd81729fc399ddb2d9c7a5e76,2 +2019-03-27,14:07:02,f265769bd96af0a39bb9d9d6eb611c636d866d47,2 +2019-03-28,11:27:23,e105212d0986ea22192aefb6034b0cb328eb0ac4,2 +2019-03-28,13:43:27,0ce8a58063a680342798175ab6adf04120b511c3,2 +2019-03-29,13:17:09,4e7c48a1db0237940d061acf80a046c8b407f2d3,2 +2019-04-01,14:25:21,95b783d25e3b7c0f98cd63a4b2f7a074dd0fcccb,2 +2019-04-03,09:05:13,0e70ce3bf4a45cecc96a098873a13040bc04c30a,2 +2019-04-03,12:50:20,6faacc1707f3702b022ec23d4aa944a16ecb422a,2 +2019-04-09,11:38:18,4e7d1621236c3d8834ae6ccb2e8022b79b562778,2 +2019-04-23,11:17:15,5ae5170a6b84112c16e02c4d2acbf70f40c4b4b4,2 +2019-04-25,15:45:15,5b7a5c2897468e9179f3566a962cbc2f9390fb65,2 +2019-05-14,14:00:58,71c857ac0dd06b951662b9cdae822b7773002ddb,2 +2019-05-15,14:34:01,808d6f90ea6ebf5dfd38adaf35cc23beaafca68a,2 +2019-05-17,10:29:52,bc23848abffeec58855b18263d0563a04534f4b0,2 +2019-05-17,13:25:20,867dc9b315f42015838702370f9189ba27c27693,2 +2019-05-23,15:38:02,9a953484aeb41f8ab8c8c367c1591e36de10e64c,2 +2019-05-29,12:33:29,8a6f68730ee491c45702d49d810ab344f0e1ca22,2 +2019-05-29,12:41:21,eadfe62221a6d08c6c00beaae7df3e6ee3968968,2 +2019-05-29,12:45:17,8e77696479cc47bf988e01e8f6e635ad6d59a767,2 +2019-05-29,12:48:25,439965d8f4b9d9ee160297e2cc145caec5a95aac,2 +2019-05-29,12:52:05,1f96db35a6bc96acde119b46564d67de8e97a252,2 +2019-05-29,12:56:13,c78b6987e1432c6c12137cf2fe167e30aa8828aa,2 +2019-06-19,09:25:23,aa4d5586d30d320ff713f3014d1ef55516f36f3e,2 +2019-06-19,11:11:17,2be548f424471fd6a156352d390b5595eb5a7c7f,2 +2019-06-19,11:20:20,b6e90063094295bf7b320340ebe5decdcc8a881c,2 +2019-06-20,09:44:42,7c2f1fcff0eb20858cf9f4c22606b704d2c2d894,2 +2019-06-20,10:01:49,d9f77659292c04bc02d8ff018429e3ff2486704b,2 +2019-06-27,07:45:41,72ab8fd7a95166669946dfd0ede70344804d14ea,2 +2019-06-27,08:09:58,98479b3f6404211edc1a2a7f6ad974c1bcdd0784,2 +2019-06-27,10:34:27,aad984e392c9adbf7c74eaa4207ba1b29f9f019e,2 +2019-06-27,10:41:42,fa7cbef972bbbcc148c30757c1ba234dbd99a08f,2 +2019-06-27,10:49:22,ab3285e473cebaec9a51830a07033d04e273b1fc,2 +2019-07-03,09:40:51,1e1a76981d546dfdfa375dc12b7a3ae6c148878c,2 +2019-07-14,14:47:31,418e85e7d0377ff51f98d07b1ad76ec94e027fb4,2 +2019-08-04,12:51:50,84b2097c6d23bbbb078f225beb7525935f93e2cf,2 +2019-08-11,13:03:32,001d644e46cd5bf55b8b14d2c596da92ac1d44bf,2 +2019-08-18,12:29:57,ed7913b3805d9120ac8a83e2dffeb3588218fb88,2 +2019-11-08,14:24:19,ecbef5856c54e58fcaa5f622939c4bb451ea71a2,2 +2019-11-13,10:43:31,1d5eedcdb2b6153e6f7919eba6ec97ff9b5b4e0a,2 +2019-11-15,14:12:01,294b48d2d58aa9e3dfbb10a14085629815f618bb,2 +2019-11-21,12:35:12,68796f77d7adf21b1e85dd1a6d9fc9f205bb07e6,2 +2020-01-03,11:08:07,02900d2fe9ca4fa5607f72a382f4f45f361aa8d3,2 +2020-01-03,12:29:41,aab63ce201e08da31c37584fb7b14f03e5572c2a,2 +2020-08-04,12:01:15,dc5ed9cff460baa526800de8acb2466926014ed8,2 +2020-09-17,14:17:20,7f9730afd44cbde0ea9574138e8278d6103ef05a,2 +2020-09-22,11:43:11,e274f617e1f9bd477b9a621ca9f0708ae0a28491,2 +2020-11-25,12:39:42,02227962b1a3f450b64cc23dced2160c5eec307a,2 +2020-11-25,14:35:13,b4d7151f81f82113bbc34816f901db15374260a4,2 +2021-05-02,14:09:31,4ece7f114ff09f8b76dd37d27000bbd84a689da3,2 +2021-07-15,09:32:59,c276dd6644fb6e205ef4e9dd799352383640f45c,2 diff --git a/docs/archunit-history/maven_build_time_history.csv b/docs/archunit-history/maven_build_time_history.csv new file mode 100644 index 000000000..cffaab0a4 --- /dev/null +++ b/docs/archunit-history/maven_build_time_history.csv @@ -0,0 +1,65 @@ +date,time,commit,buildtime +2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,47 +2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,46 +2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,46 +2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,47 +2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,47 +2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,46 +2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,46 +2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,46 +2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,46 +2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,49 +2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,48 +2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,56 +2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,56 +2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,56 +2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,59 +2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,54 +2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,53 +2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,54 +2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,54 +2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,59 +2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,62 +2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,55 +2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,56 +2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,54 +2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,55 +2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,54 +2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,55 +2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,57 +2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,55 +2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,57 +2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,55 +2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,54 +2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,52 +2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,54 +2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,56 +2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,56 +2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,56 +2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,57 +2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,55 +2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,55 +2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,56 +2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,55 +2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,55 +2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,56 +2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,57 +2024-06-13,11:40:53,62850ef0b952963293bd1c103ea379f6d3d07b9b,-1 +2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,55 +2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,57 +2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,56 +2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,56 +2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,54 +2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,57 +2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,56 +2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,56 +2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,56 +2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,58 +2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,65 +2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,57 +2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,56 +2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,57 +2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,57 +2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,56 +2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,56 +2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,56 diff --git a/docs/archunit-history/maven_cycles_history.csv b/docs/archunit-history/maven_cycles_history.csv new file mode 100644 index 000000000..00586c2fe --- /dev/null +++ b/docs/archunit-history/maven_cycles_history.csv @@ -0,0 +1,64 @@ +date,time,commit,all_modules_no_tests,all_modules_with_tests,analysis_no_tests,analysis_with_tests,api_no_tests,api_with_tests,config_no_tests,config_with_tests,gen_no_tests,gen_with_tests,graph_no_tests,graph_with_tests,main_no_tests,main_with_tests,parser_no_tests,parser_with_tests,uml_no_tests,uml_with_tests,util_no_tests,util_with_tests +2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,64,342,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,56,294,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 +2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,55,293,0,0,1,1,0,0,1,1,0,0,0,0,2,36,5,5,0,2 \ No newline at end of file diff --git a/docs/archunit-history/maven_layers_history.csv b/docs/archunit-history/maven_layers_history.csv new file mode 100644 index 000000000..9fca0ee54 --- /dev/null +++ b/docs/archunit-history/maven_layers_history.csv @@ -0,0 +1,65 @@ +date,time,commit,violations +2021-09-06,15:17:43,132ab9ba06b4f090f109b3abf663ee7f1d064a46,0 +2021-09-06,17:04:18,cd21ed86413d28551e810791ea90c948f8f12c5c,0 +2021-09-06,18:44:39,520d753c9841210f9eb6dfa6dc2b9f1518a04b6c,0 +2021-09-06,21:12:47,6cc35f11047ded64f18da8b15f25a6fda46a693a,0 +2021-09-06,23:16:26,d37826ca43d618508314e5d12d13e2b4b6f53700,0 +2021-09-07,00:00:19,7b39a15849df678f0abf6b7406e7e8d22bd1962e,0 +2021-09-07,00:07:44,1ae7051f65e887fca1758a653778d8669e79487a,0 +2021-09-07,00:32:56,057608215e4cebe24ac4329aeb1023429d504128,0 +2021-09-07,11:39:23,cbc8ba5779fbd5c596f2b97311880bdc90d5441f,0 +2021-09-07,16:16:53,df9f30b0c45b9ac7c2858ef7a74ffefaa107a93e,0 +2021-09-07,16:37:00,aede3ea804758a3fd9a9d947eb7b50013fb1022f,0 +2021-10-01,13:11:33,4c8dcb02ef86d28d09620e207b71add68b45c701,0 +2021-10-25,19:40:16,c29d2cb5e9b14bda78dd8b83efbcd55092e83805,0 +2021-10-25,19:59:27,dbb0bba1949cac4a31ecc99c7dcb4ae06fb57e61,0 +2021-11-17,17:47:52,0d5a99c233a9bef9bb1327411d57e1dc48b08833,0 +2021-11-18,09:15:45,a5f014315195e55f379bf804dc8d483f8ec7d456,0 +2021-11-18,10:20:20,403d2488fede36b1db424faf7773365b70a00c74,0 +2021-11-18,19:15:28,d8410fe3392a98748e460a188184e3fcf373ecde,0 +2022-04-20,09:19:26,c8c06d21f553974d0c8dbf5faa5e5e6785b891a8,0 +2022-04-22,17:43:57,f0b8de67c4020e08ac8c5c6d10aa29400d4f8f61,0 +2022-05-12,16:22:21,8fae9de6cf4ed4e87ba8a9bf2d0ca95a94009f2c,0 +2022-06-09,14:55:10,49e50086569006af6961eb01d744cbdf7db727e8,0 +2022-07-28,11:45:49,64dbd62425d03ce7461b9e3d64c94b0bad82f80a,0 +2022-07-28,13:00:14,40b8839b8be46f956101e3259782f581ba2bd399,0 +2022-07-28,13:04:22,34ba4715246d28da6a5837ed93ace284545e78b6,0 +2022-07-29,11:10:33,4463d22d32a81dc4d57c671e62099e1cb3ce907e,0 +2022-09-15,20:16:56,42cd07a448b675b5d6d43f18690909dfde9e5ed3,0 +2022-09-28,17:12:43,f5090860048b1dec42c1dec9bae2b78372b06677,0 +2022-09-29,12:03:55,a9f5d570384bcfd9e103da3d452bab4048ab8fe5,0 +2022-09-29,12:13:27,28f5a8ad0f6f2a1d91097c78c6e7b6ac47426fdc,0 +2022-09-29,12:20:24,0c0c1dbd039333e48aac6823432256582c04cf02,0 +2022-09-29,12:21:29,3251b426d4f1a43f828dd0f4d2871de832f012a9,0 +2022-09-29,16:35:57,db7058691713540882026b898adaee59c04ca8c9,0 +2022-10-27,15:20:04,23462fe5db8e3842cbc30f5fdd20b025cb7496b2,0 +2022-11-04,19:42:20,ba8f3d0ad56c959d903afb56536f06d9d7d268cd,0 +2022-11-06,23:27:48,7f57801d3afd33549b074693bbb4f293a2099ddd,0 +2022-11-08,08:54:47,478956edf97374513262246175248dfab8cf1c98,0 +2022-12-20,18:45:38,d23acadbc1f0406a82189abe3d65decd6d17d111,0 +2022-12-21,15:33:42,36d8a155b1fd77daadf48158e6d3de4dc952ae98,0 +2023-03-07,09:51:49,39991e51d8a89207182ee1275740b89b8333f3af,0 +2023-09-18,10:14:49,1bbf952abe85c54883eeab64b9daa113be87ec24,0 +2024-01-26,11:33:59,aaa6f4fe6651995c3f310ffabcaa2912a06d5974,0 +2024-05-13,17:44:04,01330ffaa2553bc5f465f65eddb58b3b9d27764d,0 +2024-06-06,14:14:33,2cfebf17e1fcac9c02abbdc7164ea5682e9dd0f4,0 +2024-06-11,12:35:28,6534cc6b882111debf3eef7dbcf71f0ab50c519e,0 +2024-06-13,11:40:53,62850ef0b952963293bd1c103ea379f6d3d07b9b,-1 +2024-06-14,11:02:10,3067dd1b4e378d3eb150186895b0b633fe6c206b,0 +2024-06-18,10:53:37,a0f17cb6f9968f67b137f2711918cc4048f14d6c,0 +2024-06-18,11:29:50,d8c1280d2699b44cf4a3ef0c62337f72bdda2675,0 +2024-06-19,17:28:19,319b229700cc9b0e8827976468c2a3cec7780c6c,0 +2024-06-19,17:33:35,516a3e6edaca17eee59d8172c86984277793e870,0 +2024-08-21,11:03:35,cde7c6660fd756bac083b8eaf9b0737dd86da9eb,0 +2024-08-21,11:38:29,b9be9e14b3a0bc65caa9a778abc5fcf54ddb61e2,0 +2024-08-21,11:39:20,8bf74d1d79a29141db43dd583244cf61fea9bdde,0 +2024-08-21,11:39:31,242fa5a7816564927f76dde811f8d5ce1bc28614,0 +2024-08-21,11:41:05,7a81bc8c8b9e1a7004713f67e44623971863f746,0 +2024-11-04,22:30:32,b0f91ae7f2fba291bb5a0504b0372888712defc4,0 +2024-11-24,12:43:44,c06d102b6c37463435985fc0fe6693653161670b,0 +2025-02-03,12:47:01,dfe7651f5b7105d11fbba5ae7bc041df93ff28a5,0 +2025-03-04,12:37:36,d4d61e71a813e5485359a099a20fab39c2b21e56,0 +2025-03-04,13:29:04,86ae60c041fdab2a06bdd50998852970044ddf90,0 +2025-03-04,13:30:41,afebd25fadac68277596c328c994e40e050529b2,0 +2025-03-04,14:49:18,e75171cb2bce8efb10229a78cda438bc62697705,0 +2025-03-04,14:53:29,e9475ef254e631bd3c303491b2e0b5a70193ae82,0 diff --git a/docs/scripts/Ant/ant_cycles_test.ps1 b/docs/scripts/Ant/ant_cycles_test.ps1 new file mode 100644 index 000000000..b44e264ba --- /dev/null +++ b/docs/scripts/Ant/ant_cycles_test.ps1 @@ -0,0 +1,284 @@ +# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +# JAVA_HOME will need to be set to Java 14 / 8 +param( + [string]$StartCommitHash = "", + [string]$StartLoop = "y", + [string]$OriginalUseDir = "", + [string]$ResultsDir = "" +) + +. "..\general_utilities.ps1" +. ".\ant_utilities.ps1" + +######################################### +# Global variables start here # +######################################### + +$ErrorActionPreference = "Stop" +# Set paths based on parameters or use defaults +$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { + $OriginalUseDir +} else { + # Scripts are in docs/scripts/maven, go 3 levels up to repo root + Join-Path (Get-Location) "../../.."} + +# Validate that the original use directory exists +if (-not (Test-Path $ORIGINAL_USE_DIR)) { + Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" + Log-Message "Please specify the correct path using -OriginalUseDir parameter" + exit 1 +} + +$RESULTS_DIR = if ($ResultsDir -ne "") { + $ResultsDir +} else { + Get-Location +} + +# Create results directory if it doesn't exist +if (-not (Test-Path $RESULTS_DIR)) { + New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null +} + +$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" +$RESULTS_FILE = Join-Path $RESULTS_DIR "ant_cycles_test_results.csv" +$LOG_FILE = Join-Path $RESULTS_DIR "ant_cycles_test_log.txt" + +$RELEVANT_PATHS = @(("src/main")) +$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\java\org\tzi\use\architecture\AntCyclicDependenciesCoreTest.java" +$PROPERTIES_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\resources\archunit.properties" + +$ARCHUNIT_JUNIT_PATH = "" +$ARCHUNIT_CORE_PATH = "" +$SLF4J_API_PATH = "" +$SLF4J_SIMPLE_PATH = "" + +######################################### +# Functions start here # +######################################### + +######################################### +# Util Functions # +######################################### + +function Record-Result { + param( + [string]$CommitHash, + [hashtable]$CycleCounts + ) + + $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash + $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash + + $csvLine = "$commitDate,$commitTime,$CommitHash" + + $metrics = @( + "all_modules", + "analysis", + "api", + "config", + "gen", + "graph", + "main", + "parser", + "uml", + "util" + ) + + foreach ($metric in $metrics) { + $value = if ($CycleCounts.ContainsKey($metric)) { $CycleCounts[$metric] } else { 0 } + $csvLine += ",$value" + } + + $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false + [System.IO.File]::AppendAllText($RESULTS_FILE, "$csvLine`r`n", $utf8NoBomEncoding) + Log-Message "Recorded result for commit $CommitHash with all metrics" + + # Save the cycle counts to use for the next commit if needed + $script:previousCycleCounts = $CycleCounts.Clone() +} + +function Parse-CycleResults { + param( + [string[]]$OutputLines + ) + + $metrics = @{} + + # Regex pattern to extract cycle counts + $pattern = "Number of cycles in (org\.tzi\.use(?:\.\w+)?): (\d+)" + $patternCore = "Cycles in core module: (\d+)" + + foreach ($line in $OutputLines) { + # Match for core module counts (all_modules) + if ($line -match $patternCore) { + $metrics["all_modules"] = [int]$matches[1] + } + # Match for specific package counts + elseif ($line -match $pattern) { + $package = $matches[1] -replace "org\.tzi\.use\.", "" + # Handle root package + if ($package -eq "org.tzi.use") { + $package = "all_modules" + } + $metrics[$package] = [int]$matches[2] + } + } + + return $metrics +} + +######################################### +# Dependency Functions # +######################################### + +function Check-Buildxml-Classpath { + $buildXml = Get-Content "build.xml" -Raw + + # Check for ArchUnit property definitions + $hasArchunitJar = $buildXml -match "archunit\.jar" + $hasArchunitJunit4Jar = $buildXml -match "archunit-junit4\.jar" + + # Check for ArchUnit in compilation classpath + $compileClasspathHasArchUnit = $buildXml -match '&1 + + # Parse metrics directly from test output + $cycleMetrics = Parse-CycleResults -OutputLines $test_output + + if ($cycleMetrics.Count -gt 0) { + Log-Message "Successfully parsed cycle metrics from output" + Record-Result -CommitHash $CommitHash -CycleCounts $cycleMetrics + return + } else { + Log-Message "No cycle metrics found in test output" + $failureMetrics = @{} + $metrics = @( + "all_modules", + "analysis", + "api", + "config", + "gen", + "graph", + "main", + "parser", + "uml", + "util" + ) + foreach ($metric in $metrics) { + $failureMetrics[$metric] = -1 + } + Record-Result -CommitHash $CommitHash -CycleCounts $failureMetrics + return + } +} + +function Process-Commit { + param( + [string]$CommitHash + ) + Add-CombinatoricsLib-If-Missing + Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\org\tzi\use\architecture" -FileName "AntCyclicDependenciesCoreTest.java" -FileContent $test_file_content + Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\resources" -FileName "archunit.properties" -FileContent $properties_file_content + Remove-Id-Tags + Update-Java-Version + Add-Dependencies-To-Lib -TempDir $TEMP_DIR + Update-Dependencies-In-Buildxml + Add-Missing-Test-Target-To-Buildxml + Check-Buildxml-Classpath + Check-And-Fix-Bag-File + Check-And-Fix-DiagramView-File + Check-And-Fix-ExtendedJTable-File + Execute-ArchUnit-Test -CommitHash $CommitHash +} + +######################################### +# Setup starts here # +######################################### + +# Initialize csv file with header +Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,all_modules,analysis,api,config,gen,graph,main,parser,uml,util" +# Create and move to use copy +Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR +# Download dependencies once +Setup-Dependencies-In-Shared-Dir -ResultsDir $RESULTS_DIR + +######################################### +# Store ArchUnit Test # +######################################### + +$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH +$properties_file_content = Store-ArchTest -TestFilePath $PROPERTIES_FILE_PATH + +######################################### +# Main Loop starts here # +######################################### + +Verify-StartCommit -StartCommit $StartCommitHash + +# Determine which commits to process +$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop + +$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count +$CURRENT_COMMIT = 1 +$previousCycleCounts = @{} + +try { + foreach ($COMMIT in $CommitsToProcess) { + Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" + + # Get previous commit hash + $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null + if ($LASTEXITCODE -ne 0) { + $previousCommit = $null + } + + $isFirstCommitInRepo = ($previousCommit -eq $null) + $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) + $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) + + if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { + git checkout -q $COMMIT + $is_ant = Test-Path (Join-Path $TEMP_DIR "build.xml") + + if ($is_ant) { + Process-Commit -CommitHash $COMMIT + } else { + Log-Message "No build.xml found. Skipping this commit..." + } + } else { + Log-Message "No relevant changes in commit $COMMIT. Using previous cycle counts." + if ($previousCycleCounts.Count -gt 0) { + Record-Result -CommitHash $COMMIT -CycleCounts $previousCycleCounts + } + } + $CURRENT_COMMIT++ + Cleanup-Commit + } +} +catch { + Log-Message "Catch Block: An error occurred: $_" + Log-Message "Stack Trace: $($_.ScriptStackTrace)" +} +finally { + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR + $dependencies_dir = Join-Path $RESULTS_DIR "dependencies" + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $dependencies_dir +} \ No newline at end of file diff --git a/docs/scripts/Ant/ant_layer_test.ps1 b/docs/scripts/Ant/ant_layer_test.ps1 new file mode 100644 index 000000000..b641c3eae --- /dev/null +++ b/docs/scripts/Ant/ant_layer_test.ps1 @@ -0,0 +1,190 @@ +# JAVA_HOME will need to be set to Java 14 / 8 +# Erster Ant Commit 4cdc2d1 + +param( + [string]$StartCommitHash = "", + [string]$StartLoop = "y", + [string]$OriginalUseDir = "", + [string]$ResultsDir = "" +) + +. "..\general_utilities.ps1" +. ".\ant_utilities.ps1" + +######################################### +# Global variables start here # +######################################### + +$ErrorActionPreference = "Stop" +# Set paths based on parameters or use defaults +$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { + $OriginalUseDir +} else { + # Scripts are in docs/scripts/maven, go 3 levels up to repo root + Join-Path (Get-Location) "../../.."} + +# Validate that the original use directory exists +if (-not (Test-Path $ORIGINAL_USE_DIR)) { + Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" + Log-Message "Please specify the correct path using -OriginalUseDir parameter" + exit 1 +} + +$RESULTS_DIR = if ($ResultsDir -ne "") { + $ResultsDir +} else { + Get-Location +} + +# Create results directory if it doesn't exist +if (-not (Test-Path $RESULTS_DIR)) { + New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null +} + +$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" +$RESULTS_FILE = Join-Path $RESULTS_DIR "ant_layer_violations_history.csv" +$LOG_FILE = Join-Path $RESULTS_DIR "ant_layer_test_log.txt" + +$RELEVANT_PATHS = @(("src/main"), ("src/gui")) +$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-gui\src\test\java\org\tzi\use\architecture\AntLayeredArchitectureTest.java" + +$ARCHUNIT_JUNIT_PATH = "" +$ARCHUNIT_CORE_PATH = "" +$SLF4J_API_PATH = "" +$SLF4J_SIMPLE_PATH = "" + +######################################### +# Functions start here # +######################################### + +function Parse-Test-Results { + param( + [string]$TestOutput + ) + + $violation_count = -1 + + foreach ($line in $test_output) { + if ($line -match "Number of violations: (\d+)") { + $violation_count = [int]$matches[1] + Log-Message "Found violation count: $violation_count" + break + } + } + return $violation_count +} + +######################################### +# Building & Testing Functions # +######################################### + +function Run-ArchUnit-Test { + param( + [string]$CommitHash + ) + + Log-Message "Running ant test-junit for ArchUnit test..." + $test_output = ant test-junit -Dtest.case="org.tzi.use.architecture.AntLayeredArchitectureTest" 2>&1 + + $violation_count = Parse-Test-Results -TestOutput $test_output + + if ($violation_count -ge 0) { + Record-Simple-Result -CommitHash $CommitHash -TestResult $violation_count -ResultsFile $RESULTS_FILE + } else { + Log-Message "Failed to extract violation count from test output" + Record-Simple-Result -CommitHash $CommitHash -ResultsFile $RESULTS_FILE + } +} + +function Process-Commit { + param( + [string]$CommitHash + ) + + Add-CombinatoricsLib-If-Missing + Inject-File -TempDir $TEMP_DIR -RelativePath "src\test\org\tzi\use\architecture" -FileName "AntLayeredArchitectureTest.java" -FileContent $test_file_content + Remove-Id-Tags + Update-Java-Version + Add-Dependencies-To-Lib -TempDir $TEMP_DIR + Update-Dependencies-In-Buildxml + Add-Missing-Test-Target-To-Buildxml + + if ($LASTEXITCODE -ne 0) { + Log-Message "Build.xml injection failed. Skipping this commit..." + Record-Simple-Result -CommitHash $CommitHash -ResultsFile $RESULTS_FILE + return $false + } + + Check-And-Fix-Bag-File + Check-And-Fix-DiagramView-File + Check-And-Fix-ExtendedJTable-File + Run-ArchUnit-Test -CommitHash $CommitHash + return $true +} + +######################################### +# Setup starts here # +######################################### + +# Initialize results file with headers +Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,violations" +# Create and move to use copy +Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR +# Download dependencies once +Setup-Dependencies-In-Shared-Dir -ResultsDir $RESULTS_DIR + +######################################### +# Store ArchUnit Test # +######################################### + +$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH + +######################################### +# Main Loop starts here # +######################################### + +Verify-StartCommit -StartCommit $StartCommitHash + +$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop +$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count +$CURRENT_COMMIT = 1 + +try { + foreach ($COMMIT in $CommitsToProcess) { + Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" + + $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null + + $isFirstCommitInRepo = ($previousCommit -eq $null) + $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) + $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) + + if($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { + git checkout -q $COMMIT + $is_ant = Test-Path (Join-Path $TEMP_DIR "build.xml") + $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") + + if($is_ant -and (-not $is_maven)) { + $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT + if (-not $commitProcessedSuccessfully) { + Log-Message "Build failed for commit $COMMIT" + } + } else { + Log-Message "No build.xml found. Skipping this commit..." + } + } else { + Log-Message "No relevant changes in commit $COMMIT. Skipping..." + } + $CURRENT_COMMIT++ + Cleanup-Commit + } +} +catch { + Log-Message "Catch Block: An error occurred: $_" + Log-Message "Stack Trace: $($_.ScriptStackTrace)" +} +finally { + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR + $dependencies_dir = Join-Path $RESULTS_DIR "dependencies" + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $dependencies_dir +} \ No newline at end of file diff --git a/docs/scripts/Ant/ant_utilities.ps1 b/docs/scripts/Ant/ant_utilities.ps1 new file mode 100644 index 000000000..bc90a84a9 --- /dev/null +++ b/docs/scripts/Ant/ant_utilities.ps1 @@ -0,0 +1,297 @@ +######################################### +# Fixing Functions # +######################################### + +function Check-And-Fix-Bag-File { + $bagFile = Get-ChildItem -Recurse -Filter "Bag.java" | Select-Object -First 1 + + if ($bagFile) { + $content = Get-Content $bagFile.FullName -Raw + $needsFixing = $content -match 'boolean contains\(T obj\)' -or + $content -match 'boolean remove\(T o\)' -or + (-not ($content -match '@Override.*boolean contains\(Object obj\)' -or + $content -match '@Override.*boolean remove\(Object o\)')) + + if ($needsFixing) { + Log-Message "Faulty Bag interface - Applying fix..." + $content = $content -replace 'boolean contains\(T obj\)', 'boolean contains(Object obj)' + $content = $content -replace 'boolean remove\(T o\)', 'boolean remove(Object o)' + $content | Set-Content $bagFile.FullName + } + } +} + +function Check-And-Fix-DiagramView-File { + $diagramViewFile = Get-ChildItem -Recurse -Filter "DiagramView.java" | Select-Object -First 1 + + if ($diagramViewFile) { + $content = Get-Content $diagramViewFile.FullName -Raw + $needsFixing = $content -match 'new OutputFormat\(doc\);' + + if ($needsFixing) { + Log-Message "Faulty DiagramView file - Applying fix..." + $content = $content -replace 'new OutputFormat\(doc\);', 'new OutputFormat();' + $content | Set-Content $diagramViewFile.FullName + } + } +} + +function Check-And-Fix-ExtendedJTable-File { + $extendedJTableFile = Get-ChildItem -Recurse -Filter "ExtendedJTable.java" | Select-Object -First 1 + + if ($extendedJTableFile) { + $content = Get-Content $extendedJTableFile.FullName -Raw + $needsFixing = $content -match 'public ExtendedJTable\(Vector\<\?\> rowData\, Vector\<\?\> columnNames\)' + + if ($needsFixing) { + Log-Message "Faulty ExtendedJTable constructor - Applying fix..." + $content = $content -replace 'public ExtendedJTable\(Vector\<\?\> rowData\, Vector\<\?\> columnNames\)', 'public ExtendedJTable(Vector> rowData, Vector columnNames)' + $content | Set-Content $extendedJTableFile.FullName + } + } +} + +function Remove-Id-Tags { + Get-ChildItem -Recurse -Filter *.java | ForEach-Object { + $content = Get-Content $_.FullName -Raw + if ($content -match '\$Id\$') { + $content = $content -replace '\$Id\$', '' + $content | Set-Content $_.FullName + } + } + if (Test-Path "build.xml") { + $content = Get-Content "build.xml" -Raw + if ($content -match '') { + $content = $content -replace '\s*\n', '' + $content | Set-Content "build.xml" + } + } +} + +######################################### +# Dependency Functions # +######################################### + +# Downloads necessary jar-Files from Maven Central into a specified dir +function Download-Jar { + param( + [string]$GroupId, + [string]$ArtifactId, + [string]$Version, + [string]$TargetDir + ) + + $groupPath = $GroupId -replace '\.', '/' + $jarName = "$ArtifactId-$Version.jar" + $url = "https://repo1.maven.org/maven2/$groupPath/$ArtifactId/$Version/$jarName" + $targetPath = Join-Path $TargetDir $jarName + + try { + Invoke-WebRequest -Uri $url -OutFile $targetPath -UseBasicParsing + Log-Message "Successfully downloaded $jarName" + return $targetPath + } + catch { + Log-Message "Failed to download $jarName`: $_" + exit 1 + } +} + +# Locally creates shared dependencies dir for all commits and calls Download-Jar +# This avoids downloading jars for every commit +function Setup-Dependencies-In-Shared-Dir { + param( + [string]$ResultsDir + ) + + # Create a shared lib directory for downloads + $shared_dep_dir = Join-Path $ResultsDir "dependencies" + if (-not (Test-Path $shared_dep_dir)) { + New-Item -ItemType Directory -Force -Path $shared_dep_dir | Out-Null + } + + # Download dependencies once and store paths in global variables + $script:ARCHUNIT_JUNIT_PATH = Download-Jar "com.tngtech.archunit" "archunit-junit4" "0.23.1" $shared_dep_dir + $script:ARCHUNIT_CORE_PATH = Download-Jar "com.tngtech.archunit" "archunit" "0.23.1" $shared_dep_dir + $script:SLF4J_API_PATH = Download-Jar "org.slf4j" "slf4j-api" "1.7.25" $shared_dep_dir + $script:SLF4J_SIMPLE_PATH = Download-Jar "org.slf4j" "slf4j-nop" "1.7.25" $shared_dep_dir + + Log-Message "Dependencies setup completed" +} + +# Copies pre-downloaded dependencies to a commit's lib directory +function Add-Dependencies-To-Lib { + param( + [string]$TempDir + ) + $lib_dir = Join-Path $TempDir "lib" + if (-not (Test-Path $lib_dir)) { + New-Item -ItemType Directory -Force -Path $lib_dir | Out-Null + } + + Copy-Item $script:ARCHUNIT_JUNIT_PATH (Join-Path $lib_dir "archunit-junit4-0.23.1.jar") + Copy-Item $script:ARCHUNIT_CORE_PATH (Join-Path $lib_dir "archunit-0.23.1.jar") + Copy-Item $script:SLF4J_API_PATH (Join-Path $lib_dir "slf4j-api-1.7.25.jar") + Copy-Item $script:SLF4J_SIMPLE_PATH (Join-Path $lib_dir "slf4j-simple-1.7.25.jar") + + Log-Message "Copied ArchUnit & SLF4J dependencies to lib directory" +} + +######################################### +# Debugging Functions # +######################################### + +function Detect-Original-Java-Version { + if (Test-Path "build.xml") { + $buildXml = Get-Content "build.xml" -Raw + + # Check for source version pattern + if ($buildXml -match 'source="(1\.)?(\d+)"') { + $sourceVersion = $matches[2] + Log-Message "Original Java source version detected: $sourceVersion" + } + elseif ($buildXml -match 'java\.sourceversion"\s+value="1\.(\d+)"') { + $sourceVersion = $matches[1] + Log-Message "Original Java source version detected: $sourceVersion" + } + elseif ($buildXml -match 'value="1\.(\d+)"') { + $sourceVersion = $matches[1] + Log-Message "Original Java version detected: $sourceVersion" + } + else { + Log-Message "Could not detect Java version from build.xml" + } + + # Also check if ANTLR version is specified + if ($buildXml -match 'antlr-([\d\.]+)\.jar') { + $antlrVersion = $matches[1] + Log-Message "ANTLR version detected: $antlrVersion" + } + } + else { + Log-Message "build.xml not found, cannot detect Java version" + } +} + +function Print-BuildXml { + if (Test-Path "build.xml") { + Write-Host "Contents of build.xml:" + Get-Content "build.xml" | ForEach-Object { Write-Host $_ } + } else { + Write-Host "build.xml not found in the current directory." + } +} + +######################################### +# Updating Functions # +######################################### + +# Update to Java 8 because 6 is not compatible with ArchUnit and to increase backwards compatibility +function Update-Java-Version { + $buildXml = Get-Content "build.xml" -Raw + + $buildXml = $buildXml -replace 'source="(1\.)?(\d+)"', 'source="8"' + $buildXml = $buildXml -replace 'target="(1\.)?(\d+)"', 'target="8"' + $buildXml = $buildXml -replace '(java\.targetversion"\s+value=")1\.?\d+(")', 'java.targetversion" value="8"' + $buildXml = $buildXml -replace '(java\.sourceversion"\s+value=")1\.?\d+(")', 'java.sourceversion" value="8"' + $buildXml = $buildXml -replace 'value="1\.[0-7]+"', 'value="8"' + $buildXml = $buildXml -replace 'value="1\.[0-7]+\s*"', 'value="8"' + + $buildXml | Set-Content "build.xml" + + $content = Get-Content "build.xml" -Raw + if ($content -match 'value="8"') { + Log-Message "Successfully updated Java version to 8" + } else { + Log-Message "Java version update may not have worked. Exiting..." + exit 1 + } +} + +# Add necessary archunit and slf4j dependencies to build.xml +function Update-Dependencies-In-Buildxml { + $buildXml = Get-Content "build.xml" -Raw + + $buildXml = $buildXml -replace '()[\s\S]*?', '$1' + + if ($buildXml -match "archunit-junit4-0.23.1.jar|archunit-0.23.1.jar") { + Log-Message "ArchUnit dependencies already present in build.xml" + return + } + + $propertyInsert = @" + + + + + +"@ + + $buildXml = $buildXml -replace '()', "`$1`n$propertyInsert" + $buildXml = $buildXml -replace '()', "`$1`n$propertyInsert" + + $newDeps = ':${archunit.jar}:${archunit-junit4.jar}:${slf4j-api.jar}:${slf4j-simple.jar}:${src.test.resources.dir}' + + $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\}:\$\{combinatoricslib\.jar\}:\$\{vtd-xml\.jar\}:\$\{itextpdf\.jar\})', "`$1$newDeps" + $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\}:\$\{combinatoricslib\.jar\})', "`$1$newDeps" + + $buildXml = $buildXml -replace '(classpath path="\$\{antlr\.jar\}:\$\{build\.classes\.dir\}:\$\{gsbase\.jar\}:\$\{jruby\.jar\}:\$\{junit\.jar\}:\$\{guava\.jar\})', "`$1$newDeps" + $buildXml = $buildXml -replace '(classpath path="\$\{antlr\.jar\}:\$\{build\.classes\.dir\}:\$\{gsbase\.jar\}:\$\{jruby\.jar\}:\$\{junit\.jar\})', "`$1$newDeps" + + $buildXml | Set-Content "build.xml" -Force + Log-Message "Successfully added ArchUnit dependencies to build.xml" +} + +######################################### +# Adding Missing Build.xml Contents Functions # +######################################### + +# Add a test-junit target if it doesn't exist +function Add-Missing-Test-Target-To-Buildxml { + $buildXml = Get-Content "build.xml" -Raw + + if ($buildXml -notmatch ' + + + + + + + + + + + + + + + + +"@ + + # Add test target before closing bracket of project + if ($buildXml -match '') { + $buildXml = $buildXml -replace '', "$testJunitTarget`n" + $buildXml | Set-Content "build.xml" -Force + Log-Message "Added test-junit target to build.xml" + } + } +} + +# Adds missing reference of combinatoricslib in build.xml, relies on it being present in the lib dir +function Add-CombinatoricsLib-If-Missing { + $buildXml = Get-Content "build.xml" -Raw + + if ($buildXml -notmatch "combinatoricslib\.jar") { + $propertyLine = ' ' + $buildXml = $buildXml -replace '()', "`$1`n$propertyLine" + + $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{jruby\.jar\})"', '$1:${combinatoricslib.jar}"' + $buildXml = $buildXml -replace '(classpath="\$\{antlr\.jar\}:\$\{junit\.jar\}:\$\{gsbase\.jar\})"', '$1:${combinatoricslib.jar}"' + + $buildXml | Set-Content "build.xml" -Force + Log-Message "Added combinatoricslib dependency to build.xml" + } +} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_buildtime_test.ps1 b/docs/scripts/Maven/maven_buildtime_test.ps1 new file mode 100644 index 000000000..2c2b12f46 --- /dev/null +++ b/docs/scripts/Maven/maven_buildtime_test.ps1 @@ -0,0 +1,139 @@ +# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +# First Maven Commit is 132ab9b +param( + [string]$StartCommitHash = "", + [string]$StartLoop = "y", + [string]$OriginalUseDir = "", + [string]$ResultsDir = "" +) + +. ".\general_utilities.ps1" +. ".\maven_utilities.ps1" + +######################################### +# Global variables start here # +######################################### + +$ErrorActionPreference = "Stop" +# Set paths based on parameters or use defaults +$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { + $OriginalUseDir +} else { + # Scripts are in docs/scripts/maven, go 3 levels up to repo root + Join-Path (Get-Location) "../../.."} + +# Validate that the original use directory exists +if (-not (Test-Path $ORIGINAL_USE_DIR)) { + Log-Message "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" + Log-Message "Please specify the correct path using -OriginalUseDir parameter" + exit 1 +} + +$RESULTS_DIR = if ($ResultsDir -ne "") { + $ResultsDir +} else { + Get-Location +} + +# Create results directory if it doesn't exist +if (-not (Test-Path $RESULTS_DIR)) { + New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null +} + +$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" +$RESULTS_FILE = Join-Path $RESULTS_DIR "build_time_history.csv" +$LOG_FILE = Join-Path $RESULTS_DIR "test_log_build_time_history.txt" + +######################################### +# Functions start here # +######################################### + +######################################### +# Build & Execution Functions # +######################################### + +function Measure-Build-Time { + param( + [string]$CommitHash + ) + + Log-Message "Measuring build time..." + + # Measure time it takes to build & test the project + $startTime = Get-Date + $buildOutput = mvn --batch-mode --update-snapshots verify + $endTime = Get-Date + $buildTime = $endTime - $startTime + # Convert to seconds + $buildTimeSec = [int]$buildTime.TotalSeconds + + if ($LASTEXITCODE -eq 0) { + Log-Message "Build completed successfully in $buildTimeSec s" + Record-Simple-Result -CommitHash $CommitHash -TestResult $buildTimeSec -ResultsFile $RESULTS_FILE + return $true + } else { + return $false + } +} + +function Process-Commit { + param( + [string]$CommitHash + ) + + Update-Java-Version-For-Maven + Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR + $mavenBuildSuccess = Measure-Build-Time -CommitHash $CommitHash + Cleanup-Commit + + return $mavenBuildSuccess +} + +######################################### +# Setup starts here # +######################################### + +# Initialize results file with headers +Initialize-Results-File -FilePath $RESULTS_DIR -Header "date,time,commit,buildtime" + +Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR +git checkout -q master + +######################################### +# Main Loop starts here # +######################################### + +Verify-StartCommit -StartCommit $StartCommitHash + +# Determine which commits to process +$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop + +$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count +$CURRENT_COMMIT = 1 + +try { + foreach ($COMMIT in $CommitsToProcess) { + Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" + + git checkout -q $COMMIT + $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") + + if($is_maven) { + $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT + if (-not $commitProcessedSuccessfully) { + Log-Message "Build failed for commit $COMMIT" + Record-Simple-Result -CommitHash $COMMIT -TestResult -1 -ResultsFile $RESULTS_FILE + } + } else { + Log-Message "No pom.xml found. Skipping this commit..." + } + $CURRENT_COMMIT++ + } +} +catch { + Log-Message "Catch Block: An error occurred: $_" + Log-Message "Stack Trace: $($_.ScriptStackTrace)" +} +finally { + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR +} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_cycles_test.ps1 b/docs/scripts/Maven/maven_cycles_test.ps1 new file mode 100644 index 000000000..81bdb4f81 --- /dev/null +++ b/docs/scripts/Maven/maven_cycles_test.ps1 @@ -0,0 +1,288 @@ +# JAVA_HOME will need to be set to Java 21 +# First Maven Commit is 132ab9b +param( + [string]$StartCommitHash = "", + [string]$StartLoop = "y", + [string]$OriginalUseDir = "", + [string]$ResultsDir = "" +) + +. "..\general_utilities.ps1" +. ".\maven_utilities.ps1" + +######################################### +# Global variables start here # +######################################### + +$ErrorActionPreference = "Stop" +# Set paths based on parameters or use defaults +$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { + $OriginalUseDir +} else { + # Scripts are in docs/scripts/maven, go 3 levels up to repo root + Join-Path (Get-Location) "../../.." +} + +# Validate that the original use directory exists +if (-not (Test-Path $ORIGINAL_USE_DIR)) { + Write-Host "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" + Write-Host "Please specify the correct path using -OriginalUseDir parameter" + exit 1 +} + +$RESULTS_DIR = if ($ResultsDir -ne "") { + $ResultsDir +} else { + Get-Location +} + +# Create results directory if it doesn't exist +if (-not (Test-Path $RESULTS_DIR)) { + New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null +} + +$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" +$RESULTS_FILE = Join-Path $RESULTS_DIR "maven_cycles_history.csv" +$LOG_FILE = Join-Path $RESULTS_DIR "maven_cycles_test_log.txt" + +$RELEVANT_PATHS = @( + ("use-gui/src/"), + ("use-core/src/") +) +$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\java\org\tzi\use\architecture\MavenCyclicDependenciesCoreTest.java" +$PROPERTIES_FILE_PATH = Join-Path $TEMP_DIR "use-core\src\test\resources\archunit.properties" + +######################################### +# Functions start here # +######################################### + +######################################### +# Util Functions # +######################################### + +function Record-Result { + param( + [string]$CommitHash, + [hashtable]$CycleCounts + ) + + $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash + $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash + + $csvLine = "$commitDate,$commitTime,$CommitHash" + + # Add metrics in the correct order for CSV + $metrics = @( + "all_modules_no_tests", "all_modules_with_tests", + "analysis_no_tests", "analysis_with_tests", + "api_no_tests", "api_with_tests", + "config_no_tests", "config_with_tests", + "gen_no_tests", "gen_with_tests", + "graph_no_tests", "graph_with_tests", + "main_no_tests", "main_with_tests", + "parser_no_tests", "parser_with_tests", + "uml_no_tests", "uml_with_tests", + "util_no_tests", "util_with_tests" + ) + + foreach ($metric in $metrics) { + $value = if ($CycleCounts.ContainsKey($metric)) { $CycleCounts[$metric] } else { 0 } + $csvLine += ",$value" + } + + $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false + [System.IO.File]::AppendAllText($RESULTS_FILE, "$csvLine`r`n", $utf8NoBomEncoding) + Log-Message "Recorded result for commit $CommitHash with all metrics" + + # Save the cycle counts to use for the next commit if needed + $script:previousCycleCounts = $CycleCounts.Clone() +} + +function Parse-CycleResults { + param( + [string[]]$OutputLines + ) + + $metrics = @{} + + # Regex patterns to extract cycle counts from stdout + $patternNoTests = "Number of cycles in (org\.tzi\.use(?:\.\w+)?) without tests: (\d+)" + $patternWithTests = "Number of cycles in (org\.tzi\.use(?:\.\w+)?) with tests: (\d+)" + $patternCoreNoTests = "Cycles in core module without tests : (\d+)" + $patternCoreWithTests = "Cycles in core module with tests : (\d+)" + + foreach ($line in $OutputLines) { + # Match for core module counts (all_modules) + if ($line -match $patternCoreNoTests) { + $metrics["all_modules_no_tests"] = [int]$matches[1] + } + elseif ($line -match $patternCoreWithTests) { + $metrics["all_modules_with_tests"] = [int]$matches[1] + } + # Match for specific package counts + elseif ($line -match $patternNoTests) { + $package = $matches[1] -replace "org\.tzi\.use\.", "" + # Handle root package + if ($package -eq "org.tzi.use") { + $package = "all_modules" + } + $metrics["$($package)_no_tests"] = [int]$matches[2] + } + elseif ($line -match $patternWithTests) { + $package = $matches[1] -replace "org\.tzi\.use\.", "" + # Handle root package + if ($package -eq "org.tzi.use") { + $package = "all_modules" + } + $metrics["$($package)_with_tests"] = [int]$matches[2] + } + } + return $metrics +} + +######################################### +# Build & Execution Functions # +######################################### + +function Run-ArchUnit-Test { + Log-Message "Running ArchUnit test..." + $test_output = mvn -pl use-core test "-Dtest=org.tzi.use.architecture.MavenCyclicDependenciesCoreTest#count_cycles_in_core_without_tests" -DfailIfNoTests=false 2>&1 + + # Parse metrics directly from test output + $cycleMetrics = Parse-CycleResults -OutputLines $test_output + + if ($cycleMetrics.Count -gt 0) { + Log-Message "Successfully parsed cycle metrics from output" + return $cycleMetrics + } else { + Log-Message "No cycle metrics found in test output" + return @{} + } +} + +function Maven-Build-And-Test { + param( + [string]$CommitHash + ) + + $compile_output = mvn clean compile 2>&1 + if ($LASTEXITCODE -ne 0) { + Log-Message "Maven compilation failed. Error output:" + $compile_output | ForEach-Object { Log-Message $_ } + return $false + } + + $cycleMetrics = Run-ArchUnit-Test + + if ($cycleMetrics.Count -gt 0) { + Record-Result -CommitHash $CommitHash -CycleCounts $cycleMetrics + return $true + } else { + return $false + } +} + +function Process-Commit { + param( + [string]$CommitHash, + [hashtable]$PreviousCycleCounts + ) + + Update-Java-Version-For-Maven + Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR + Inject-File -TempDir $TEMP_DIR -RelativePath "use-core\src\test\java\org\tzi\use\architecture" -FileName "MavenCyclicDependenciesCoreTest.java" -FileContent $test_file_content + Inject-File -TempDir $TEMP_DIR -RelativePath "use-core\src\test\resources" -FileName "archunit.properties" -FileContent $properties_file_content + $mavenBuildSuccess = Maven-Build-And-Test -CommitHash $CommitHash + + return $mavenBuildSuccess +} + + +######################################### +# Setup starts here # +######################################### + +# Initialize results file with header +Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,all_modules_no_tests,all_modules_with_tests,analysis_no_tests,analysis_with_tests,api_no_tests,api_with_tests,config_no_tests,config_with_tests,gen_no_tests,gen_with_tests,graph_no_tests,graph_with_tests,main_no_tests,main_with_tests,parser_no_tests,parser_with_tests,uml_no_tests,uml_with_tests,util_no_tests,util_with_tests" +# Create and move to use copy +Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR + +######################################### +# Store ArchUnit Test # +######################################### + +$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH +$properties_file_content = Store-ArchTest -TestFilePath $PROPERTIES_FILE_PATH + +######################################### +# Main Loop starts here # +######################################### + +Verify-StartCommit -StartCommit $StartCommitHash + +# Determine which commits to process +$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop + +$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count +$CURRENT_COMMIT = 1 +$previousCycleCounts = @{} + +try { + foreach ($COMMIT in $CommitsToProcess) { + Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" + + # Get previous commit hash + $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null + if ($LASTEXITCODE -ne 0) { + $previousCommit = $null + } + + $isFirstCommitInRepo = ($previousCommit -eq $null) + $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) + $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) + + if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { + git checkout -q $COMMIT + $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") + + if ($is_maven) { + $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT -PreviousCycleCounts $previousCycleCounts + if (-not $commitProcessedSuccessfully) { + $failureMetrics = @{} + $metrics = @( + "all_modules_no_tests", "all_modules_with_tests", + "analysis_no_tests", "analysis_with_tests", + "api_no_tests", "api_with_tests", + "config_no_tests", "config_with_tests", + "gen_no_tests", "gen_with_tests", + "graph_no_tests", "graph_with_tests", + "main_no_tests", "main_with_tests", + "parser_no_tests", "parser_with_tests", + "uml_no_tests", "uml_with_tests", + "util_no_tests", "util_with_tests" + ) + foreach ($metric in $metrics) { + $failureMetrics[$metric] = -1 + } + Record-Result -CommitHash $COMMIT -CycleCounts $failureMetrics + } + } else { + Log-Message "No pom.xml found. Skipping this commit..." + } + } else { + Log-Message "No relevant changes in commit $COMMIT. Using previous cycle counts." + if ($previousCycleCounts.Count -gt 0) { + Record-Result -CommitHash $COMMIT -CycleCounts $previousCycleCounts + } + } + $CURRENT_COMMIT++ + Cleanup-Commit + } +} +catch { + Log-Message "Catch Block: An error occurred: $_" + Log-Message "Stack Trace: $($_.ScriptStackTrace)" +} +finally { + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR +} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_layer_test.ps1 b/docs/scripts/Maven/maven_layer_test.ps1 new file mode 100644 index 000000000..8889d13ab --- /dev/null +++ b/docs/scripts/Maven/maven_layer_test.ps1 @@ -0,0 +1,218 @@ +# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +# First Maven Commit is 132ab9b +param( + [string]$StartCommitHash = "", + [string]$StartLoop = "y", + [string]$OriginalUseDir = "", + [string]$ResultsDir = "" +) + +. "..\general_utilities.ps1" +. ".\maven_utilities.ps1" + +######################################### +# Global variables start here # +######################################### + +$ErrorActionPreference = "Stop" +# Set paths based on parameters or use defaults +$ORIGINAL_USE_DIR = if ($OriginalUseDir -ne "") { + $OriginalUseDir +} else { + # Scripts are in docs/scripts/maven, go 3 levels up to repo root + Join-Path (Get-Location) "../../.." +} + +# Validate that the original use directory exists +if (-not (Test-Path $ORIGINAL_USE_DIR)) { + Write-Host "Error: Original USE directory not found at: $ORIGINAL_USE_DIR" + Write-Host "Please specify the correct path using -OriginalUseDir parameter" + exit 1 +} + +$RESULTS_DIR = if ($ResultsDir -ne "") { + $ResultsDir +} else { + Get-Location +} + +# Create results directory if it doesn't exist +if (-not (Test-Path $RESULTS_DIR)) { + New-Item -ItemType Directory -Force -Path $RESULTS_DIR | Out-Null +} + +$TEMP_DIR = Join-Path $RESULTS_DIR "USE_TEMP_$(Get-Random)" +$RESULTS_FILE = Join-Path $RESULTS_DIR "maven_layers_history.csv" +$LOG_FILE = Join-Path $RESULTS_DIR "mave_layers_test_log.txt" + +$RELEVANT_PATHS = @( + ("use-gui/src/"), + ("use-core/src/") +) +$TEST_FILE_PATH = Join-Path $TEMP_DIR "use-gui\src\test\java\org\tzi\use\architecture\MavenLayeredArchitectureTest.java" + + +######################################### +# Functions start here # +######################################### + +######################################### +# Dependency Functions # +######################################### + +function Parse-Test-Results { + param( + [string[]]$TestOutput + ) + + # Violation count appears alone on the line after the "Running org.tzi.use.architecture.MavenLayeredArchitectureTest" line + $violation_count = -1 + $running_line_found = $false + + foreach ($line in $test_output) { + if ($running_line_found) { + # The next line should contain the violation count + if ($line -match '^\s*(\d+)\s*$') { + $violation_count = [int]$matches[1] + break + } + } + + if ($line -match 'Running org\.tzi\.use\.architecture\.MavenLayeredArchitectureTest') { + $running_line_found = $true + } + } + return $violation_count +} + +######################################### +# Build & Execution Functions # +######################################### + +function Run-ArchUnit-Test { + param( + [string]$CommitHash + ) + Log-Message "Running ArchUnit test..." + $test_output = mvn -pl use-gui test "-Dtest=org.tzi.use.architecture.MavenLayeredArchitectureTest" -DfailIfNoTests=false -o 2>&1 + + # Parse metrics directly from test output + $violation_count = Parse-Test-Results -TestOutput $test_output + + if ($violation_count -ge 0) { + Log-Message "Successfully parsed violation count from test output" + Record-Simple-Result -CommitHash $CommitHash -TestResult $violation_count -ResultsFile $RESULTS_FILE + } else { + Log-Message "Failed to extract violation count from test output" + Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE + } +} + +function Maven-Build-And-Test { + param( + [string]$CommitHash + ) + + # Build & install parent pom + $parent_output = mvn -N clean install 2>&1 + + if ($LASTEXITCODE -ne 0) { + Log-Message "Parent pom installation failed:" + $parent_output | ForEach-Object { Log-Message $_ } + Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE + return $false + } + + # Install core module to local repository (without tests) bc of snapshot errors + $core_install_output = mvn -pl use-core clean install -DskipTests 2>&1 + + if ($LASTEXITCODE -ne 0) { + Log-Message "Maven core module installation failed:" + Record-Simple-Result -CommitHash $CommitHash -TestResult -1 -ResultsFile $RESULTS_FILE + return $false + } + Log-Message "Core module installed successfully. Compiling project..." + + Run-ArchUnit-Test -CommitHash $CommitHash + return $true +} + +function Process-Commit { + param( + [string]$CommitHash + ) + + Update-Java-Version-For-Maven + Ensure-Dependencies-For-Maven -TempDir $TEMP_DIR + Inject-File -TempDir $TEMP_DIR -RelativePath "use-gui\src\test\java\org\tzi\use\architecture" -FileName "MavenLayeredArchitectureTest.java" -FileContent $test_file_content + $mavenBuildSuccess = Maven-Build-And-Test -CommitHash $CommitHash + + return $mavenBuildSuccess +} + +######################################### +# Setup starts here # +######################################### + +# Initialize results file with header +Initialize-Results-File -FilePath $RESULTS_FILE -Header "date,time,commit,violations" +# Create and move to use copy +Setup-Repo -TempDir $TEMP_DIR -OriginalUseDir $ORIGINAL_USE_DIR + +######################################### +# Store ArchUnit Test # +######################################### + +$test_file_content = Store-ArchTest -TestFilePath $TEST_FILE_PATH + +######################################### +# Main Loop starts here # +######################################### + +Verify-StartCommit -StartCommit $StartCommitHash + +# Determine which commits to process +$CommitsToProcess = Determine-Commits-To-Process -StartCommitHash $StartCommitHash -StartLoop $StartLoop + +$TOTAL_COMMITS = ($CommitsToProcess | Measure-Object).Count +$CURRENT_COMMIT = 1 + +try { + foreach ($COMMIT in $CommitsToProcess) { + Log-Message "[$CURRENT_COMMIT/$TOTAL_COMMITS] Processing commit: $COMMIT" + + $previousCommit = git log -1 --format="%H" "$COMMIT^" 2>$null + if ($LASTEXITCODE -ne 0) { + $previousCommit = $null + } + + $isFirstCommitInRepo = ($previousCommit -eq $null) + $isStartCommit = ($StartCommitHash -ne "" -and $COMMIT -eq $StartCommitHash) + $hasRelevantChanges = (Has-Relevant-Changes -CommitHash $COMMIT -PreviousCommitHash $previousCommit -RelevantPaths $RELEVANT_PATHS) + + if ($isFirstCommitInRepo -or $isStartCommit -or $hasRelevantChanges) { + git checkout -q $COMMIT + $is_maven = Test-Path (Join-Path $TEMP_DIR "pom.xml") + + if($is_maven){ + $commitProcessedSuccessfully = Process-Commit -CommitHash $COMMIT + if (-not $commitProcessedSuccessfully) { + Log-Message "Build failed for commit $COMMIT" + } + } else { + Log-Message "No pom.xml found. Skipping this commit..." + } + } else { + Log-Message "No relevant changes in commit $COMMIT. Skipping..." + } + $CURRENT_COMMIT++ + Cleanup-Commit + } +} +catch { + Log-Message "Catch Block: An error occurred: $_" + Log-Message "Stack Trace: $($_.ScriptStackTrace)" +} +finally { + Final-Cleanup -ResultsDir $RESULTS_DIR -TempDir $TEMP_DIR +} \ No newline at end of file diff --git a/docs/scripts/Maven/maven_utilities.ps1 b/docs/scripts/Maven/maven_utilities.ps1 new file mode 100644 index 000000000..a4fc70f15 --- /dev/null +++ b/docs/scripts/Maven/maven_utilities.ps1 @@ -0,0 +1,102 @@ +. "..\general_utilities.ps1" + +######################################### +# Dependency Functions # +######################################### + +function Ensure-Dependencies-For-Maven { + param( + [string]$TempDir + ) + + $pom_files = @("pom.xml", "use-core/pom.xml", "use-gui/pom.xml") + + foreach ($pom_file in $pom_files) { + $full_path = Join-Path $TempDir $pom_file + if (Test-Path $full_path) { + Log-Message "Checking and adding dependencies in $full_path" + $pom = [xml](Get-Content $full_path) + + if ($null -eq $pom.project) { + Log-Message "Project node not found in $full_path. Exiting..." + exit 1 + } + + if ($null -eq $pom.project.dependencies) { + Log-Message "No dependencies in pom" + $dependencies = $pom.CreateElement("dependencies", $pom.DocumentElement.NamespaceURI) + $pom.project.AppendChild($dependencies) + } else { + $dependencies = $pom.project.dependencies + } + + $archunit_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "archunit-junit5" } + if (-not $archunit_present) { + $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) + $new_dep.InnerXml = "com.tngtech.archunitarchunit-junit51.0.1" + $dependencies.AppendChild($new_dep) + } + + $junit_jupiter_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "junit-jupiter" } + if (-not $junit_jupiter_present) { + $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) + $new_dep.InnerXml = "org.junit.jupiterjunit-jupiter5.8.2test" + $dependencies.AppendChild($new_dep) + } + + $slf4j_nop_present = $dependencies.dependency | Where-Object { $_.artifactId -eq "slf4j-nop" } + if (-not $slf4j_nop_present) { + $new_dep = $pom.CreateElement("dependency", $pom.DocumentElement.NamespaceURI) + $new_dep.InnerXml = "org.slf4jslf4j-nop1.7.32test" + $dependencies.AppendChild($new_dep) + } + + $build = $pom.project.build + if ($build -and $build.plugins) { + $helper_plugin = $build.plugins.plugin | Where-Object { $_.artifactId -eq "build-helper-maven-plugin" } + if ($helper_plugin) { + Log-Message "Deactivating build-helper-plugin in $full_path" + foreach ($execution in $helper_plugin.executions.execution) { + if ($execution.id -eq "add-test-source") { + $execution.phase = "none" + } + } + } + } + $pom.Save($full_path) + } + else { + Log-Message "pom.xml not found at $full_path. Exiting..." + exit 1 + } + } +} + +######################################### +# Updating Functions # +######################################### + +function Update-Java-Version-For-Maven { + + $pomFiles = @( + "$TEMP_DIR\pom.xml", + "$TEMP_DIR\use-core\pom.xml", + "$TEMP_DIR\use-gui\pom.xml", + "$TEMP_DIR\use-assembly\pom.xml" + ) + + foreach ($pomFile in $pomFiles) { + if (Test-Path $pomFile) { + $content = Get-Content $pomFile -Raw + + $content = $content -replace '15', '14' + $content = $content -replace '15', '14' + + $content | Set-Content $pomFile + Log-Message "Changed problematic Java Version 15 to 14" + } + else { + Log-Message "Warning: ${pomFile} not found." + } + } +} \ No newline at end of file diff --git a/docs/scripts/general_utilities.ps1 b/docs/scripts/general_utilities.ps1 new file mode 100644 index 000000000..577b2dfa7 --- /dev/null +++ b/docs/scripts/general_utilities.ps1 @@ -0,0 +1,204 @@ +# Load with . ".\general_utilities.ps1" + +######################################### +# Utility Functions # +######################################### + +function Log-Message { + param([string]$message) + Write-Host $message + $message | Out-File -FilePath $LOG_FILE -Append +} + +# Initialize CSV file with header for results +function Initialize-Results-File { + param( + [string]$FilePath, + [string]$Header + ) + + if (-not (Test-Path $FilePath)) { + $Header | Out-File -FilePath $FilePath -Encoding UTF8 + Log-Message "Created results file with header: $FilePath" + } +} + +function Record-Simple-Result { + param( + [string]$CommitHash, + [int]$TestResult = -1, + [string]$ResultsFile + ) + + # Get commit date and time + $commitDate = git show -s --format=%cd --date=format:"%Y-%m-%d" $CommitHash + $commitTime = git show -s --format=%cd --date=format:"%H:%M:%S" $CommitHash + + # Format the result + $resultLine = "$commitDate,$commitTime,$CommitHash,$TestResult" + $resultLine | Out-File -FilePath $ResultsFile -Append +} + + +function Remove-BOM { + param( + [string]$FilePath + ) + $full_path = Join-Path $TEMP_DIR $FilePath + $content = [System.IO.File]::ReadAllBytes($full_path) + if ($content.Length -ge 3 -and $content[0] -eq 0xEF -and $content[1] -eq 0xBB -and $content[2] -eq 0xBF) { + $content = $content[3..$content.Length] + [System.IO.File]::WriteAllBytes($full_path, $content) + } +} + +######################################### +# Commit Functions # +######################################### + +# Compares two commit hashes and checks whether there are changes to the source code +function Has-Relevant-Changes { + param( + [string]$CommitHash, + [string]$PreviousCommitHash, + [string[]]$RelevantPaths + ) + $changedFiles = git diff --name-only $PreviousCommitHash $CommitHash + + foreach ($file in $changedFiles) { + foreach ($path in $RelevantPaths) { + if ($file.StartsWith($path) -and $file.EndsWith(".java")) { + return $true + } + } + } + return $false +} + +function Verify-StartCommit { + param( + $StartCommit + ) + # Verify that the start commit exists + if ($StartCommitHash -ne "") { + $commitExists = git cat-file -e "$StartCommitHash^{commit}" 2>$null + if ($LASTEXITCODE -ne 0) { + Log-Message "Start commit hash $StartCommitHash not found in repository. Exiting." + exit 1 + } + Log-Message "Found start commit $StartCommitHash" + } +} + +function Determine-Commits-To-Process { + param( + $StartCommitHash, + $StartLoop + ) + # Determine which commits to process + $CommitsToProcess = if ($StartCommitHash -eq "") { + # Process all commits from the beginning + git log --first-parent --reverse --format="%H" + } elseif ($StartLoop.ToLower() -eq "n") { + # Process only the specified commit + @($StartCommitHash) + } else { + # Process from the specified commit onwards + git log --first-parent --reverse --format="%H" "$StartCommitHash^..HEAD" + } + return $CommitsToProcess +} + +######################################### +# Cleanup Functions # +######################################### + +function Cleanup-Commit { + git reset -q --hard + git clean -qfd + Log-Message "#####################################################################################" +} + +function Final-Cleanup { + param( + $ResultsDir, + $TempDir + ) + Set-Location $ResultsDir + if (Test-Path $TempDir) { + Remove-Item -Recurse -Force $TempDir + Log-Message "Cleaned up directory $TempDir" + } +} + +######################################### +# Setup Functions # +######################################### + +function Setup-Repo { + param( + [string]$TempDir, + [string]$OriginalUseDir + ) + # Create & move to temp directory + New-Item -ItemType Directory -Force -Path $TempDir | Out-Null + Set-Location $TempDir + Log-Message "Created & moved to temporary directory: $TempDir" + + Log-Message "Attempting to clone repository from $OriginalUseDir" + $gitOutput = & { + $ErrorActionPreference = 'SilentlyContinue' + git clone $OriginalUseDir . 2>&1 + } + # Comment in for debugging + #$gitOutput | ForEach-Object { Log-Message "Git output: $_" } + + if ($LASTEXITCODE -ne 0) { + Log-Message "Failed to clone repository. Exit code: $LASTEXITCODE" + exit 1 + } + else { + Log-Message "Repository cloned successfully." + } +} + +function Store-ArchTest { + param( + $TestFilePath + ) + # In case we're not on master already + git checkout -q master + + if (-not (Test-Path $TestFilePath)) { + Log-Message "Required file $TestFilePath not found in master branch. Exiting." + exit 1 + } + + $test_file_content = Get-Content $TestFilePath -Raw -Encoding UTF8 + return $test_file_content +} + +# Creates new architecture test dir, new ArchTest file and copies pre-stored test content into that file +# Alternatively same for properties file +function Inject-File { + param( + [string]$TempDir, + [string]$RelativePath, + [string]$FileName, + [string]$FileContent + ) + + $target_dir = Join-Path $TempDir $RelativePath + if (-not (Test-Path $target_dir)) { + New-Item -ItemType Directory -Force -Path $target_dir | Out-Null + Log-Message "Created directory: $target_dir" + } + + $target_file = Join-Path $target_dir $FileName + $utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $false + [System.IO.File]::WriteAllText($target_file, $FileContent, $utf8NoBomEncoding) + + if (Test-Path $target_file) { + Log-Message "Successfully added $FileName to commit" + } +} \ No newline at end of file From ac1527eb3b9916dfd530ee03e8fa001e85a5cdab Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 9 Apr 2026 21:35:27 +0200 Subject: [PATCH 30/34] -added back falsely deleted - folder /docs - folder /use-core/src/main/resources - deleted personal gitignore and other files --- .gitignore | 131 - .../cycles-current-failure-report.txt | 4234 +++++++++++++++++ .../layers-current-failure-report.txt | 1 + log.txt | 10 + use-core/.ai/mcp/mcp.json | 0 .../src/main/java/org/tzi/use/util/Debug.java | 33 - .../main/resources/etc/java-header-use.txt | 18 + .../Documentation/AssociationClass/Info.txt | 15 + .../examples/Documentation/Demo/Info.txt | 35 + .../examples/Documentation/Employee/Info.txt | 25 + .../examples/Documentation/Graph/Info.txt | 21 + .../00readme.txt | 199 + .../NestedOperationCalls/Info.txt | 19 + .../examples/Metamodels/OCL2MM/Info.txt | 7 + .../examples/Metamodels/UML13All/Info.txt | 11 + .../examples/Metamodels/UML13Core/Info.txt | 8 + .../examples/Metamodels/UML23/Info.txt | 7 + .../Metamodels/actionsemantics/Info.txt | 2 + .../resources/examples/Others/AB/Info.txt | 21 + .../examples/Others/CallSequence/Info.txt | 12 + .../examples/Others/CarRental/Info.txt | 21 + .../resources/examples/Others/Empty/Info.txt | 7 + .../resources/examples/Others/Ex/Info.txt | 13 + .../examples/Others/Grammar/Info.txt | 25 + .../resources/examples/Others/Job/Info.txt | 13 + .../resources/examples/Others/Lists/Info.txt | 14 + .../resources/examples/Others/Math/Info.txt | 14 + .../Others/MultipleInheritance/Info.txt | 9 + .../resources/examples/Others/Person/Info.txt | 12 + .../examples/Others/Polygon/Info.txt | 21 + .../examples/Others/Project/Info.txt | 13 + .../Others/RecursiveOperations/Info.txt | 11 + .../Others/ReflexiveAssociation/Info.txt | 12 + .../examples/Others/Student/Info.txt | 10 + .../sudoku_lh_Result_V1_no_constraints.txt | 157 + .../sudoku_lh_Result_V2_valid_solution.txt | 30 + .../examples/Others/SwapLinks/Info.txt | 23 + .../resources/examples/Others/Test/Info.txt | 6 + .../resources/examples/Others/Tree/Info.txt | 35 + .../Papers/1998/RichtersAndGogolla/Info.txt | 22 + .../Papers/1998/WarmerAndKleppe/Info.txt | 12 + .../Papers/1999/RichtersAndGogolla/Info.txt | 12 + .../EmployeeExtended/Info.txt | 23 + .../NestedOperationCalls/Info.txt | 1 + .../2005/GogollaBohlingRichters/info.txt | 39 + .../GogollaBuettnerRichters/sample_output.txt | 10 + .../generator/english/cycles/invariants.txt | 8 + .../english/predecessors/invariants.txt | 9 + .../german/schleifen/invarianten.txt | 9 + .../german/vorgaenger/invarianten.txt | 10 + .../oclextensions/README-Distributions.txt | 18 + .../resources/oclextensions/README-Random.txt | 63 + use-gui/TESTS_ObjectDiagram_MVP.md | 47 - .../main/resources/images/_image_licenses.txt | 20 + 54 files changed, 5347 insertions(+), 211 deletions(-) delete mode 100644 .gitignore create mode 100644 docs/archunit-results/cycles-current-failure-report.txt create mode 100644 docs/archunit-results/layers-current-failure-report.txt create mode 100644 log.txt delete mode 100644 use-core/.ai/mcp/mcp.json delete mode 100644 use-core/src/main/java/org/tzi/use/util/Debug.java create mode 100644 use-core/src/main/resources/etc/java-header-use.txt create mode 100644 use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt create mode 100644 use-core/src/main/resources/examples/Documentation/Demo/Info.txt create mode 100644 use-core/src/main/resources/examples/Documentation/Employee/Info.txt create mode 100644 use-core/src/main/resources/examples/Documentation/Graph/Info.txt create mode 100644 use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt create mode 100644 use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt create mode 100644 use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt create mode 100644 use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt create mode 100644 use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt create mode 100644 use-core/src/main/resources/examples/Metamodels/UML23/Info.txt create mode 100644 use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/AB/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/CallSequence/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/CarRental/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Empty/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Ex/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Grammar/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Job/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Lists/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Math/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Person/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Polygon/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Project/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Student/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt create mode 100644 use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt create mode 100644 use-core/src/main/resources/examples/Others/SwapLinks/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Test/Info.txt create mode 100644 use-core/src/main/resources/examples/Others/Tree/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt create mode 100644 use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt create mode 100644 use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt create mode 100644 use-core/src/main/resources/examples/generator/english/cycles/invariants.txt create mode 100644 use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt create mode 100644 use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt create mode 100644 use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt create mode 100644 use-core/src/main/resources/oclextensions/README-Distributions.txt create mode 100644 use-core/src/main/resources/oclextensions/README-Random.txt delete mode 100644 use-gui/TESTS_ObjectDiagram_MVP.md create mode 100644 use-gui/src/main/resources/images/_image_licenses.txt diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 8cb0c1ed0..000000000 --- a/.gitignore +++ /dev/null @@ -1,131 +0,0 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/intellij -# Edit at https://www.toptal.com/developers/gitignore?templates=intellij - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf -.idea/**/encodings.xml - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -.idea/artifacts -.idea/compiler.xml -.idea/jarRepositories.xml -.idea/modules.xml -.idea/*.iml -.idea/modules -*.iml -*.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -# https://plugins.jetbrains.com/plugin/7973-sonarlint -.idea/**/sonarlint/ - -# SonarQube Plugin -# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin -.idea/**/sonarIssues.xml - -# Markdown Navigator plugin -# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator-enh.xml -.idea/**/markdown-navigator/ - -# Cache file creation bug -# See https://youtrack.jetbrains.com/issue/JBR-2257 -.idea/$CACHE_FILE$ - -# CodeStream plugin -# https://plugins.jetbrains.com/plugin/12206-codestream -.idea/codestream.xml - -# End of https://www.toptal.com/developers/gitignore/api/intellij - - -/use-core/target -/use-gui/target -/use-assembly/target - -**/.DS_Store -/.idea -/tools/ -/pic/ -*.txt -/use_refactor_logs/ -*.csv -*.ps1 - -/backups/ -/use-gui/scripts/ -*.puml -/use-gui/src/main/resources/lib/ diff --git a/docs/archunit-results/cycles-current-failure-report.txt b/docs/archunit-results/cycles-current-failure-report.txt new file mode 100644 index 000000000..d79830d15 --- /dev/null +++ b/docs/archunit-results/cycles-current-failure-report.txt @@ -0,0 +1,4234 @@ +Cycle detected: Slice analysis -> + Slice uml -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (boolean)> in (DerivedAttributeController.java:93) + - Method calls method in (DerivedAttributeController.java:96) +Cycle detected: Slice analysis -> + Slice uml -> + Slice api -> + Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) + 3. Dependencies of Slice api + - Method calls method in (UseSystemApi.java:629) + - Method calls method in (UseSystemApi.java:630) + - Method calls method in (UseSystemApi.java:632) + - Method gets field in (UseSystemApi.java:632) + - Method calls method in (UseSystemApi.java:633) + - Method gets field in (UseSystemApi.java:633) + - Method calls method in (UseSystemApi.java:638) + - Method calls method in (UseSystemApi.java:639) + 4. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 5. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 6. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 7. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice api -> + Slice main -> + Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) + 3. Dependencies of Slice api + - Constructor (org.tzi.use.main.Session)> has parameter of type in (UseSystemApiUndoable.java:0) + - Method has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.main.Session)> calls method in (UseSystemApiUndoable.java:65) + 4. Dependencies of Slice main + - Method gets field in (MonitorAspectGenerator.java:73) + 5. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 6. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 7. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 8. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice api -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) + 3. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 5. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice api -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) + 3. Dependencies of Slice api + - Method calls method in (UseSystemApiNative.java:69) + - Method calls method in (UseSystemApiUndoable.java:101) + - Method calls method in (UseSystemApiUndoable.java:129) + - Method calls method in (UseSystemApi.java:141) + - Method calls method in (UseModelApi.java:150) + - Method calls method in (UseSystemApiUndoable.java:155) + - Method calls method in (UseModelApi.java:178) + - Method calls method in (UseSystemApi.java:262) + - Method calls method in (UseModelApi.java:311) + - Method calls method in (UseModelApi.java:512) + - Method calls method in (UseModelApi.java:541) + - Method calls method in (UseSystemApi.java:594) + - Method calls method in (UseSystemApi.java:643) + - Method calls method in (UseSystemApi.java:652) + - Method calls method in (UseModelApi.java:750) + - Method calls method in (UseModelApi.java:1014) + - Method calls method in (UseModelApi.java:1056) + - Method calls method in (UseModelApi.java:1072) + - Method calls method in (UseModelApi.java:1076) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 6. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method has parameter of type in (ExpStdOp.java:0) + - Method calls method in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:135) + - Method gets field in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:136) + - Method calls method in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:138) + - Method gets field in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:142) + - Method gets field in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:197) + - Method gets field in (ExpStdOp.java:197) + - Method calls method in (MSystem.java:540) + - Method calls method in (MSystem.java:671) + - Method gets field in (MSystemState.java:1565) + - Method gets field in (MSystemState.java:1566) + - Method gets field in (MSystemState.java:1618) + - Method gets field in (MSystemState.java:1680) + - Method gets field in (MSystemState.java:1817) + 3. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 6. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) + 3. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice graph -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Class implements interface in (MGeneralization.java:0) + - Field has type in (MModel.java:0) + - Field has type in (MSystemState.java:0) + - Interface extends interface in (MWholePartLink.java:0) + - Method has return type in (MModel.java:0) + - Method has return type in (MSystemState.java:0) + - Constructor (java.lang.String)> calls constructor ()> in (MModel.java:84) + - Method calls method in (MModel.java:123) + - Method calls method in (MModel.java:160) + - Method calls method in (MDataTypeImpl.java:233) + - Method calls method in (MDataTypeImpl.java:245) + - Method calls method in (MDataTypeImpl.java:256) + - Method calls method in (MDataTypeImpl.java:266) + - Method calls method in (MMInstanceGenerator.java:274) + - Method calls method in (MClassImpl.java:304) + - Method calls method in (MAssociationImpl.java:307) + - Method calls method in (MClassImpl.java:316) + - Method calls method in (MClassImpl.java:327) + - Method calls method in (MAssociationClassImpl.java:331) + - Method calls method in (MAssociationClassImpl.java:337) + (35 further dependencies have been omitted...) + 3. Dependencies of Slice graph + - Constructor (java.lang.Object)> calls method in (NodeDoesNotExistException.java:40) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 6. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 4. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice analysis -> + Slice uml -> + Slice util -> + Slice parser -> + Slice gen -> + Slice analysis + 1. Dependencies of Slice analysis + - Class implements interface in (AbstractCoverageVisitor.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Constructor (org.tzi.use.uml.mm.MClassifier, org.tzi.use.uml.mm.MAttribute)> has parameter of type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (AbstractCoverageVisitor.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has type in (AttributeAccessInfo.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (BasicCoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Field has generic type > with type argument depending on in (CoverageData.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + - Method has parameter of type in (AbstractCoverageVisitor.java:0) + (253 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Class implements interface in (ExpTupleLiteral.java:0) + - Class implements interface in (Expression.java:0) + - Class implements interface in (TupleType.java:0) + - Class implements interface in (TupleValue.java:0) + - Class implements interface in (Value.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MLinkDeletionStatement.java:0) + - Constructor (int, org.tzi.use.util.collections.Queue, java.util.ArrayList, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (ThreadedEvaluator.java:0) + - Constructor (org.tzi.use.uml.sys.events.tags.EventContext, org.tzi.use.uml.sys.soil.MStatement, org.tzi.use.util.soil.StateDifference)> has parameter of type in (StatementExecutedEvent.java:0) + - Field has type in (ThreadedEvaluator.java:0) + - Field has type in (BagValue.java:0) + - Field has type in (MSystem.java:0) + - Field has type in (MSystem.java:0) + - Field has generic type > with type argument depending on in (MSystem.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementExecutedEvent.java:0) + - Interface extends interface in (Type.java:0) + - Method has return type in (Evaluator.java:0) + (464 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 5. Dependencies of Slice gen + - Field has type in (BasicInstructionCoverageCalulator.java:0) + - Method has return type in (BasicInstructionCoverageCalulator.java:0) + - Method calls constructor ()> in (BasicInstructionCoverageCalulator.java:45) + - Method calls method in (BasicInstructionCoverageCalulator.java:59) + - Method calls method in (BasicInstructionCoverageCalulator.java:108) + - Method calls constructor (boolean)> in (GProcedure.java:119) + - Method calls method in (GProcedure.java:123) + - Method calls method in (BasicInstructionCoverageCalulator.java:125) + - Method calls method in (GProcedure.java:144) + - Method calls method in (BasicInstructionCoverageCalulator.java:158) + - Method calls method in (BasicInstructionCoverageCalulator.java:225) + - Method calls method in (BasicInstructionCoverageCalulator.java:233) + - Method calls method in (BasicInstructionCoverageCalulator.java:235) + - Method calls method in (BasicInstructionCoverageCalulator.java:260) + - Method calls method in (BasicInstructionCoverageCalulator.java:276) +Cycle detected: Slice api -> + Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApi.java:629) + - Method calls method in (UseSystemApi.java:630) + - Method calls method in (UseSystemApi.java:632) + - Method gets field in (UseSystemApi.java:632) + - Method calls method in (UseSystemApi.java:633) + - Method gets field in (UseSystemApi.java:633) + - Method calls method in (UseSystemApi.java:638) + - Method calls method in (UseSystemApi.java:639) + 2. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 5. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 6. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice config -> + Slice util -> + Slice parser -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApi.java:629) + - Method calls method in (UseSystemApi.java:630) + - Method calls method in (UseSystemApi.java:632) + - Method gets field in (UseSystemApi.java:632) + - Method calls method in (UseSystemApi.java:633) + - Method gets field in (UseSystemApi.java:633) + - Method calls method in (UseSystemApi.java:638) + - Method calls method in (UseSystemApi.java:639) + 2. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 4. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice config -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApi.java:629) + - Method calls method in (UseSystemApi.java:630) + - Method calls method in (UseSystemApi.java:632) + - Method gets field in (UseSystemApi.java:632) + - Method calls method in (UseSystemApi.java:633) + - Method gets field in (UseSystemApi.java:633) + - Method calls method in (UseSystemApi.java:638) + - Method calls method in (UseSystemApi.java:639) + 2. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice main -> + Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Constructor (org.tzi.use.main.Session)> has parameter of type in (UseSystemApiUndoable.java:0) + - Method has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.main.Session)> calls method in (UseSystemApiUndoable.java:65) + 2. Dependencies of Slice main + - Method gets field in (MonitorAspectGenerator.java:73) + 3. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 6. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 7. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice main -> + Slice config -> + Slice util -> + Slice parser -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Constructor (org.tzi.use.main.Session)> has parameter of type in (UseSystemApiUndoable.java:0) + - Method has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.main.Session)> calls method in (UseSystemApiUndoable.java:65) + 2. Dependencies of Slice main + - Method gets field in (MonitorAspectGenerator.java:73) + 3. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 6. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice main -> + Slice config -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Constructor (org.tzi.use.main.Session)> has parameter of type in (UseSystemApiUndoable.java:0) + - Method has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.main.Session)> calls method in (UseSystemApiUndoable.java:65) + 2. Dependencies of Slice main + - Method gets field in (MonitorAspectGenerator.java:73) + 3. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice main -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Constructor (org.tzi.use.main.Session)> has parameter of type in (UseSystemApiUndoable.java:0) + - Method has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.main.Session)> calls method in (UseSystemApiUndoable.java:65) + 2. Dependencies of Slice main + - Constructor (java.io.PrintWriter, org.tzi.use.uml.mm.MModel)> has parameter of type in (MonitorAspectGenerator.java:0) + - Field has type in (MonitorAspectGenerator.java:0) + - Field has type in (Session.java:0) + - Method has parameter of type in (Session.java:0) + - Method has parameter of type in (Session.java:0) + - Method has parameter of type in (Session.java:0) + - Method has return type in (Session.java:0) + - Method calls method in (Session.java:86) + - Method calls method in (MonitorAspectGenerator.java:116) + - Method calls method in (MonitorAspectGenerator.java:118) + - Method calls method in (MonitorAspectGenerator.java:124) + - Method calls method in (MonitorAspectGenerator.java:124) + - Method calls method in (MonitorAspectGenerator.java:125) + - Method calls method in (MonitorAspectGenerator.java:136) + - Method calls method in (MonitorAspectGenerator.java:138) + - Method calls method in (MonitorAspectGenerator.java:145) + - Method calls method in (MonitorAspectGenerator.java:145) + - Method calls method in (MonitorAspectGenerator.java:146) + - Method calls method in (MonitorAspectGenerator.java:155) + - Method calls method in (MonitorAspectGenerator.java:158) + (2 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice config -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Method gets field in (ASTInStateExpression.java:97) + - Method gets field in (ASTTypeArgExpression.java:101) + - Method gets field in (Symtable.java:105) + - Method gets field in (ASTStatement.java:287) + - Method gets field in (ASTStatement.java:292) + - Method gets field in (ASTOperationExpression.java:401) + - Method gets field in (ASTOperationExpression.java:408) + - Method gets field in (SoilParser.java:1295) + - Method gets field in (ShellCommandParser.java:6177) + - Method gets field in (TestSuiteParser.java:6888) + - Method gets field in (USEParser.java:8549) + - Method gets field in (GeneratorParser.java:9880) + 3. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice gen -> + Slice config -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 3. Dependencies of Slice gen + - Constructor (boolean)> gets field in (GEvalInstrTry.java:37) + - Method gets field in (GGenerator.java:77) + 4. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 5. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 6. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice gen -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 3. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice gen -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 3. Dependencies of Slice gen + - Method calls method in (GInstrASSLCall.java:30) + - Method calls method in (GInstrInsert_Assoc_Linkends.java:60) + - Method calls method in (GInstrTry_Assoc_LinkendSeqs.java:61) + - Method calls method in (GSignature.java:61) + - Method calls method in (GEvalInstrCreate_C.java:63) + - Method calls method in (GInstrDelete_Assoc_Linkends.java:63) + - Method calls method in (GInstrTry_AssocClass_LinkendSeqs.java:64) + - Method calls method in (GInstrCreate_AC.java:69) + - Method calls method in (GEvalInstrTry.java:73) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:91) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:92) + - Method calls method in (GEvalInstrCreate_C.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:94) + - Method calls method in (GGenerator.java:102) + - Method calls method in (GGenerator.java:103) + - Method calls method in (GEvalInstrCreate_C.java:109) + - Method calls method in (GEvalInstrCreate_C.java:110) + - Method calls method in (GGenerator.java:112) + - Method calls method in (GGenerator.java:119) + (58 further dependencies have been omitted...) + 4. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice parser -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls constructor ()> in (UseModelApi.java:443) + - Method calls method in (UseModelApi.java:445) + - Method calls method in (UseModelApi.java:450) + - Method calls method in (UseModelApi.java:499) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:505) + - Method calls method in (UseModelApi.java:506) + - Method calls method in (UseModelApi.java:510) + - Method calls constructor (java.lang.String, java.io.PrintWriter)> in (UseModelApi.java:548) + - Method calls constructor (org.antlr.runtime.CharStream)> in (UseModelApi.java:557) + - Method calls constructor (org.antlr.runtime.TokenStream)> in (UseModelApi.java:559) + - Method calls method in (UseModelApi.java:561) + - Method calls method in (UseModelApi.java:562) + - Method calls method in (UseModelApi.java:565) + - Method calls method in (UseModelApi.java:567) + - Method calls constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> in (UseModelApi.java:569) + - Method calls method in (UseModelApi.java:573) + - Method calls method in (UseModelApi.java:575) + - Method calls method in (UseModelApi.java:578) + - Method calls method in (UseModelApi.java:579) + - Method calls method in (UseModelApi.java:579) + (10 further dependencies have been omitted...) + 2. Dependencies of Slice parser + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method throws type in (ASTAttributeAssignmentStatement.java:0) + - Method throws type in (ASTBlockStatement.java:0) + - Method throws type in (ASTConditionalExecutionStatement.java:0) + - Method throws type in (ASTEmptyStatement.java:0) + - Method throws type in (ASTEnterOperationStatement.java:0) + - Method throws type in (ASTExitOperationStatement.java:0) + - Method throws type in (ASTIterationStatement.java:0) + - Method throws type in (ASTLinkDeletionStatement.java:0) + - Method throws type in (ASTLinkInsertionStatement.java:0) + - Method throws type in (ASTNewLinkObjectStatement.java:0) + - Method throws type in (ASTNewObjectStatement.java:0) + (240 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Constructor (org.tzi.use.uml.mm.MModel)> has parameter of type in (UseModelApi.java:0) + - Constructor (org.tzi.use.uml.mm.MModel)> has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (UseSystemApi.java:0) + - Constructor (org.tzi.use.uml.mm.MModel)> has parameter of type in (UseSystemApiNative.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (UseSystemApiNative.java:0) + - Constructor (org.tzi.use.uml.mm.MModel)> has parameter of type in (UseSystemApiUndoable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (UseSystemApiUndoable.java:0) + - Field has type in (UseModelApi.java:0) + - Field has type in (UseModelApi.java:0) + - Field has type in (UseSystemApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method depends on component type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + - Method has return type in (UseModelApi.java:0) + (258 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice util -> + Slice parser -> + Slice gen -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApiNative.java:69) + - Method calls method in (UseSystemApiUndoable.java:101) + - Method calls method in (UseSystemApiUndoable.java:129) + - Method calls method in (UseSystemApi.java:141) + - Method calls method in (UseModelApi.java:150) + - Method calls method in (UseSystemApiUndoable.java:155) + - Method calls method in (UseModelApi.java:178) + - Method calls method in (UseSystemApi.java:262) + - Method calls method in (UseModelApi.java:311) + - Method calls method in (UseModelApi.java:512) + - Method calls method in (UseModelApi.java:541) + - Method calls method in (UseSystemApi.java:594) + - Method calls method in (UseSystemApi.java:643) + - Method calls method in (UseSystemApi.java:652) + - Method calls method in (UseModelApi.java:750) + - Method calls method in (UseModelApi.java:1014) + - Method calls method in (UseModelApi.java:1056) + - Method calls method in (UseModelApi.java:1072) + - Method calls method in (UseModelApi.java:1076) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 4. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice util -> + Slice parser -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApiNative.java:69) + - Method calls method in (UseSystemApiUndoable.java:101) + - Method calls method in (UseSystemApiUndoable.java:129) + - Method calls method in (UseSystemApi.java:141) + - Method calls method in (UseModelApi.java:150) + - Method calls method in (UseSystemApiUndoable.java:155) + - Method calls method in (UseModelApi.java:178) + - Method calls method in (UseSystemApi.java:262) + - Method calls method in (UseModelApi.java:311) + - Method calls method in (UseModelApi.java:512) + - Method calls method in (UseModelApi.java:541) + - Method calls method in (UseSystemApi.java:594) + - Method calls method in (UseSystemApi.java:643) + - Method calls method in (UseSystemApi.java:652) + - Method calls method in (UseModelApi.java:750) + - Method calls method in (UseModelApi.java:1014) + - Method calls method in (UseModelApi.java:1056) + - Method calls method in (UseModelApi.java:1072) + - Method calls method in (UseModelApi.java:1076) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice api -> + Slice util -> + Slice uml -> + Slice api + 1. Dependencies of Slice api + - Method calls method in (UseSystemApiNative.java:69) + - Method calls method in (UseSystemApiUndoable.java:101) + - Method calls method in (UseSystemApiUndoable.java:129) + - Method calls method in (UseSystemApi.java:141) + - Method calls method in (UseModelApi.java:150) + - Method calls method in (UseSystemApiUndoable.java:155) + - Method calls method in (UseModelApi.java:178) + - Method calls method in (UseSystemApi.java:262) + - Method calls method in (UseModelApi.java:311) + - Method calls method in (UseModelApi.java:512) + - Method calls method in (UseModelApi.java:541) + - Method calls method in (UseSystemApi.java:594) + - Method calls method in (UseSystemApi.java:643) + - Method calls method in (UseSystemApi.java:652) + - Method calls method in (UseModelApi.java:750) + - Method calls method in (UseModelApi.java:1014) + - Method calls method in (UseModelApi.java:1056) + - Method calls method in (UseModelApi.java:1072) + - Method calls method in (UseModelApi.java:1076) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:55) + - Method calls method in (TestModelUtil.java:56) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:64) + - Method calls method in (TestModelUtil.java:65) + - Method calls method in (TestModelUtil.java:72) + - Method calls method in (TestModelUtil.java:74) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:87) + - Method calls method in (TestModelUtil.java:88) + - Method calls method in (TestModelUtil.java:89) + - Method calls method in (TestModelUtil.java:90) + - Method calls method in (TestModelUtil.java:91) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:100) + - Method calls method in (TestModelUtil.java:101) + - Method calls method in (TestModelUtil.java:102) + - Method calls method in (TestModelUtil.java:103) + - Method calls method in (TestModelUtil.java:104) + - Method calls constructor (java.lang.String)> in (TestModelUtil.java:116) + - Method calls method in (TestModelUtil.java:117) + - Method calls method in (TestModelUtil.java:118) + - Method calls method in (TestModelUtil.java:119) + (80 further dependencies have been omitted...) +Cycle detected: Slice config -> + Slice util -> + Slice parser -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Method gets field in (ASTInStateExpression.java:97) + - Method gets field in (ASTTypeArgExpression.java:101) + - Method gets field in (Symtable.java:105) + - Method gets field in (ASTStatement.java:287) + - Method gets field in (ASTStatement.java:292) + - Method gets field in (ASTOperationExpression.java:401) + - Method gets field in (ASTOperationExpression.java:408) + - Method gets field in (SoilParser.java:1295) + - Method gets field in (ShellCommandParser.java:6177) + - Method gets field in (TestSuiteParser.java:6888) + - Method gets field in (USEParser.java:8549) + - Method gets field in (GeneratorParser.java:9880) +Cycle detected: Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 4. Dependencies of Slice gen + - Constructor (boolean)> gets field in (GEvalInstrTry.java:37) + - Method gets field in (GGenerator.java:77) +Cycle detected: Slice config -> + Slice util -> + Slice parser -> + Slice gen -> + Slice uml -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 4. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 5. Dependencies of Slice uml + - Method has parameter of type in (ExpStdOp.java:0) + - Method calls method in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:135) + - Method gets field in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:136) + - Method calls method in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:138) + - Method gets field in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:142) + - Method gets field in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:197) + - Method gets field in (ExpStdOp.java:197) + - Method calls method in (MSystem.java:540) + - Method calls method in (MSystem.java:671) + - Method gets field in (MSystemState.java:1565) + - Method gets field in (MSystemState.java:1566) + - Method gets field in (MSystemState.java:1618) + - Method gets field in (MSystemState.java:1680) + - Method gets field in (MSystemState.java:1817) +Cycle detected: Slice config -> + Slice util -> + Slice parser -> + Slice uml -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Method has parameter of type in (ExpStdOp.java:0) + - Method calls method in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:135) + - Method gets field in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:136) + - Method calls method in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:138) + - Method gets field in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:142) + - Method gets field in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:197) + - Method gets field in (ExpStdOp.java:197) + - Method calls method in (MSystem.java:540) + - Method calls method in (MSystem.java:671) + - Method gets field in (MSystemState.java:1565) + - Method gets field in (MSystemState.java:1566) + - Method gets field in (MSystemState.java:1618) + - Method gets field in (MSystemState.java:1680) + - Method gets field in (MSystemState.java:1817) +Cycle detected: Slice config -> + Slice util -> + Slice parser -> + Slice uml -> + Slice gen -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) + 5. Dependencies of Slice gen + - Constructor (boolean)> gets field in (GEvalInstrTry.java:37) + - Method gets field in (GGenerator.java:77) +Cycle detected: Slice config -> + Slice util -> + Slice uml -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Method has parameter of type in (ExpStdOp.java:0) + - Method calls method in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:135) + - Method gets field in (ExpStdOp.java:135) + - Method calls method in (ExpStdOp.java:136) + - Method calls method in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:138) + - Method gets field in (ExpStdOp.java:138) + - Method calls method in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:142) + - Method gets field in (ExpStdOp.java:142) + - Method calls method in (ExpStdOp.java:197) + - Method gets field in (ExpStdOp.java:197) + - Method calls method in (MSystem.java:540) + - Method calls method in (MSystem.java:671) + - Method gets field in (MSystemState.java:1565) + - Method gets field in (MSystemState.java:1566) + - Method gets field in (MSystemState.java:1618) + - Method gets field in (MSystemState.java:1680) + - Method gets field in (MSystemState.java:1817) +Cycle detected: Slice config -> + Slice util -> + Slice uml -> + Slice gen -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) + 4. Dependencies of Slice gen + - Constructor (boolean)> gets field in (GEvalInstrTry.java:37) + - Method gets field in (GGenerator.java:77) +Cycle detected: Slice config -> + Slice util -> + Slice uml -> + Slice gen -> + Slice parser -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) + 4. Dependencies of Slice gen + - Method calls method in (GGenerator.java:113) + - Method calls method in (GGenerator.java:120) + 5. Dependencies of Slice parser + - Method gets field in (ASTInStateExpression.java:97) + - Method gets field in (ASTTypeArgExpression.java:101) + - Method gets field in (Symtable.java:105) + - Method gets field in (ASTStatement.java:287) + - Method gets field in (ASTStatement.java:292) + - Method gets field in (ASTOperationExpression.java:401) + - Method gets field in (ASTOperationExpression.java:408) + - Method gets field in (SoilParser.java:1295) + - Method gets field in (ShellCommandParser.java:6177) + - Method gets field in (TestSuiteParser.java:6888) + - Method gets field in (USEParser.java:8549) + - Method gets field in (GeneratorParser.java:9880) +Cycle detected: Slice config -> + Slice util -> + Slice uml -> + Slice parser -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) + 4. Dependencies of Slice parser + - Method gets field in (ASTInStateExpression.java:97) + - Method gets field in (ASTTypeArgExpression.java:101) + - Method gets field in (Symtable.java:105) + - Method gets field in (ASTStatement.java:287) + - Method gets field in (ASTStatement.java:292) + - Method gets field in (ASTOperationExpression.java:401) + - Method gets field in (ASTOperationExpression.java:408) + - Method gets field in (SoilParser.java:1295) + - Method gets field in (ShellCommandParser.java:6177) + - Method gets field in (TestSuiteParser.java:6888) + - Method gets field in (USEParser.java:8549) + - Method gets field in (GeneratorParser.java:9880) +Cycle detected: Slice config -> + Slice util -> + Slice uml -> + Slice parser -> + Slice gen -> + Slice config + 1. Dependencies of Slice config + - Field has type in (Options.java:0) + - Method calls method in (Options.java:356) + - Method calls method in (Options.java:374) + - Method calls method in (Options.java:376) + - Method calls method in (Options.java:377) + - Method calls method in (Options.java:386) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:421) + - Method calls method in (Options.java:458) + - Method calls method in (Options.java:469) + - Method calls method in (Options.java:470) + - Method calls method in (Options.java:471) + - Method calls method in (Options.java:472) + - Method calls constructor (java.util.Properties)> in (Options.java:485) + - Method calls method in (Options.java:501) + - Method calls method in (Options.java:509) + - Method calls method in (Options.java:519) + - Method calls method in (Options.java:521) + - Method calls method in (Options.java:524) + - Method calls method in (Options.java:526) + (6 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) + 5. Dependencies of Slice gen + - Constructor (boolean)> gets field in (GEvalInstrTry.java:37) + - Method gets field in (GGenerator.java:77) +Cycle detected: Slice gen -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GGenerator.java:113) + - Method calls method in (GGenerator.java:120) + 2. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice gen -> + Slice parser -> + Slice uml -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GGenerator.java:113) + - Method calls method in (GGenerator.java:120) + 2. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) +Cycle detected: Slice gen -> + Slice parser -> + Slice util -> + Slice uml -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GGenerator.java:113) + - Method calls method in (GGenerator.java:120) + 2. Dependencies of Slice parser + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method throws type in (ASTAttributeAssignmentStatement.java:0) + - Method throws type in (ASTBlockStatement.java:0) + - Method throws type in (ASTConditionalExecutionStatement.java:0) + - Method throws type in (ASTEmptyStatement.java:0) + - Method throws type in (ASTEnterOperationStatement.java:0) + - Method throws type in (ASTExitOperationStatement.java:0) + - Method throws type in (ASTIterationStatement.java:0) + - Method throws type in (ASTLinkDeletionStatement.java:0) + - Method throws type in (ASTLinkInsertionStatement.java:0) + - Method throws type in (ASTNewLinkObjectStatement.java:0) + - Method throws type in (ASTNewObjectStatement.java:0) + (240 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) +Cycle detected: Slice gen -> + Slice uml -> + Slice gen + 1. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) +Cycle detected: Slice gen -> + Slice uml -> + Slice graph -> + Slice util -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Class implements interface in (MGeneralization.java:0) + - Field has type in (MModel.java:0) + - Field has type in (MSystemState.java:0) + - Interface extends interface in (MWholePartLink.java:0) + - Method has return type in (MModel.java:0) + - Method has return type in (MSystemState.java:0) + - Constructor (java.lang.String)> calls constructor ()> in (MModel.java:84) + - Method calls method in (MModel.java:123) + - Method calls method in (MModel.java:160) + - Method calls method in (MDataTypeImpl.java:233) + - Method calls method in (MDataTypeImpl.java:245) + - Method calls method in (MDataTypeImpl.java:256) + - Method calls method in (MDataTypeImpl.java:266) + - Method calls method in (MMInstanceGenerator.java:274) + - Method calls method in (MClassImpl.java:304) + - Method calls method in (MAssociationImpl.java:307) + - Method calls method in (MClassImpl.java:316) + - Method calls method in (MClassImpl.java:327) + - Method calls method in (MAssociationClassImpl.java:331) + - Method calls method in (MAssociationClassImpl.java:337) + (35 further dependencies have been omitted...) + 3. Dependencies of Slice graph + - Constructor (java.lang.Object)> calls method in (NodeDoesNotExistException.java:40) + 4. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 5. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice gen -> + Slice uml -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice gen -> + Slice uml -> + Slice util -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GConfiguration.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GValueInstruction, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GAttributeAssignment.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GInstrBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInstrCalculatedBarrier.java:0) + - Constructor (org.tzi.use.uml.mm.MClass, org.tzi.use.gen.assl.statics.GValueInstruction)> has parameter of type in (GInstrCreateN_C_Integer.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrCreate_AC.java:0) + - Constructor (org.tzi.use.uml.mm.MClass)> has parameter of type in (GInstrCreate_C.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrDelete_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrInsert_Assoc_Linkends.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociationClass, java.util.List)> has parameter of type in (GInstrTry_AssocClass_LinkendSeqs.java:0) + - Constructor (org.tzi.use.uml.mm.MAssociation, java.util.List)> has parameter of type in (GInstrTry_Assoc_LinkendSeqs.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GOCLExpression, org.tzi.use.uml.mm.MAttribute, org.tzi.use.gen.assl.statics.GOCLExpression)> has parameter of type in (GInstrTry_Attribute.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (GOCLExpression.java:0) + - Constructor (org.tzi.use.uml.mm.MModel, org.tzi.use.gen.tool.GGeneratorArguments)> has parameter of type in (GChecker.java:0) + - Constructor (org.tzi.use.uml.sys.MSystem)> has parameter of type in (GGenerator.java:0) + - Constructor (org.tzi.use.gen.assl.statics.GProcedure, java.util.List)> has generic parameter type > with type argument depending on in (GProcedureCall.java:0) + - Constructor (java.lang.String, java.util.List)> has generic parameter type > with type argument depending on in (GSignature.java:0) + - Constructor (org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (GInvariantStatistic.java:0) + - Field has type in (GConfiguration.java:0) + (527 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Class implements interface in (ExpTupleLiteral.java:0) + - Class implements interface in (Expression.java:0) + - Class implements interface in (TupleType.java:0) + - Class implements interface in (TupleValue.java:0) + - Class implements interface in (Value.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MLinkDeletionStatement.java:0) + - Constructor (int, org.tzi.use.util.collections.Queue, java.util.ArrayList, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (ThreadedEvaluator.java:0) + - Constructor (org.tzi.use.uml.sys.events.tags.EventContext, org.tzi.use.uml.sys.soil.MStatement, org.tzi.use.util.soil.StateDifference)> has parameter of type in (StatementExecutedEvent.java:0) + - Field has type in (ThreadedEvaluator.java:0) + - Field has type in (BagValue.java:0) + - Field has type in (MSystem.java:0) + - Field has type in (MSystem.java:0) + - Field has generic type > with type argument depending on in (MSystem.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementExecutedEvent.java:0) + - Interface extends interface in (Type.java:0) + - Method has return type in (Evaluator.java:0) + (464 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice gen -> + Slice util -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GInstrASSLCall.java:30) + - Method calls method in (GInstrInsert_Assoc_Linkends.java:60) + - Method calls method in (GInstrTry_Assoc_LinkendSeqs.java:61) + - Method calls method in (GSignature.java:61) + - Method calls method in (GEvalInstrCreate_C.java:63) + - Method calls method in (GInstrDelete_Assoc_Linkends.java:63) + - Method calls method in (GInstrTry_AssocClass_LinkendSeqs.java:64) + - Method calls method in (GInstrCreate_AC.java:69) + - Method calls method in (GEvalInstrTry.java:73) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:91) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:92) + - Method calls method in (GEvalInstrCreate_C.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:94) + - Method calls method in (GGenerator.java:102) + - Method calls method in (GGenerator.java:103) + - Method calls method in (GEvalInstrCreate_C.java:109) + - Method calls method in (GEvalInstrCreate_C.java:110) + - Method calls method in (GGenerator.java:112) + - Method calls method in (GGenerator.java:119) + (58 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice gen -> + Slice util -> + Slice parser -> + Slice uml -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GInstrASSLCall.java:30) + - Method calls method in (GInstrInsert_Assoc_Linkends.java:60) + - Method calls method in (GInstrTry_Assoc_LinkendSeqs.java:61) + - Method calls method in (GSignature.java:61) + - Method calls method in (GEvalInstrCreate_C.java:63) + - Method calls method in (GInstrDelete_Assoc_Linkends.java:63) + - Method calls method in (GInstrTry_AssocClass_LinkendSeqs.java:64) + - Method calls method in (GInstrCreate_AC.java:69) + - Method calls method in (GEvalInstrTry.java:73) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:91) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:92) + - Method calls method in (GEvalInstrCreate_C.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:94) + - Method calls method in (GGenerator.java:102) + - Method calls method in (GGenerator.java:103) + - Method calls method in (GEvalInstrCreate_C.java:109) + - Method calls method in (GEvalInstrCreate_C.java:110) + - Method calls method in (GGenerator.java:112) + - Method calls method in (GGenerator.java:119) + (58 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) +Cycle detected: Slice gen -> + Slice util -> + Slice uml -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GInstrASSLCall.java:30) + - Method calls method in (GInstrInsert_Assoc_Linkends.java:60) + - Method calls method in (GInstrTry_Assoc_LinkendSeqs.java:61) + - Method calls method in (GSignature.java:61) + - Method calls method in (GEvalInstrCreate_C.java:63) + - Method calls method in (GInstrDelete_Assoc_Linkends.java:63) + - Method calls method in (GInstrTry_AssocClass_LinkendSeqs.java:64) + - Method calls method in (GInstrCreate_AC.java:69) + - Method calls method in (GEvalInstrTry.java:73) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:91) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:92) + - Method calls method in (GEvalInstrCreate_C.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:94) + - Method calls method in (GGenerator.java:102) + - Method calls method in (GGenerator.java:103) + - Method calls method in (GEvalInstrCreate_C.java:109) + - Method calls method in (GEvalInstrCreate_C.java:110) + - Method calls method in (GGenerator.java:112) + - Method calls method in (GGenerator.java:119) + (58 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Field has type in (MSystem.java:0) + - Method has return type in (MSystem.java:0) + - Method calls constructor (org.tzi.use.uml.sys.MSystem)> in (MSystem.java:157) +Cycle detected: Slice gen -> + Slice util -> + Slice uml -> + Slice parser -> + Slice gen + 1. Dependencies of Slice gen + - Method calls method in (GInstrASSLCall.java:30) + - Method calls method in (GInstrInsert_Assoc_Linkends.java:60) + - Method calls method in (GInstrTry_Assoc_LinkendSeqs.java:61) + - Method calls method in (GSignature.java:61) + - Method calls method in (GEvalInstrCreate_C.java:63) + - Method calls method in (GInstrDelete_Assoc_Linkends.java:63) + - Method calls method in (GInstrTry_AssocClass_LinkendSeqs.java:64) + - Method calls method in (GInstrCreate_AC.java:69) + - Method calls method in (GEvalInstrTry.java:73) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:91) + - Constructor (boolean, boolean)> calls method in (GCollectorImpl.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:92) + - Method calls method in (GEvalInstrCreate_C.java:92) + - Method calls method in (GEvalInstrCreateN_C_Integer.java:94) + - Method calls method in (GGenerator.java:102) + - Method calls method in (GGenerator.java:103) + - Method calls method in (GEvalInstrCreate_C.java:109) + - Method calls method in (GEvalInstrCreate_C.java:110) + - Method calls method in (GGenerator.java:112) + - Method calls method in (GGenerator.java:119) + (58 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) + 4. Dependencies of Slice parser + - Field has generic type > with type argument depending on in (Context.java:0) + - Field has type in (ASTGProcedure.java:0) + - Method has generic return type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (Context.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic parameter type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASSLCompiler.java:0) + - Method has generic return type > with type argument depending on in (ASSLCompiler.java:0) + - Method has return type in (ASTGAsslCall.java:0) + - Method has return type in (ASTGAtomicInstruction.java:0) + - Method has return type in (ASTGAttributeAssignment.java:0) + - Method has return type in (ASTGBarrier.java:0) + - Method has return type in (ASTGIfThenElse.java:0) + - Method has return type in (ASTGInstruction.java:0) + - Method has return type in (ASTGLoop.java:0) + - Method has return type in (ASTGOpEnter.java:0) + - Method has return type in (ASTGOpExit.java:0) + - Method has return type in (ASTGProcedure.java:0) + - Method has return type in (ASTGProcedureCall.java:0) + (49 further dependencies have been omitted...) +Cycle detected: Slice graph -> + Slice util -> + Slice parser -> + Slice uml -> + Slice graph + 1. Dependencies of Slice graph + - Constructor (java.lang.Object)> calls method in (NodeDoesNotExistException.java:40) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) + 3. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 4. Dependencies of Slice uml + - Class implements interface in (MGeneralization.java:0) + - Field has type in (MModel.java:0) + - Field has type in (MSystemState.java:0) + - Interface extends interface in (MWholePartLink.java:0) + - Method has return type in (MModel.java:0) + - Method has return type in (MSystemState.java:0) + - Constructor (java.lang.String)> calls constructor ()> in (MModel.java:84) + - Method calls method in (MModel.java:123) + - Method calls method in (MModel.java:160) + - Method calls method in (MDataTypeImpl.java:233) + - Method calls method in (MDataTypeImpl.java:245) + - Method calls method in (MDataTypeImpl.java:256) + - Method calls method in (MDataTypeImpl.java:266) + - Method calls method in (MMInstanceGenerator.java:274) + - Method calls method in (MClassImpl.java:304) + - Method calls method in (MAssociationImpl.java:307) + - Method calls method in (MClassImpl.java:316) + - Method calls method in (MClassImpl.java:327) + - Method calls method in (MAssociationClassImpl.java:331) + - Method calls method in (MAssociationClassImpl.java:337) + (35 further dependencies have been omitted...) +Cycle detected: Slice graph -> + Slice util -> + Slice uml -> + Slice graph + 1. Dependencies of Slice graph + - Constructor (java.lang.Object)> calls method in (NodeDoesNotExistException.java:40) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Class implements interface in (MGeneralization.java:0) + - Field has type in (MModel.java:0) + - Field has type in (MSystemState.java:0) + - Interface extends interface in (MWholePartLink.java:0) + - Method has return type in (MModel.java:0) + - Method has return type in (MSystemState.java:0) + - Constructor (java.lang.String)> calls constructor ()> in (MModel.java:84) + - Method calls method in (MModel.java:123) + - Method calls method in (MModel.java:160) + - Method calls method in (MDataTypeImpl.java:233) + - Method calls method in (MDataTypeImpl.java:245) + - Method calls method in (MDataTypeImpl.java:256) + - Method calls method in (MDataTypeImpl.java:266) + - Method calls method in (MMInstanceGenerator.java:274) + - Method calls method in (MClassImpl.java:304) + - Method calls method in (MAssociationImpl.java:307) + - Method calls method in (MClassImpl.java:316) + - Method calls method in (MClassImpl.java:327) + - Method calls method in (MAssociationClassImpl.java:331) + - Method calls method in (MAssociationClassImpl.java:337) + (35 further dependencies have been omitted...) +Cycle detected: Slice parser -> + Slice uml -> + Slice parser + 1. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) +Cycle detected: Slice parser -> + Slice uml -> + Slice util -> + Slice parser + 1. Dependencies of Slice parser + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (java.lang.String, java.net.URI, java.io.PrintWriter, org.tzi.use.uml.ocl.value.VarBindings, org.tzi.use.uml.mm.ModelFactory)> has parameter of type in (Context.java:0) + - Constructor (org.tzi.use.parser.ExprContext, java.lang.String, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (ExprContext.java:0) + - Constructor (org.tzi.use.parser.Symtable, java.lang.String, org.tzi.use.uml.ocl.type.Type, org.tzi.use.parser.SrcPos)> has parameter of type in (Symtable.java:0) + - Constructor (org.tzi.use.uml.ocl.value.VarBindings)> has parameter of type in (Symtable.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (Context.java:0) + - Field has type in (ExprContext.java:0) + - Field has generic type > with type argument depending on in (ImportContext.java:0) + - Field has type in (Symtable.java:0) + - Field has type in (Symtable.java:0) + - Field depends on component type in (ASTOperationExpression.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociation.java:0) + - Field has type in (ASTAssociationClass.java:0) + (1060 further dependencies have been omitted...) + 2. Dependencies of Slice uml + - Class implements interface in (ExpTupleLiteral.java:0) + - Class implements interface in (Expression.java:0) + - Class implements interface in (TupleType.java:0) + - Class implements interface in (TupleValue.java:0) + - Class implements interface in (Value.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MLinkDeletionStatement.java:0) + - Constructor (int, org.tzi.use.util.collections.Queue, java.util.ArrayList, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (ThreadedEvaluator.java:0) + - Constructor (org.tzi.use.uml.sys.events.tags.EventContext, org.tzi.use.uml.sys.soil.MStatement, org.tzi.use.util.soil.StateDifference)> has parameter of type in (StatementExecutedEvent.java:0) + - Field has type in (ThreadedEvaluator.java:0) + - Field has type in (BagValue.java:0) + - Field has type in (MSystem.java:0) + - Field has type in (MSystem.java:0) + - Field has generic type > with type argument depending on in (MSystem.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementExecutedEvent.java:0) + - Interface extends interface in (Type.java:0) + - Method has return type in (Evaluator.java:0) + (464 further dependencies have been omitted...) + 3. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) +Cycle detected: Slice parser -> + Slice util -> + Slice parser + 1. Dependencies of Slice parser + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method throws type in (ASTAttributeAssignmentStatement.java:0) + - Method throws type in (ASTBlockStatement.java:0) + - Method throws type in (ASTConditionalExecutionStatement.java:0) + - Method throws type in (ASTEmptyStatement.java:0) + - Method throws type in (ASTEnterOperationStatement.java:0) + - Method throws type in (ASTExitOperationStatement.java:0) + - Method throws type in (ASTIterationStatement.java:0) + - Method throws type in (ASTLinkDeletionStatement.java:0) + - Method throws type in (ASTLinkInsertionStatement.java:0) + - Method throws type in (ASTNewLinkObjectStatement.java:0) + - Method throws type in (ASTNewObjectStatement.java:0) + (240 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> has parameter of type in (CompilationFailedException.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> has parameter of type in (CompilationFailedException.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (CompilationFailedException.java:0) + - Method has return type in (SymbolTable.java:0) + - Method has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String)> calls method in (CompilationFailedException.java:48) + - Constructor (org.tzi.use.parser.soil.ast.ASTStatement, java.lang.String, java.lang.Throwable)> calls method in (CompilationFailedException.java:64) + - Method calls method in (CompilationFailedException.java:77) +Cycle detected: Slice parser -> + Slice util -> + Slice uml -> + Slice parser + 1. Dependencies of Slice parser + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Field has type in (ASTStatement.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (ShellCommandCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method has parameter of type in (SoilCompiler.java:0) + - Method throws type in (ASTAttributeAssignmentStatement.java:0) + - Method throws type in (ASTBlockStatement.java:0) + - Method throws type in (ASTConditionalExecutionStatement.java:0) + - Method throws type in (ASTEmptyStatement.java:0) + - Method throws type in (ASTEnterOperationStatement.java:0) + - Method throws type in (ASTExitOperationStatement.java:0) + - Method throws type in (ASTIterationStatement.java:0) + - Method throws type in (ASTLinkDeletionStatement.java:0) + - Method throws type in (ASTLinkInsertionStatement.java:0) + - Method throws type in (ASTNewLinkObjectStatement.java:0) + - Method throws type in (ASTNewObjectStatement.java:0) + (240 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + 3. Dependencies of Slice uml + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MProtocolStateMachine.java:0) + - Constructor (java.lang.String, org.tzi.use.parser.SrcPos, org.tzi.use.uml.mm.MClassifier)> has parameter of type in (MStateMachine.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByKind.java:0) + - Constructor (org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.ocl.type.Type)> throws type in (ExpSelectByType.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssert.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClass)> has parameter of type in (MAssertClassInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertGlobalInvariants.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression)> has parameter of type in (MAssertOclExpression.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean)> has parameter of type in (MAssertPost.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.ocl.expr.Expression, org.tzi.use.uml.mm.MOperation, [Lorg.tzi.use.uml.ocl.expr.Expression;)> has parameter of type in (MAssertPre.java:0) + - Constructor (org.tzi.use.parser.SrcPos, java.lang.String, java.lang.String, boolean, org.tzi.use.uml.mm.MClassInvariant)> has parameter of type in (MAssertSingleInvariant.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.antlr.runtime.Token, org.tzi.use.uml.mm.MModel, java.util.List, java.util.List)> has generic parameter type > with type argument depending on in (MTestSuite.java:0) + - Constructor (org.tzi.use.parser.SrcPos)> has parameter of type in (MVariation.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationEnd.java:0) + - Constructor (org.tzi.use.parser.SrcPos, org.tzi.use.uml.sys.MSystem)> has parameter of type in (MVariationStart.java:0) + - Field has type in (MStateMachine.java:0) + - Field has type in (Expression.java:0) + - Field has type in (VarDecl.java:0) + - Field has type in (MStatement.java:0) + (42 further dependencies have been omitted...) +Cycle detected: Slice uml -> + Slice util -> + Slice uml + 1. Dependencies of Slice uml + - Class implements interface in (ExpTupleLiteral.java:0) + - Class implements interface in (Expression.java:0) + - Class implements interface in (TupleType.java:0) + - Class implements interface in (TupleValue.java:0) + - Class implements interface in (Value.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MSystemState.java:0) + - Class implements interface in (MLinkDeletionStatement.java:0) + - Constructor (int, org.tzi.use.util.collections.Queue, java.util.ArrayList, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (ThreadedEvaluator.java:0) + - Constructor (org.tzi.use.uml.sys.events.tags.EventContext, org.tzi.use.uml.sys.soil.MStatement, org.tzi.use.util.soil.StateDifference)> has parameter of type in (StatementExecutedEvent.java:0) + - Field has type in (ThreadedEvaluator.java:0) + - Field has type in (BagValue.java:0) + - Field has type in (MSystem.java:0) + - Field has type in (MSystem.java:0) + - Field has generic type > with type argument depending on in (MSystem.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementEvaluationResult.java:0) + - Field has type in (StatementExecutedEvent.java:0) + - Interface extends interface in (Type.java:0) + - Method has return type in (Evaluator.java:0) + (464 further dependencies have been omitted...) + 2. Dependencies of Slice util + - Class has generic interface > with type argument depending on in (AlphabeticalConditionByNameComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalConditionComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalInvariantComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalNamedElementComparator.java:0) + - Class has generic interface > with type argument depending on in (AlphabeticalOperationComparator.java:0) + - Class has generic interface > with type argument depending on in (UseFileOrderComparator.java:0) + - Class has generic interface > with type argument depending on in (UseModelElementFileOrderComparator.java:0) + - Constructor (org.tzi.use.util.soil.SymbolTable, org.tzi.use.uml.ocl.type.Type)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (SymbolTable.java:0) + - Constructor (org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Constructor (org.tzi.use.util.soil.VariableEnvironment, org.tzi.use.uml.sys.MSystemState)> has parameter of type in (VariableEnvironment.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has generic type > with type argument depending on in (StateDifference.java:0) + - Field has type in (SymbolTable.java:0) + - Field has type in (SymbolTable.java:0) + - Field has generic type > with type argument depending on in (VariableEnvironment.java:0) + - Field has generic type >> with type argument depending on in (VariableEnvironment.java:0) + (151 further dependencies have been omitted...) + +Cycle count: 55 diff --git a/docs/archunit-results/layers-current-failure-report.txt b/docs/archunit-results/layers-current-failure-report.txt new file mode 100644 index 000000000..960729122 --- /dev/null +++ b/docs/archunit-results/layers-current-failure-report.txt @@ -0,0 +1 @@ +No violations - failure report does not exist. \ No newline at end of file diff --git a/log.txt b/log.txt new file mode 100644 index 000000000..738498b39 --- /dev/null +++ b/log.txt @@ -0,0 +1,10 @@ +Log-Eintrag 1 +Log-Eintrag 2 +Log-Eintrag 3 +Log-Eintrag 4 +Log-Eintrag 5 +Log-Eintrag 6 +Log-Eintrag 7 +Log-Eintrag 8 +Log-Eintrag 9 +Log-Eintrag 10 diff --git a/use-core/.ai/mcp/mcp.json b/use-core/.ai/mcp/mcp.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/use-core/src/main/java/org/tzi/use/util/Debug.java b/use-core/src/main/java/org/tzi/use/util/Debug.java deleted file mode 100644 index efc80d8c9..000000000 --- a/use-core/src/main/java/org/tzi/use/util/Debug.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.tzi.use.util; - -/** - * Small debug helper to enable conditional debug output without polluting - * the normal test/golden outputs. Activate by setting system property - * -Duse.debug=true or environment variable USE_DEBUG=true. - */ -public final class Debug { - private Debug() {} - - public static boolean enabled() { - try { - String p = System.getProperty("use.debug"); - if (p != null) return "true".equalsIgnoreCase(p); - String e = System.getenv("USE_DEBUG"); - return "true".equalsIgnoreCase(e); - } catch (Throwable t) { - return false; - } - } - - public static void log(String s) { - if (enabled()) { - try { - // Try to write to USE protocol (preferred for integration tests) - org.tzi.use.util.USEWriter.getInstance().protocol("[USE-DEBUG] " + s); - } catch (Throwable ignore) { - // fallback to stderr - System.err.println("[USE-DEBUG] " + s); - } - } - } -} diff --git a/use-core/src/main/resources/etc/java-header-use.txt b/use-core/src/main/resources/etc/java-header-use.txt new file mode 100644 index 000000000..31ea7632b --- /dev/null +++ b/use-core/src/main/resources/etc/java-header-use.txt @@ -0,0 +1,18 @@ +/* + * USE - UML based specification environment + * Copyright (C) 1999-2004 Mark Richters, University of Bremen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ diff --git a/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt b/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt new file mode 100644 index 000000000..6db88f6c8 --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/AssociationClass/Info.txt @@ -0,0 +1,15 @@ +An example with persons working for a company. +Salary and employee ranking are represented by +association classes. + +This example is part of +"Improvements in USE 2.2.0" + +AssociationClass.use: +two classes Company and Person +two association classes WorksFor, EmployeeRanking +no Constraints + +AssociationClass.cmd: +creates objects for classes and +association classes diff --git a/use-core/src/main/resources/examples/Documentation/Demo/Info.txt b/use-core/src/main/resources/examples/Documentation/Demo/Info.txt new file mode 100644 index 000000000..bc1266a70 --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/Demo/Info.txt @@ -0,0 +1,35 @@ +An example with employees working in different departments +on projects, which are controlled by a department. +After executing Demo.cmd one invariant evaluates to false +because one project has a higher budged than its department. + +This example is part of the "USE Quick Tour". + +Demo.use: +three classes Employee, Department and Project +three associations +at least one invariant for each class + +Demo.cmd: +== the sequence of Demo0.cmd to Demo4.cmd + +SplitCommands/Demo0.cmd: +creates one object of type Department + +SplitCommands/Demo1.cmd: +assigns the attribute values in the new object + +SplitCommands/Demo2.cmd: +creates two objects of type Employee and assigns +attribute values + +SplitCommands/Demo3.cmd: +creates two links between the department and the employees + +SplitCommands/Demo4.cmd: +creates two projects, assigns attribute values and +creates two links between the projects and the +department +creates links between the employees and the new projects + +Classdiagram/Demo-UML.eps: Class diagram for this example diff --git a/use-core/src/main/resources/examples/Documentation/Employee/Info.txt b/use-core/src/main/resources/examples/Documentation/Employee/Info.txt new file mode 100644 index 000000000..78ad523af --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/Employee/Info.txt @@ -0,0 +1,25 @@ +This example shows companies and persons working +for them. + +The example corresponds to the example +model in the section `Validating Pre- and Postconditions +with USE´ + +Employee.use: +Corresponds to examples/monitoring/Employee.use, +but the invariant context Person inv: age >= 18 +is missing here + +two classes Person and Company with at least +one operation with side effects +one association WorksFor +no invariants, but one constraint for every operation + +Employee.cmd: +creates one Company and one Person +the operation hire is executed to create a link +between both objects +after that, the raiseSalary operation with return value +is executed +finally the new link is destroyed by executing the +operation fire diff --git a/use-core/src/main/resources/examples/Documentation/Graph/Info.txt b/use-core/src/main/resources/examples/Documentation/Graph/Info.txt new file mode 100644 index 000000000..e07981246 --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/Graph/Info.txt @@ -0,0 +1,21 @@ +This example describes a graph with nodes and edges. +The operation +newTarget creates a new link (edge) between a +source node and exactly one new node. +This operation uses the operation oclIsNew. + +The example corresponds to +the section `Validating Pre- and Postconditions +with USE + +Graph.use: +one class Node and one association Edge +one operation newTarget with two postconditions + +Graph.cmd: +three calls of newTarget +both postconditions evaluate to true after the first call +the first postcondition evaluates to false and the +second to true after the second call +and the first postcondition evaluates to true +and the second to false after the last call diff --git a/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt b/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt new file mode 100644 index 000000000..b58942ad4 --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/HowToCheckUMLAndOCLModelsWithUSE/00readme.txt @@ -0,0 +1,199 @@ + How to Check UML and OCL Models with USE + Martin Gogolla + July 2010 + +Abstract: This note contains practical hints on how to define UML and +OCL models and how to check such models with the tool USE (UML-based +Specification Environment) developed at the University of Bremen. One +should obtain a link to the tool USE by searching Google with the terms +'use ocl bremen'. This note explains most of the USE functionality by a +simple example describing civil status properties of persons. + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +1. WHAT IS CONTAINED IN THE FILES? + +In order to work with the civil status example easily, all files should +be placed in the directory 'c:/use/civstat/'. In your directory +'c:/use/civstat/' there should be 56 files which are partitioned into 9 +groups. + +----------------------------------------- files documenting this note -- +- 00readme.pdf +- 00readme.sxw +- 00readme.txt +----------------------------------------- files for the abcd scenario -- +- abcd_assl.cmd +- abcd_assl.olt ++ abcd_assl.pro +- abcd_cmd.cmd +- abcd_cmd.olt ++ abcd_cmd.pro ++ abcd_seqDiaDetail1.gif ++ abcd_seqDiaDetail2.gif ++ abcd_useScreenshot.gif +--------------------------------------- files for the bigamy scenario -- +- bigamy.cmd +- bigamy.invs ++ bigamy.pro +------------------------------------- central files showing the model -- ++ civstat.assl ++ civstat.use ++ civstat_classDia.gif +---------------------------------------- files for the crowd scenario -- +- crowd.cmd +- crowd.olt ++ crowd.pro ++ crowd_classExtent.gif ++ crowd_useScreenshot.gif +---------------------------------- papers explaining underlying ideas -- +- Gogolla_2005_SOSYM.pdf +- Gogolla_2005_SOSYM.ps +- Gogolla_2007_SCP.pdf +- Gogolla_2007_SCP.ps +- Gogolla_2009_TAP.pdf +- Gogolla_2009_TAP.ps +--------------------------------- files for the independence scenario -- +- independence_allInvariants.gif +- independence_attributesDefined.cmd ++ independence_attributesDefined.gif +- independence_attributesDefined.pro +- independence_femaleHasNoWife.cmd ++ independence_femaleHasNoWife.gif +- independence_femaleHasNoWife.pro +- independence_maleHasNoHusband.cmd ++ independence_maleHasNoHusband.gif +- independence_maleHasNoHusband.pro +- independence_nameCapitalThenSmallLetters.cmd ++ independence_nameCapitalThenSmallLetters.gif +- independence_nameCapitalThenSmallLetters.pro +- independence_nameIsUnique.cmd ++ independence_nameIsUnique.gif +- independence_nameIsUnique.pro +--------------------------------- cmd files defining model operations -- ++ Person_birth.cmd ++ Person_death_married.cmd ++ Person_death_unmarried.cmd ++ Person_divorce.cmd ++ Person_marry.cmd +---------------------------------------- files for the world scenario -- +- world.cmd +- world.olt ++ world.pro ++ world_objDia.gif +- world_query.cmd ++ world_query.pro +------------------------------------------------------------------------ + +Files ending with 'use', 'assl', 'cmd', 'invs', or 'olt' can be +processed by the USE tool. All files with other suffixes ('pdf', +'sxw', 'txt', 'pro', 'gif', or 'ps') are the result of documenting the +work ('gif', 'pro', ...) with USE or explain basic ideas ('ps', +'pdf'). The file suffixes indicate the file content as follows. + +use - definition of the UML and OCL model (classes, invariants, etc.) +assl - definition of parametrized scripts for manipulating the model +cmd - scripts or script calls realizing scenarios +invs - additional invariants to be loaded dynamically +olt - object diagram layout + +pdf - pdf file for documentation +txt - plain text files for documentation +pro - protocol file (plain text) documenting execution of a cmd file +gif - graphic file containing a UML diagram or something similar +ps - ps file for documentation + +All files enumerated above with '+' are shown in the file +'00readme.pdf'. + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +2. HOW CAN I RUN USE AND EXECUTE SCENARIOS? + +Download, install and start USE. Consult the USE documentation if +needed. USE will show up with a GUI window and a COMMAND LINE +window. Open the file 'c:/use/civstat/abcd_cmd.cmd' with a text +editor. The first line of that file looks as follows: + +-- read c:/use/civstat/abcd_cmd.cmd + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A cmd file contains a sequence of commands which can be processed by +USE. The characters '--' indicate that the rest of the line is a +comment. Copy that part of this first line into your clipboard which +is marked above with the character '^'. Paste the command which you +have copied from your clipboard into the COMMAND LINE window and press +return. USE will execute all commands in the file +'c:/use/civstat/abcd_cmd.cmd' and will build up an object diagram. USE +has constructed several object diagrams before reaching the final +one. All executed operations can be traced in the sequence diagram +view. + +Execution of all above mentioned scenarios can be done in the same way +as for the first scenario, i.e., by loading the respective cmd file into +a text editor, by copying from the first line the read command together +with the respective file name and by pasting this command into the +COMMAND LINE window. This will work for the following cmd files: + +abcd_assl.{cmd|pro} +abcd_cmd.{cmd|pro} +bigamy.{cmd|pro} +crowd.{cmd|pro} +independence_attributesDefined.{cmd|pro} +independence_femaleHasNoWife.{cmd|pro} +independence_maleHasNoHusband.{cmd|pro} +independence_nameCapitalThenSmallLetters.{cmd|pro} +independence_nameIsUnique.{cmd|pro} +world.{cmd|pro} +world_query.{cmd|pro} + +These scenarios are documented with a protocol file having the same name +as the cmd file but possessing the suffix pro. These pro files are +ordinary text files. They are edited versions (long files names are +shortened) of the output given by USE in the COMMAND LINE window. + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +3. WHAT DO THE DIFFERENT SCENARIOS SHOW? + +Scenario 'abcd': A simple object diagram with four persons (ada, bob, + cyd, dan) is built up. The persons are created, partly get married or + divorced or die. This scenario is expressed in two versions, namely + one version realizing the operations with cmd files (abcd_cmd.cmd) + and one version realizing the operations using the assl file + (abcd_assl.cmd). + +Scenario 'bigamy': This scenario (bigamy.cmd) checks whether a bigamy + situation can be constructed under the stated invariants. A large + number of possible bigamy situations is tried with the script + attemptBigamy() from the civstat.assl file, but none is found. This + proves that at least in the enumerated search space, the UML and OCL + model is bigamy free. + +Scenario 'crowd': The cmd file crowd.cmd builds up an invalid object + diagram where one model-inherent multiplicity constraint and two + explicit invariants are violated. This scenario may be regarded as a + negative test case which has to lead to a constraint violation. + +Scenario 'independence': This scenario considers the relationship + between the five invariants and consists of five cmd files + (independence_attributesDefined.cmd, + independence_femaleHasNoWife.cmd, independence_maleHasNoHusband.cmd, + independence_nameCapitalThenSmallLetters.cmd, + independence_nameIsUnique.cmd). It builds up five object diagrams + where each single object diagram violates exactly one invariant and + satisfies the other four invariants. The construction of these five + object diagrams proves that the five invariants are independent from + each other, i.e., no single invariant is a consequence of the other + invariants. In other words, the five invariants are non-redundant and + express independent requirements. + +Scenario 'world': Here a larger object diagram is constructed with the + cmd file world.cmd that shows that the invariants are consistent, + i.e., the invariants are not contradictory to each other. The object + diagram is constructed by the script world() which is parametrized + with the number of expected female and male persons and the number of + expected mariages. Person attributes like name or gender are filled + with values representing real-world situations. + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt b/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt new file mode 100644 index 000000000..14342d196 --- /dev/null +++ b/use-core/src/main/resources/examples/Documentation/NestedOperationCalls/Info.txt @@ -0,0 +1,19 @@ +This example shows the handling of nested operation +calls. It is based on the factorial function +with return type Integer. +The operation can be used as query operation and +with openter and opexit, too. + +NestedOperationCalls.use: +one Class Rec +one operation fac, computing and returning the factorial +of the functions argument +this operation is defined as query and has +pre- and postconditions + + +NestedOperationCalls.cmd: +calls the Function three times with different +arguments (not as query) +and it ends the calls in the same order +all pre- and postconditions evaluate to true diff --git a/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt b/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt new file mode 100644 index 000000000..0c529c71f --- /dev/null +++ b/use-core/src/main/resources/examples/Metamodels/OCL2MM/Info.txt @@ -0,0 +1,7 @@ +Specification of a metamodel for OCL expressions +classifiers, association ends and attributes. + +OCL2MM.use: + +OCL2MM.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt new file mode 100644 index 000000000..24a69dd33 --- /dev/null +++ b/use-core/src/main/resources/examples/Metamodels/UML13All/Info.txt @@ -0,0 +1,11 @@ +Specifies UML 1.3 in USE + +UML13All.use: +- + +UML13All.cmd: +leer + +Demo-meta.cmd: +Represents a part of the metamodel of the /Documentation/ +Demo example. (classes and attributes) \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt new file mode 100644 index 000000000..76150bb0a --- /dev/null +++ b/use-core/src/main/resources/examples/Metamodels/UML13Core/Info.txt @@ -0,0 +1,8 @@ +Specifies the UML 1.3 Core +the definition is also a part of /Specifications/ +UML13All + +UML13Core.use: + +UML13Core.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt b/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt new file mode 100644 index 000000000..e626a550f --- /dev/null +++ b/use-core/src/main/resources/examples/Metamodels/UML23/Info.txt @@ -0,0 +1,7 @@ +Specification of a metamodel for OCL expressions +(structured-)classifiers, association ends and attributes. + +OCL2MM.use: + +OCL2MM.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt b/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt new file mode 100644 index 000000000..3ae75daba --- /dev/null +++ b/use-core/src/main/resources/examples/Metamodels/actionsemantics/Info.txt @@ -0,0 +1,2 @@ +Specification of the actionsemantics model +-> OMG RFP ad/98-11-01 \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/AB/Info.txt b/use-core/src/main/resources/examples/Others/AB/Info.txt new file mode 100644 index 000000000..2ae2c8172 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/AB/Info.txt @@ -0,0 +1,21 @@ +This Example shows the use of openter and opexit +for an operation with side effects. +With four postconditions different expressions using +@pre are presented. + +AB.use: +two classes A,B and one association R + +AB.cmd: +creates state 1 with two objects and one link +calls the operation with openter +creates state 2 by chancing attribute values, +changing links and creating a new object +then opexit + +AB1.cmd: +creates state 1 + +AB2.cmd: +creates state 2 + diff --git a/use-core/src/main/resources/examples/Others/CallSequence/Info.txt b/use-core/src/main/resources/examples/Others/CallSequence/Info.txt new file mode 100644 index 000000000..f1a420cde --- /dev/null +++ b/use-core/src/main/resources/examples/Others/CallSequence/Info.txt @@ -0,0 +1,12 @@ +This example shows nested operation calls with different +objects. + +CallSequence.use: +two classes with one operation (without parameters +and definition) +each + +CallSequence.cmd: +creates two objects with differen types +it follows a sequence of alternating openter and +opexit commands diff --git a/use-core/src/main/resources/examples/Others/CarRental/Info.txt b/use-core/src/main/resources/examples/Others/CarRental/Info.txt new file mode 100644 index 000000000..f189e755d --- /dev/null +++ b/use-core/src/main/resources/examples/Others/CarRental/Info.txt @@ -0,0 +1,21 @@ +This is a complex version of the +examples/Papers/1998/RichtersAndGogolla example +with simple invariants to ensure object diagrams +which make sense and pre-/postconditions +for every operation with side effects. + +CarRental2.use: +more classes and associations than the simple example +there is a 3-ary association + +many attributes (with primitive and complex types) +there are queries and operations changing the system +state + +CarRental2.cmd: +creates a state with at least +one object per class and assigned attribute values +not all constraints evaluate to true +there are inconsistent invariants + +CarRental2.olt: diff --git a/use-core/src/main/resources/examples/Others/Empty/Info.txt b/use-core/src/main/resources/examples/Others/Empty/Info.txt new file mode 100644 index 000000000..f54ab9bf5 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Empty/Info.txt @@ -0,0 +1,7 @@ +An empty class and object diagram. + +Empty.use: +empty model + +Empty.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Ex/Info.txt b/use-core/src/main/resources/examples/Others/Ex/Info.txt new file mode 100644 index 000000000..f6cb9058d --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Ex/Info.txt @@ -0,0 +1,13 @@ +This example is the same as Example/Documentation/Demo. +But there is an invariant added and absent comments +in the Ex.use file. + +Ex*.cmd == Demo*.cmd + +e.cmd: +== Ex.cmd and a creation of three +more projects controlled by the department + +After executing e.cmd one more invariant evaluates to +false, because there are more projects controlled by the +department than there are employees working for it. \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Grammar/Info.txt b/use-core/src/main/resources/examples/Others/Grammar/Info.txt new file mode 100644 index 000000000..4290c80ea --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Grammar/Info.txt @@ -0,0 +1,25 @@ +This example describes a grammar with terminal +and non terminal symbols (composition) +and production rules describing how the symbols +can be replaced. + +Grammar.use: +several classes with generalization +and compositions compositions +for every class at least one simple invariant +with iterate and nested operations + +Grammar.cmd: +a simple grammar is created +four terminal symbols +, -, 0 and 1 +two non terminal symbols expr and operator +five production rules + -> + -> '0' + -> '1' + -> '+' + -> '-' + +Grammar.fig: + +Grammar.olt: diff --git a/use-core/src/main/resources/examples/Others/Job/Info.txt b/use-core/src/main/resources/examples/Others/Job/Info.txt new file mode 100644 index 000000000..1d5577ca9 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Job/Info.txt @@ -0,0 +1,13 @@ +This example describes Jobs and Persons who have Jobs. +Students and employees are persons. + +Job.use: +four classes Person, Student (subclass of Person), +Employee (subclass of Person) and Job +one association Works between Job and Person +no constraints + +Job.cmd: +one object is created for every class +one link between a student and a job is created +then two objects are destroyed and the link deleted diff --git a/use-core/src/main/resources/examples/Others/Lists/Info.txt b/use-core/src/main/resources/examples/Others/Lists/Info.txt new file mode 100644 index 000000000..4ce6a900f --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Lists/Info.txt @@ -0,0 +1,14 @@ +This example shows a representation of lists. +They can belong to maps and include object pairs. + +Lists.use: +several classes with generalization and associations +many constraints + +Lists.cmd: +one list is created with three not empty lists and +one empty list +then a Map with a not empty list containing a pair +is created + +Lists.olt: diff --git a/use-core/src/main/resources/examples/Others/Math/Info.txt b/use-core/src/main/resources/examples/Others/Math/Info.txt new file mode 100644 index 000000000..c74a1c041 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Math/Info.txt @@ -0,0 +1,14 @@ +This example contains only one class with an operation +not free from side effects with return type Integer. +Its not defined as query, but with a postcondition +and result inside the class definition (not as an +explicit constraint). +The operation computes the greatest common divisor +of the arguments (two Integers). + +Math.use: +one class Math with an operation gcd + +Math.cmd: +gdc is called with different arguments +the result values satisfy the postcondition \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt b/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt new file mode 100644 index 000000000..3e6834595 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/MultipleInheritance/Info.txt @@ -0,0 +1,9 @@ +This example shows generalization between several +classes without attributes, operations and associations. + +MultipleInheritance.use: +five classes A, B (subclass of A), C (subclass of A), +D (subclass of B, C and E), E + +MultipleInheritance.cmd: +creates an object for every class \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Person/Info.txt b/use-core/src/main/resources/examples/Others/Person/Info.txt new file mode 100644 index 000000000..31a4edb43 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Person/Info.txt @@ -0,0 +1,12 @@ +This example shows the connection of father, mother +and children with the aid of a class and a 3-ary +association Family. +Every child has exactly one father and one mother. +Fathers and mothers may have more than one child. + +Person.use: +one class Person +one association Family + +Person.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Polygon/Info.txt b/use-core/src/main/resources/examples/Others/Polygon/Info.txt new file mode 100644 index 000000000..44aeb51e9 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Polygon/Info.txt @@ -0,0 +1,21 @@ +Points and polygons are represented in this example. +Ordered points can belong to polygons. A single +point and a set of points representing +a polygon can be moved. There are also colored +points. + +Polygon.use: +three classes Point, ColorPoint (subclass of Point) and +Polygon +one association (with stereotype ordered) +Polygon_Point between points and polygons +for each class, there is an operation +with side effects for moving the points resp. +polygons and the corresponding constraints +(postconditions) defined + +Polygon.cmd: +creates a polygon and three points +one of it is colored +then the polygon, a point and the colored point +are moved diff --git a/use-core/src/main/resources/examples/Others/Project/Info.txt b/use-core/src/main/resources/examples/Others/Project/Info.txt new file mode 100644 index 000000000..548743836 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Project/Info.txt @@ -0,0 +1,13 @@ +Example from exercises of the lecture +Object-oriented Software Design. + +This example equals /Documentation/Demo, but the +invariants are ordered differently. +In this example the constraints are defined in the +class definition. + +Project.use: +~Demo.use + +Project.cmd: +empty diff --git a/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt b/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt new file mode 100644 index 000000000..f8ea6366b --- /dev/null +++ b/use-core/src/main/resources/examples/Others/RecursiveOperations/Info.txt @@ -0,0 +1,11 @@ +This example shows the use of two different recursive +operations. One of it does not terminate. +Like /Documentation/NestedOperationCalls the factorial +function is defined here, but without constraints. + +RecursiveOperations.use: +one class Rec with two operations + +RecursiveOperations.cmd: +one object is created +two operation calls with different arguments diff --git a/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt b/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt new file mode 100644 index 000000000..ad9fc6986 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/ReflexiveAssociation/Info.txt @@ -0,0 +1,12 @@ +This example is the simple version of /Others/Person. +There are nodes and connections between them. +The role of a node can be parent or child. + +ReflexiveAssociation.use: +one class Node with one attribute num +one association + +ReflexiveAssociation.cmd: +creates two objects +both are connected with two links and changed roles +a third link connects an object with itself diff --git a/use-core/src/main/resources/examples/Others/Student/Info.txt b/use-core/src/main/resources/examples/Others/Student/Info.txt new file mode 100644 index 000000000..8b5ee33f7 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Student/Info.txt @@ -0,0 +1,10 @@ +This example is a part of /Others/Job. +There are persons, students and employees with +generalization. + +Student.use: +three classes Person, Student (subclass of Person) +and Employee (subclass of Person) + +Student.cmd: +empty diff --git a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt new file mode 100644 index 000000000..850ef4a57 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V1_no_constraints.txt @@ -0,0 +1,157 @@ +(all c: one Column | one (BoardColumns . c)) +---OUTCOME--- +TRIVIALLY_SATISFIABLE + +---INSTANCE--- +relations: { + +Integer=[[I_1], [I_2], [I_3], [I_4], [I_5], [I_6], [I_7], [I_8], [I_9]], + +Board=[[board]], + +Row=[[Row1], [Row2], [Row3], [Row4], [Row5], [Row6], [Row7], [Row8], [Row9]], +Column=[[Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9]], +Square=[[Square1], [Square2], [Square3], [Square4], [Square5], [Square6], [Square7], [Square8], [Square9]], +Field=[[Field1], [Field2], [Field3], [Field4], [Field5], [Field6], [Field7], [Field8], [Field9], + [Field10], [Field11], [Field12], [Field13], [Field14], [Field15], [Field16], [Field17], [Field18], + [Field19], [Field20], [Field21], [Field22], [Field23], [Field24], [Field25], [Field26], [Field27], + [Field28], [Field29], [Field30], [Field31], [Field32], [Field33], [Field34], [Field35], [Field36], + [Field37], [Field38], [Field39], [Field40], [Field41], [Field42], [Field43], [Field44], [Field45], + [Field46], [Field47], [Field48], [Field49], [Field50], [Field51], [Field52], [Field53], [Field54], + [Field55], [Field56], [Field57], [Field58], [Field59], [Field60], [Field61], [Field62], [Field63], + [Field64], [Field65], [Field66], [Field67], [Field68], [Field69], [Field70], [Field71], [Field72], + [Field73], [Field74], [Field75], [Field76], [Field77], [Field78], [Field79], [Field80], [Field81]], + +BoardFields=[[board, Field1], [board, Field2], [board, Field3], + [board, Field4], [board, Field5], [board, Field6], + [board, Field7], [board, Field8], [board, Field9], + [board, Field10], [board, Field11], [board, Field12], + [board, Field13], [board, Field14], [board, Field15], + [board, Field16], [board, Field17], [board, Field18], + [board, Field19], [board, Field20], [board, Field21], + [board, Field22], [board, Field23], [board, Field24], + [board, Field25], [board, Field26], [board, Field27], + [board, Field28], [board, Field29], [board, Field30], + [board, Field31], [board, Field32], [board, Field33], + [board, Field34], [board, Field35], [board, Field36], + [board, Field37], [board, Field38], [board, Field39], + [board, Field40], [board, Field41], [board, Field42], + [board, Field43], [board, Field44], [board, Field45], + [board, Field46], [board, Field47], [board, Field48], + [board, Field49], [board, Field50], [board, Field51], + [board, Field52], [board, Field53], [board, Field54], + [board, Field55], [board, Field56], [board, Field57], + [board, Field58], [board, Field59], [board, Field60], + [board, Field61], [board, Field62], [board, Field63], + [board, Field64], [board, Field65], [board, Field66], + [board, Field67], [board, Field68], [board, Field69], + [board, Field70], [board, Field71], [board, Field72], + [board, Field73], [board, Field74], [board, Field75], + [board, Field76], [board, Field77], [board, Field78], + [board, Field79], [board, Field80], [board, Field81]], + +ColumnFields=[[Column1, Field1], [Column1, Field10], [Column1, Field19], + [Column1, Field28], [Column1, Field37], [Column1, Field46], + [Column1, Field55], [Column1, Field64], [Column1, Field73], + [Column2, Field2], [Column2, Field11], [Column2, Field20], + [Column2, Field29], [Column2, Field38], [Column2, Field47], + [Column2, Field56], [Column2, Field65], [Column2, Field74], + [Column3, Field3], [Column3, Field12], [Column3, Field21], + [Column3, Field30], [Column3, Field39], [Column3, Field48], + [Column3, Field57], [Column3, Field66], [Column3, Field75], + [Column4, Field4], [Column4, Field13], [Column4, Field22], + [Column4, Field31], [Column4, Field40], [Column4, Field49], + [Column4, Field58], [Column4, Field67], [Column4, Field76], + [Column5, Field5], [Column5, Field14], [Column5, Field23], + [Column5, Field32], [Column5, Field41], [Column5, Field50], + [Column5, Field59], [Column5, Field68], [Column5, Field77], + [Column6, Field6], [Column6, Field15], [Column6, Field24], + [Column6, Field33], [Column6, Field42], [Column6, Field51], + [Column6, Field60], [Column6, Field69], [Column6, Field78], + [Column7, Field7], [Column7, Field16], [Column7, Field25], + [Column7, Field34], [Column7, Field43], [Column7, Field52], + [Column7, Field61], [Column7, Field70], [Column7, Field79], + [Column8, Field8], [Column8, Field17], [Column8, Field26], + [Column8, Field35], [Column8, Field44], [Column8, Field53], + [Column8, Field62], [Column8, Field71], [Column8, Field80], + [Column9, Field9], [Column9, Field18], [Column9, Field27], + [Column9, Field36], [Column9, Field45], [Column9, Field54], + [Column9, Field63], [Column9, Field72], [Column9, Field81]], + +RowFields=[[Row1, Field1], [Row1, Field2], [Row1, Field3], + [Row1, Field4], [Row1, Field5], [Row1, Field6], + [Row1, Field7], [Row1, Field8], [Row1, Field9], + [Row2, Field10], [Row2, Field11], [Row2, Field12], + [Row2, Field13], [Row2, Field14], [Row2, Field15], + [Row2, Field16], [Row2, Field17], [Row2, Field18], + [Row3, Field19], [Row3, Field20], [Row3, Field21], + [Row3, Field22], [Row3, Field23], [Row3, Field24], + [Row3, Field25], [Row3, Field26], [Row3, Field27], + [Row4, Field28], [Row4, Field29], [Row4, Field30], + [Row4, Field31], [Row4, Field32], [Row4, Field33], + [Row4, Field34], [Row4, Field35], [Row4, Field36], + [Row5, Field37], [Row5, Field38], [Row5, Field39], + [Row5, Field40], [Row5, Field41], [Row5, Field42], + [Row5, Field43], [Row5, Field44], [Row5, Field45], + [Row6, Field46], [Row6, Field47], [Row6, Field48], + [Row6, Field49], [Row6, Field50], [Row6, Field51], + [Row6, Field52], [Row6, Field53], [Row6, Field54], + [Row7, Field55], [Row7, Field56], [Row7, Field57], + [Row7, Field58], [Row7, Field59], [Row7, Field60], + [Row7, Field61], [Row7, Field62], [Row7, Field63], + [Row8, Field64], [Row8, Field65], [Row8, Field66], + [Row8, Field67], [Row8, Field68], [Row8, Field69], + [Row8, Field70], [Row8, Field71], [Row8, Field72], + [Row9, Field73], [Row9, Field74], [Row9, Field75], + [Row9, Field76], [Row9, Field77], [Row9, Field78], + [Row9, Field79], [Row9, Field80], [Row9, Field81]], + +SquareFields=[[Square1, Field1], [Square1,Field2], [Square1, Field3], + [Square1, Field10], [Square1, Field11],[Square1, Field12], + [Square1, Field19], [Square1, Field20], [Square1,Field21], + [Square2, Field4], [Square2, Field5], [Square2, Field6], + [Square2, Field13], [Square2, Field14], [Square2, Field15], + [Square2,Field22], [Square2, Field23], [Square2, Field24], + [Square3, Field7],[Square3, Field8], [Square3, Field9], + [Square3, Field16], [Square3,Field17], [Square3, Field18], + [Square3, Field25], [Square3, Field26],[Square3, Field27], + [Square4, Field28], [Square4, Field29], [Square4,Field30], + [Square4, Field37], [Square4, Field38], [Square4, Field39], + [Square4, Field46], [Square4, Field47], [Square4, Field48], + [Square5,Field31], [Square5, Field32], [Square5, Field33], + [Square5, Field40],[Square5, Field41], [Square5, Field42], + [Square5, Field49], [Square5,Field50], [Square5, Field51], + [Square6, Field34], [Square6, Field35],[Square6, Field36], + [Square6, Field43], [Square6, Field44], [Square6,Field45], + [Square6, Field52], [Square6, Field53], [Square6, Field54], + [Square7, Field55], [Square7, Field56], [Square7, Field57], + [Square7,Field64], [Square7, Field65], [Square7, Field66], + [Square7, Field73],[Square7, Field74], [Square7, Field75], + [Square8, Field58], [Square8,Field59], [Square8, Field60], + [Square8, Field67], [Square8, Field68],[Square8, Field69], + [Square8, Field76], [Square8, Field77], [Square8,Field78], + [Square9, Field61], [Square9, Field62], [Square9, Field63], + [Square9, Field70], [Square9, Field71], [Square9, Field72], + [Square9,Field79], [Square9, Field80], [Square9, Field81]] + +BoardRows=[[board, Row1], [board, Row2], [board, Row3], + [board, Row4], [board, Row5], [board, Row6], + [board, Row7], [board, Row8], [board, Row9]], + +BoardColumns=[[board, Column1], [board, Column2], [board, Column3], + [board, Column4], [board, Column5], [board, Column6], + [board, Column7], [board, Column8], [board, Column9]], + +BoardSquares=[[board, Square1], [board, Square2], [board, Square3], [board, Square4], [board, Square5], [board, Square6], [board, Square7], [board, Square8], [board, Square9]], + + + +value=[], + +ints: [] + +---STATS--- +p cnf 0 0 +primary variables: 0 +translation time: 63 ms +solving time: 0 ms diff --git a/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt new file mode 100644 index 000000000..17820800e --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Sudoku/sudoku_lh_Result_V2_valid_solution.txt @@ -0,0 +1,30 @@ +((((((((((((((((((((((((((((((((((all c: one Column | one (BoardColumns . c)) && (all f: one Field | one (BoardFields . f))) && (all r: one Row | one (BoardRows . r))) && (all s: one Square | one (BoardSquares . s))) && ((BoardColumns . univ) in Board)) && ((BoardFields . univ) in Board)) && ((BoardRows . univ) in Board)) && ((BoardSquares . univ) in Board)) && (all f: one Field | one (ColumnFields . f))) && (all b: one Board | (#((b . BoardColumns)) = 9))) && ((univ . BoardColumns) in Column)) && ((ColumnFields . univ) in Column)) && (all b: one Board | (#((b . BoardFields)) = 81))) && (all c: one Column | (#((c . ColumnFields)) = 9))) && (all r: one Row | (#((r . RowFields)) = 9))) && (all s: one Square | (#((s . SquareFields)) = 9))) && ((univ . BoardFields) in Field)) && ((univ . ColumnFields) in Field)) && ((univ . RowFields) in Field)) && ((univ . SquareFields) in Field)) && (all f: one Field | one (RowFields . f))) && (all b: one Board | (#((b . BoardRows)) = 9))) && ((univ . BoardRows) in Row)) && ((RowFields . univ) in Row)) && (all f: one Field | one (SquareFields . f))) && (all b: one Board | (#((b . BoardSquares)) = 9))) && ((univ . BoardSquares) in Square)) && ((SquareFields . univ) in Square)) && ((value . univ) in Field)) && ((univ . value) in Integer)) && (all f: one Field | one (f . value))) && (all r: one Row | (#({ f1: one (r . RowFields) | (#({ f2: one (r . RowFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((r . RowFields))) }) = #((r . RowFields))))) && (all c: one Column | (#({ f1: one (c . ColumnFields) | (#({ f2: one (c . ColumnFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((c . ColumnFields))) }) = #((c . ColumnFields))))) && (all s: one Square | (#({ f1: one (s . SquareFields) | (#({ f2: one (s . SquareFields) | (!(f1 = f2) => !((f1 . value) = (f2 . value))) }) = #((s . SquareFields))) }) = #((s . SquareFields))))) +---OUTCOME--- +SATISFIABLE + +---INSTANCE--- +relations: {Board=[[board]], + +value=[ + +[I_4], [I_3], [I_9], [I_8], [I_2], [I_5], [I_7], [I_1], [I_6], +[I_2], [I_5], [I_7], [I_6], [I_1], [I_3], [I_4], [I_8], [I_9], +[I_1], [I_6], [I_8], [I_7], [I_4], [I_9], [I_2], [I_3], [I_5], +[I_3], [I_2], [I_1], [I_5], [I_9], [I_7], [I_6], [I_4], [I_8], +[I_7], [I_9], [I_4], [I_2], [I_8], [I_6], [I_1], [I_5], [I_3], +[I_5], [I_8], [I_6], [I_4], [I_3], [I_1], [I_9], [I_7], [I_2], +[I_9], [I_4], [I_3], [I_1], [I_6], [I_8], [I_5], [I_2], [I_7], +[I_8], [I_7], [I_2], [I_9], [I_5], [I_4], [I_3], [I_6], [I_1], +[I_6], [I_1], [I_5], [I_3], [I_7], [I_2], [I_8], [I_9], [I_4]], + + +Integer=[[I_1], [I_2], [I_3], [I_4], [I_5], [I_6], [I_7], [I_8], [I_9]], Row=[[Row1], [Row2], [Row3], [Row4], [Row5], [Row6], [Row7], [Row8], [Row9]], Column=[[Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9]], Square=[[Square1], [Square2], [Square3], [Square4], [Square5], [Square6], [Square7], [Square8], [Square9]], Field=[[[[[[[[[[[Field10], [Field11], [Field12], [Field13], [Field14], [Field15], [Field16], [Field17], [Field18], [Field19], [Field20], [Field21], [Field22], [Field23], [Field24], [Field25], [Field26], [Field27], [Field28], [Field29], [Field30], [Field31], [Field32], [Field33], [Field34], [Field35], [Field36], [Field37], [Field38], [Field39], [Field40], [Field41], [Field42], [Field43], [Field44], [Field45], [Field46], [Field47], [Field48], [Field49], [Field50], [Field51], [Field52], [Field53], [Field54], [Field55], [Field56], [Field57], [Field58], [Field59], [Field60], [Field61], [Field62], [Field63], [Field64], [Field65], [Field66], [Field67], [Field68], [Field69], [Field70], [Field71], [Field72], [Field73], [Field74], [Field75], [Field76], [Field77], [Field78], [Field79], [Field80], [Field81]], BoardRows=[[board, Row1], [board, Row2], [board, Row3], [board, Row4], [board, Row5], [board, Row6], [board, Row7], [board, Row8], [board, Row9]], BoardColumns=[[board, Column1], [board, Column2], [board, Column3], [board, Column4], [board, Column5], [board, Column6], [board, Column7], [board, Column8], [board, Column9]], BoardSquares=[[board, Square1], [board, Square2], [board, Square3], [board, Square4], [board, Square5], [board, Square6], [board, Square7], [board, Square8], [board, Square9]], BoardFields=[[board, [board, [board, [board, [board, [board, [board, [board, [board, [board, Field10], [board, Field11], [board, Field12], [board, Field13], [board, Field14], [board, Field15], [board, Field16], [board, Field17], [board, Field18], [board, Field19], [board, Field20], [board, Field21], [board, Field22], [board, Field23], [board, Field24], [board, Field25], [board, Field26], [board, Field27], [board, Field28], [board, Field29], [board, Field30], [board, Field31], [board, Field32], [board, Field33], [board, Field34], [board, Field35], [board, Field36], [board, Field37], [board, Field38], [board, Field39], [board, Field40], [board, Field41], [board, Field42], [board, Field43], [board, Field44], [board, Field45], [board, Field46], [board, Field47], [board, Field48], [board, Field49], [board, Field50], [board, Field51], [board, Field52], [board, Field53], [board, Field54], [board, Field55], [board, Field56], [board, Field57], [board, Field58], [board, Field59], [board, Field60], [board, Field61], [board, Field62], [board, Field63], [board, Field64], [board, Field65], [board, Field66], [board, Field67], [board, Field68], [board, Field69], [board, Field70], [board, Field71], [board, Field72], [board, Field73], [board, Field74], [board, Field75], [board, Field76], [board, Field77], [board, Field78], [board, Field79], [board, Field80], [board, Field81]], ColumnFields=[[Column1, [Column1, Field10], [Column1, Field19], [Column1, Field28], [Column1, Field37], [Column1, Field46], [Column1, Field55], [Column1, Field64], [Column1, Field73], [Column2, [Column2, Field11], [Column2, Field20], [Column2, Field29], [Column2, Field38], [Column2, Field47], [Column2, Field56], [Column2, Field65], [Column2, Field74], [Column3, [Column3, Field12], [Column3, Field21], [Column3, Field30], [Column3, Field39], [Column3, Field48], [Column3, Field57], [Column3, Field66], [Column3, Field75], [Column4, [Column4, Field13], [Column4, Field22], [Column4, Field31], [Column4, Field40], [Column4, Field49], [Column4, Field58], [Column4, Field67], [Column4, Field76], [Column5, [Column5, Field14], [Column5, Field23], [Column5, Field32], [Column5, Field41], [Column5, Field50], [Column5, Field59], [Column5, Field68], [Column5, Field77], [Column6, [Column6, Field15], [Column6, Field24], [Column6, Field33], [Column6, Field42], [Column6, Field51], [Column6, Field60], [Column6, Field69], [Column6, Field78], [Column7, [Column7, Field16], [Column7, Field25], [Column7, Field34], [Column7, Field43], [Column7, Field52], [Column7, Field61], [Column7, Field70], [Column7, Field79], [Column8, [Column8, Field17], [Column8, Field26], [Column8, Field35], [Column8, Field44], [Column8, Field53], [Column8, Field62], [Column8, Field71], [Column8, Field80], [Column9, [Column9, Field18], [Column9, Field27], [Column9, Field36], [Column9, Field45], [Column9, Field54], [Column9, Field63], [Column9, Field72], [Column9, Field81]], RowFields=[[Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row1, [Row2, Field10], [Row2, Field11], [Row2, Field12], [Row2, Field13], [Row2, Field14], [Row2, Field15], [Row2, Field16], [Row2, Field17], [Row2, Field18], [Row3, Field19], [Row3, Field20], [Row3, Field21], [Row3, Field22], [Row3, Field23], [Row3, Field24], [Row3, Field25], [Row3, Field26], [Row3, Field27], [Row4, Field28], [Row4, Field29], [Row4, Field30], [Row4, Field31], [Row4, Field32], [Row4, Field33], [Row4, Field34], [Row4, Field35], [Row4, Field36], [Row5, Field37], [Row5, Field38], [Row5, Field39], [Row5, Field40], [Row5, Field41], [Row5, Field42], [Row5, Field43], [Row5, Field44], [Row5, Field45], [Row6, Field46], [Row6, Field47], [Row6, Field48], [Row6, Field49], [Row6, Field50], [Row6, Field51], [Row6, Field52], [Row6, Field53], [Row6, Field54], [Row7, Field55], [Row7, Field56], [Row7, Field57], [Row7, Field58], [Row7, Field59], [Row7, Field60], [Row7, Field61], [Row7, Field62], [Row7, Field63], [Row8, Field64], [Row8, Field65], [Row8, Field66], [Row8, Field67], [Row8, Field68], [Row8, Field69], [Row8, Field70], [Row8, Field71], [Row8, Field72], [Row9, Field73], [Row9, Field74], [Row9, Field75], [Row9, Field76], [Row9, Field77], [Row9, Field78], [Row9, Field79], [Row9, Field80], [Row9, Field81]], SquareFields=[[Square1, [Square1, [Square1, [Square1, Field10], [Square1, Field11], [Square1, Field12], [Square1, Field19], [Square1, Field20], [Square1, Field21], [Square2, [Square2, [Square2, [Square2, Field13], [Square2, Field14], [Square2, Field15], [Square2, Field22], [Square2, Field23], [Square2, Field24], [Square3, [Square3, [Square3, [Square3, Field16], [Square3, Field17], [Square3, Field18], [Square3, Field25], [Square3, Field26], [Square3, Field27], [Square4, Field28], [Square4, Field29], [Square4, Field30], [Square4, Field37], [Square4, Field38], [Square4, Field39], [Square4, Field46], [Square4, Field47], [Square4, Field48], [Square5, Field31], [Square5, Field32], [Square5, Field33], [Square5, Field40], [Square5, Field41], [Square5, Field42], [Square5, Field49], [Square5, Field50], [Square5, Field51], [Square6, Field34], [Square6, Field35], [Square6, Field36], [Square6, Field43], [Square6, Field44], [Square6, Field45], [Square6, Field52], [Square6, Field53], [Square6, Field54], [Square7, Field55], [Square7, Field56], [Square7, Field57], [Square7, Field64], [Square7, Field65], [Square7, Field66], [Square7, Field73], [Square7, Field74], [Square7, Field75], [Square8, Field58], [Square8, Field59], [Square8, Field60], [Square8, Field67], [Square8, Field68], [Square8, Field69], [Square8, Field76], [Square8, Field77], [Square8, Field78], [Square9, Field61], [Square9, Field62], [Square9, Field63], [Square9, Field70], [Square9, Field71], [Square9, Field72], [Square9, Field79], [Square9, Field80], [Square9, Field81]]} + + +ints: [] + +---STATS--- +p cnf 227878 858581 +primary variables: 13892 +translation time: 27097 ms +solving time: 827 ms diff --git a/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt b/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt new file mode 100644 index 000000000..9dda14dc6 --- /dev/null +++ b/use-core/src/main/resources/examples/Others/SwapLinks/Info.txt @@ -0,0 +1,23 @@ +This model contains two classes A and B with +associations R1 and R2 between them. +The operation swap_b swaps the two R1 and R2 links +for an A object. The expected state resulting from the +operation is asserted by a postcondition. +The command file uses features introduced in +USE 2.1.0: note the expressions in the insert and +delete commands, and the new let command. + +SwapLinks.use: +two classes A (with one Operation) and B +two associations between A and B +one object of type A has to be connected with +exactly one object of type B for each association +pre- and postconditions for the operation + +SwapLinks.cmd: +two objects of type B and one Object a of type A +are created +a is connected with the other objects +with two links from the different associations +then the operation is called and the objects +swap (let is used) diff --git a/use-core/src/main/resources/examples/Others/Test/Info.txt b/use-core/src/main/resources/examples/Others/Test/Info.txt new file mode 100644 index 000000000..0df235d4e --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Test/Info.txt @@ -0,0 +1,6 @@ +This test file was automatically generated. +It contains 50 classes and 2450 (= 50 * 49) +associations connecting each class with each other. + +Test.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Others/Tree/Info.txt b/use-core/src/main/resources/examples/Others/Tree/Info.txt new file mode 100644 index 000000000..3bacd629a --- /dev/null +++ b/use-core/src/main/resources/examples/Others/Tree/Info.txt @@ -0,0 +1,35 @@ +Trees can be created with this model. +There is a class, which represents the nodes of a tree. +A link of the association Parentship can be created +between two nodes. +A parent may have several children +but only one parent or no parent, +if it is the root node. + +Tree.use: +one class TreeNode +one association Parantship +one invariant (does not allow cycles) +four complex operations: + - childPlus1 (recursive) returns all objects + the calling object is connected with (transitive). + The union of sets, collect and flatten is used. + Does not terminate if there are cycles in the graph. + - childPlus2 like childPlus2; it uses the operation + childPlusOnNodeSet + - childPlusOnNodeSet (recursive) collects all + objects the objects in the set (argument) + are connected with (transitive) and checks for all + elements if all directly connected children are + also element of the set (termination condition). + With this check, cycles are no problem. + - childPlus3 can handle cycles + because the search depth equals the maximum depth + of the tree. + +Tree.cmd: +creates a graph with cycles + +Tree2.cmd: +creates a graph with two nodes +the invariant evaluates to false diff --git a/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt b/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt new file mode 100644 index 000000000..fca777a9c --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/1998/RichtersAndGogolla/Info.txt @@ -0,0 +1,22 @@ +An example with generalization. There are +vehicles (abstract class) and cars resp. motorcycles +(subclasses). +Vehicles belong to companies, which +have a branch RentalStation (aggregation). +Persons work for rental stations or manage them. + +The example corresponds to the paper: +Mark Richters and Martin Gogolla, +"On Formalizing the UML Object Constraint Language OCL", +Figure 1 + +CarRental.use: +six classes Company, RentalStation, Person, +Vehicle (abstract class), Car, Motorcycle +with generalization +attributes and queries +four associations Owns, hasBranch (aggregation), +managedBy, WorksFor and some explicit role names + +CarRental.cmd: +empty diff --git a/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt b/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt new file mode 100644 index 000000000..204b8f288 --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/1998/WarmerAndKleppe/Info.txt @@ -0,0 +1,12 @@ +Modeled after an example taken from: +Jos Warmer and Anneke Kleppe, +"The Object Constraint Language: +Precise Modeling with UML", Addison-Wesley, 1998. (p. 12) + +RoyalAndLoyal.use: +several classes and attributes +no operations and constraints +several associations + +RoyalAndLoyal.cmd: +empty diff --git a/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt b/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt new file mode 100644 index 000000000..c2f26661d --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/1999/RichtersAndGogolla/Info.txt @@ -0,0 +1,12 @@ +This example corresponds to Fig. 4 Metamodel +for OCL Types in "A Metamodel for OCL" + +see also: Phd thesis of Mark Richters +Figure 6.5 + +OCLmetamodel.use: +contains a class with generalization and associations +for each OCL type + +OCLmetamodel.cmd: +empty \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt new file mode 100644 index 000000000..4c4fe17f2 --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/EmployeeExtended/Info.txt @@ -0,0 +1,23 @@ +This example corresponds to +the case study of Mark Richters in his PhD Thesis: +"A Precise Approach to Validating UML Models and OCL +Constraints" + +EmployeeExtended.use: +Classes from /Others/Ex/Ex.use +Person renamed into Employee +Employee extended by attribute age : Integer +Employee extended by operation raiseSalary from +/Documentation/Employee.use +Invariants from /Others/Ex/Ex.use +Constraint for raiseSalary from Employee, extended +by the postcondition amount > 0 and changed +from rate to amount + +EmployeeExtended.cmd: +==EmployeeExtended0.cmd,EmployeeExtended1.cmd, +EmployeeExtended2.cmd,EmployeeExtended3.cmd, +EmployeeExtended4.cmd,EmployeeExtendedRaiseSalary.cmd + +Builds up on /Others/Ex/Ex.cmd and is extended +by an operation call from /Documentation/Employee.cmd diff --git a/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt new file mode 100644 index 000000000..f22774d85 --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/2001/RichtersPhDThesis/NestedOperationCalls/Info.txt @@ -0,0 +1 @@ +copy of /Documentation/NestedOperationCalls \ No newline at end of file diff --git a/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt b/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt new file mode 100644 index 000000000..51c540a5f --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/2005/GogollaBohlingRichters/info.txt @@ -0,0 +1,39 @@ +bossBossBetterPaidThanWorker.invs bossBoss better paid than worker invariant +companyHasEmployee.invs company has employee invariant +hierarchyBinTree.ins hierarchy is binary tree (worker size =0 or =2) +jobsAtMost.invs person has at most 2 jobs invariant +percom-1.cmd 7 persons, 1 company, 7 jobs, 6 BossWorker +percom-130.cmd 10 persons, 26 company, 130 jobs, 120 BossWorker +percom-2.cmd 4 persons, 1 company, 4 jobs, 3 BossWorker +percom-3.cmd twoRoleTC (2 persons, 3 company, 6 jobs, 4 BossWorker) +percom-3b.cmd 3 persons, 2 company, 5 jobs, 3 BossWorker +percom-3c.cmd 2 persons, 3 company, 2 jobs, 2 BossWorker +percom-3d.cmd 26 persons, 7 company, 182 jobs, 175 BossWorker / no success +percom-3e.cmd 26 persons, 4 company, 28 jobs, 24 BossWorker +percom-4.cmd 4 persons, 3 company, 8 jobs, 5 BossWorker +percom-5.cmd twoBossesTC (7 persons, 1 company, 7 jobs, 6 BossWorker) +percom-5b.cmd 7 persons, 1 company, 7 jobs, genBW2 +percom-5c.cmd 8 persons, 1 company, 8 jobs, 7 BossWorker +percom-6.cmd genPersons versus genPersonsNaive +percom-7.cmd bossBossVC (3 persons, 1 company, 3 jobs, bB better paid) +percom-8.cmd generatePersonWith2Jobs[0|1]Companies +percom-9.cmd generatePersonWith3Jobs[0|1|2]Companies +percom-10.cmd generate binary tree hierarchy +percom-10-X.cmd generated by 10.cmd (7P,1C,7J,6BW) +percom-10-X.olt layout for percom-10-X.cmd +percom-11.cmd attempt to automatically calculate reject from invs +percom-12.cmd realistic snapshot (15P, 3C, 18J, 15BW) +percom-13.cmd chain snapshot (7P, 1C, 7J, 6BW) +percom-14.cmd 'bohling' snapshot +percom.assl assl file +percom.use use file +personEmployeeInverseCompEmployer.invs invariant following from operation definition (VC ToDo) +personWith2JobsIn0Or1Company.invs invariant not satisfiable +personWith3JobsIn0Or1Or2Companies.invs invariant not satisfiable +threeLevelHierarchy.cmd three level hierarchy query +threeLevelHierarchy.invs three level hierarchy invariant +twoBossesWithDisjointWorkers.cmd two bosses with existing disjoint workers query +twoBossesWithDisjointWorkers.invs two bosses with existing disjoint workers invariant +twoBossesWithDisjointWorkers2.invs two bosses with 2 disjoint workers invariant +twoRoleEmployee.cmd two role employee query +twoRoleEmployee.invs two role employee invariant diff --git a/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt b/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt new file mode 100644 index 000000000..b868e9e4e --- /dev/null +++ b/use-core/src/main/resources/examples/Papers/2006/GogollaBuettnerRichters/sample_output.txt @@ -0,0 +1,10 @@ +Test suite 'CivilStatus' with 3 test cases +Executing test 1/3 `testSetUp'... success +Executing test 2/3 `uniqueNames'... success +Executing test 3/3 `excludeBigamie'... success + +Test suite 'CivilStatus' with 3 test cases +Executing test 1/3 `testSetUp'... success +Executing test 2/3 `uniqueNames'... success +Executing test 3/3 `excludeBigamie'... failure + Assertion failure in line 59. \ No newline at end of file diff --git a/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt b/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt new file mode 100644 index 000000000..bfe587999 --- /dev/null +++ b/use-core/src/main/resources/examples/generator/english/cycles/invariants.txt @@ -0,0 +1,8 @@ + +context Train + inv Chain_tooWeak: + self.waggon->select(w: Waggon | w.predecessor->isEmpty)->size = 1 + +context Waggon + inv NoCycles: + not self.transPredecessor()->includes(self) diff --git a/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt b/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt new file mode 100644 index 000000000..ac25c8cdb --- /dev/null +++ b/use-core/src/main/resources/examples/generator/english/predecessors/invariants.txt @@ -0,0 +1,9 @@ + +context Train + inv Chain_tooWeak: + self.waggon->select(w: Waggon | w.predecessor->isEmpty)->size = 1 + +context Waggon + inv PredecessorInSameTrain: + (not self.predecessor->isEmpty) implies + self.predecessor.train = self.train diff --git a/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt b/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt new file mode 100644 index 000000000..147ad8516 --- /dev/null +++ b/use-core/src/main/resources/examples/generator/german/schleifen/invarianten.txt @@ -0,0 +1,9 @@ + +context Zug + inv Kette_zuWeich: + self.waggon->select(w: Waggon | w.vorgaenger->isEmpty)->size = 1 + +context Waggon + inv KeineSchleife: + not self.transVorgaenger()->includes(self) + diff --git a/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt b/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt new file mode 100644 index 000000000..808b42c15 --- /dev/null +++ b/use-core/src/main/resources/examples/generator/german/vorgaenger/invarianten.txt @@ -0,0 +1,10 @@ + +context Zug + inv Kette_zuWeich: + self.waggon->select(w: Waggon | w.vorgaenger->isEmpty)->size = 1 + +context Waggon + inv VorgaengerImGleichenZug: + (not self.vorgaenger->isEmpty) implies + self.vorgaenger.zug = self.zug + diff --git a/use-core/src/main/resources/oclextensions/README-Distributions.txt b/use-core/src/main/resources/oclextensions/README-Distributions.txt new file mode 100644 index 000000000..deb454cb5 --- /dev/null +++ b/use-core/src/main/resources/oclextensions/README-Distributions.txt @@ -0,0 +1,18 @@ +File "Distributions.xml" contains an extension for USE Real numbers + +Given x, m, s: Real, then: + +x.pdf01() returns the distribution function PDF(x) of a Gaussian Distribution with mean=0 and sigma=1, N(0,1) + +x.pdf(m,s) returns the distribution function PDF(x) of a N(m,s) + +x.cdf01() returns the CUMMULATIVE distribution function CDF(x) of a Gaussian + Distribution with mean=0 and sigma=1, N(0,1) + +x.cdf(m,s) returns the CUMMULATIVE distribution function CDF(x) of a N(m,s) + +x.normalDistr(y) returns a value of a Normal (Gaussian) distribution of mean x and sigma y, N(x,y). + For example 0.normalDistr(1) returns the value of N(0,1) + +Finally, x.expDistr() returns a value of an exponential distribution of mean x (or 0.0 if x==0.0) + diff --git a/use-core/src/main/resources/oclextensions/README-Random.txt b/use-core/src/main/resources/oclextensions/README-Random.txt new file mode 100644 index 000000000..9fd0dd42f --- /dev/null +++ b/use-core/src/main/resources/oclextensions/README-Random.txt @@ -0,0 +1,63 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +RANDOM Numbers + + + + + + + + + + + + 0 + return Random.srand($self) %1000000 + else + return Random.srand() % 10000000 + end + ]]> + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +EXAMPLES OF USE + +use> ?1.rand() +-> 0.09152860811512553 : Real +use> ?2.rand() +-> 1.8371397364794912 : Real +use> ?2.rand() +-> 0.6646401472302712 : Real +use> ?2.rand() +-> 1.5417649510780334 : Real +use> ?2.rand() +-> 0.990212333639167 : Real +use> ?2.rand() +-> 1.676070756281957 : Real +use> ?2.rand() +-> 1.835645464118648 : Real +use> ?1.srand() +-> 32783 : Integer +use> ?1.srand() +-> 1 : Integer +use> ?0.srand() +-> 1 : Integer +use> ?0.srand() +-> 2297549 : Integer +use> ?0.srand() +-> 3220924 : Integer +use> ?0.srand() +-> 3666729 : Integer +use> \ No newline at end of file diff --git a/use-gui/TESTS_ObjectDiagram_MVP.md b/use-gui/TESTS_ObjectDiagram_MVP.md deleted file mode 100644 index 9234ae04a..000000000 --- a/use-gui/TESTS_ObjectDiagram_MVP.md +++ /dev/null @@ -1,47 +0,0 @@ -# Testfälle: NewObjectDiagram / Presenter (MVP) - -Diese Datei enthält 10 fokussierte Testfälle, die ausschließlich `NewObjectDiagram`, `NewObjectDiagramPresenterImpl` und die direkt beteiligten Komponenten (`NewObjectDiagramView`, `NewObjectDiagramModel`, `PlacementRepository`, `ContextMenuProvider`, `ApplicationController`) betreffen. - -Hinweis: Für die Log-Verifizierung werden Einträge im Verzeichnis `use_refactor_logs` erwartet (z. B. `%USERPROFILE%\use_refactor_logs\t01.log`). - -| Test-ID | Scope | Vorbedingung | Schritte | Erwartete Log-Einträge (Beispiele) | Verifikation | -|---|---|---|---|---|---| -| Test-01 | Presenter-Initialisierung | `NewObjectDiagramView.initDiagram()` wird aufgerufen | Öffne die Objektdiagram-View (View init) | `NewObjectDiagramPresenterImpl - constructed`
`NewObjectDiagram.setPresenter - presenter attached for test=...`
`LOGGER TEST` (ctor) | Alle drei Einträge erscheinen in `.log` | -| Test-02 | Create Object → Presenter → ApplicationController | Diagramm geöffnet | Erzeuge Objekt via View (z. B. Create A) | `onCreateObject called` (presenter)
Controller-spezifische Logs (z. B. create invocation) | Presenter-Log vorhanden und Controller-Aufruf sichtbar oder Objekt im Model vorhanden | -| Test-03 | Show Object Properties flow | Mind. ein Objekt vorhanden | Rechtsklick auf Objekt → Properties (oder Doppelklick) | `NewObjectDiagram - invoking presenter.onShowObjectProperties for object=...`
`onShowObjectProperties object=...`
`DefaultApplicationController.showObjectProperties - object=...` | Reihenfolge: Presenter → Controller; ObjectPropertiesView zeigt Objekt | -| Test-04 | Insert Link | Zwei Objekte (A,B) vorhanden | Insert Link via Context/Toolbar zwischen A und B | `onInsertLink association=... participants=2` | Link erscheint; Log zeigt participants=2 | -| Test-05 | Delete Link | Ein Link zwischen A und B existiert | Delete Link via Context/Toolbar | `onDeleteLink link=...` | Link ist entfernt; Log enthält `onDeleteLink` | -| Test-06 | Delete Objects (Multi) | Mehrere Objekte auswählbar | Wähle A,B → Delete objects | `onDeleteObjects count=2` | Objekte sind entfernt; Log zeigt count | -| Test-07 | Store / Restore Layout (PlacementRepository) | Nodes sind manuell positioniert | 1) Save layout → 2) Reset positions → 3) Restore layout | `onStoreLayout called`
`onRestoreLayout called version=...` | Nach Restore sind Positionen wiederhergestellt; Logs enthalten Store+Restore | -| Test-08 | Hide / Show Links & Objects | Links/Objects vorhanden | Hide links → Show all links → Hide objects (crop) | `onHideLinks count=...`
`onShowAllLinks called`
`onCropSelection count=...` | Visueller Status entspricht Aktionen; Logs enthalten counts | -| Test-09 | Highlight / Transition Events (EventBus) | System kann Events senden | 1) Trigger TransitionEvent (z. B. Attributänderung)
2) Trigger HighlightChangeEvent | `onTransition event source=...`
`onHighlightChange called event=...` | Presenter empfängt Events; Diagramm wird refreshed; Logs vorhanden | -| Test-10 | Full Reset / Refresh Flow | Diagramm in beliebigem Zustand | 1) Reset Diagram → 2) Refresh (z. B. SortChange) | `onResetDiagram called options=...`
`onRefreshRequested called`
`onStatusMessage: Diagram reset` | Diagramm ist zurückgesetzt; Status-Logs vorhanden | - ---- - -Kurze Ausführungs- und Prüf-Hinweise - -- Setze vor dem Start die Umgebungsvariable `TEST_NAME` oder übergebe sie beim Start, z. B. mit dem bereitgestellten Script: - -```powershell -Push-Location "C:\Users\ahmed\IdeaProjects\use\use-gui\src\main\resources\bin" -$env:TEST_NAME = 't01' -.\start_with_testlog.bat t01 > C:\temp\use_start_t01.txt 2>&1 -Pop-Location -``` - -- Live-Tail des Logs während Interaktion: - -```powershell -Get-Content -Path "$env:USERPROFILE\use_refactor_logs\t01.log" -Wait -Tail 20 -``` - -- Prüfe die erwarteten Log-Muster in der Datei `%USERPROFILE%\use_refactor_logs\.log` oder in der Working-Copy `...\bin\use_refactor_logs\.log`. - -Wenn du möchtest, kann ich jetzt: -- A) Für jeden Test ein kurzes PowerShell-Checkskript erzeugen, das die erwarteten Log-Patterns prüft (einfaches text-suchen), oder -- B) Die 10 Tests als separate `.md`-Files unter `use-gui/tests/` ablegen, oder -- C) Sofort Test-2..Test-10 Einträge in die Logs wie bei Test-1 schreiben. - -Antworte bitte mit `A`, `B` oder `C` (oder `Stop`). - diff --git a/use-gui/src/main/resources/images/_image_licenses.txt b/use-gui/src/main/resources/images/_image_licenses.txt new file mode 100644 index 000000000..0eba34437 --- /dev/null +++ b/use-gui/src/main/resources/images/_image_licenses.txt @@ -0,0 +1,20 @@ +Image sources and licenses: + +Image name | Author | License | Source +------------------------------------------------------------------------------------------------------------------------- +export_pdf.png | AMAZIGH Aneglus | GNU/GPL | http://findicons.com/icon/188108/stock_save_pdf?id=189458# +invariant-view.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +document-open.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 +document-print.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 +save.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 +undo.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 +redo.png | Silvestre Herrera | GNU/GPL | http://art.gnome.org/download/themes/icon/1100/ICON-DroplineNeu.tar.bz2 +line-chart.png | Oxygen Team | GNU/LGPL | http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-office-chart-line-icon.html +blue-chart-icon.png | Double-J Design | CC Attribution 3.0 | http://www.iconarchive.com/show/origami-colored-pencil-icons-by-double-j-design/blue-chart-icon.html +red-chart-icon.png | Double-J Design | CC Attribution 3.0 | http://www.iconarchive.com/show/origami-colored-pencil-icons-by-double-j-design/red-chart-icon.html +shape-align-left-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +shape-align-right-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +shape-align-center-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +shape-align-top-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +shape-align-middle-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons +shape-align-bottom-icon.png | Fatcow Web Hosting | CC Attribution 3.0 | http://www.fatcow.com/free-icons From 37596a3846de0f338ac6763ea1bd682377cef7b7 Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 9 Apr 2026 21:40:26 +0200 Subject: [PATCH 31/34] added original .gitignore back --- .gitignore | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0d379eafe --- /dev/null +++ b/.gitignore @@ -0,0 +1,119 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf +.idea/**/encodings.xml + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +.idea/artifacts +.idea/compiler.xml +.idea/jarRepositories.xml +.idea/modules.xml +.idea/*.iml +.idea/modules +*.iml +*.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# End of https://www.toptal.com/developers/gitignore/api/intellij + + +/use-core/target +/use-gui/target +/use-assembly/target + +**/.DS_Store From fa5835462850cbe54f9d36069bd97dadeb91722c Mon Sep 17 00:00:00 2001 From: ahmed Date: Thu, 9 Apr 2026 21:56:18 +0200 Subject: [PATCH 32/34] small javadoc and code adjustment --- .../diagrams/event/DiagramInputHandling.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java index a4d0e1257..2c9a2fdbb 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/event/DiagramInputHandling.java @@ -149,8 +149,10 @@ public void mousePressed(MouseEvent e) { // untouched). In any case this click may be used to // start dragging selected items. if (!(pickedObjectNode instanceof ResizeNode) && !fNodeSelection.isSelected(pickedObjectNode)) { + // clear selection fNodeSelection.clear(); fEdgeSelection.clear(); + // add this component as the only selected item fNodeSelection.add(pickedObjectNode); fDiagram.repaint(); } @@ -167,8 +169,10 @@ public void mousePressed(MouseEvent e) { fDragStart = e.getPoint(); } else if (pickedEdge != null) { if (!fEdgeSelection.isSelected(pickedEdge)) { + // clear selection fNodeSelection.clear(); fEdgeSelection.clear(); + // add this component as the only selected item fEdgeSelection.add(pickedEdge); fDiagram.repaint(); } @@ -310,9 +314,9 @@ public synchronized void mouseDragged(MouseEvent e) { } /** - * - * @param dx - * @param dy + * Resize the currently selected node(s) according to the pointer position. + * Only active when a ResizeNode was the initial drag handle. + * @param p current mouse position used to compute delta from fDragStart */ protected void resizeSelectedObjects(Point p) { // Just to be sure @@ -329,13 +333,15 @@ protected void resizeSelectedObjects(Point p) { resizeNode.setDraggedPosition(dx, dy); fDiagram.invalidateNode(theNode); fDragStart = p; - return; } } - + /** - * @param dx - * @param dy + * Move all selected objects by the given delta. + * Special-case: associated class/object nodes are not moved when multiple nodes are selected + * to avoid them being moved twice. + * @param dx horizontal delta to move selected nodes + * @param dy vertical delta to move selected nodes */ protected void moveSelectedObjects(int dx, int dy) { // move all selected components to new position, @@ -400,7 +406,7 @@ public void mouseMoved(MouseEvent e) { .showMessage("[x=" + e.getPoint().getX() + ", y=" + e.getPoint().getY() + "] ", BorderLayout.EAST); } - PlaceableNode targetNode = null; + PlaceableNode targetNode; for (PlaceableNode n : fNodeSelection) { targetNode = n.occupies(e.getX(), e.getY()) ? n : n.getRelatedNode(e.getX(), e.getY()); if (targetNode != null) { From 45c2dd4d79558ee045b166a3b130a7a9228e4c27 Mon Sep 17 00:00:00 2001 From: ahmed Date: Mon, 13 Apr 2026 23:49:25 +0200 Subject: [PATCH 33/34] Additional supporting refactorings based on Sonarqube Issues across objectDiagram and MVP-Pattern. Below a list with the most complex issues - S3776: High Cognitive Complexity of methods - S135: Methods should not have too many parameters - S1948: Fields in a Serializable class should be transient or serialzable - S1450: Private fields only used as local variables - S107: Cognitive Complexity follow-up (split of large methods) --- .../objectdiagram/ApplicationController.java | 1 - .../DefaultApplicationController.java | 12 +- .../DefaultContextMenuProvider.java | 732 +++++++----------- .../DefaultPlacementRepository.java | 114 +-- .../diagrams/objectdiagram/DiagramCanvas.java | 8 +- .../objectdiagram/NewObjectDiagram.java | 437 ++++------- .../objectdiagram/NewObjectDiagramModel.java | 1 - .../NewObjectDiagramPresenterImpl.java | 68 +- .../objectdiagram/NewObjectDiagramView.java | 92 ++- .../objectdiagram/ObjDiagramOptions.java | 11 +- .../objectdiagram/ObjectDiagramModel.java | 84 +- .../diagrams/objectdiagram/ObjectNode.java | 38 +- .../objectdiagram/PresenterFileLogger.java | 159 +--- .../PresenterFileLoggerTestMain.java | 3 +- .../objectdiagram/QualifierInputView.java | 121 +-- .../views/diagrams/objectdiagram/package.html | 7 +- .../objectselection/ObjectSelection.java | 591 ++++++-------- 17 files changed, 1098 insertions(+), 1381 deletions(-) diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java index 52dc60230..23c220fda 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ApplicationController.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Set; -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjDiagramOptions; /** * Boundary for executing application/system commands. diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java index 6fcc06fa0..d1c7f5823 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultApplicationController.java @@ -2,7 +2,6 @@ import org.tzi.use.gui.main.MainWindow; import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MClass; import org.tzi.use.uml.ocl.value.Value; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MObject; @@ -19,7 +18,6 @@ import java.util.Set; import org.tzi.use.gui.views.ObjectPropertiesView; -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjDiagramOptions; /** * Default bridge to execute domain commands against the USE system. @@ -29,6 +27,10 @@ class DefaultApplicationController implements ApplicationController { private final MainWindow mainWindow; private final MSystem system; private final DiagramContext diagramContext; + /** + * Dialog title used for error dialogs. Extracted to avoid duplicated string literal (Sonar S1192). + */ + private static final String DLG_TITLE_ERROR = "Error"; DefaultApplicationController(MainWindow mainWindow, MSystem system, DiagramContext diagramContext) { this.mainWindow = mainWindow; @@ -54,7 +56,7 @@ public void insertLink(MAssociation association, List participants) { try { system.execute(new MLinkInsertionStatement(association, objects, Collections.>emptyList())); } catch (MSystemException e) { - JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); } } @@ -63,7 +65,7 @@ public void deleteLink(MLink link) { try { system.execute(new MLinkDeletionStatement(link)); } catch (MSystemException e) { - JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); } } @@ -79,7 +81,7 @@ public void deleteObjects(Set objects) { try { system.execute(sequence.simplify()); } catch (MSystemException e) { - JOptionPane.showMessageDialog(mainWindow, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(mainWindow, e.getMessage(), DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index df5c2ab5c..f789d0bd7 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -6,7 +6,11 @@ import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; import org.tzi.use.gui.views.diagrams.util.MenuScroller; import org.tzi.use.gui.views.selection.objectselection.ObjectSelection; -import org.tzi.use.uml.mm.*; +import org.tzi.use.uml.mm.MAssociation; +import org.tzi.use.uml.mm.MAssociationEnd; +import org.tzi.use.uml.mm.MAssociationClassImpl; +import org.tzi.use.uml.mm.MClass; +import org.tzi.use.uml.mm.MNamedElementComparator; import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; import org.tzi.use.uml.sys.MLink; import org.tzi.use.uml.sys.MObject; @@ -22,6 +26,21 @@ import java.util.function.Supplier; public class DefaultContextMenuProvider implements ContextMenuProvider { + // common UI label constants to avoid duplicated string literals (Sonar S1192) + private static final String LABEL_HIDE = "Hide "; + private static final String LABEL_SHOW = "Show "; + private static final String LABEL_HIDE_ALL = "Hide all"; + private static final String LABEL_SHOW_ALL = "Show all"; + private static final String LABEL_CLASS_PREFIX = "Class "; + private static final String LABEL_LINKS_SUFFIX = " links"; + // link kind labels + private static final String KIND_DERIVED = "Derived links"; + private static final String KIND_ASSOCIATION_CLASS = "Association class links"; + private static final String KIND_NARY = "N-ary links"; + private static final String KIND_REFLEXIVE = "Reflexive links"; + private static final String KIND_BINARY = "Binary links"; + private static final String KIND_AGGREGATION = "Aggregation links"; + private static final String KIND_COMPOSITION = "Composition links"; @Override @@ -46,7 +65,6 @@ public void enhanceMenu(JPopupMenu popupMenu, } List baseItems = new ArrayList<>(Arrays.asList(popupMenu.getComponents())); - popupMenu.removeAll(); Set safeObjects = selectedObjects == null ? Set.of() : selectedObjects; @@ -105,7 +123,7 @@ && hasHiddenElements(newDiagram) if (hasSelectedLinks) { - addComponent(ordered, buildHideSelectedLinksItem(diagram, presenter, safeLinks)); + addComponent(ordered, buildHideSelectedLinksItem(presenter, safeLinks)); addComponent(ordered, buildCropSelectedLinksItem(diagram, presenter, safeLinks, safeAssocObjects)); @@ -141,47 +159,7 @@ && hasHiddenElements(newDiagram) addSeparator(ordered); - addComponent(ordered, extractOrFallback(baseItems, "Show attributes", () -> buildStatusItem("Show attributes", presenter))); - - addComponent(ordered, buildShowStatesToggle(diagram, presenter)); - - addComponent(ordered, extractOrFallback(baseItems, "Show association names", () -> buildStatusItem("Show association names", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Show role names", () -> buildStatusItem("Show role names", presenter))); - - addSeparator(ordered); - - addComponent(ordered, extractOrFallback(baseItems, "Align elements", () -> new JMenu("Align elements"))); - - addComponent(ordered, extractOrFallback(baseItems, "Anti-aliasing", () -> buildStatusItem("Anti-aliasing", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Show grid", () -> buildStatusItem("Show grid", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Grayscale view", () -> buildStatusItem("Grayscale view", presenter))); - - addSeparator(ordered); - - addComponent(ordered, extractOrFallback(baseItems, "Auto-Layout", () -> buildStatusItem("Auto-Layout", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Layouts", () -> new JMenu("Layouts"))); - - addComponent(ordered, extractOrFallback(baseItems, "Reset layout", () -> buildStatusItem("Reset layout", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Load layout...", () -> buildStatusItem("Load layout...", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Save layout...", () -> buildStatusItem("Save layout...", presenter))); - - if (diagram instanceof NewObjectDiagram newDiagram && newDiagram.getVisibleData() != null - - && newDiagram.getVisibleData().hasNodes()) { - - addSeparator(ordered); - - addComponent(ordered, extractOrFallback(baseItems, "Select all nodes", () -> buildStatusItem("Select all nodes", presenter))); - - addComponent(ordered, extractOrFallback(baseItems, "Select all edges", () -> buildStatusItem("Select all edges", presenter))); - - } + buildViewAndLayoutOptions(ordered, baseItems, diagram, presenter); ordered.stream().filter(Objects::nonNull).forEach(popupMenu::add); @@ -307,223 +285,45 @@ private List buildInsertItems(NewObjectDiagramPresenter presenter, Se } - Collection assocCollection = presenter.fetchAllAssociations(); + List associations = prepareAssociations(presenter); + List selList = prepareSelectedList(selectedObjects); - List associations = assocCollection == null ? new ArrayList<>() : new ArrayList<>(assocCollection); + if (selList.isEmpty() || associations.isEmpty()) { + return items; + } - associations.removeIf(Objects::isNull); + for (MAssociation assoc : associations) { + addInsertItemsForAssociation(assoc, selList, presenter, items); + } - associations.sort(Comparator.comparing( + return items; - MAssociation::name, + } + private List prepareAssociations(NewObjectDiagramPresenter presenter) { + Collection assocCollection = presenter.fetchAllAssociations(); + List associations = assocCollection == null ? new ArrayList<>() : new ArrayList<>(assocCollection); + associations.removeIf(Objects::isNull); + associations.sort(Comparator.comparing( + MAssociation::name, Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); + return associations; + } - if (selectedObjects == null || selectedObjects.isEmpty() || associations.isEmpty()) { - - return items; - + private List prepareSelectedList(Set selectedObjects) { + if (selectedObjects == null || selectedObjects.isEmpty()) { + return List.of(); } - List selList = new ArrayList<>(selectedObjects); - selList.removeIf(Objects::isNull); - selList.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); - - int m = selList.size(); - - if (m == 0) { - - return items; - - } - - for (MAssociation assoc : associations) { - - if (assoc == null || assoc.isReadOnly()) { - - continue; - - } - - List ends = assoc.associationEnds(); - - int n = ends == null ? 0 : ends.size(); - - if (n == 0) { - - continue; - - } - - Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); - - if (associationLinks == null) { - - associationLinks = List.of(); - - } - - int pow = 1; - - for (int i = 0; i < n; i++) { - - pow *= m; - - } - - for (int value = 0; value < pow; value++) { - - int[] digits = radixConversion(value, m, n); - - if (!isCompleteObjectCombination(digits, m)) { - - continue; - - } - - MObject[] tuple = new MObject[n]; - - MClass[] types = new MClass[n]; - - for (int idx = 0; idx < n; idx++) { - - tuple[idx] = selList.get(digits[idx]); - - types[idx] = tuple[idx].cls(); - - } - - if (!assoc.isAssignableFrom(types)) { - - continue; - - } - - StringBuilder joined = new StringBuilder(); - - for (int idx = 0; idx < tuple.length; idx++) { - - if (idx > 0) { - - joined.append(','); - - } - - joined.append(safeName(tuple[idx])); - - } - - List matchingLinks = new ArrayList<>(); - - for (MLink link : associationLinks) { - - List linkObjects = link.linkedObjects(); - - if (linkObjects == null || linkObjects.size() != tuple.length) { - - continue; - - } - - boolean sameTuple = true; - - for (int idx = 0; idx < tuple.length; idx++) { - - if (linkObjects.get(idx) != tuple[idx]) { - - sameTuple = false; - - break; - - } - - } - - if (sameTuple) { - - matchingLinks.add(link); - - } - - } - - if (matchingLinks.isEmpty()) { - - List tupleList = Arrays.asList(tuple.clone()); - - items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), - - ev -> presenter.onInsertLink(assoc, tupleList))); - - } else { - - for (MLink link : matchingLinks) { - - StringBuilder deleteLabel = new StringBuilder("delete ("); - - List> qualifiers = castQualifiers(link.getQualifier()); - - for (int idx = 0; idx < tuple.length; idx++) { - - if (idx > 0) { - - deleteLabel.append(','); - - } - - deleteLabel.append(safeName(tuple[idx])); - - if (qualifiers != null && idx < qualifiers.size()) { - - List qualifierForEnd = qualifiers.get(idx); - - if (qualifierForEnd != null && !qualifierForEnd.isEmpty()) { - - deleteLabel.append('{'); - - for (int q = 0; q < qualifierForEnd.size(); q++) { - - if (q > 0) { - - deleteLabel.append(','); - - } - - deleteLabel.append(qualifierForEnd.get(q)); - - } - - deleteLabel.append('}'); - - } - - } - - } - - deleteLabel.append(") from ").append(assoc.name()); - - items.add(buildMenuItem(deleteLabel.toString(), ev -> presenter.onDeleteLink(link))); - - } - - } - - } - - } - - return items; - + return selList; } private JMenuItem buildHideSelectedItem(NewObjectDiagramPresenter presenter, Set selectedObjects) { - return buildMenuItem("Hide " + describeSelection(selectedObjects), - - ev -> hideOrWarn(presenter, selectedObjects, objs -> presenter.onHideObjects(objs))); + return buildMenuItem(LABEL_HIDE + describeSelection(selectedObjects), + ev -> hideOrWarn(presenter, selectedObjects, presenter::onHideObjects)); } @@ -617,7 +417,7 @@ private JMenu buildHideObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDia for (MClass cls : classes) { - JMenu classMenu = new JMenu("Class " + cls.name()); + JMenu classMenu = new JMenu(LABEL_CLASS_PREFIX + cls.name()); MenuScroller.setScrollerFor(classMenu, 15, 125, 0, 0); @@ -625,7 +425,7 @@ private JMenu buildHideObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDia classObjects.sort(Comparator.comparing(this::safeName, String.CASE_INSENSITIVE_ORDER)); - JMenuItem hideClassAll = new JMenuItem("Hide all"); + JMenuItem hideClassAll = new JMenuItem(LABEL_HIDE_ALL); hideClassAll.addActionListener(ev -> presenter.onHideObjects(new LinkedHashSet<>(classObjects))); @@ -635,7 +435,7 @@ private JMenu buildHideObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDia for (MObject obj : classObjects) { - classMenu.add(buildMenuItem("Hide " + obj.name(), ev -> presenter.onHideObjects(Set.of(obj)))); + classMenu.add(buildMenuItem(LABEL_HIDE + obj.name(), ev -> presenter.onHideObjects(Set.of(obj)))); } @@ -667,7 +467,7 @@ private JMenu buildHideLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagr } - JMenuItem hideAllLinks = new JMenuItem("Hide all links"); + JMenuItem hideAllLinks = new JMenuItem(LABEL_HIDE_ALL + LABEL_LINKS_SUFFIX); hideAllLinks.setEnabled(!newDiagram.getVisibleData().getEdges().isEmpty()); @@ -687,16 +487,14 @@ private JMenu buildHideLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagr List assocLinks = entry.getValue(); - assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); + assocMenu.add(buildMenuItem(LABEL_HIDE_ALL, ev -> presenter.onHideLinks(assocLinks))); assocMenu.addSeparator(); assocLinks.sort(linkComparator()); for (MLink link : assocLinks) { - - assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); - + assocMenu.add(buildMenuItem(LABEL_HIDE + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); } menu.add(assocMenu); @@ -727,7 +525,7 @@ private JMenu buildShowLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagr } - JMenuItem showAllLinks = new JMenuItem("Show all links"); + JMenuItem showAllLinks = new JMenuItem(LABEL_SHOW_ALL + LABEL_LINKS_SUFFIX); showAllLinks.setEnabled(!newDiagram.getHiddenData().getEdges().isEmpty()); @@ -747,16 +545,14 @@ private JMenu buildShowLinksMenu(ObjectDiagramInteractor diagram, NewObjectDiagr List assocLinks = entry.getValue(); - assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); + assocMenu.add(buildMenuItem(LABEL_SHOW_ALL, ev -> presenter.onShowLinks(assocLinks))); assocMenu.addSeparator(); assocLinks.sort(linkComparator()); for (MLink link : assocLinks) { - - assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); - + assocMenu.add(buildMenuItem(LABEL_SHOW + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); } menu.add(assocMenu); @@ -789,7 +585,7 @@ private JMenu buildShowObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDia } - JMenuItem showAllObjects = new JMenuItem("Show all hidden objects"); + JMenuItem showAllObjects = new JMenuItem(LABEL_SHOW_ALL + " hidden objects"); showAllObjects.setEnabled(true); @@ -811,27 +607,17 @@ private JMenu buildShowObjectsMenu(ObjectDiagramInteractor diagram, NewObjectDia MObject obj = node.object(); - if (!classMenus.containsKey(cls)) { - - JMenu subm = new JMenu("Class " + cls.name()); - + JMenu parent = classMenus.computeIfAbsent(cls, k -> { + JMenu subm = new JMenu(LABEL_CLASS_PREFIX + k.name()); MenuScroller.setScrollerFor(subm, 15, 125, 0, 0); - - classMenus.put(cls, subm); - - JMenuItem showAll = new JMenuItem("Show all"); - + JMenuItem showAll = new JMenuItem(LABEL_SHOW_ALL); showAll.addActionListener(e -> presenter.onShowHiddenElements()); - subm.add(showAll); - subm.addSeparator(); + return subm; + }); - } - - JMenu parent = classMenus.get(cls); - - parent.add(buildMenuItem("Show " + obj.name(), ev -> presenter.onShowHiddenElements())); + parent.add(buildMenuItem(LABEL_SHOW + obj.name(), ev -> presenter.onShowHiddenElements())); } @@ -909,9 +695,7 @@ public void addSelectionObjectView() { } - private JMenuItem buildHideSelectedLinksItem(ObjectDiagramInteractor diagram, - - NewObjectDiagramPresenter presenter, + private JMenuItem buildHideSelectedLinksItem(NewObjectDiagramPresenter presenter, Set selectedLinks) { @@ -923,9 +707,9 @@ private JMenuItem buildHideSelectedLinksItem(ObjectDiagramInteractor diagram, } - String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + LABEL_LINKS_SUFFIX; - return buildMenuItem("Hide " + label, ev -> presenter.onHideLinks(links)); + return buildMenuItem(LABEL_HIDE + label, ev -> presenter.onHideLinks(links)); } @@ -945,7 +729,7 @@ private JMenuItem buildCropSelectedLinksItem(ObjectDiagramInteractor diagram, } - String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + " links"; + String label = links.size() == 1 ? formatLinkName(links.getFirst()) : links.size() + LABEL_LINKS_SUFFIX; Set keepObjects = selectedAssocObjects == null ? Set.of() : new LinkedHashSet<>(selectedAssocObjects); @@ -1018,75 +802,10 @@ private JMenu buildLinksByKindMenu(ObjectDiagramInteractor diagram, NewObjectDia MenuScroller.setScrollerFor(menu, 15, 125, 0, 0); List allLinks = grouped.values().stream().flatMap(Collection::stream).distinct().toList(); - - int linkState = newDiagram.isHidden(allLinks); - - if (linkState == 1 || linkState == 2) { - - menu.add(buildMenuItem("Show all links", ev -> presenter.onShowAllLinks())); - - } - - if (linkState == 0 || linkState == 2) { - - menu.add(buildMenuItem("Hide all links", ev -> presenter.onHideAllLinks())); - - } - + addGlobalLinksShowHide(menu, newDiagram, presenter, allLinks); menu.addSeparator(); - for (Map.Entry> entry : grouped.entrySet()) { - - List links = entry.getValue(); - - if (links == null || links.isEmpty()) { - - continue; - - } - - JMenu assocMenu = new JMenu(entry.getKey()); - - MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); - - List assocLinks = new ArrayList<>(links); - - int assocLinkState = newDiagram.isHidden(assocLinks); - - if (assocLinkState == 1 || assocLinkState == 2) { - - assocMenu.add(buildMenuItem("Show all", ev -> presenter.onShowLinks(assocLinks))); - - } - - if (assocLinkState == 0 || assocLinkState == 2) { - - assocMenu.add(buildMenuItem("Hide all", ev -> presenter.onHideLinks(assocLinks))); - - } - - assocMenu.addSeparator(); - - List sortedLinks = new ArrayList<>(links); - - sortedLinks.sort(linkComparator()); - - for (MLink link : sortedLinks) { - - if (newDiagram.isHidden(link)) { - - assocMenu.add(buildMenuItem("Show " + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); - - } else { - - assocMenu.add(buildMenuItem("Hide " + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); - - } - - } - - menu.add(assocMenu); - + addLinksByKindAssocMenu(menu, entry.getKey(), entry.getValue(), presenter, newDiagram); } return menu; @@ -1097,114 +816,201 @@ private TreeMap> mapLinksToKindOfAssociation(NewObjectDiagra TreeMap> assocs = new TreeMap<>(); - Collection associations = presenter.fetchAllAssociations(); - - if (associations == null) { - + List associations = prepareAssociations(presenter); + if (associations.isEmpty()) { return assocs; - } - - final String derrivedLinks = "Derived links"; - - final String associationClass = "Association class links"; - - final String nAryLinks = "N-ary links"; - - final String reflexivLinks = "Reflexive links"; - - final String binaryLinks = "Binary links"; - - final String aggregation = "Aggregation links"; - - final String compositon = "Composition links"; - for (MAssociation assoc : associations) { - - if (assoc == null) { - - continue; - - } - Set links = presenter.fetchLinksOfAssociation(assoc); - if (links == null || links.isEmpty()) { - continue; - } + for (MLink link : links) { + String kind = computeLinkKind(assoc, link); + if (kind != null) { + assocs.computeIfAbsent(kind, k -> new ArrayList<>()).add(link); + } + } + } - switch (assoc.aggregationKind()) { - - case 0: - - for (MLink link : links) { - - if (link.association().isDerived() || link.association().isUnion()) { - - assocs.computeIfAbsent(derrivedLinks, k -> new ArrayList<>()).add(link); - - } else if (link.association() instanceof MAssociationClassImpl) { - - assocs.computeIfAbsent(associationClass, k -> new ArrayList<>()).add(link); - - } else if (link.linkEnds().size() > 2) { - - assocs.computeIfAbsent(nAryLinks, k -> new ArrayList<>()).add(link); - - } else if (link.association().associatedClasses().size() == 1) { - - assocs.computeIfAbsent(reflexivLinks, k -> new ArrayList<>()).add(link); - - } else if (link.linkedObjects().size() == 2 - - && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { - - assocs.computeIfAbsent(binaryLinks, k -> new ArrayList<>()).add(link); - - } - - } - - break; - - case 1: + return assocs; - for (MLink link : links) { + } - assocs.computeIfAbsent(aggregation, k -> new ArrayList<>()).add(link); + // formatLinkLabel removed: unused helper removed to reduce noise - } + /** + * Helper to add insert items for a single association. Extracted from buildInsertItems to reduce complexity. + */ + private void addInsertItemsForAssociation(MAssociation assoc, + List selList, + NewObjectDiagramPresenter presenter, + List items) { + if (assoc == null || assoc.isReadOnly()) { + return; + } - break; + List ends = assoc.associationEnds(); + int n = ends == null ? 0 : ends.size(); + if (n == 0) { + return; + } - case 2: + Collection associationLinks = presenter.fetchLinksOfAssociation(assoc); + if (associationLinks == null) { + associationLinks = List.of(); + } - for (MLink link : links) { + int m = selList.size(); - assocs.computeIfAbsent(compositon, k -> new ArrayList<>()).add(link); + List tuples = computeValidTuples(m, n); + for (int[] digits : tuples) { + MObject[] tuple = new MObject[n]; + MClass[] types = new MClass[n]; + for (int idx = 0; idx < n; idx++) { + tuple[idx] = selList.get(digits[idx]); + types[idx] = tuple[idx].cls(); + } + if (!assoc.isAssignableFrom(types)) { + continue; + } + processTupleForAssociation(assoc, tuple, associationLinks, presenter, items); + } + } + private List computeValidTuples(int m, int n) { + List result = new ArrayList<>(); + if (m <= 0 || n <= 0) { + return result; + } + int pow = 1; + for (int i = 0; i < n; i++) { + pow *= m; + } + for (int value = 0; value < pow; value++) { + int[] digits = radixConversion(value, m, n); + if (isCompleteObjectCombination(digits, m)) { + result.add(digits); + } + } + return result; + } - } + private void processTupleForAssociation(MAssociation assoc, + MObject[] tuple, + Collection associationLinks, + NewObjectDiagramPresenter presenter, + List items) { + StringBuilder joined = new StringBuilder(); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + joined.append(','); + } + joined.append(safeName(tuple[idx])); + } - break; + List matchingLinks = findMatchingLinks(tuple, associationLinks); - default: + if (matchingLinks.isEmpty()) { + List tupleList = Arrays.asList(tuple.clone()); + items.add(buildMenuItem("insert (" + joined + ") into " + assoc.name(), ev -> presenter.onInsertLink(assoc, tupleList))); + } else { + for (MLink link : matchingLinks) { + String deleteLabel = buildDeleteLabel(tuple, castQualifiers(link.getQualifier()), assoc.name()); + items.add(buildMenuItem(deleteLabel, ev -> presenter.onDeleteLink(link))); + } + } + } + private List findMatchingLinks(MObject[] tuple, Collection associationLinks) { + List matchingLinks = new ArrayList<>(); + for (MLink link : associationLinks) { + List linkObjects = link.linkedObjects(); + if (linkObjects == null || linkObjects.size() != tuple.length) { + continue; + } + boolean sameTuple = true; + for (int idx = 0; idx < tuple.length; idx++) { + if (linkObjects.get(idx) != tuple[idx]) { + sameTuple = false; break; - + } + } + if (sameTuple) { + matchingLinks.add(link); } - } + return matchingLinks; + } - return assocs; - + private String buildDeleteLabel(MObject[] tuple, List> qualifiers, String assocName) { + StringBuilder deleteLabel = new StringBuilder("delete ("); + for (int idx = 0; idx < tuple.length; idx++) { + if (idx > 0) { + deleteLabel.append(','); + } + deleteLabel.append(safeName(tuple[idx])); + if (idx < qualifiers.size()) { + deleteLabel.append(formatQualifierList(qualifiers.get(idx))); + } + } + deleteLabel.append(") from ").append(assocName); + return deleteLabel.toString(); } - private String formatLinkLabel(String prefix, MLink link) { + private String formatQualifierList(List qualifierForEnd) { + if (qualifierForEnd == null || qualifierForEnd.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + sb.append('{'); + for (int q = 0; q < qualifierForEnd.size(); q++) { + if (q > 0) { + sb.append(','); + } + sb.append(qualifierForEnd.get(q)); + } + sb.append('}'); + return sb.toString(); + } - return prefix + " " + link.toString(); + /** + * Helper to build and add the submenu for a grouped association entry in the links-by-kind menu. + */ + private void addLinksByKindAssocMenu(JMenu parentMenu, String key, List links, NewObjectDiagramPresenter presenter, NewObjectDiagram newDiagram) { + if (links == null || links.isEmpty()) { + return; + } + JMenu assocMenu = new JMenu(key); + MenuScroller.setScrollerFor(assocMenu, 20, 125, 0, 0); + List assocLinks = new ArrayList<>(links); + int assocLinkState = newDiagram.isHidden(assocLinks); + if (assocLinkState == 1 || assocLinkState == 2) { + assocMenu.add(buildMenuItem(LABEL_SHOW_ALL, ev -> presenter.onShowLinks(assocLinks))); + } + if (assocLinkState == 0 || assocLinkState == 2) { + assocMenu.add(buildMenuItem(LABEL_HIDE_ALL, ev -> presenter.onHideLinks(assocLinks))); + } + assocMenu.addSeparator(); + List sortedLinks = new ArrayList<>(links); + sortedLinks.sort(linkComparator()); + for (MLink link : sortedLinks) { + if (newDiagram.isHidden(link)) { + assocMenu.add(buildMenuItem(LABEL_SHOW + formatLinkName(link), ev -> presenter.onShowLinks(List.of(link)))); + } else { + assocMenu.add(buildMenuItem(LABEL_HIDE + formatLinkName(link), ev -> presenter.onHideLinks(List.of(link)))); + } + } + parentMenu.add(assocMenu); + } + private void addGlobalLinksShowHide(JMenu menu, NewObjectDiagram newDiagram, NewObjectDiagramPresenter presenter, List allLinks) { + int linkState = newDiagram.isHidden(allLinks); + if (linkState == 1 || linkState == 2) { + menu.add(buildMenuItem(LABEL_SHOW_ALL + LABEL_LINKS_SUFFIX, ev -> presenter.onShowAllLinks())); + } + if (linkState == 0 || linkState == 2) { + menu.add(buildMenuItem(LABEL_HIDE_ALL + LABEL_LINKS_SUFFIX, ev -> presenter.onHideAllLinks())); + } } private String formatLinkName(MLink link) { @@ -1253,6 +1059,63 @@ private String formatLinkName(MLink link) { } + private void buildViewAndLayoutOptions(List ordered, List baseItems, ObjectDiagramInteractor diagram, NewObjectDiagramPresenter presenter) { + addComponent(ordered, extractOrFallback(baseItems, "Show attributes", () -> buildStatusItem("Show attributes", presenter))); + addComponent(ordered, buildShowStatesToggle(diagram, presenter)); + addComponent(ordered, extractOrFallback(baseItems, "Show association names", () -> buildStatusItem("Show association names", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show role names", () -> buildStatusItem("Show role names", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Align elements", () -> new JMenu("Align elements"))); + addComponent(ordered, extractOrFallback(baseItems, "Anti-aliasing", () -> buildStatusItem("Anti-aliasing", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Show grid", () -> buildStatusItem("Show grid", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Grayscale view", () -> buildStatusItem("Grayscale view", presenter))); + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Auto-Layout", () -> buildStatusItem("Auto-Layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Layouts", () -> new JMenu("Layouts"))); + addComponent(ordered, extractOrFallback(baseItems, "Reset layout", () -> buildStatusItem("Reset layout", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Load layout...", () -> buildStatusItem("Load layout...", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Save layout...", () -> buildStatusItem("Save layout...", presenter))); + if (diagram instanceof NewObjectDiagram newDiagram && newDiagram.getVisibleData() != null && newDiagram.getVisibleData().hasNodes()) { + addSeparator(ordered); + addComponent(ordered, extractOrFallback(baseItems, "Select all nodes", () -> buildStatusItem("Select all nodes", presenter))); + addComponent(ordered, extractOrFallback(baseItems, "Select all edges", () -> buildStatusItem("Select all edges", presenter))); + } + } + + private String computeLinkKind(MAssociation assoc, MLink link) { + if (assoc == null || link == null) { + return null; + } + + switch (assoc.aggregationKind()) { + case 0: + if (link.association().isDerived() || link.association().isUnion()) { + return KIND_DERIVED; + } + if (link.association() instanceof MAssociationClassImpl) { + return KIND_ASSOCIATION_CLASS; + } + if (link.linkEnds().size() > 2) { + return KIND_NARY; + } + if (link.association().associatedClasses().size() == 1) { + return KIND_REFLEXIVE; + } + if (link.linkedObjects().size() == 2 && !link.linkedObjects().get(0).equals(link.linkedObjects().get(1))) { + return KIND_BINARY; + } + break; + case 1: + return KIND_AGGREGATION; + case 2: + return KIND_COMPOSITION; + default: + break; + } + + return null; + } + private List collectUniqueLinks(Set edges) { List links = new ArrayList<>(); @@ -1512,21 +1375,16 @@ private int[] radixConversion(int value, int radix, int length) { private List> castQualifiers(List qualifiers) { if (qualifiers == null) { - - return null; - + // return empty list instead of null to simplify callers + return List.of(); } List> casted = new ArrayList<>(qualifiers.size()); for (Object qualifier : qualifiers) { - if (qualifier instanceof List list) { - casted.add(list); - } else { - casted.add(List.of()); } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java index 4d288cd72..c04d2e18c 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultPlacementRepository.java @@ -5,17 +5,12 @@ import com.ximpleware.XPathEvalException; import com.ximpleware.XPathParseException; import org.tzi.use.gui.util.PersistHelper; -import org.tzi.use.gui.views.diagrams.objectdiagram.ObjectNode; import org.tzi.use.gui.views.diagrams.elements.PlaceableNode; import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationClassOrObject; import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationOrLinkEdge; import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; -import org.tzi.use.gui.views.diagrams.elements.edges.NAryAssociationClassOrObjectEdge; import org.tzi.use.uml.mm.MAssociation; -import org.tzi.use.uml.mm.MClass; -import org.tzi.use.uml.mm.MNamedElementComparator; -import org.tzi.use.uml.mm.statemachines.MProtocolStateMachine; -import org.tzi.use.uml.ocl.value.Value; +// removed unused imports import org.tzi.use.uml.sys.*; import org.w3c.dom.Element; @@ -110,7 +105,7 @@ private void restoreNodeEdges(PersistHelper helper, int version, MSystem system, if (assoc != null && sourceObject != null && targetObject != null) { MLink link = resolveLink(helper, assoc, sourceObject, targetObject, system); - if (link != null && link instanceof MLinkObject linkObj) { + if (link instanceof MLinkObject linkObj) { EdgeBase tmp = visibleData.getLinkObjectToNodeEdge().get(linkObj); if (tmp instanceof BinaryAssociationClassOrObject edge) { edge.restorePlacementInfo(helper, version); @@ -129,6 +124,13 @@ private void restoreNodeEdges(PersistHelper helper, int version, MSystem system, private void restoreDiamondNodes(PersistHelper helper, int version, MSystem system, NewObjectDiagram.ObjectDiagramData visibleData, Set hiddenObjects) { + restoreObjectNodes(helper, version, system, visibleData, hiddenObjects); + restoreDiamondNodesForAssociations(helper, version, system, visibleData); + } + + private void restoreObjectNodes(PersistHelper helper, int version, MSystem system, + NewObjectDiagram.ObjectDiagramData visibleData, + Set hiddenObjects) { AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { @@ -152,34 +154,16 @@ private void restoreDiamondNodes(PersistHelper helper, int version, MSystem syst ap.resetXPath(); helper.getNav().pop(); } + } - ap = new AutoPilot(helper.getNav()); + private void restoreDiamondNodesForAssociations(PersistHelper helper, int version, MSystem system, + NewObjectDiagram.ObjectDiagramData visibleData) { + AutoPilot ap = new AutoPilot(helper.getNav()); helper.getNav().push(); try { ap.selectXPath("./node[@type='DiamondNode']"); while (ap.evalXPath() != -1) { - String name = helper.getElementStringValue("name"); - MAssociation assoc = system.model().getAssociation(name); - if (assoc == null) continue; - List connectedObjects = new LinkedList<>(); - if (!helper.toFirstChild("connectedNode")) continue; - String objectName = helper.getElementStringValue(); - MObject obj = system.state().objectByName(objectName); - if (obj != null) connectedObjects.add(obj); - while (helper.toNextSibling("connectedNode")) { - objectName = helper.getElementStringValue(); - obj = system.state().objectByName(objectName); - if (obj != null) connectedObjects.add(obj); - } - if (assoc.associationEnds().size() != connectedObjects.size()) continue; - MLink link = system.state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); - if (link != null) { - var node = visibleData.getNaryLinkToDiamondNodeMap().get(link); - if (node != null) { - helper.toParent(); - node.restorePlacementInfo(helper, version); - } - } + processDiamondNode(helper, version, system, visibleData); } } catch (XPathEvalException | NavException | XPathParseException e) { // ignore @@ -189,6 +173,38 @@ private void restoreDiamondNodes(PersistHelper helper, int version, MSystem syst } } + private void processDiamondNode(PersistHelper helper, int version, MSystem system, + NewObjectDiagram.ObjectDiagramData visibleData) { + String name = helper.getElementStringValue("name"); + MAssociation assoc = system.model().getAssociation(name); + // Only proceed if association exists and there is at least one connectedNode child + if (assoc == null || !helper.toFirstChild("connectedNode")) { + return; + } + + List connectedObjects = new LinkedList<>(); + // collect all connectedNode children + do { + String objectName = helper.getElementStringValue(); + MObject obj = system.state().objectByName(objectName); + if (obj != null) { + connectedObjects.add(obj); + } + } while (helper.toNextSibling("connectedNode")); + + // only restore if number of connected objects matches association arity + if (assoc.associationEnds().size() == connectedObjects.size()) { + MLink link = system.state().linkBetweenObjects(assoc, connectedObjects, Collections.emptyList()); + if (link != null) { + var node = visibleData.getNaryLinkToDiamondNodeMap().get(link); + if (node != null) { + helper.toParent(); + node.restorePlacementInfo(helper, version); + } + } + } + } + private MLink resolveLink(PersistHelper helper, MAssociation assoc, MObject source, MObject target, MSystem system) { if (assoc.hasQualifiedEnds()) { String linkValue = helper.getElementStringValue("linkValue"); @@ -210,22 +226,10 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l if (allLinks == null || allLinks.isEmpty()) { return null; } - List matchingLinks = new ArrayList<>(); - for (MLink l : allLinks) { - if (l == null) continue; - List linked = l.linkedObjects(); - if (linked == null || linked.size() != objects.size()) continue; - boolean sameObjects = true; - for (int i = 0; i < linked.size(); i++) { - if (!Objects.equals(linked.get(i), objects.get(i))) { - sameObjects = false; - break; - } - } - if (sameObjects) { - matchingLinks.add(l); - } - } + List matchingLinks = allLinks.stream() + .filter(Objects::nonNull) + .filter(l -> isMatchingLink(l, objects)) + .collect(java.util.stream.Collectors.toCollection(java.util.LinkedList::new)); if (matchingLinks.isEmpty()) { return null; } @@ -236,11 +240,11 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l return null; } for (MLink l : matchingLinks) { - if (l == null) continue; String s = null; try { s = l.toString(); } catch (Exception ignored) { + // toString may throw for certain link implementations; ignore and continue } if (Objects.equals(linkValue, s)) { return l; @@ -248,4 +252,20 @@ private MLink getLinkByValue(MAssociation assoc, List objects, String l } return null; } + + /** + * Helper: checks whether link's linkedObjects equal given objects (by position). + */ + private boolean isMatchingLink(MLink l, List objects) { + List linked = l.linkedObjects(); + if (linked == null || linked.size() != objects.size()) { + return false; + } + for (int i = 0; i < linked.size(); i++) { + if (!Objects.equals(linked.get(i), objects.get(i))) { + return false; + } + } + return true; + } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java index afce245f6..a80abec67 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DiagramCanvas.java @@ -2,18 +2,14 @@ import javax.swing.JComponent; import javax.swing.JPopupMenu; -import java.awt.Graphics; + /** * Placeholder canvas implementing the view interface. Rendering will be migrated later. */ public class DiagramCanvas extends JComponent implements NewObjectDiagramUI { - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - // actual rendering logic will be migrated from NewObjectDiagram - } + // Intentionally inherit default paintComponent implementation. @Override public void showPopup(JPopupMenu popup) { diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java index c21cfef2c..3bc120efc 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagram.java @@ -26,8 +26,7 @@ import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDropEvent; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +// removed unused ActionEvent import import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; @@ -36,7 +35,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Arrays; +import java.security.SecureRandom; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -45,8 +44,7 @@ import java.util.Set; import java.util.TreeMap; -import javax.swing.AbstractAction; -import javax.swing.Action; +// action helper classes were moved to context menu provider import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JComponent; @@ -58,7 +56,7 @@ import javax.swing.border.Border; import org.tzi.use.gui.main.MainWindow; -import org.tzi.use.gui.main.ModelBrowser; +// ModelBrowser is accessed via constructor parameter now import org.tzi.use.gui.main.ModelBrowserSorting; import org.tzi.use.gui.main.ModelBrowserSorting.SortChangeListener; import org.tzi.use.gui.util.PersistHelper; @@ -86,7 +84,7 @@ import org.tzi.use.uml.mm.MModelElement; import org.tzi.use.uml.ocl.value.Value; import org.tzi.use.uml.sys.*; -import org.tzi.use.util.StringUtil; +// StringUtil usages moved/removed with context-menu refactor import org.w3c.dom.Element; /** @@ -132,9 +130,9 @@ public ObjectDiagramData() { */ public boolean containsLink(MLink link) { boolean has = fBinaryLinkToEdgeMap.containsKey(link) || fNaryLinkToDiamondNodeMap.containsKey(link); - if (!has && link instanceof MLinkObject) { - has = fLinkObjectToNodeEdge.containsKey((MLinkObject) link); - } + if (!has && link instanceof MLinkObject ml) { + has = fLinkObjectToNodeEdge.containsKey(ml); + } return has; } @@ -210,33 +208,35 @@ public Map getLinkObjectToNodeEdge() { } } - private ObjectDiagramData visibleData = new ObjectDiagramData(); + private transient ObjectDiagramData visibleData = new ObjectDiagramData(); - private ObjectDiagramData hiddenData = new ObjectDiagramData(); + private transient ObjectDiagramData hiddenData = new ObjectDiagramData(); - private final DiagramContext context; - private final NewObjectDiagramView view; - private final ModelBrowser modelBrowser; - private NewObjectDiagramModel model; - private MSystem system; - private final java.util.function.BooleanSupplier isSelectedView; + private final transient DiagramContext context; + private final transient NewObjectDiagramView view; + private transient NewObjectDiagramModel model; + private transient MSystem system; + private final transient java.util.function.BooleanSupplier isSelectedView; /** * The position of the next object node. This is either set to a random * value or to a specific position when an object is created by drag & drop. */ - protected Point2D.Double nextNodePosition = new Point2D.Double(); + protected transient Point2D.Double nextNodePosition = new Point2D.Double(); // show object properties listener is attached inline in constructor (no field required) - private final ObjectSelection fSelection; + private final transient ObjectSelection fSelection; - protected final DiagramInputHandling inputHandling; + protected final transient DiagramInputHandling inputHandling; - private static boolean javaFxCall = false; + // JavaFX mode is tracked in MainWindow; delegate setter to central place. /** Presenter reference for incremental MVP refactor. */ - private NewObjectDiagramPresenter presenter; + private transient NewObjectDiagramPresenter presenter; + + /** Secure random used for non-security-sensitive random layout choices. Replaces ThreadLocalRandom to satisfy Sonar rule S2245. */ + private static final SecureRandom SECURE_RANDOM = new SecureRandom(); private MSystem system() { return system; @@ -269,7 +269,6 @@ protected NewObjectDiagram(DiagramContext parent, PrintWriter log, ObjDiagramOpt context = parent; view = (parent instanceof NewObjectDiagramView v) ? v : null; this.system = parent.system(); - this.modelBrowser = parent.getModelBrowser(); this.isSelectedView = parent::isSelectedView; this.model = new NewObjectDiagramModel(); rebindModelData(); @@ -284,7 +283,7 @@ protected NewObjectDiagram(DiagramContext parent, PrintWriter log, ObjDiagramOpt inputHandling = new DiagramInputHandling(fNodeSelection, fEdgeSelection, this); - modelBrowser.addHighlightChangeListener(this); + parent.getModelBrowser().addHighlightChangeListener(this); ModelBrowserSorting.getInstance().addSortChangeListener(this); addKeyListener(inputHandling); @@ -303,6 +302,7 @@ public void mouseClicked(MouseEvent e) { }); addComponentListener(new ComponentAdapter() { + @Override public void componentResized(ComponentEvent e) { // need a new layouter to adapt to new window size fLayouter = null; @@ -370,11 +370,11 @@ public void handleHighlightChange(HighlightChangeEvent e) { selectedLinks.addAll(links); } - if (elem instanceof MClass) { - Set objs = presenter != null ? presenter.fetchObjectsOfClass((MClass) elem) - : system().state().objectsOfClass((MClass) elem); - selectedObjects.addAll(objs); - } + if (elem instanceof MClass mclass) { + Set objs = presenter != null ? presenter.fetchObjectsOfClass(mclass) + : system().state().objectsOfClass(mclass); + selectedObjects.addAll(objs); + } if (!e.getHighlight()) { selectedObjects.clear(); @@ -483,34 +483,35 @@ public void showObject(MObject obj) { showOrHideObjectNode(obj, true); - boolean isLinkObject = false; + boolean isLinkObject = obj instanceof MLinkObject; Set assocs = obj.cls().allAssociations(); - if (obj instanceof MLinkObject) { + if (isLinkObject) { assocs.add((MAssociation) obj.cls()); - isLinkObject = true; } - // Show all links the object participates in, - // when all other objects are visible, too. for (MAssociation assoc : assocs) { - Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) - : system().state().linksOfAssociation(assoc).links(); - // TODO: Not very fast! - for (MLink link : links) { - if (link.linkedObjects().contains(obj) || (isLinkObject && link.equals(obj))) { - boolean allVisible = true; - for (MObject linkedO : link.linkedObjects()) { - if (!visibleData.getObjectToNodeMap().containsKey(linkedO)) { - allVisible = false; - break; - } - } + showLinksForAssociation(obj, assoc, isLinkObject); + } + } - if (allVisible && (!isLinkObject || visibleData.getObjectToNodeMap().containsKey(obj))) - showLink(link); + private void showLinksForAssociation(MObject obj, MAssociation assoc, boolean isLinkObject) { + Set links = presenter != null ? presenter.fetchLinksOfAssociation(assoc) + : system().state().linksOfAssociation(assoc).links(); + for (MLink link : links) { + if (!link.linkedObjects().contains(obj) && !(isLinkObject && link.equals(obj))) { + continue; + } + boolean allVisible = true; + for (MObject linkedO : link.linkedObjects()) { + if (!visibleData.getObjectToNodeMap().containsKey(linkedO)) { + allVisible = false; + break; } } + if (allVisible && (!isLinkObject || visibleData.getObjectToNodeMap().containsKey(obj))) { + showLink(link); + } } } @@ -632,12 +633,12 @@ protected void addNAryLink(MLink link) { fGraph.add(node); // connected to an "object link" - if (link instanceof MLinkObject) { + if (link instanceof MLinkObject ml) { NAryAssociationClassOrObjectEdge e = NAryAssociationClassOrObjectEdge.create(node, - visibleData.getObjectToNodeMap().get(link), this, link.association(), true); + visibleData.getObjectToNodeMap().get(ml), this, link.association(), true); fGraph.addEdge(e); - visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); + visibleData.getLinkObjectToNodeEdge().put(ml, e); fLayouter = null; } // connected to a "normal" link @@ -660,15 +661,15 @@ protected void addNAryLink(MLink link) { } // If there is an associated link-object edge, add it once (avoid duplicate map access) - { - EdgeBase linkObjEdge = null; - if (link instanceof MLinkObject) { - linkObjEdge = visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); - } - if (linkObjEdge != null) { - halfEdges.add(linkObjEdge); - edgeIds.add(((MLinkObject) link).name()); - } + EdgeBase linkObjEdge = null; + String linkObjName = null; + if (link instanceof MLinkObject ml) { + linkObjEdge = visibleData.getLinkObjectToNodeEdge().get(ml); + linkObjName = ml.name(); + } + if (linkObjEdge != null) { + halfEdges.add(linkObjEdge); + edgeIds.add(linkObjName); } node.setHalfEdges(halfEdges, edgeIds); @@ -686,8 +687,8 @@ public void showLink(MLink link) { if (visibleData.containsLink(link)) return; - if (link instanceof MLinkObject) { - showObject((MObject) link); + if (link instanceof MLinkObject ml) { + showObject(ml); } if (visibleData.containsLink(link)) @@ -720,8 +721,8 @@ public void hideLink(MLink link) { } // Hide Linkobject, if link has a linkobject - if (link instanceof MLinkObject && visibleData.getObjectToNodeMap().containsKey(link)) { - hideObject((MObject) link); + if (link instanceof MLinkObject ml && visibleData.getObjectToNodeMap().containsKey(ml)) { + hideObject(ml); } } @@ -779,25 +780,28 @@ protected void showOrHideNAryLink(MLink link, boolean show) { if (link instanceof MLinkObject ml) { EdgeBase e = model.moveLinkObjectEdge(ml, show); if (e != null) { - if (show) { - fGraph.addEdge(e); - } else { - fGraph.removeEdge(e); - } - fLayouter = null; + adjustGraphForEdge(e, show); } } List halfEdges = model.moveHalfEdges(link, show); if (halfEdges != null) { for (EdgeBase edge : halfEdges) { - if (show) { - fGraph.addEdge(edge); - } else { - fGraph.removeEdge(edge); - } + adjustGraphForEdge(edge, show); } } + } + + /** Small helper to add/remove an edge to the graph and mark layout dirty. */ + private void adjustGraphForEdge(EdgeBase e, boolean show) { + if (e == null) { + return; + } + if (show) { + fGraph.addEdge(e); + } else { + fGraph.removeEdge(e); + } fLayouter = null; } @@ -807,56 +811,67 @@ protected void showOrHideNAryLink(MLink link, boolean show) { @Override public void deleteLink(MLink link) { if (link.linkEnds().size() == 2) { - boolean wasVisible = visibleData.containsLink(link); - boolean isLinkObject = link instanceof MLinkObject; - - EdgeBase e = isLinkObject ? model.popLinkObjectEdge((MLinkObject) link) : model.popBinaryLink(link); - if (e == null) { - return; - } + deleteBinaryLinkInternal(link); + } else { + deleteNAryLinkInternal(link); + } + } - if (isLinkObject && e instanceof BinaryAssociationClassOrObject edge) { + private void deleteBinaryLinkInternal(MLink link) { + boolean wasVisible = visibleData.containsLink(link); + if (link instanceof MLinkObject ml) { + EdgeBase e = model.popLinkObjectEdge(ml); + if (e == null) return; + if (e instanceof BinaryAssociationClassOrObject edge) { PlaceableNode objectNode = edge.getClassOrObjectNode(); linkPositionCache().put(link, objectNode.getStrategy()); } - if (wasVisible) { fGraph.removeEdge(e); fLayouter = null; } e.dispose(); - } else { // n-ary association - boolean wasVisible = visibleData.getNaryLinkToDiamondNodeMap().containsKey(link); - DiamondNode n = model.popNaryLinkNode(link); - - if (n == null) { - throw new RuntimeException("no diamond node for n-ary link `" + link + "' in current state."); + } else { + EdgeBase e = model.popBinaryLink(link); + if (e == null) return; + if (wasVisible) { + fGraph.removeEdge(e); + fLayouter = null; } + e.dispose(); + } + } - model.popHalfEdges(link).forEach(edge -> { - if (wasVisible) { - fGraph.removeEdge(edge); - } - edge.dispose(); - }); + private void deleteNAryLinkInternal(MLink link) { + boolean wasVisible = visibleData.getNaryLinkToDiamondNodeMap().containsKey(link); + DiamondNode n = model.popNaryLinkNode(link); + if (n == null) { + throw new IllegalStateException("no diamond node for n-ary link `" + link + "' in current state."); + } + model.popHalfEdges(link).forEach(edge -> { if (wasVisible) { - fGraph.remove(n); - fLayouter = null; + fGraph.removeEdge(edge); } + edge.dispose(); + }); - n.dispose(); + if (wasVisible) { + fGraph.remove(n); + fLayouter = null; + } - if (link instanceof MLinkObject) { - EdgeBase edge = model.popLinkObjectEdge((MLinkObject) link); - if (edge != null) { - linkPositionCache().put(link, - ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); - if (wasVisible) { - fGraph.removeEdge(edge); - } - edge.dispose(); + n.dispose(); + + if (link instanceof MLinkObject ml) { + EdgeBase edge = model.popLinkObjectEdge(ml); + if (edge != null) { + linkPositionCache().put(link, + ((NAryAssociationClassOrObjectEdge) edge).getClassOrLinkObjectNode().getStrategy()); + if (wasVisible) { + fGraph.removeEdge(edge); } + edge.dispose(); } } } @@ -894,107 +909,10 @@ public ObjectSelection getObjectSelection() { } - /** - * Adds a new Link to the objectdiagram. - */ - class ActionInsertLink extends AbstractAction { - private final MAssociation fAssociation; - private final MObject[] fParticipants; - - ActionInsertLink(MAssociation association, MObject[] participants) { - fAssociation = association; - fParticipants = participants; - - StringBuilder txt = new StringBuilder("insert ("); - StringUtil.fmtSeq(txt, participants, ",", MObject::name); - - txt.append(") into ").append(association.name()); + // helper action classes were moved to the context menu provider; removed here as unused. - putValue(Action.NAME, txt.toString()); - } - - public void actionPerformed(ActionEvent e) { - if (presenter != null) { - presenter.onInsertLink(fAssociation, Arrays.asList(fParticipants)); - } - } - } - - /** - * Deletes a Link from the object diagram. - */ - class ActionDeleteLink extends AbstractAction { - private final MLink link; - - ActionDeleteLink(MLink link) { - this.link = link; - MObject[] participants = link.linkedObjectsAsArray(); - StringBuilder txt = new StringBuilder("delete ("); - - for (int i = 0; i < participants.length; ++i) { - if (i > 0) { - txt.append(","); - } - txt.append(participants[i].name()); - if (!link.getQualifier().isEmpty() && !link.getQualifier().get(i).isEmpty()) { - txt.append("{"); - StringUtil.fmtSeq(txt, link.getQualifier().get(i), ","); - txt.append("}"); - } - } - txt.append(") from ").append(link.association().name()); - - putValue(Action.NAME, txt.toString()); - } - - public void actionPerformed(ActionEvent e) { - if (presenter != null) { - presenter.onDeleteLink(link); - } - fEdgeSelection.clear(); - } - } - - /** - * Deletes the selected objects. - */ - class ActionDelete extends AbstractAction { - private final Set fObjects; - - ActionDelete(String text, Set objects) { - super(text); - fObjects = objects; - } - - public void actionPerformed(ActionEvent e) { - if (presenter != null) { - presenter.onDeleteObjects(fObjects); - } - fNodeSelection.clear(); - } - } - - /** - * Show properties of objects - */ - class ActionShowProperties extends AbstractAction { - private final MObject fObject; - - ActionShowProperties(String text, MObject object) { - super(text); - fObject = object; - } - - public void actionPerformed(ActionEvent e) { - if (presenter != null) { - presenter.onShowObjectProperties(fObject); - } - } - } - - /** - * Creates and shows popup menu if mouse event is the trigger for popups. - */ + // Creates and shows popup menu if mouse event is the trigger for popups. + @Override protected PopupMenuInfo unionOfPopUpMenu() { PopupMenuInfo popupInfo = super.unionOfPopUpMenu(); if (presenter == null) { @@ -1029,32 +947,9 @@ protected PopupMenuInfo unionOfPopUpMenu() { return popupInfo; } - /** - * Finds all nodes which are not selected. - * - * @param selectedNodes Nodes which are selected at this point in the diagram. - * @return A HashSet of the none selected objects in the diagram. - */ - private Set getNoneSelectedNodes(Set selectedNodes) { - Set noneSelectedNodes = new HashSet<>(); - for (PlaceableNode o : fGraph) { - if (o instanceof ObjectNode) { - MObject obj = ((ObjectNode) o).object(); - if (!selectedNodes.contains(obj)) { - noneSelectedNodes.add(obj); - } - } - } - - selectedNodes.forEach(elem -> { - if (elem instanceof MLinkObjectImpl) { - ((MLinkObjectImpl) elem).linkedObjects().forEach(noneSelectedNodes::remove); - } - }); - return noneSelectedNodes; - } + // getNoneSelectedNodes was removed; this logic moved to context menu provider where needed. - private JWindow fObjectInfoWin = null; + private transient JWindow fObjectInfoWin = null; private void displayObjectInfo(MObject obj, MouseEvent e) { if (fObjectInfoWin != null) { @@ -1089,7 +984,7 @@ private void displayObjectInfo(MObject obj, MouseEvent e) { Point p = e.getPoint(); SwingUtilities.convertPointToScreen(p, (JComponent) e.getSource()); - fObjectInfoWin.setLocation(p);// e.getPoint()); + fObjectInfoWin.setLocation(p); fObjectInfoWin.pack(); fObjectInfoWin.setVisible(true); } @@ -1138,8 +1033,8 @@ public void dropObjectFromModelBrowser(DropTargetDropEvent dtde) { public void mayBeShowObjectInfo(MouseEvent e) { if (fNodeSelection.size() == 1) { PlaceableNode node = fNodeSelection.iterator().next(); - if (node instanceof ObjectNode) { - displayObjectInfo(((ObjectNode) node).object(), e); + if (node instanceof ObjectNode on) { + displayObjectInfo(on.object(), e); } } } @@ -1155,29 +1050,7 @@ public void mayBeDisposeObjectInfo() { } } - private int[] radixConversion(int number, int base, int maxDigits) { - int[] res = new int[maxDigits]; - for (int i = 0; i < maxDigits; ++i) { - res[i] = number % base; - number = number / base; - } - return res; - } - - private boolean isCompleteObjectCombination(int[] c, int base) { - for (int i = 0; i < base; i++) { - boolean found = false; - for (int v : c) { - if (v == i) { - found = true; - break; - } - } - if (!found) - return false; - } - return true; - } + // Helper methods removed: moved to context menu provider where they are used. /** * Finds a random new position for the next object node. @@ -1185,8 +1058,10 @@ private boolean isCompleteObjectCombination(int[] c, int base) { protected void getRandomNextPosition() { // getWidth and getHeight return 0 // if we are called on a new diagram. - nextNodePosition.x = Math.random() * Math.max(100, getWidth() - 100); - nextNodePosition.y = Math.random() * Math.max(100, getHeight() - 100); + double w = Math.max(100, getWidth() - 100); + double h = Math.max(100, getHeight() - 100); + nextNodePosition.x = SECURE_RANDOM.nextDouble() * w; + nextNodePosition.y = SECURE_RANDOM.nextDouble() * h; } @Override @@ -1221,21 +1096,7 @@ protected String getDefaultLayoutFileSuffix() { return null; } - /** - * A small helper method for creating {@link Action} instances with less boilerplate code. - * - * @param text The text of the action. - * @param listener The {@link.ActionListener} that executes the action. - * @return The created action. - */ - private Action createAction(String text, ActionListener listener) { - return new AbstractAction(text) { - @Override - public void actionPerformed(ActionEvent e) { - listener.actionPerformed(e); - } - }; - } + // helper Action factory removed as unused protected void addBinaryLink(MLink link) { MAssociation assoc = link.association(); @@ -1247,20 +1108,20 @@ protected void addBinaryLink(MLink link) { MObject obj2 = linkEnd2.object(); // object link - if (link instanceof MLinkObject) { + if (link instanceof MLinkObject ml) { BinaryAssociationClassOrObject e = BinaryAssociationClassOrObject.create( visibleData.getObjectToNodeMap().get(obj1), visibleData.getObjectToNodeMap().get(obj2), - linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(link), this, + linkEnd1, linkEnd2, visibleData.getObjectToNodeMap().get(ml), this, link); - BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) visibleData.getLinkObjectToNodeEdge().get((MLinkObject) link); + BinaryAssociationClassOrObject edge = (BinaryAssociationClassOrObject) visibleData.getLinkObjectToNodeEdge().get(ml); if (edge != null) { PlaceableNode objectNode = edge.getClassOrObjectNode(); linkPositionCache().put(link, objectNode.getStrategy()); } fGraph.addEdge(e); - visibleData.getLinkObjectToNodeEdge().put((MLinkObject) link, e); + visibleData.getLinkObjectToNodeEdge().put(ml, e); fLayouter = null; } else { // binary link @@ -1324,7 +1185,7 @@ public Set getHiddenNodes() { /** Used by JavaFX caller to toggle FX-mode behavior. */ public static void setJavaFxCall(boolean value) { - javaFxCall = value; + MainWindow.setJavaFxCall(value); } /** Sort change from ModelBrowserSorting. */ @@ -1362,8 +1223,9 @@ public int isHidden(List links) { return 0; } - /** Group links by association name for ObjectSelection needs. */ - public Map> mapLinksToKindOfAssociation(List links) { + /** Group links by association name for ObjectSelection needs. */ + @SuppressWarnings("unused") + public Map> mapLinksToKindOfAssociation(List links) { Map> result = new HashMap<>(); for (MLink link : links) { String key = link.association().name(); @@ -1372,9 +1234,10 @@ public Map> mapLinksToKindOfAssociation(List links) { return result; } - /** Legacy overload: collects all links grouped by association. */ - public TreeMap> mapLinksToKindOfAssociation() { - TreeMap> result = new TreeMap<>(); + /** Legacy overload: collects all links grouped by association. */ + @SuppressWarnings("unused") + public Map> mapLinksToKindOfAssociation() { + Map> result = new TreeMap<>(); Collection assocs = presenter != null ? presenter.fetchAllAssociations() : system().model().associations(); for (MAssociation assoc : assocs) { diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java index c17f37622..faa5b254e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramModel.java @@ -14,7 +14,6 @@ import org.tzi.use.gui.views.diagrams.elements.edges.EdgeBase; import org.tzi.use.gui.views.diagrams.elements.positioning.PositionStrategy; import org.tzi.use.gui.views.diagrams.elements.edges.BinaryAssociationOrLinkEdge; -import org.tzi.use.gui.views.diagrams.elements.edges.NAryAssociationClassOrObjectEdge; import org.tzi.use.gui.views.diagrams.elements.DiamondNode; import org.tzi.use.gui.views.diagrams.objectdiagram.NewObjectDiagram.ObjectDiagramData; import org.tzi.use.uml.sys.MLink; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java index 514345e1e..0ec19823b 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java @@ -39,6 +39,18 @@ public class NewObjectDiagramPresenterImpl implements NewObjectDiagramPresenter private final MSystem system; + // Common log message fragments extracted to constants to avoid duplicated literals (Sonar S1192) + private static final String PREFIX_EVENT = "event="; + private static final String PREFIX_OBJECT = "object="; + private static final String PREFIX_LINK = "link="; + private static final String PREFIX_COUNT = "count="; + private static final String PREFIX_ASSOCIATION = "association="; + private static final String PREFIX_CLASS = "class="; + private static final String MSG_REQUESTED = "requested"; + private static final String CONSTRUCTED_PREFIX = "constructed; view="; + private static final String COMMA_DIAGRAM = ", diagram="; + private static final String COMMA_MODEL = ", model="; + public NewObjectDiagramPresenterImpl(NewObjectDiagramUI view, ObjectDiagramInteractor diagram, @@ -67,11 +79,9 @@ public NewObjectDiagramPresenterImpl(NewObjectDiagramUI view, this.system = system; - log("", "constructed; view=" + (view == null ? "null" : view.getClass().getSimpleName()) - - + ", diagram=" + (diagram == null ? "null" : diagram.getClass().getSimpleName()) - - + ", model=" + (model == null ? "null" : model.getClass().getSimpleName())); + log("", CONSTRUCTED_PREFIX + (view == null ? "null" : view.getClass().getSimpleName()) + + COMMA_DIAGRAM + (diagram == null ? "null" : diagram.getClass().getSimpleName()) + + COMMA_MODEL + (model == null ? "null" : model.getClass().getSimpleName())); if (this.system != null) { @@ -181,7 +191,7 @@ public void onResetDiagram(ObjDiagramOptions options) { public void onHighlightChange(HighlightChangeEvent e) { - log("onHighlightChange", "event=" + e); + log("onHighlightChange", PREFIX_EVENT + e); if (diagram instanceof NewObjectDiagram diag && e != null) { @@ -197,7 +207,7 @@ public void onHighlightChange(HighlightChangeEvent e) { public void onTransition(TransitionEvent e) { - log("onTransition", "event=" + e); + log("onTransition", PREFIX_EVENT + e); if (diagram == null || e == null) { @@ -245,7 +255,7 @@ public void onObjectCreated(ObjectCreatedEvent e) { public void onObjectCreated(MObject obj) { - log("onObjectCreated", "object=" + obj); + log("onObjectCreated", PREFIX_OBJECT + obj); if (diagram == null || obj == null || obj instanceof MLink) { @@ -277,7 +287,7 @@ public void onObjectDestroyed(ObjectDestroyedEvent e) { public void onObjectDestroyed(MObject obj) { - log("onObjectDestroyed", "object=" + obj); + log("onObjectDestroyed", PREFIX_OBJECT + obj); if (diagram == null || obj == null || obj instanceof MLink) { @@ -297,7 +307,7 @@ public void onObjectDestroyed(MObject obj) { public void onAttributeAssigned(AttributeAssignedEvent e) { - log("onAttributeAssigned", "event=" + e); + log("onAttributeAssigned", PREFIX_EVENT + e); if (diagram == null || e == null || e.getObject() == null) { @@ -317,7 +327,7 @@ public void onAttributeAssigned(AttributeAssignedEvent e) { public void onLinkInserted(LinkInsertedEvent e) { - log("onLinkInserted", "event=" + e); + log("onLinkInserted", PREFIX_EVENT + e); if (diagram == null || e == null) { @@ -351,7 +361,7 @@ public void onLinkInserted(LinkInsertedEvent e) { public void onLinkDeleted(LinkDeletedEvent e) { - log("onLinkDeleted", "event=" + e); + log("onLinkDeleted", PREFIX_EVENT + e); if (diagram == null || e == null) { @@ -447,7 +457,7 @@ public void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set participants) { - log("onInsertLink", "association=" + association + ", participants=" + sizeOf(participants)); + log("onInsertLink", PREFIX_ASSOCIATION + association + ", participants=" + sizeOf(participants)); if (applicationController != null) { @@ -465,7 +475,7 @@ public void onInsertLink(MAssociation association, List participants) { public void onDeleteLink(MLink link) { - log("onDeleteLink", "link=" + link); + log("onDeleteLink", PREFIX_LINK + link); if (applicationController != null) { @@ -489,7 +499,7 @@ public void onDeleteLink(MLink link) { public void onDeleteObjects(Set objects) { - log("onDeleteObjects", "count=" + sizeOf(objects)); + log("onDeleteObjects", PREFIX_COUNT + sizeOf(objects)); if (applicationController != null) { @@ -513,7 +523,7 @@ public void onDeleteObjects(Set objects) { public void onShowObjectProperties(MObject object) { - log("onShowObjectProperties", "object=" + object); + log("onShowObjectProperties", PREFIX_OBJECT + object); if (applicationController != null && object != null) { @@ -527,7 +537,7 @@ public void onShowObjectProperties(MObject object) { public Set fetchLinksOfAssociation(MAssociation association) { - log("fetchLinksOfAssociation", "association=" + association); + log("fetchLinksOfAssociation", PREFIX_ASSOCIATION + association); if (association == null || system == null) { @@ -543,7 +553,7 @@ public Set fetchLinksOfAssociation(MAssociation association) { public Set fetchObjectsOfClass(MClass cls) { - log("fetchObjectsOfClass", "class=" + cls); + log("fetchObjectsOfClass", PREFIX_CLASS + cls); if (cls == null || system == null) { @@ -559,7 +569,7 @@ public Set fetchObjectsOfClass(MClass cls) { public Collection fetchAllAssociations() { - log("fetchAllAssociations", "requested"); + log("fetchAllAssociations", MSG_REQUESTED); if (system == null) { @@ -575,7 +585,7 @@ public Collection fetchAllAssociations() { public void onHideLinks(Collection links) { - log("onHideLinks", "count=" + sizeOf(links)); + log("onHideLinks", PREFIX_COUNT + sizeOf(links)); if (diagram == null || links == null) { @@ -593,7 +603,7 @@ public void onHideLinks(Collection links) { public void onShowLinks(Collection links) { - log("onShowLinks", "count=" + sizeOf(links)); + log("onShowLinks", PREFIX_COUNT + sizeOf(links)); if (diagram == null || links == null) { @@ -615,7 +625,7 @@ public void onShowLinks(Collection links) { public void onHideObjects(Collection objects) { - log("onHideObjects", "count=" + sizeOf(objects)); + log("onHideObjects", PREFIX_COUNT + sizeOf(objects)); if (diagram == null || objects == null) { @@ -633,7 +643,7 @@ public void onHideObjects(Collection objects) { public void onHideAllLinks() { - log("onHideAllLinks", "requested"); + log("onHideAllLinks", MSG_REQUESTED); if (diagram == null) { @@ -651,7 +661,7 @@ public void onHideAllLinks() { public void onShowAllLinks() { - log("onShowAllLinks", "requested"); + log("onShowAllLinks", MSG_REQUESTED); if (diagram == null) { @@ -723,7 +733,7 @@ public void onCropSelection(Collection objectsToHide) { public void onGrayOut(Collection objects) { - log("onGrayOut", "count=" + sizeOf(objects)); + log("onGrayOut", PREFIX_COUNT + sizeOf(objects)); if (diagram == null || objects == null) { @@ -741,7 +751,7 @@ public void onGrayOut(Collection objects) { public void onGrayIn(Collection objects) { - log("onGrayIn", "count=" + sizeOf(objects)); + log("onGrayIn", PREFIX_COUNT + sizeOf(objects)); if (diagram == null || objects == null) { @@ -781,7 +791,7 @@ public void onStoreLayout(PersistHelper helper, NewObjectDiagramModel model) { - log("onStoreLayout", "helper=" + helper + ", root=" + root + ", model=" + model); + log("onStoreLayout", "helper=" + helper + ", root=" + root + COMMA_MODEL + model); if (placementRepository != null && helper != null && root != null) { @@ -801,7 +811,7 @@ public Set onRestoreLayout(PersistHelper helper, MSystem system) { - log("onRestoreLayout", "version=" + version + ", helper=" + helper + ", model=" + model); + log("onRestoreLayout", "version=" + version + ", helper=" + helper + COMMA_MODEL + model); if (placementRepository != null && helper != null) { @@ -829,7 +839,7 @@ MSystem getSystem() { public void detach() { - log("detach", "requested"); + log("detach", MSG_REQUESTED); if (system != null) { diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java index fc71b2170..303bfd731 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramView.java @@ -26,6 +26,7 @@ import java.awt.print.PageFormat; import java.util.Arrays; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import javax.swing.JComponent; import javax.swing.JPanel; @@ -50,17 +51,24 @@ * * @author Mark Richters */ -@SuppressWarnings("serial") -public class NewObjectDiagramView extends JPanel +public class NewObjectDiagramView extends JPanel implements View, PrintableView, SortChangeListener, NewObjectDiagramUI, DiagramContext { - protected final MSystem fSystem; - protected final MainWindow fMainWindow; - private ApplicationController appController; + private static final long serialVersionUID = 1L; + + /** The system shown in this view. Marked transient because MSystem is not serializable. */ + protected final transient MSystem fSystem; + /** Reference to main window; transient because MainWindow is not serializable. */ + protected final transient MainWindow fMainWindow; + /** Controller used for commands; transient because controllers are not serializable. */ + private transient ApplicationController appController; + + /** The underlying diagram component. transient because Swing components are not serializable. */ + protected transient NewObjectDiagram fObjectDiagram; + + /** Number of active views. Use AtomicInteger to avoid instance methods writing plain static fields. */ + private static final AtomicInteger VIEW_COUNT = new AtomicInteger(0); - protected NewObjectDiagram fObjectDiagram; - public static int viewcount = 0; - public NewObjectDiagramView(MainWindow mainWindow, MSystem system) { fMainWindow = mainWindow; fSystem = system; @@ -75,6 +83,7 @@ public NewObjectDiagramView(MainWindow mainWindow, MSystem system) { initDiagram(false, null); } + @SuppressWarnings("unused") public void initDiagram(boolean loadDefaultLayout, ObjDiagramOptions opt) { if (opt == null) fObjectDiagram = new NewObjectDiagram( this, fMainWindow.logWriter()); @@ -85,17 +94,19 @@ public void initDiagram(boolean loadDefaultLayout, ObjDiagramOptions opt) { NewObjectDiagramModel model = new NewObjectDiagramModel(); PlacementRepository placementRepository = new DefaultPlacementRepository(); - NewObjectDiagramPresenterImpl presenter = new NewObjectDiagramPresenterImpl( - this, - fObjectDiagram, - model, - appController = new DefaultApplicationController(fMainWindow, fSystem, this), - new DefaultContextMenuProvider(), - placementRepository, - fSystem); + // avoid assignment inside method invocation (Sonar S1121) + appController = new DefaultApplicationController(fMainWindow, fSystem, this); + NewObjectDiagramPresenterImpl presenter = new NewObjectDiagramPresenterImpl( + this, + fObjectDiagram, + model, + appController, + new DefaultContextMenuProvider(), + placementRepository, + fSystem); fObjectDiagram.setPresenter(presenter); - fObjectDiagram.setStatusBar(fMainWindow.statusBar()); + fObjectDiagram.setStatusBar(fMainWindow.statusBar()); this.removeAll(); add( new JScrollPane(fObjectDiagram) ); initState(); @@ -119,7 +130,7 @@ private void initState() { } fObjectDiagram.initialize(); - viewcount++; + VIEW_COUNT.incrementAndGet(); } // legacy helpers removed; use public DiagramContext methods below @@ -127,9 +138,37 @@ private void initState() { @Override public MSystem system() { return fSystem; } @Override public ModelBrowser getModelBrowser() { return fMainWindow.getModelBrowser(); } @Override public boolean isSelectedView() { return fMainWindow.getSelectedView() != null && fMainWindow.getSelectedView().equals(this); } - @Override public void addKeyListener(KeyListener l) { super.addKeyListener(l); } - @Override public Font getFont() { return super.getFont(); } - @Override public void setFont(Font font) { super.setFont(font); } + /** + * Adds a key listener and ensures the component is focusable so it can receive key events. + */ + @Override + public synchronized void addKeyListener(KeyListener l) { + super.addKeyListener(l); + // make sure the component can receive focus when a key listener is added + setFocusable(true); + } + + /** + * Returns the font of this component. If no font is set, fall back to the main window font. + */ + @Override + public Font getFont() { + Font f = super.getFont(); + if (f == null && fMainWindow != null) { + return fMainWindow.getFont(); + } + return f; + } + + /** + * Sets the font and triggers a revalidation/repaint to reflect the change. + */ + @Override + public void setFont(Font font) { + super.setFont(font); + revalidate(); + repaint(); + } @Override public void createObject(String className) { if (fObjectDiagram != null && fObjectDiagram.getPresenter() != null) { fObjectDiagram.getPresenter().onCreateObject(className); @@ -176,7 +215,16 @@ public void detachModel() { } ModelBrowserSorting.getInstance().removeSortChangeListener( this ); fSystem.unregisterRequiresAllDerivedValues(); - viewcount--; + VIEW_COUNT.decrementAndGet(); + } + + /** + * Returns the current number of active views. + * + * @return the view count + */ + public static int getViewcount() { + return VIEW_COUNT.get(); } @Override diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjDiagramOptions.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjDiagramOptions.java index 8b493b25a..2063b9a30 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjDiagramOptions.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjDiagramOptions.java @@ -33,6 +33,7 @@ public final class ObjDiagramOptions extends DiagramOptions { private boolean isShowStates = false; + private boolean showMultiplicities = false; public ObjDiagramOptions() { } @@ -42,7 +43,9 @@ public ObjDiagramOptions() { */ public ObjDiagramOptions(ObjDiagramOptions opt) { super(opt); - } + this.isShowStates = opt.isShowStates; + this.showMultiplicities = opt.showMultiplicities; + } @Override protected void registerAdditionalColors() { @@ -59,10 +62,12 @@ protected void registerAdditionalColors() { } public boolean isShowMutliplicities() { - return false; + return showMultiplicities; } public void setShowMutliplicities(boolean showMutliplicities) { + this.showMultiplicities = showMutliplicities; + this.onOptionChanged("SHOWMULTIPLICITIES"); } /** @@ -85,11 +90,13 @@ public void setShowStates(boolean isShowStates) { public void saveOptions(PersistHelper helper, Element parent) { super.saveOptions(helper, parent); helper.appendChild(parent, "ShowStates", String.valueOf(this.isShowStates)); + helper.appendChild(parent, "ShowMultiplicities", String.valueOf(this.showMultiplicities)); } @Override public void loadOptions(PersistHelper helper, int version) { super.loadOptions(helper, version); this.isShowStates = helper.getElementBooleanValue("ShowStates"); + this.showMultiplicities = helper.getElementBooleanValue("ShowMultiplicities"); } } \ No newline at end of file diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java index 4c7a708fe..f57ecb376 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectDiagramModel.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Map; import java.util.Set; @@ -22,11 +23,30 @@ public class ObjectDiagramModel { /** listeners for future change events */ public interface Listener { - default void onNodeAdded(MObject obj, PlaceableNode node) {} - default void onNodeRemoved(MObject obj) {} - default void onLinkAdded(MLink link, EdgeBase edge) {} - default void onLinkRemoved(MLink link) {} - default void onStateChanged() {} + @SuppressWarnings("unused") + default void onNodeAdded(MObject obj, PlaceableNode node) { + // no-op: parameterized callback for future implementations + } + + @SuppressWarnings("unused") + default void onNodeRemoved(MObject obj) { + // no-op: parameterized callback for future implementations + } + + @SuppressWarnings("unused") + default void onLinkAdded(MLink link, EdgeBase edge) { + // no-op: parameterized callback for future implementations + } + + @SuppressWarnings("unused") + default void onLinkRemoved(MLink link) { + // no-op: parameterized callback for future implementations + } + + @SuppressWarnings("unused") + default void onStateChanged() { + // no-op: state change notification placeholder + } } private final Set listeners = new HashSet<>(); @@ -76,15 +96,63 @@ public Map getHiddenNaryEdges() { /** * Placeholder query for later migration: map links to kind of association. */ - public Map> mapLinksToKindOfAssociation(List associations, Map> linksByAssoc) { - return Map.of(); + public Map> mapLinksToKindOfAssociation(List associations, + Map> linksByAssoc) { + Map> result = new HashMap<>(); + // If no explicit linksByAssoc provided, fall back to association names only + if (linksByAssoc == null || linksByAssoc.isEmpty()) { + if (associations != null) { + for (MAssociation assoc : associations) { + if (assoc != null) { + result.put(assoc.name(), List.of()); + } + } + } + return result; + } + + populateFromLinksByAssoc(result, linksByAssoc); + return result; + } + + // helper removed — logic inlined to reduce cognitive complexity metric + + /** + * Populate result map from the provided linksByAssoc mapping. + */ + private void populateFromLinksByAssoc(Map> result, Map> linksByAssoc) { + if (linksByAssoc == null) { + return; + } + for (Map.Entry> e : linksByAssoc.entrySet()) { + MAssociation assoc = e.getKey(); + if (assoc == null) { + continue; + } + Set links = e.getValue(); + result.put(assoc.name(), links == null ? List.of() : List.copyOf(links)); + } } /** * Placeholder for later migration: resolve a link by value/class combination. */ public MLink getLinkByValue(MLink candidate, String value) { - return candidate; + if (candidate == null) { + return null; + } + if (value == null) { + return candidate; + } + try { + String s = candidate.toString(); + if (Objects.equals(s, value)) { + return candidate; + } + } catch (Exception ignored) { + // toString might fail on some implementations; fall through to null + } + return null; } /** diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectNode.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectNode.java index 8f835b0e7..660e77c5b 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectNode.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ObjectNode.java @@ -77,12 +77,10 @@ public ObjectNode(MObject obj, NewObjectDiagramView parent, ObjDiagramOptions op fParent = parent; fOpt = opt; fIsGreyed = false; - fOptChaneListener = new DiagramOptionChangedListener() { - @Override - public void optionChanged(String optionname) { - if (optionname.equals("SHOWOPERATIONS") || optionname.equals("SHOWATTRIBUTES") - || optionname.equals("SHOWSTATES")) - calculateBounds(); + fOptChaneListener = optionname -> { + if ("SHOWOPERATIONS".equals(optionname) || "SHOWATTRIBUTES".equals(optionname) + || "SHOWSTATES".equals(optionname)) { + calculateBounds(); } }; @@ -153,13 +151,13 @@ public void doCalculateSize(Graphics2D g) { attributesRect.width = Math.max(attributesRect.width, fm.stringWidth(fValues[i])); } - attributesRect.height = fm.getHeight() * fAttributes.size() + 3; + attributesRect.height = ((double) fm.getHeight()) * fAttributes.size() + 3.0; statesRect.width = 0; for (int i = 0; i < fStateValues.length; ++i) { statesRect.width = Math.max(statesRect.width, fm.stringWidth(fStateValues[i])); } - statesRect.height = fm.getHeight() * fStateMachines.size() + 3; + statesRect.height = ((double) fm.getHeight()) * fStateMachines.size() + 3.0; calculateBounds(); } @@ -201,8 +199,8 @@ public void updateContent() { MAttribute attr = fAttributes.get(i); Value val = objState.attributeValue(attr); - if (val instanceof EnumValue) { - value = "#" + ((EnumValue) val).value(); + if (val instanceof EnumValue ev) { + value = "#" + ev.value(); } else { value = val.toString(); } @@ -229,8 +227,8 @@ protected void onDraw(Graphics2D g) { return; } - double x = currentBounds.getX(); - int y = (int) currentBounds.getY(); + double x; + int y; int labelWidth = g.getFontMetrics().stringWidth(fLabel); @@ -238,10 +236,8 @@ protected void onDraw(Graphics2D g) { Color fillColor = fOpt.getNODE_COLOR(); Color lineColor = fOpt.getNODE_FRAME_COLOR(); // change colors if needed - if(isSelected() && isGreyed()) { - //fillColor = fOpt.getGREYED_SELECTED_FILL_COLOR(); + if (isSelected() && isGreyed()) { fillColor = fOpt.getNODE_SELECTED_COLOR(); - //lineColor = fOpt.getGREYED_LINE_COLOR(); lineColor = fOpt.getGREYED_SELECTED_LINE_COLOR(); } else if (isSelected()) { fillColor = fOpt.getNODE_SELECTED_COLOR(); @@ -255,16 +251,16 @@ protected void onDraw(Graphics2D g) { g.setColor(lineColor); g.draw(currentBounds); - x = (currentBounds.getCenterX() - labelWidth / 2); + double halfLabel = labelWidth / 2.0; + x = (currentBounds.getCenterX() - halfLabel); y = (int) currentBounds.getY() + g.getFontMetrics().getAscent() + 2; - //g.setColor(fOpt.getColor(DiagramOptions.NODE_LABEL_COLOR)); g.drawString(fLabelA.getIterator(), Math.round(x), y); if (fOpt.isShowAttributes()) { // compartment divider - Line2D.Double lineAttrDivider = new Line2D.Double(currentBounds.getX(), y + 3, currentBounds.getMaxX(), - y + 3); + Line2D.Double lineAttrDivider = new Line2D.Double(currentBounds.getX(), y + 3.0, currentBounds.getMaxX(), + y + 3.0); g.draw(lineAttrDivider); x = currentBounds.getX() + 5; y += 3; @@ -276,8 +272,8 @@ protected void onDraw(Graphics2D g) { if (fOpt.isShowStates()) { // compartment divider - Line2D.Double lineAttrDivider = new Line2D.Double(currentBounds.getX(), y + 3, currentBounds.getMaxX(), - y + 3); + Line2D.Double lineAttrDivider = new Line2D.Double(currentBounds.getX(), y + 3.0, currentBounds.getMaxX(), + y + 3.0); g.draw(lineAttrDivider); x = currentBounds.getX() + 5; y += 3; diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java index 10cec5030..3e493ebdc 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLogger.java @@ -40,54 +40,44 @@ public final class PresenterFileLogger { // Best-effort: create directories and write an initialization line into the test log. - try { - - Files.createDirectories(LOG_DIR); - - Files.createDirectories(WORK_DIR_LOG); - - // write an init line into the current test log file (no stdout/stderr) using structured format - - String initTs = TS_FORMAT.format(Instant.now()); - - String initLine = initTs + " [PresenterFileLogger#init] initialized test=" + currentTest + System.lineSeparator(); - - try { - - Path p = LOG_DIR.resolve(currentTest + ".log"); - - Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); - - } catch (IOException ignored) { + // Ensure directories exist (ignore failures) + safeCreateDirs(LOG_DIR); + safeCreateDirs(WORK_DIR_LOG); - // ignore — best-effort + // write an init line into the current test log file (no stdout/stderr) using structured format + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#init] initialized test=" + currentTest + System.lineSeparator(); - } + Path p = LOG_DIR.resolve(currentTest + ".log"); + safeWriteString(p, initLine); - try { + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + safeWriteString(pWork, initLine); - Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); - - Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } - } catch (IOException ignored) { + private PresenterFileLogger() { - // ignore + // utility - } + } + // Helper: create directories without nesting try-catch blocks at call sites + private static void safeCreateDirs(Path dir) { + try { + Files.createDirectories(dir); } catch (IOException ignored) { - - // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr - + // best-effort: ignore } - } - private PresenterFileLogger() { - - // utility - + // Helper: write string to file in append mode, ignore failures + private static void safeWriteString(Path file, String content) { + try { + Files.writeString(file, content, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ignored) { + // best-effort: ignore + } } private static boolean readEnabledFlag() { @@ -127,54 +117,22 @@ public static synchronized void setCurrentTest(String testName) { currentTest = testName; if (!enabled) { - return; - } - try { - - // Ensure both directories exist when changing the test name so subsequent writes succeed - - Files.createDirectories(LOG_DIR); - - Files.createDirectories(WORK_DIR_LOG); - - // write an init line into the new current test log file (best-effort, no stdout/stderr) - - String initTs = TS_FORMAT.format(Instant.now()); - - String initLine = initTs + " [PresenterFileLogger#setCurrentTest] switched test=" + currentTest + System.lineSeparator(); - - try { - - Path p = LOG_DIR.resolve(currentTest + ".log"); - - Files.writeString(p, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); - - } catch (IOException ignored) { - - // ignore — best-effort + // Ensure both directories exist when changing the test name so subsequent writes succeed + safeCreateDirs(LOG_DIR); + safeCreateDirs(WORK_DIR_LOG); - } + // write an init line into the new current test log file (best-effort, no stdout/stderr) + String initTs = TS_FORMAT.format(Instant.now()); + String initLine = initTs + " [PresenterFileLogger#setCurrentTest] switched test=" + currentTest + System.lineSeparator(); - try { + Path p = LOG_DIR.resolve(currentTest + ".log"); + safeWriteString(p, initLine); - Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); - - Files.writeString(pWork, initLine, StandardOpenOption.CREATE, StandardOpenOption.APPEND); - - } catch (IOException ignored) { - - // ignore - - } - - } catch (IOException ignored) { - - // ignore directory creation failures — logger is best-effort and must not print to stdout/stderr - - } + Path pWork = WORK_DIR_LOG.resolve(currentTest + ".log"); + safeWriteString(pWork, initLine); } @@ -194,47 +152,12 @@ private static void writeLineToFiles(String line) { Path pWork = WORK_DIR_LOG.resolve(fileName); - try { - - // ensure directories exist (in case setCurrentTest wasn't called since class init) - - Files.createDirectories(LOG_DIR); - - } catch (IOException ignored) { - - // ignore - - } - - try { - - Files.createDirectories(WORK_DIR_LOG); + // ensure directories exist (in case setCurrentTest wasn't called since class init) + safeCreateDirs(LOG_DIR); + safeCreateDirs(WORK_DIR_LOG); - } catch (IOException ignored) { - - // ignore - - } - - try { - - Files.writeString(p, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); - - } catch (IOException ignored) { - - // ignore - - } - - try { - - Files.writeString(pWork, line, StandardOpenOption.CREATE, StandardOpenOption.APPEND); - - } catch (IOException ignored) { - - // ignore - - } + safeWriteString(p, line); + safeWriteString(pWork, line); } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java index 40459ba6d..31153ae8e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/PresenterFileLoggerTestMain.java @@ -14,7 +14,8 @@ public static void main(String[] args) { PresenterFileLogger.log("afterSwitch", "main", "entry after switching test name"); PresenterFileLogger.log("t_test_manual", "explicit-message-after-switch"); - System.out.println("PresenterFileLoggerTestMain finished — check use_refactor_logs in user home and working dir."); + // Do not write to standard output for logging — use the file logger instead. + PresenterFileLogger.log("PresenterFileLoggerTestMain finished — check use_refactor_logs in user home and working dir."); } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/QualifierInputView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/QualifierInputView.java index 10aa10223..8a6f4952f 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/QualifierInputView.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/QualifierInputView.java @@ -22,8 +22,7 @@ import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +// action events handled with lambdas; explicit listener imports removed import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -67,29 +66,30 @@ public class QualifierInputView extends JDialog { private static final long serialVersionUID = -6361281949862418261L; - + private static final String DLG_TITLE_ERROR = "Error"; + /** * The system to execute the insert link statement on. */ - private MSystem system; - + private final transient MSystem system; + /** * The association to insert the link into */ - private MAssociation association; - + private final transient MAssociation association; + /** * The objects participating in the link */ - private MObject[] participants; - + private final transient MObject[] participants; + /** * A table model for each end with qualifier */ - private TableModel[] tableModels; - - private JTable[] tables; - + private transient TableModel[] tableModels; + + private transient JTable[] tables; + public QualifierInputView(Frame owner, MSystem system, MAssociation association, MObject[] participants) { super(owner, "Enter qualifier values"); this.system = system; @@ -133,20 +133,12 @@ private void initGui() { JButton btnApply = new JButton("Insert"); btnApply.setMnemonic('I'); btnApply.setVerifyInputWhenFocusTarget(true); - btnApply.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - apply(); - } - }); - + btnApply.addActionListener(e -> apply()); + JButton btnReset = new JButton("Reset"); btnReset.setMnemonic('R'); btnReset.setVerifyInputWhenFocusTarget(false); - btnReset.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - reset(); - } - }); + btnReset.addActionListener(e -> reset()); // layout the buttons centered from left to right JPanel buttonPane = new JPanel(); @@ -172,15 +164,14 @@ private void apply() { } List> qualifier = new ArrayList<>(); - for (int i = 0; i < this.tableModels.length; ++i) { - TableModel model = this.tableModels[i]; + for (TableModel model : this.tableModels) { if (model == null) { - qualifier.add(Collections.emptyList()); + qualifier.add(Collections.emptyList()); } else { List endValues = getEndValues(model); - - if (endValues == null) return; - + if (endValues == null) { + return; + } qualifier.add(endValues); } } @@ -193,7 +184,7 @@ private void apply() { JOptionPane.showMessageDialog( getParent(), e.getMessage(), - "Error", + DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); } @@ -201,10 +192,15 @@ private void apply() { } /** - * @param model + * Parse and evaluate qualifier expressions from the provided table model. + * + * @param model the table model providing qualifier expression strings + * @return a list of evaluated {@link Value} objects or null if the user + * cancelled or input was invalid */ + @SuppressWarnings("squid:S1168") // null is used to signal user-cancel/invalid input to caller protected List getEndValues(TableModel model) { - List endValues = new ArrayList(); + List endValues = new ArrayList<>(); for (int i2 = 0; i2 < model.getValues().length; ++i2) { String value = model.getValues()[i2]; @@ -212,7 +208,7 @@ protected List getEndValues(TableModel model) { JOptionPane.showMessageDialog( this, "Please provide a value for the qualifier " + model.getQualifierNames()[i2], - "Error", + DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); return null; } @@ -231,9 +227,9 @@ protected List getEndValues(TableModel model) { JOptionPane.showMessageDialog( this, errorOutput, - "Error", + DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); - return null; + return null; // null indicates user-cancelled/invalid input } try { @@ -241,23 +237,23 @@ protected List getEndValues(TableModel model) { Evaluator evaluator = new Evaluator(true); Value val = evaluator.eval(valueAsExpression, system.state(), system.varBindings()); endValues.add(val); - } catch (MultiplicityViolationException e) { - JOptionPane.showMessageDialog( - this, + } catch (MultiplicityViolationException e) { + JOptionPane.showMessageDialog( + this, "Could not evaluate. " + e.getMessage(), - "Error", + DLG_TITLE_ERROR, JOptionPane.ERROR_MESSAGE); - return null; - } + return null; + } } return endValues; } private void reset() { - for (int i = 0; i < this.tableModels.length; ++i) { - if (this.tableModels[i] != null) { - this.tableModels[i].reset(); + for (TableModel tm : this.tableModels) { + if (tm != null) { + tm.reset(); } } } @@ -265,7 +261,7 @@ private void reset() { /** * The table model. */ - class TableModel extends AbstractTableModel { + static class TableModel extends AbstractTableModel { /** * */ @@ -273,17 +269,19 @@ class TableModel extends AbstractTableModel { final String[] columnNames = { "Qualifier", "Value" }; - private String[] qualifierNames; - - private String[] qualifierValues; - + private final String[] qualifierNames; + + private final String[] qualifierValues; + TableModel(String[] qualifierNames) { this.qualifierNames = qualifierNames; this.qualifierValues = new String[qualifierNames.length]; } - /** - * @return + /** + * Return the qualifier names for this table model. + * + * @return an array of qualifier names */ public String[] getQualifierNames() { return this.qualifierNames; @@ -299,29 +297,34 @@ public void reset() { this.fireTableDataChanged(); } + @Override public String getColumnName(int col) { return columnNames[col]; } - public int getColumnCount() { - return 2; + @Override + public int getColumnCount() { + return 2; } - public int getRowCount() { + @Override + public int getRowCount() { return qualifierNames.length; } - public Object getValueAt(int row, int col) { + @Override + public Object getValueAt(int row, int col) { if (col == 0 ) return qualifierNames[row]; else return qualifierValues[row]; } - public boolean isCellEditable(int row, int col) { + @Override + public boolean isCellEditable(int row, int col) { return col == 1; } - - public void setValueAt(Object value, int row, int col) { + @Override + public void setValueAt(Object value, int row, int col) { qualifierValues[row] = value.toString(); } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/package.html b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/package.html index 9110fd150..37b27989e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/package.html +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/package.html @@ -1,4 +1,9 @@ - + + + + + Object Diagram Package + This package provides classes for visualizing an objectdiagram. diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java b/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java index 167c835aa..10d1c8e52 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/selection/objectselection/ObjectSelection.java @@ -2,7 +2,6 @@ import java.awt.BorderLayout; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -60,13 +59,25 @@ public class ObjectSelection { private final MSystem system; - // Conrols for ScrollMenu - private final int numOfElems = 20; - private final int interval = 125; - private final int topFixedCount = 0; - private final int bottomFixedCount = 0; + // Controls for ScrollMenu + private static final int NUM_OF_ELEMS = 20; + private static final int INTERVAL = 125; + private static final int TOP_FIXED_COUNT = 0; + private static final int BOTTOM_FIXED_COUNT = 0; + + // UI label constants to avoid duplicated string literals + private static final String LABEL_HIDE_OBJECTS = "Hide objects"; + private static final String LABEL_HIDE_ALL_OBJECTS = "Hide all objects"; + private static final String LABEL_HIDE = "Hide "; + private static final String LABEL_CLASS_PREFIX = "Class "; + private static final String LABEL_SHOW = "Show "; + private static final String LABEL_SHOW_ALL_HIDDEN_OBJECTS = "Show all hidden objects"; + private static final String LABEL_HIDE_ALL_LINKS = "Hide all links"; + private static final String LABEL_SHOW_ALL_LINKS = "Show all links"; + private static final String LABEL_HIDE_ALL = "Hide all"; + private static final String LABEL_SHOW_ALL = "Show all"; + private static final String OBJECT_PROPERTIES_ICON = "ObjectProperties.gif"; - private final AlphanumComparator keyComparator; private final Comparator linkComparator; private final Comparator objectComparator; @@ -76,7 +87,7 @@ public class ObjectSelection { public ObjectSelection(DiagramViewWithObjectNode diagram, MSystem system) { this.diagram = diagram; this.system = system; - this.keyComparator = new AlphanumComparator(); + AlphanumComparator keyComparator = new AlphanumComparator(); this.linkComparator = Comparator .comparing((MLink link) -> link.linkedObjects().get(0).toString(), keyComparator) .thenComparing(link -> link.linkedObjects().get(1).toString(), keyComparator); @@ -84,24 +95,23 @@ public ObjectSelection(DiagramViewWithObjectNode diagram, MSystem system) { } - @SuppressWarnings("serial") class ActionSelectedObjectPathView extends AbstractAction { - private Set selectedObjects; + private final transient Set selectedObjects; ActionSelectedObjectPathView(String text, Set sc) { super(text); - selectedObjects = sc; + this.selectedObjects = sc; } public void actionPerformed(ActionEvent e) { SelectedObjectPathView opv = new SelectedObjectPathView(MainWindow.instance(), system, diagram, selectedObjects); - ViewFrame f = new ViewFrame("Selection by path length", opv, "ObjectProperties.gif"); + ViewFrame f = new ViewFrame("Selection by path length", opv, OBJECT_PROPERTIES_ICON); JComponent c = (JComponent) f.getContentPane(); c.setLayout(new BorderLayout()); c.add(opv, BorderLayout.CENTER); - if (MainWindow.getJavaFxCall()){ + if (Boolean.TRUE.equals(MainWindow.getJavaFxCall())){ Platform.runLater(() -> { SwingNode swingNode = new SwingNode(); swingNode.setContent(opv); @@ -120,7 +130,6 @@ public ActionSelectedObjectPathView getSelectedObjectPathView(String text, Set { SwingNode swingNode = new SwingNode(); swingNode.setContent(opv); @@ -155,7 +164,6 @@ public ActionSelectionObjectView getSelectionObjectView() { /** * Show Selection OCL View */ - @SuppressWarnings("serial") class ActionSelectionOCLView extends AbstractAction { ActionSelectionOCLView() { super("With OCL..."); @@ -163,13 +171,13 @@ class ActionSelectionOCLView extends AbstractAction { public void actionPerformed(ActionEvent e) { SelectionOCLView opv = new SelectionOCLView(MainWindow.instance(), system, diagram); - ViewFrame f = new ViewFrame("Selection by OCL expression", opv, "ObjectProperties.gif"); + ViewFrame f = new ViewFrame("Selection by OCL expression", opv, OBJECT_PROPERTIES_ICON); JComponent c = (JComponent) f.getContentPane(); c.setLayout(new BorderLayout()); c.add(opv, BorderLayout.CENTER); - if (MainWindow.getJavaFxCall()){ + if (Boolean.TRUE.equals(MainWindow.getJavaFxCall())){ Platform.runLater(() -> { SwingNode swingNode = new SwingNode(); swingNode.setContent(opv); @@ -193,57 +201,133 @@ public ActionSelectionOCLView getSelectionWithOCLViewAction() { * which are connected with the Association selected by the user. */ public Set getSelectedObjectsofAssociation(MAssociation node, Set selectedObjectsOfAssociation) { - HashSet objects = new HashSet(); - Iterator it = this.diagram.getGraph().edgeIterator(); - String name = node.name(); + if (node == null) { + return Set.of(); + } - while (it.hasNext()) { - EdgeBase o = it.next(); + Set safeSelected = selectedObjectsOfAssociation == null ? Set.of() : selectedObjectsOfAssociation; - if (o instanceof BinaryAssociationOrLinkEdge) { - BinaryAssociationOrLinkEdge edge = (BinaryAssociationOrLinkEdge) o; + Set fromEdges = findObjectsFromEdges(node, safeSelected); + if (!fromEdges.isEmpty()) { + return fromEdges; + } - if (edge.getAssociation() != null && edge.getAssociation().equals(node)) { - MObject mo = ((ObjectNodeActivity) (edge.source())).object(); - if (!selectedObjectsOfAssociation.contains(mo)) { - objects.add(mo); + return findObjectsFromDiamonds(node.name(), safeSelected); + } + + private Set findObjectsFromEdges(MAssociation node, Set selectedObjectsOfAssociation) { + Set objects = new HashSet<>(); + return findMatchingEdge(node) + .map(edge -> { + MObject mo1 = ((ObjectNodeActivity) edge.source()).object(); + MObject mo2 = ((ObjectNodeActivity) edge.target()).object(); + if (!selectedObjectsOfAssociation.contains(mo1)) { + objects.add(mo1); } - mo = ((ObjectNodeActivity) (edge.target())).object(); - if (!selectedObjectsOfAssociation.contains(mo) && !objects.contains(mo)) { - objects.add(mo); + if (!selectedObjectsOfAssociation.contains(mo2)) { + objects.add(mo2); } return objects; - } + }) + .orElse(objects); + } + + private java.util.Optional findMatchingEdge(MAssociation node) { + Iterator it = this.diagram.getGraph().edgeIterator(); + while (it.hasNext()) { + EdgeBase o = it.next(); + if (o instanceof BinaryAssociationOrLinkEdge edge && edge.getAssociation() != null + && edge.getAssociation().equals(node)) { + return java.util.Optional.of(edge); } } + return java.util.Optional.empty(); + } - Iterator nodeIter = diagram.getGraph().iterator(); + private Set findObjectsFromDiamonds(String name, Set selectedObjectsOfAssociation) { + return findMatchingDiamond(name).map(dnode -> { + Set objects = new HashSet<>(); + for (MObject mo : dnode.link().linkedObjects()) { + if (!selectedObjectsOfAssociation.contains(mo)) { + objects.add(mo); + } + } + return objects; + }).orElse(Set.of()); + } - while (it.hasNext()) { + private java.util.Optional findMatchingDiamond(String name) { + Iterator nodeIter = diagram.getGraph().iterator(); + while (nodeIter.hasNext()) { PlaceableNode o = nodeIter.next(); - if (o instanceof DiamondNode) { - if (((DiamondNode) o).name().equalsIgnoreCase(name)) { - DiamondNode dnode = (DiamondNode) o; - - for (MObject mo : dnode.link().linkedObjects()) { - if (!selectedObjectsOfAssociation.contains(mo) && !objects.contains(mo)) { - objects.add(mo); - } - } - return objects; + if (o instanceof DiamondNode dnode && dnode.name().equalsIgnoreCase(name)) { + return java.util.Optional.of(dnode); + } + } + return java.util.Optional.empty(); + } + + /** + * Collect unique links and prepare association menus for the given edges. + */ + private void collectAssociationNamesAndLinks(Set edges, Map associationNames, + List links) { + for (EdgeBase edge : edges) { + if (edge instanceof LinkEdge aEdge) { + MLink link = aEdge.getLink(); + if (!links.contains(link)) { + JMenu menu = new JMenu(link.association().toString()); + MenuScroller.setScrollerFor(menu, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); + associationNames.put(link.association().toString(), menu); + links.add(link); } } } - return objects; } - private class ObjectNodeActivityComparator implements Comparator { - @Override - public int compare(ObjectNodeActivity o1, ObjectNodeActivity o2) { - return o1.object().name().compareTo(o2.object().name()); + private JMenuItem createMenuItem(String label, Runnable action) { + JMenuItem item = new JMenuItem(label); + item.addActionListener(e -> action.run()); + return item; + } + + /** + * Add menu entries (show or hide) for an association menu entry. + */ + private void addAssociationMenuItems(Entry menuEntry, List links, boolean showMode) { + JMenu assocMenu = menuEntry.getValue(); + String key = menuEntry.getKey(); + + String allLabel = showMode ? LABEL_SHOW_ALL : LABEL_HIDE_ALL; + assocMenu.add(createMenuItem(allLabel, () -> { + List matching = links.stream().filter(l -> key.equals(l.association().toString())).toList(); + if (showMode) { + ((NewObjectDiagram) diagram).showLink(matching); + } else { + ((NewObjectDiagram) diagram).hideLink(matching); + } + diagram.repaint(); + })); + + assocMenu.addSeparator(); + + for (MLink link : links) { + if (key.equals(link.association().toString())) { + String label = (showMode ? LABEL_SHOW : LABEL_HIDE) + formatLinkName(link); + assocMenu.add(createMenuItem(label, () -> { + if (showMode) { + ((NewObjectDiagram) diagram).showLink(link); + } else { + ((NewObjectDiagram) diagram).hideLink(link); + } + diagram.repaint(); + })); + } } } + // ObjectNodeActivityComparator removed — not used (S3985) + /** * Method getSubMenuHideObject supplies a list of the sorted objects in the * context menu. which are not hidden. @@ -255,59 +339,51 @@ public JMenu getSubMenuHideObject() { Set visibleObjectNodes = CollectionUtil.filterByType(visibleNodes, ObjectNodeActivity.class); - JMenu subMenuHideObject = new JMenu("Hide objects"); - MenuScroller.setScrollerFor(subMenuHideObject, numOfElems, interval, topFixedCount, bottomFixedCount); + JMenu subMenuHideObject = new JMenu(LABEL_HIDE_OBJECTS); + MenuScroller.setScrollerFor(subMenuHideObject, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); - final JMenuItem hideAllObjects = new JMenuItem("Hide all objects"); + final JMenuItem hideAllObjects = new JMenuItem(LABEL_HIDE_ALL_OBJECTS); hideAllObjects.setEnabled(diagram.getVisibleData().hasNodes()); - hideAllObjects.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - diagram.hideAll(); - diagram.repaint(); - } + hideAllObjects.addActionListener(ev -> { + diagram.hideAll(); + diagram.repaint(); }); subMenuHideObject.add(hideAllObjects); subMenuHideObject.addSeparator(); - TreeSet sortedObjectNodes = new TreeSet(objectComparator); + TreeSet sortedObjectNodes = new TreeSet<>(objectComparator); sortedObjectNodes.addAll(visibleObjectNodes); - Map classMenus = new HashMap(); + Map classMenus = new HashMap<>(); for (ObjectNodeActivity objNode : sortedObjectNodes) { final MClass cls = objNode.cls(); final MObject obj = objNode.object(); - if (!classMenus.containsKey(cls)) { - JMenu subm = new JMenu("Class " + cls.name()); - classMenus.put(cls, subm); - - // Add show all - JMenuItem showAll = new JMenuItem("Hide all"); - showAll.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - diagram.hideObjects(getVisibleObjects(cls)); - diagram.repaint(); - } + JMenu parent = classMenus.computeIfAbsent(cls, k -> { + JMenu subm = new JMenu(LABEL_CLASS_PREFIX + k.name()); + MenuScroller.setScrollerFor(subm, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); + JMenuItem showAll = new JMenuItem(LABEL_HIDE_ALL); + showAll.addActionListener(e -> { + diagram.hideObjects(getVisibleObjects(k)); + diagram.repaint(); }); subm.add(showAll); subm.addSeparator(); - } + return subm; + }); - JMenu parent = classMenus.get(cls); - final JMenuItem hideObject = new JMenuItem("Hide " + obj.name()); - hideObject.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - diagram.hideObject(obj); - diagram.repaint(); - } + final JMenuItem hideObject = new JMenuItem(LABEL_HIDE + obj.name()); + hideObject.addActionListener(ev -> { + diagram.hideObject(obj); + diagram.repaint(); }); parent.add(hideObject); } - List classes = new ArrayList(classMenus.keySet()); + + List classes = new ArrayList<>(classMenus.keySet()); Collections.sort(classes, new MNamedElementComparator()); for (JMenu m : classMenus.values()) { - MenuScroller.setScrollerFor(m, numOfElems, interval, topFixedCount, bottomFixedCount); + MenuScroller.setScrollerFor(m, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); } for (MClass cls : classes) { @@ -324,17 +400,14 @@ public void actionPerformed(ActionEvent ev) { * @return JMenu */ public JMenu getSubMenuHideLinks() { - JMenu subMenuHideAssoc = new JMenu("Hide links"); - MenuScroller.setScrollerFor(subMenuHideAssoc, numOfElems, interval, topFixedCount, bottomFixedCount); + JMenu subMenuHideAssoc = new JMenu(LABEL_HIDE + "links"); + MenuScroller.setScrollerFor(subMenuHideAssoc, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); - final JMenuItem hideAllAssoc = new JMenuItem("Hide all links"); + final JMenuItem hideAllAssoc = new JMenuItem(LABEL_HIDE_ALL_LINKS); hideAllAssoc.setEnabled(!diagram.getVisibleData().getEdges().isEmpty()); - hideAllAssoc.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).hideAllLinks(); - diagram.repaint(); - } + hideAllAssoc.addActionListener(e -> { + ((NewObjectDiagram) diagram).hideAllLinks(); + diagram.repaint(); }); subMenuHideAssoc.add(hideAllAssoc); subMenuHideAssoc.addSeparator(); @@ -345,55 +418,13 @@ public void actionPerformed(ActionEvent e) { final Map associationNames = new TreeMap<>(); final List links = new ArrayList<>(); - for (EdgeBase edge : edges) { + collectAssociationNamesAndLinks(edges, associationNames, links); - if (edge instanceof LinkEdge) { - LinkEdge aEdge = (LinkEdge) edge; - - MLink link = aEdge.getLink(); - if (!links.contains(link)) { - JMenu menu = new JMenu(link.association().toString()); - MenuScroller.setScrollerFor(menu, numOfElems, interval, topFixedCount, bottomFixedCount); - - associationNames.put(link.association().toString(), menu); - links.add(link); - } - } - } + links.sort(linkComparator); for (final Entry menu : associationNames.entrySet()) { subMenuHideAssoc.add(menu.getValue()); - JMenuItem hideAll = new JMenuItem("Hide all"); - hideAll.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - List matching = new ArrayList<>(); - for (MLink link : links) { - if (menu.getKey().equals(link.association().toString())) { - matching.add(link); - } - } - ((NewObjectDiagram) diagram).hideLink(matching); - diagram.repaint(); - } - }); - menu.getValue().add(hideAll); - menu.getValue().addSeparator(); - - Collections.sort(links, linkComparator); - - for (final MLink link : links) { - if (menu.getKey().equals(link.association().toString())) { - - JMenuItem hideLink = new JMenuItem("Hide " + formatLinkName(link)); - hideLink.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - ((NewObjectDiagram) diagram).hideLink(link); - diagram.repaint(); - } - }); - menu.getValue().add(hideLink); - } - } + addAssociationMenuItems(menu, links, false); } return subMenuHideAssoc; } @@ -415,8 +446,8 @@ public String formatLinkName(MLink link) { label.append("("); // if linkobject - if (MLinkObjectImpl.class.isInstance(link)) { - label.append(((MLinkObjectImpl) link).name()); + if (link instanceof MLinkObjectImpl lom) { + label.append(lom.name()); label.append(" : "); } @@ -474,17 +505,14 @@ public String formatLinkName(MLink link) { */ public JMenu getSubMenuShowLinks() { - JMenu subMenuShowLinks = new JMenu("Show links"); - MenuScroller.setScrollerFor(subMenuShowLinks, numOfElems, interval, topFixedCount, bottomFixedCount); + JMenu subMenuShowLinks = new JMenu(LABEL_SHOW + "links"); + MenuScroller.setScrollerFor(subMenuShowLinks, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); - final JMenuItem showAllLinks = new JMenuItem("Show all links"); + final JMenuItem showAllLinks = new JMenuItem(LABEL_SHOW_ALL_LINKS); showAllLinks.setEnabled(!diagram.getHiddenData().getEdges().isEmpty()); - showAllLinks.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).showAllLinks(); - diagram.repaint(); - } + showAllLinks.addActionListener(e -> { + ((NewObjectDiagram) diagram).showAllLinks(); + diagram.repaint(); }); subMenuShowLinks.add(showAllLinks); subMenuShowLinks.addSeparator(); @@ -494,54 +522,13 @@ public void actionPerformed(ActionEvent e) { final Map associationNames = new TreeMap<>(); final List links = new ArrayList<>(); - for (EdgeBase edge : edges) { - - if (edge instanceof LinkEdge) { - LinkEdge aEdge = (LinkEdge) edge; + collectAssociationNamesAndLinks(edges, associationNames, links); - MLink link = aEdge.getLink(); - if (!links.contains(link)) { - JMenu menu = new JMenu(link.association().toString()); - MenuScroller.setScrollerFor(menu, numOfElems, interval, topFixedCount, bottomFixedCount); - - associationNames.put(link.association().toString(), menu); - links.add(link); - } - } - } + links.sort(linkComparator); for (final Entry menu : associationNames.entrySet()) { subMenuShowLinks.add(menu.getValue()); - JMenuItem showAll = new JMenuItem("Show all"); - showAll.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - List matching = new ArrayList<>(); - for (MLink link : links) { - if (menu.getKey().equals(link.association().toString())) { - matching.add(link); - } - } - ((NewObjectDiagram) diagram).showLink(matching); - diagram.repaint(); - } - }); - menu.getValue().add(showAll); - menu.getValue().addSeparator(); - - Collections.sort(links, linkComparator); - - for (final MLink link : links) { - if (menu.getKey().equals(link.association().toString())) { - JMenuItem showLink = new JMenuItem("Show " + formatLinkName(link)); - showLink.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - ((NewObjectDiagram) diagram).showLink(link); - diagram.repaint(); - } - }); - menu.getValue().add(showLink); - } - } + addAssociationMenuItems(menu, links, true); } return subMenuShowLinks; @@ -555,100 +542,62 @@ public void actionPerformed(ActionEvent ev) { */ public JMenu getSubMenuLinksByKind() { JMenu subMenuAssociation = new JMenu("Show/hide links-by-kind"); - MenuScroller.setScrollerFor(subMenuAssociation, numOfElems, interval, topFixedCount, bottomFixedCount); + MenuScroller.setScrollerFor(subMenuAssociation, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); if (!diagram.getVisibleData().getEdges().isEmpty()) { - final JMenuItem hideAllAssoc = new JMenuItem("Hide all links"); - hideAllAssoc.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).hideAllLinks(); - diagram.repaint(); - } + final JMenuItem hideAllAssoc = new JMenuItem(LABEL_HIDE_ALL_LINKS); + hideAllAssoc.addActionListener(e -> { + ((NewObjectDiagram) diagram).hideAllLinks(); + diagram.repaint(); }); subMenuAssociation.add(hideAllAssoc); } if (!diagram.getHiddenData().getEdges().isEmpty()) { - final JMenuItem showAllAssoc = new JMenuItem("Show all links"); - showAllAssoc.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).showAllLinks(); - diagram.repaint(); - } + final JMenuItem showAllAssoc = new JMenuItem(LABEL_SHOW_ALL_LINKS); + showAllAssoc.addActionListener(e -> { + ((NewObjectDiagram) diagram).showAllLinks(); + diagram.repaint(); }); subMenuAssociation.add(showAllAssoc); } subMenuAssociation.addSeparator(); - TreeMap> assocs = ((NewObjectDiagram) diagram).mapLinksToKindOfAssociation(); + Map> assocs = ((NewObjectDiagram) diagram).mapLinksToKindOfAssociation(); for (Map.Entry> a : assocs.entrySet()) { + addLinksByKindEntry(subMenuAssociation, a.getKey(), a.getValue()); + } + return subMenuAssociation; + } - final JMenu assocMenu = new JMenu(a.getKey()); - MenuScroller.setScrollerFor(assocMenu, numOfElems, interval, topFixedCount, bottomFixedCount); - - if (((NewObjectDiagram) diagram).isHidden(a.getValue()) == 1 - || ((NewObjectDiagram) diagram).isHidden(a.getValue()) == 2) { - - JMenuItem hideAllLinksOfAssoc = new JMenuItem("Hide all " + a.getKey()); - hideAllLinksOfAssoc.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).hideLink(a.getValue()); - diagram.repaint(); - } - }); - assocMenu.add(hideAllLinksOfAssoc); - } + private void addLinksByKindEntry(JMenu parentMenu, String key, List assocLinks) { + if (assocLinks == null || assocLinks.isEmpty()) { + return; + } + JMenu assocMenu = new JMenu(key); + MenuScroller.setScrollerFor(assocMenu, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); - if (((NewObjectDiagram) diagram).isHidden(a.getValue()) == 0 - || ((NewObjectDiagram) diagram).isHidden(a.getValue()) == 2) { + List links = new ArrayList<>(assocLinks); + int assocLinkState = ((NewObjectDiagram) diagram).isHidden(links); + if (assocLinkState == 1 || assocLinkState == 2) { + assocMenu.add(createMenuItem(LABEL_SHOW_ALL, () -> ((NewObjectDiagram) diagram).showLink(links))); + } + if (assocLinkState == 0 || assocLinkState == 2) { + assocMenu.add(createMenuItem(LABEL_HIDE_ALL, () -> ((NewObjectDiagram) diagram).hideLink(links))); + } + assocMenu.addSeparator(); - JMenuItem showAllLinksOfAssoc = new JMenuItem("Show all " + a.getKey()); - showAllLinksOfAssoc.addActionListener(new ActionListener() { + links.sort(linkComparator); - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).showLink(a.getValue()); - diagram.repaint(); - } - }); - assocMenu.add(showAllLinksOfAssoc); - } - assocMenu.addSeparator(); - - Collections.sort(a.getValue(), linkComparator); - - for (MLink link : a.getValue()) { - - if (((NewObjectDiagram) diagram).isHidden(link)) { - JMenuItem linkItem = new JMenuItem("Show " + formatLinkName(link)); - linkItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).showLink(link); - diagram.repaint(); - } - }); - assocMenu.add(linkItem); - } else { - JMenuItem linkItem = new JMenuItem("Hide " + formatLinkName(link)); - linkItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - ((NewObjectDiagram) diagram).hideLink(link); - diagram.repaint(); - } - }); - assocMenu.add(linkItem); - } + for (MLink link : links) { + if (((NewObjectDiagram) diagram).isHidden(link)) { + assocMenu.add(createMenuItem(LABEL_SHOW + formatLinkName(link), () -> ((NewObjectDiagram) diagram).showLink(link))); + } else { + assocMenu.add(createMenuItem(LABEL_HIDE + formatLinkName(link), () -> ((NewObjectDiagram) diagram).hideLink(link))); } - subMenuAssociation.add(assocMenu); } - return subMenuAssociation; + parentMenu.add(assocMenu); } /** @@ -658,70 +607,59 @@ public void actionPerformed(ActionEvent e) { * @return JMenu */ public JMenu getSubMenuShowObject() { - JMenu subMenuShowObject = new JMenu("Show objects"); - MenuScroller.setScrollerFor(subMenuShowObject, numOfElems, interval, topFixedCount, bottomFixedCount); + JMenu subMenuShowObject = new JMenu(LABEL_SHOW + "objects"); + MenuScroller.setScrollerFor(subMenuShowObject, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); Set hiddenNodes = diagram.getHiddenNodes(); Set hiddenObjectNodes = CollectionUtil.filterByType(hiddenNodes, ObjectNodeActivity.class); - final JMenuItem showAllObjects = new JMenuItem("Show all hidden objects"); + final JMenuItem showAllObjects = new JMenuItem(LABEL_SHOW_ALL_HIDDEN_OBJECTS); showAllObjects.setEnabled(!hiddenObjectNodes.isEmpty()); - showAllObjects.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - diagram.showAll(); - diagram.repaint(); - } + showAllObjects.addActionListener(ev -> { + diagram.showAll(); + diagram.repaint(); }); subMenuShowObject.add(showAllObjects); subMenuShowObject.addSeparator(); - TreeSet sortedNodes = new TreeSet(objectComparator); + TreeSet sortedNodes = new TreeSet<>(objectComparator); sortedNodes.addAll(hiddenObjectNodes); - Map classMenus = new HashMap(); + Map classMenus = new HashMap<>(); for (ObjectNodeActivity node : sortedNodes) { final ObjectNodeActivity objNode = node; final MClass cls = objNode.cls(); final MObject obj = objNode.object(); - if (!classMenus.containsKey(cls)) { - JMenu subm = new JMenu("Class " + cls.name()); - MenuScroller.setScrollerFor(subm, numOfElems, interval, topFixedCount, bottomFixedCount); - - classMenus.put(cls, subm); + JMenu parent = classMenus.computeIfAbsent(cls, k -> { + JMenu subm = new JMenu(LABEL_CLASS_PREFIX + k.name()); + MenuScroller.setScrollerFor(subm, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); - // Add show all - JMenuItem showAll = new JMenuItem("Show all"); - showAll.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - diagram.showObjects(getHiddenObjects(cls)); - diagram.repaint(); - } + JMenuItem showAll = new JMenuItem(LABEL_SHOW_ALL); + showAll.addActionListener(e -> { + diagram.showObjects(getHiddenObjects(k)); + diagram.repaint(); }); subm.add(showAll); subm.addSeparator(); - } - - JMenu parent = classMenus.get(cls); + return subm; + }); - final JMenuItem showObject = new JMenuItem("Show " + obj.name()); - showObject.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - diagram.showObject(obj); - diagram.repaint(); - } + final JMenuItem showObject = new JMenuItem(LABEL_SHOW + obj.name()); + showObject.addActionListener(ev -> { + diagram.showObject(obj); + diagram.repaint(); }); parent.add(showObject); } - List classes = new ArrayList(classMenus.keySet()); + List classes = new ArrayList<>(classMenus.keySet()); Collections.sort(classes, new MNamedElementComparator()); for (JMenu m : classMenus.values()) { - MenuScroller.setScrollerFor(m, numOfElems, interval, topFixedCount, bottomFixedCount); + MenuScroller.setScrollerFor(m, NUM_OF_ELEMS, INTERVAL, TOP_FIXED_COUNT, BOTTOM_FIXED_COUNT); } for (MClass cls : classes) { @@ -738,16 +676,13 @@ public void actionPerformed(ActionEvent ev) { * @return */ public Set getDisplayedObjectsForClasses(Set allClasses) { - Set objects = new HashSet(); + Set objects = new HashSet<>(); Iterator itobject = diagram.getVisibleData().getNodes().iterator(); while (itobject.hasNext()) { Object node = itobject.next(); - if (node instanceof ObjectNodeActivity) { - MObject mobj = ((ObjectNodeActivity) node).object(); - if (allClasses.contains(mobj.cls())) { - objects.add(mobj); - } + if (node instanceof ObjectNodeActivity ona && allClasses.contains(ona.object().cls())) { + objects.add(ona.object()); } } @@ -761,14 +696,11 @@ public Set getDisplayedObjectsForClasses(Set allClasses) { * @return */ public Set getVisibleObjects(MClass cls) { - Set objects = new HashSet(); + Set objects = new HashSet<>(); for (PlaceableNode node : diagram.getVisibleData().getNodes()) { - if (node instanceof ObjectNodeActivity) { - MObject mobj = ((ObjectNodeActivity) node).object(); - if (cls.equals(mobj.cls())) { - objects.add(mobj); - } + if (node instanceof ObjectNodeActivity ona && cls.equals(ona.object().cls())) { + objects.add(ona.object()); } } @@ -776,26 +708,19 @@ public Set getVisibleObjects(MClass cls) { } public Set getCropHideObjects(Set classes) { - Set classesToHide = new HashSet(); + Set classesToHide = new HashSet<>(); Iterator itg = diagram.getGraph().iterator(); while (itg.hasNext()) { Object node = itg.next(); - if (node instanceof ObjectNodeActivity) { - MObject mobj = ((ObjectNodeActivity) node).object(); - if (!classes.contains(mobj.cls())) { - classesToHide.add(mobj.cls()); - } + if (node instanceof ObjectNodeActivity ona && !classes.contains(ona.object().cls())) { + classesToHide.add(ona.object().cls()); } } for (Object node : diagram.getHiddenNodes()) { - if (node instanceof MObject) { - MObject mobj = (MObject) (node); - - if (!classes.contains(mobj.cls())) { - classesToHide.add(mobj.cls()); - } + if (node instanceof MObject mobj && !classes.contains(mobj.cls())) { + classesToHide.add(mobj.cls()); } } @@ -803,14 +728,11 @@ public Set getCropHideObjects(Set classes) { } public Set getHiddenObjects(Set classes) { - final Set objects = new HashSet(); + final Set objects = new HashSet<>(); for (PlaceableNode node : diagram.getHiddenNodes()) { - if (node instanceof ObjectNodeActivity) { - ObjectNodeActivity mobj = (ObjectNodeActivity) (node); - if (classes.contains(mobj.cls())) { - objects.add(mobj.object()); - } + if (node instanceof ObjectNodeActivity ona && classes.contains(ona.cls())) { + objects.add(ona.object()); } } @@ -818,14 +740,11 @@ public Set getHiddenObjects(Set classes) { } public Set getHiddenObjects(MClass cls) { - final Set objects = new HashSet(); + final Set objects = new HashSet<>(); for (PlaceableNode node : diagram.getHiddenNodes()) { - if (node instanceof ObjectNodeActivity) { - ObjectNodeActivity mobj = (ObjectNodeActivity) (node); - if (mobj.cls().equals(cls)) { - objects.add(mobj.object()); - } + if (node instanceof ObjectNodeActivity ona && ona.cls().equals(cls)) { + objects.add(ona.object()); } } From 6686ca1a2a55b01f2059afd9a871665738e714fa Mon Sep 17 00:00:00 2001 From: ahmed Date: Wed, 15 Apr 2026 17:40:41 +0200 Subject: [PATCH 34/34] - Added detailed documentation to give a overview on the MVP-Solution for objectdiagram - Refinements in Interfaces --- documentation/objectdiagram-mvp-migration.md | 178 ++++++++++++++++++ .../objectdiagram/ContextMenuProvider.java | 12 ++ .../DefaultContextMenuProvider.java | 2 +- .../objectdiagram/IObjectDiagramView.java | 11 -- .../NewObjectDiagramPresenter.java | 2 +- .../NewObjectDiagramPresenterImpl.java | 2 +- .../ShowHideCropMenuBuilder.java | 16 -- 7 files changed, 193 insertions(+), 30 deletions(-) create mode 100644 documentation/objectdiagram-mvp-migration.md delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java delete mode 100644 use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java diff --git a/documentation/objectdiagram-mvp-migration.md b/documentation/objectdiagram-mvp-migration.md new file mode 100644 index 000000000..1976da504 --- /dev/null +++ b/documentation/objectdiagram-mvp-migration.md @@ -0,0 +1,178 @@ +# Object Diagram — MVP Migration Plan + +This document describes a practical, incremental migration path from the current larger monolithic object-diagram implementation toward a clean MVP (Model–View–Presenter) architecture. It focuses on the `org.tzi.use.gui.views.diagrams.objectdiagram` package and outlines which classes / interfaces to keep, which to simplify or remove, and how to reduce class count while preserving compatibility. + +Goals +- Reduce unnecessary classes and duplicate interfaces. +- Make responsibilities explicit and small (Presenter vs View vs Application Controller vs Model). +- Keep backward compatibility where possible; perform breaking removals only in major releases. +- Improve testability and reduce cognitive complexity of large classes (especially `DefaultContextMenuProvider` and `NewObjectDiagram`). + +Scope +- Files directly analysed: the `objectdiagram` package in `use-gui` (see package contents). +- Focus on API shapes (interfaces) and the primary presenter/view boundaries. + +Summary of the current state +- View / UI classes: `NewObjectDiagram`, `NewObjectDiagramView`, `DiagramCanvas` (placeholder) +- Presenter: `NewObjectDiagramPresenter` + `NewObjectDiagramPresenterImpl` +- Model: `NewObjectDiagramModel` +- Controllers / Bridges: `ApplicationController`, `DefaultApplicationController` +- Menu builder: `ContextMenuProvider`, `DefaultContextMenuProvider` (very large) +- Placement persistence: `PlacementRepository`, `DefaultPlacementRepository` +- `ShowHideCropMenuBuilder` moved into `ContextMenuProvider` as nested interface (deprecated alias preserved) + +Design principles and decisions +- Keep Presenter small and focused: it should translate UI actions into domain operations and update the View via `ObjectDiagramInteractor`. +- `ApplicationController` is the boundary for executing domain operations that affect the `MSystem`; keep it separate from `ObjectDiagramInteractor` (which manipulates the UI/graph only). +- The `ContextMenuProvider` is a UI-building component. Large monolithic providers should be split into small builders (e.g. InsertItemsBuilder, LinksByKindBuilder, HideShowBuilder). +- Avoid duplicate small view interfaces — keep `NewObjectDiagramUI` as the canonical minimal UI contract. + +Proposed target architecture (MVP simplified) +- Model: `NewObjectDiagramModel` — holds application state (visible/hidden data, selection, caches). +- Presenter: `NewObjectDiagramPresenter` (interface) + `NewObjectDiagramPresenterImpl` (impl) — subscribes to system events, coordinates model & view. +- View / Interactor: `ObjectDiagramInteractor` — operations the presenter can invoke on the view. +- UI contract: `NewObjectDiagramUI` — minimal UI surface for hosting view. +- Application boundary: `ApplicationController` — executes domain-level commands against `MSystem`. +- Menu factories: `ContextMenuProvider` and small builder components. + +High-level Component Diagram (PlantUML) + +```plantuml +@startuml +package "objectdiagram" { + [NewObjectDiagramView] --> [NewObjectDiagram] : contains + [NewObjectDiagram] ..> [NewObjectDiagramModel] : uses + [NewObjectDiagramPresenterImpl] --> [NewObjectDiagramModel] : reads/writes + [NewObjectDiagramPresenterImpl] --> [ObjectDiagramInteractor] : updates view + [NewObjectDiagramPresenterImpl] --> [ApplicationController] : executes commands + [ContextMenuProvider] --> [NewObjectDiagramPresenterImpl] : builds menus +} +@enduml +``` + +## Complete class & interface diagram + +Below is a complete PlantUML diagram that lists the main classes and interfaces in the +`org.tzi.use.gui.views.diagrams.objectdiagram` package and their primary relationships +(implementation, composition and usage). Use this diagram to get a single-picture overview +of responsibilities and dependencies. + +```plantuml +@startuml +skinparam classAttributeIconSize 0 + +package "org.tzi.use.gui.views.diagrams.objectdiagram" { + + interface NewObjectDiagramPresenter + class NewObjectDiagramPresenterImpl + NewObjectDiagramPresenterImpl ..|> NewObjectDiagramPresenter : implements + + interface ApplicationController + class DefaultApplicationController + DefaultApplicationController ..|> ApplicationController : implements + + interface ContextMenuProvider + class DefaultContextMenuProvider + DefaultContextMenuProvider ..|> ContextMenuProvider : implements + ContextMenuProvider .. ShowHideCropMenuBuilder : contains + interface ShowHideCropMenuBuilder + + interface PlacementRepository + class DefaultPlacementRepository + DefaultPlacementRepository ..|> PlacementRepository : implements + + interface ObjectDiagramInteractor + class NewObjectDiagram + NewObjectDiagram ..|> ObjectDiagramInteractor : implements + NewObjectDiagram "1" *-- "1" NewObjectDiagram::ObjectDiagramData : contains + + class NewObjectDiagramView + NewObjectDiagramView ..|> NewObjectDiagramUI : implements + NewObjectDiagramView ..|> DiagramContext : implements + NewObjectDiagramView "1" *-- "1" NewObjectDiagram : contains + + interface NewObjectDiagramUI + interface IObjectDiagramView + IObjectDiagramView ..|> NewObjectDiagramUI : "deprecated alias" + class DiagramCanvas + DiagramCanvas ..|> NewObjectDiagramUI : implements + interface DiagramContext + + class NewObjectDiagramModel + class ObjectDiagramModel + class ObjectNode + + class PresenterFileLogger + class PresenterFileLoggerTestMain + class QualifierInputView + class ObjDiagramOptions + + ' high-level usage edges + NewObjectDiagramPresenterImpl --> NewObjectDiagramModel : reads/writes + NewObjectDiagramPresenterImpl --> ObjectDiagramInteractor : updates view + NewObjectDiagramPresenterImpl --> ApplicationController : delegates commands + NewObjectDiagramPresenterImpl --> ContextMenuProvider : asks to build menu + NewObjectDiagramPresenterImpl --> PlacementRepository : persist/restore layout + + NewObjectDiagram --> NewObjectDiagramModel : uses + NewObjectDiagram --> ObjectNode : creates/owns + NewObjectDiagram --> NewObjectDiagramPresenterImpl : wired-to (optional) + + NewObjectDiagramView --> NewObjectDiagram : contains (UI) + DefaultContextMenuProvider --> NewObjectDiagram : queries visible/hidden data + + ' mark deprecated / aliases + IObjectDiagramView : <> + ShowHideCropMenuBuilder : <> + +} + +@enduml +``` + +Sequence Diagram: User opens context menu & deletes a link + +```plantuml +@startuml +actor User +User -> NewObjectDiagram : right-click +NewObjectDiagram -> ContextMenuProvider : request menu +ContextMenuProvider -> NewObjectDiagramPresenterImpl : onPopupMenuPrepared(menu,...) +User -> ContextMenu : click "Delete link" +ContextMenu -> NewObjectDiagramPresenterImpl : onDeleteLink(link) +NewObjectDiagramPresenterImpl -> ApplicationController : deleteLink(link) +ApplicationController -> MSystem : execute(MLinkDeletionStatement) +NewObjectDiagramPresenterImpl -> ObjectDiagramInteractor : clearSelection() +NewObjectDiagramPresenterImpl -> NewObjectDiagram : refresh +@enduml +``` + +## Rationale for the refactoring (why these changes make sense) + +This refactoring was performed to make the codebase more maintainable, testable and easier to understand over the long term. The main reasons and the direct impact on our implementation are summarized below. + +- Separation of concerns: + - Before: UI logic, placement/persistence logic and domain commands were mixed inside the same classes (for example `NewObjectDiagram`, `DefaultContextMenuProvider`). + - After: `ApplicationController` is responsible for domain/system commands, `ObjectDiagramInteractor` provides view/rendering APIs only, and `NewObjectDiagramModel` holds diagram state. This reduces the risk that UI changes accidentally affect domain behavior. + +- Reduced duplication and improved cohesion: + - Duplicate small interfaces were consolidated (for example `IObjectDiagramView` is now an alias of `NewObjectDiagramUI`) and the `ShowHideCropMenuBuilder` was grouped under `ContextMenuProvider`. Related concepts are now collected in a single place. + +- Safe, incremental migration: + - Instead of deleting types immediately we introduced deprecations (for example in `DiagramContext`) and kept compatibility aliases. This allows downstream code to migrate in small steps without breaking the build. + +- Better testability and lower cognitive load: + - By splitting large classes into focused builders and utilities we reduce per-class cognitive complexity which makes unit testing easier and quicker to write. + +- Preparing for quality tools (SonarQube): + - Many Sonar issues are caused by duplicated code, public static fields, overly long methods or high cognitive complexity. The applied changes are targeted at reducing those metrics. + +Implemented, concrete changes and refinements + +- `ShowHideCropMenuBuilder` was moved into `ContextMenuProvider` as a nested interface; the old file was deleted. +- `IObjectDiagramView` was consolidated to `NewObjectDiagramUI` and 'IObjectDiagramView' is now deleted. +- `DiagramContext` now marks application-level command methods as deprecated and points callers to `ApplicationController`. +- `NewObjectDiagramPresenter` and `NewObjectDiagramPresenterImpl` were updated to use the relocated nested builder type. + +These steps are intentionally small to preserve compatibility while steering the architecture towards a clear MVP structure. + diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java index e5cc1b3bd..31c87ae10 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ContextMenuProvider.java @@ -17,4 +17,16 @@ void enhanceMenu(JPopupMenu popupMenu, Set selectedObjects, Set selectedLinks, Set selectedAssocObjects); + + /** + * Helper interface to contribute show/hide/crop submenu entries without + * exposing Swing types to the presenter. This logically belongs to the + * context menu provider since it is used to build parts of the context + * menu; keeping it nested helps grouping related APIs. + */ + interface ShowHideCropMenuBuilder { + void addSelectedObjectPathView(Set selectedObjects); + void addSelectionWithOCLViewAction(); + void addSelectionObjectView(); + } } diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java index f789d0bd7..a955ed01f 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/DefaultContextMenuProvider.java @@ -651,7 +651,7 @@ private JMenu buildShowHideCropMenu(ObjectDiagramInteractor diagram, ObjectSelection selection = diagram != null ? diagram.getObjectSelection() : null; - presenter.onBuildShowHideCropMenu(new ShowHideCropMenuBuilder() { + presenter.onBuildShowHideCropMenu(new ContextMenuProvider.ShowHideCropMenuBuilder() { @Override diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java deleted file mode 100644 index 954399cd7..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/IObjectDiagramView.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import javax.swing.JPopupMenu; - -/** Minimal view contract for the object diagram MVP. */ -public interface IObjectDiagramView { - void showPopup(JPopupMenu popup); - void refresh(); - void setStatus(String status); -} - diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java index ade29ba09..46a9b661e 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenter.java @@ -47,7 +47,7 @@ default void onPopupMenuPrepared(JPopupMenu menu, Set selectedAssocObjects) {} default void onStatusMessage(String status) {} - default void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set selectedObjects) {} + default void onBuildShowHideCropMenu(ContextMenuProvider.ShowHideCropMenuBuilder builder, Set selectedObjects) {} default void onInsertLink(MAssociation association, List participants) {} default void onDeleteLink(MLink link) {} diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java index 0ec19823b..0f3a1c2c3 100644 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java +++ b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/NewObjectDiagramPresenterImpl.java @@ -431,7 +431,7 @@ public void onStatusMessage(String status) { @Override - public void onBuildShowHideCropMenu(ShowHideCropMenuBuilder builder, Set selectedObjects) { + public void onBuildShowHideCropMenu(ContextMenuProvider.ShowHideCropMenuBuilder builder, Set selectedObjects) { log("onBuildShowHideCropMenu", "selectedObjects=" + sizeOf(selectedObjects)); diff --git a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java b/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java deleted file mode 100644 index e624d2201..000000000 --- a/use-gui/src/main/java/org/tzi/use/gui/views/diagrams/objectdiagram/ShowHideCropMenuBuilder.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.tzi.use.gui.views.diagrams.objectdiagram; - -import org.tzi.use.uml.sys.MObject; - -import java.util.Set; - -/** - * Package-local helper used by the presenter hook to contribute the - * Show/hide/crop submenu entries without exposing Swing types to the interface. - */ -public interface ShowHideCropMenuBuilder { - void addSelectedObjectPathView(Set selectedObjects); - void addSelectionWithOCLViewAction(); - void addSelectionObjectView(); -} -