From 2d4c372ab463d8ee972c837c247aeaadee040331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20God=C3=B3y?= Date: Sat, 8 Jul 2017 16:17:51 -0300 Subject: [PATCH] Updated project structure --- .gitignore | 50 +- GraphDrawingTheory/.classpath | 40 - GraphDrawingTheory/.gitignore | 44 - GraphDrawingTheory/.project | 23 - GraphDrawingTheory/pom.xml | 140 +- .../graph/algorithm/AlgorithmExecutor.java | 0 .../java}/graph/algorithm/ExecuteResult.java | 0 .../algorithm/cycles/JohnsonSimpleCycles.java | 8 +- .../algorithm/cycles/PatonSimpleCycles.java | 8 +- .../algorithm/cycles/SimpleCyclesFinder.java | 4 +- .../cycles/SimpleUndirectedCyclesFinder.java | 8 +- .../connectivity/PlanarAugmentation.java | 2 +- .../connectivity/PlanarAugmentationLabel.java | 2 +- .../algorithms/drawing/ConvexDrawing.java | 0 .../drawing/CyclicSymmetricGraphDrawing.java | 10 +- .../drawing/PlanarConvexEmbedding.java | 0 .../algorithms/drawing/TutteEmbedding.java | 12 +- .../drawing/VisibilityRepresentation.java | 15 +- .../interlacement/InterlacementGraphEdge.java | 0 .../InterlacementGraphVertex.java | 4 +- .../algorithms/lrpartition/LRPartition.java | 10 +- .../lrpartition/LRPartitionEdge.java | 6 +- .../lrpartition/LRPartitionSet.java | 8 +- .../algorithms/numbering/DFSNumbering.java | 8 +- .../graph/algorithms/numbering/Numbering.java | 4 +- .../algorithms/numbering/STNumbering.java | 0 .../planarity/BoyerMyrvoldPlanarity.java | 18 +- .../graph/algorithms/planarity/Embedding.java | 0 .../planarity/FraysseixMendezPlanarity.java | 8 +- .../planarity/MaximumPlanaritySubgraph.java | 6 +- .../algorithms/planarity/PQTreePlanarity.java | 0 .../algorithms/planarity/PlanarEmbedding.java | 0 .../algorithms/planarity/PlanarFaces.java | 0 .../planarity/PlanarityTestingAlgorithm.java | 0 .../planarity/dual/DualGraphEdge.java | 0 .../planarity/dual/DualGraphVertex.java | 0 .../planarity/dual/STDualGraph.java | 6 +- .../java}/graph/drawing/Drawing.java | 6 +- .../{ => main/java}/graph/elements/Edge.java | 0 .../java}/graph/elements/EdgeDirection.java | 0 .../{ => main/java}/graph/elements/Graph.java | 0 .../{ => main/java}/graph/elements/Path.java | 0 .../java}/graph/elements/Vertex.java | 0 .../elements/VertexDegreeComparator.java | 0 .../java}/graph/elements/impl/GraphEdge.java | 0 .../graph/elements/impl/GraphVertex.java | 0 .../java}/graph/enumerations/Direction.java | 0 .../exception/CannotBeAppliedException.java | 0 .../java}/graph/exception/DSLException.java | 0 .../graph/exception/NotPlanarException.java | 0 .../graph/layout/AbstractJGraphXLayouter.java | 10 +- .../graph/layout/AbstractJungLayouter.java | 4 +- .../java}/graph/layout/AbstractLayouter.java | 0 .../graph/layout/AbstractPrefuseLayouter.java | 9 +- .../java}/graph/layout/AestheticCriteria.java | 0 .../layout/DefaultGraphLayoutProperties.java | 0 .../graph/layout/GraphLayoutProperties.java | 0 .../graph/layout/LayoutAestheticMap.java | 0 .../java}/graph/layout/LayoutAlgorithms.java | 0 .../java}/graph/layout/Layouter.java | 0 .../java}/graph/layout/LayouterFactory.java | 0 .../java}/graph/layout/PropertyEnums.java | 0 .../automatic/AutomaticPropertiesLayout.java | 0 .../graph/layout/automatic/LayoutPicker.java | 0 .../java}/graph/layout/box/BoxLayouter.java | 8 +- .../graph/layout/circle/CircleLayouter.java | 8 +- .../circle/CircleWithCenterLayouter.java | 4 +- .../java}/graph/layout/dsl/DSLLayouter.java | 14 +- .../AbstractForceDirectedLayouter.java | 0 .../layout/force/directed/DAGLayouter.java | 0 .../directed/FruchtermanReingoldLayouter.java | 0 .../force/directed/KamadaKawaiLayouter.java | 0 .../PrefuseForceDirectedLayouter.java | 0 .../layout/force/directed/SpringLayouter.java | 0 .../organic/JGraphFastorganicLayouter.java | 0 .../organic/JGraphHierarchicalLayouter.java | 4 +- .../layout/organic/JGraphOrganicLayouter.java | 0 .../layout/organic/JungISOMLayouter.java | 0 .../layout/orthogonal/EntryDirection.java | 0 .../orthogonal/OrthogonalConnector.java | 4 +- .../VisibilityRepresentationLayout.java | 0 .../layout/router/OrthogonalEdgeRouter.java | 0 .../layout/straight/line/ConvexLayouter.java | 6 +- .../layout/straight/line/TutteLayouter.java | 8 +- .../symmetric/SymmetricCircleLayouter.java | 12 +- .../layout/symmetric/SymmetricLayouter.java | 4 +- .../layout/tree/JGraphCompactTreeLayout.java | 0 .../graph/layout/tree/JungTreeLayouter.java | 0 .../layout/tree/PrefuseBalloonLayouter.java | 0 .../tree/PrefuseNodeLinkTreeLayouter.java | 2 +- .../tree/PrefuseRadialTreeLayouter.java | 2 +- .../graph/layout/tree/RadialTreeLayouter.java | 0 .../graph/layout/util/PositionAction.java | 0 .../src/{ => main/java}/graph/math/Calc.java | 0 .../java}/graph/math/CircleLayoutCalc.java | 4 +- .../java}/graph/math/CramersRule.java | 0 .../graph/math/CzekanovskiDiceDistance.java | 8 +- .../java}/graph/math/GramSchmidt.java | 0 .../src/{ => main/java}/graph/math/Line.java | 0 .../{ => main/java}/graph/math/Matrix.java | 0 .../java}/graph/math/MatrixUtil.java | 0 .../{ => main/java}/graph/math/Triangle.java | 0 .../graph/operations/GraphOperations.java | 6 +- .../graph/ordering/CanonicalOrdering.java | 0 .../graph/ordering/TopologicalOrdering.java | 0 .../graph/ordering/circular/Circular.java | 12 +- .../graph/ordering/circular/GraphCopy.java | 6 +- .../ordering/circular/TriangulatedEdge.java | 0 .../java}/graph/properties/Bipartite.java | 8 +- .../graph/properties/GraphProperties.java | 0 .../graph/properties/components/Block.java | 0 .../properties/components/Component.java | 6 +- .../HopcroftTarjanSplitComponent.java | 0 .../properties/components/SplitComponent.java | 0 .../properties/components/SplitPair.java | 0 .../SplitTriconnectedComponentType.java | 0 .../splitting/AlgorithmErrorException.java | 0 .../splitting/BiconnectedSplitting.java | 8 +- .../splitting/HopcroftTarjanSplitting.java | 14 +- .../properties/splitting/SeparationPair.java | 0 .../splitting/SeparationPairSplitting.java | 12 +- .../graph/properties/splitting/Splitting.java | 0 .../graph/properties/splitting/Triple.java | 0 .../graph/symmetry/CyclicPermutation.java | 4 +- .../graph/symmetry/DeFrayseeixHeuristic.java | 15 +- .../java}/graph/symmetry/Permutation.java | 0 .../graph/symmetry/PermutationAnalyzator.java | 10 +- .../graph/symmetry/PermutationCycle.java | 4 +- .../graph/symmetry/PermutationGroup.java | 0 .../symmetry/nauty/BinaryRepresentation.java | 4 +- .../nauty/McKayGraphLabelingAlgorithm.java | 12 +- .../symmetry/nauty/OrderedPartition.java | 4 +- .../graph/symmetry/nauty/SearchTree.java | 4 +- .../graph/symmetry/nauty/SearchTreeNode.java | 4 +- .../graph/traversal/DFSTreeTraversal.java | 0 .../graph/traversal/DijkstraAlgorithm.java | 12 +- .../java}/graph/traversal/GraphTraversal.java | 0 .../java}/graph/traversal/TraversalUtil.java | 0 .../java}/graph/tree/bc/BCNodeType.java | 0 .../{ => main/java}/graph/tree/bc/BCTree.java | 0 .../java}/graph/tree/bc/BCTreeEdge.java | 0 .../java}/graph/tree/bc/BCTreeNode.java | 0 .../java}/graph/tree/binary/BinaryTree.java | 10 +- .../graph/tree/binary/BinaryTreeNode.java | 0 .../java}/graph/tree/pq/PQNodeLabel.java | 0 .../java}/graph/tree/pq/PQNodeMark.java | 0 .../java}/graph/tree/pq/PQNodeOrderValid.java | 0 .../java}/graph/tree/pq/PQNodeType.java | 0 .../{ => main/java}/graph/tree/pq/PQTree.java | 0 .../java}/graph/tree/pq/PQTreeEdge.java | 0 .../java}/graph/tree/pq/PQTreeNode.java | 0 .../java}/graph/tree/pq/PQTreeReduction.java | 6 +- .../java}/graph/tree/spqr/AbstractTree.java | 0 .../java}/graph/tree/spqr/NodeType.java | 0 .../java}/graph/tree/spqr/ProtoSPQRTree.java | 0 .../java}/graph/tree/spqr/SPQRTree.java | 0 .../java}/graph/tree/spqr/SPQRTreeNode.java | 8 +- .../java}/graph/tree/spqr/Skeleton.java | 0 .../graph/tree/spqr/TreeEdgeWithContent.java | 0 .../{ => main/java}/graph/trees/DFSTree.java | 12 +- .../src/{ => main/java}/graph/util/Pair.java | 0 .../src/{ => main/java}/graph/util/Util.java | 8 +- .../src/{ => main/resources}/log4j.properties | 0 .../graph/test/algorithms/GraphTestCase.java | 8 +- .../graph/test/algorithms/TestDFSTree.java | 9 +- .../graph/test/algorithms/TestDijkstra.java | 6 +- .../test/algorithms/TestLRPartitioning.java | 14 +- .../java}/graph/test/elements/TestEdge.java | 0 .../java}/graph/test/elements/TestVertex.java | 4 +- .../test/graph/properties/TestGraph.java | 4 +- .../test/graph/properties/TestSplitting.java | 9 +- .../graph/test/layout/LayoutsSpeedTest.java | 6 - .../test/operations/TestGraphOperations.java | 11 +- .../planarity/BoyerMyrvoldPlanarityTest.java | 5 +- .../graph/test/planarity/TestPlanarity.java | 0 .../graph/test/symmetry/GramSchmidtTest.java | 5 +- .../java}/graph/test/tree/TestBCTree.java | 4 +- .../test/java}/graph/test/tree/TestSPQR.java | 4 +- GraphDrawingTheory/target/.gitignore | 1 - GraphEditor/.classpath | 17 - GraphEditor/.project | 23 - GraphEditor/pom.xml | 90 +- .../gui/actions/main/frame/ExitAction.java | 2 +- .../gui/actions/main/frame/LoadAction.java | 10 +- .../actions/main/frame/NewGraphAction.java | 6 +- .../gui/actions/main/frame/SaveAction.java | 8 +- .../gui/actions/palette/AddVertexAction.java | 6 +- .../gui/actions/palette/LayoutAction.java | 16 +- .../java}/gui/actions/palette/LinkAction.java | 4 +- .../gui/actions/palette/SelectAction.java | 4 +- .../java}/gui/actions/toolbar/RedoAction.java | 6 +- .../gui/actions/toolbar/RemoveAction.java | 14 +- .../java}/gui/actions/toolbar/UndoAction.java | 6 +- .../java/gui/app/Application.java} | 2 +- .../java}/gui/command/panel/CommandPanel.java | 25 +- .../java}/gui/commands/AddElementCommand.java | 0 .../{ => main/java}/gui/commands/Command.java | 0 .../java}/gui/commands/CommandExecutor.java | 0 .../java}/gui/commands/MoveCommand.java | 8 +- .../java}/gui/commands/RemoveCommand.java | 6 +- .../gui/components/JDigitsTextField.java | 0 .../gui/components/JDoubleTextField.java | 0 .../java}/gui/components/NumberFilter.java | 0 .../java}/gui/components/TypeComponents.java | 0 .../java}/gui/dialogs/LayoutDialog.java | 13 +- .../java}/gui/main/frame/ElementsEnum.java | 0 .../java}/gui/main/frame/MainFrame.java | 121 +- .../{ => main/java}/gui/model/GraphEdge.java | 4 +- .../java}/gui/model/GraphElement.java | 0 .../{ => main/java}/gui/model/GraphModel.java | 6 +- .../java}/gui/model/GraphVertex.java | 4 +- .../java}/gui/model/IGraphElement.java | 0 .../java}/gui/model/SelectionModel.java | 4 +- .../layout/HierarchicalLayoutPanel.java | 6 +- .../gui/panels/layout/LayoutPanelFactory.java | 6 +- .../panels/layout/LayoutPropertyPanel.java | 11 +- .../layout/NodeLinkTreeLayoutPanel.java | 6 +- .../panels/layout/SymmetricLayoutPanel.java | 10 +- .../gui/properties/EdgePropertiesPanel.java | 7 +- .../properties/GraphModelPropertiesPanel.java | 7 +- .../gui/properties/PropertiesFactory.java | 8 +- .../java}/gui/properties/PropertiesPanel.java | 4 +- .../gui/properties/VertexPropertiesPanel.java | 7 +- .../{ => main/java}/gui/state/AddState.java | 8 +- .../java}/gui/state/LassoSelectState.java | 4 +- .../{ => main/java}/gui/state/LinkState.java | 14 +- .../{ => main/java}/gui/state/MoveState.java | 14 +- .../java}/gui/state/SelectState.java | 6 +- .../src/{ => main/java}/gui/state/State.java | 6 +- .../src/{ => main/java}/gui/util/GuiUtil.java | 4 +- .../{ => main/java}/gui/util/StatusBar.java | 0 .../{ => main/java}/gui/view/GraphView.java | 32 +- .../java}/gui/view/painters/EdgePainter.java | 8 +- .../gui/view/painters/IElementPainter.java | 0 .../java}/gui/view/painters/PaintingUtil.java | 0 .../gui/view/painters/VertexPainter.java | 4 +- .../icons}/edit-icon-png-16x16-540.png | Bin .../resources/icons}/exit.png | Bin .../resources/icons}/load.png | Bin .../resources/icons}/new.png | Bin .../resources/icons}/newundo_largeimage_1.png | Bin .../resources/icons}/redo.png | Bin .../resources/icons}/remove.png | Bin .../resources/icons}/save.png | Bin .../resources/icons}/undo.png | Bin .../test_graphs/23queenstourgraph.graph | 0 .../resources}/test_graphs/33fangraph.graph | 0 .../resources}/test_graphs/6graph114.graph | 0 .../test/resources}/test_graphs/convex1.graph | 0 .../test/resources}/test_graphs/convex2.graph | 0 .../test/resources}/test_graphs/convex3.graph | 0 .../resources}/test_graphs/convex3_1.graph | 0 .../resources}/test_graphs/convex3_2.graph | 0 .../test/resources}/test_graphs/convex4.graph | 0 .../test/resources}/test_graphs/convex5.graph | 0 .../test/resources}/test_graphs/convex6.graph | 0 .../test/resources}/test_graphs/convex7.graph | 0 .../resources}/test_graphs/pentatope.graph | 0 .../test_graphs/planarfacestest1.graph | 0 .../resources}/test_graphs/pqembedding.graph | 0 .../resources}/test_graphs/pqtreeplanar.graph | 0 .../separations pair paper graph.graph | 0 .../test_graphs/triconnectivity test.graph | 0 .../test_graphs/utility graph.graph | 0 .../resources}/test_graphs/visibility.graph | 0 .../gui/resources/edit-icon-png-16x16-540.png | Bin 140730 -> 0 bytes .../target/classes/gui/resources/exit.png | Bin 3418 -> 0 bytes .../target/classes/gui/resources/load.png | Bin 3415 -> 0 bytes .../target/classes/gui/resources/new.png | Bin 3331 -> 0 bytes .../gui/resources/newundo_largeimage_1.png | Bin 60323 -> 0 bytes .../target/classes/gui/resources/redo.png | Bin 3447 -> 0 bytes .../target/classes/gui/resources/remove.png | Bin 3498 -> 0 bytes .../target/classes/gui/resources/save.png | Bin 3360 -> 0 bytes .../target/classes/gui/resources/undo.png | Bin 3436 -> 0 bytes GraphLayoutDSL/.classpath | 18 - GraphLayoutDSL/.gitignore | 45 - GraphLayoutDSL/.project | 29 - GraphLayoutDSL/pom.xml | 73 +- .../src/{ => main/java}/app/App.java | 0 .../{ => main/java}/interfaces/ILayout.java | 0 .../java}/interfaces/ILayoutGraph.java | 0 .../java}/interfaces/ILayoutSubgraphs.java | 0 .../java}/interpreter/Interpreter.py | 0 .../{ => main/java}/interpreter/__init__.py | 0 .../java}/interpreter/java/Interpreter.java | 16 +- .../src/{ => main/java}/language/layout.dot | 0 .../src/{ => main/java}/language/layout.png | Bin .../src/{ => main/java}/language/layout.tx | 0 .../java}/models/java/LayoutGraph.java | 4 +- .../java}/models/java/LayoutSubgraphs.java | 4 +- .../{ => main/java}/models/pythonmodels.py | 0 .../java}/modules/arpeggio/__init__.py | 0 .../java}/modules/arpeggio/cleanpeg.py | 0 .../java}/modules/arpeggio/export.py | 0 .../{ => main/java}/modules/arpeggio/peg.py | 0 .../{ => main/java}/modules/arpeggio/utils.py | 0 .../{ => main/java}/modules/textx/__init__.py | 0 .../{ => main/java}/modules/textx/const.py | 0 .../java}/modules/textx/exceptions.py | 0 .../{ => main/java}/modules/textx/export.py | 0 .../java}/modules/textx/metamodel.py | 0 .../{ => main/java}/modules/textx/model.py | 0 .../{ => main/java}/modules/textx/textx.py | 0 .../src/{ => main/java}/util/Factory.java | 0 .../dsl/test/TestLanguageAndInterpreter.java | 52 +- .../target/classes/interpreter/Interpreter.py | 102 - .../target/classes/interpreter/__init__.py | 0 .../target/classes/language/layout.dot | 177 -- .../target/classes/language/layout.png | Bin 405871 -> 0 bytes .../target/classes/language/layout.tx | 494 ----- .../target/classes/models/pythonmodels.py | 49 - .../classes/modules/arpeggio/__init__.py | 1734 ----------------- .../classes/modules/arpeggio/cleanpeg.py | 62 - .../target/classes/modules/arpeggio/export.py | 221 --- .../target/classes/modules/arpeggio/peg.py | 258 --- .../target/classes/modules/arpeggio/utils.py | 14 - .../target/classes/modules/textx/__init__.py | 1 - .../target/classes/modules/textx/const.py | 14 - .../classes/modules/textx/exceptions.py | 15 - .../target/classes/modules/textx/export.py | 221 --- .../target/classes/modules/textx/metamodel.py | 498 ----- .../target/classes/modules/textx/model.py | 452 ----- .../target/classes/modules/textx/textx.py | 915 --------- pom.xml | 143 ++ 324 files changed, 837 insertions(+), 6191 deletions(-) delete mode 100644 GraphDrawingTheory/.classpath delete mode 100644 GraphDrawingTheory/.gitignore delete mode 100644 GraphDrawingTheory/.project rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/AlgorithmExecutor.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/ExecuteResult.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/cycles/JohnsonSimpleCycles.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/cycles/PatonSimpleCycles.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/cycles/SimpleCyclesFinder.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/connectivity/PlanarAugmentation.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/connectivity/PlanarAugmentationLabel.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/drawing/ConvexDrawing.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/drawing/PlanarConvexEmbedding.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/drawing/TutteEmbedding.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/drawing/VisibilityRepresentation.java (99%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/interlacement/InterlacementGraphEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/interlacement/InterlacementGraphVertex.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/lrpartition/LRPartition.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/lrpartition/LRPartitionEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/lrpartition/LRPartitionSet.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/numbering/DFSNumbering.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/numbering/Numbering.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/numbering/STNumbering.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/Embedding.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/FraysseixMendezPlanarity.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/MaximumPlanaritySubgraph.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/PQTreePlanarity.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/PlanarEmbedding.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/PlanarFaces.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/PlanarityTestingAlgorithm.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/dual/DualGraphEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/dual/DualGraphVertex.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/algorithms/planarity/dual/STDualGraph.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/drawing/Drawing.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/Edge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/EdgeDirection.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/Graph.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/Path.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/Vertex.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/VertexDegreeComparator.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/impl/GraphEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/elements/impl/GraphVertex.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/enumerations/Direction.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/exception/CannotBeAppliedException.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/exception/DSLException.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/exception/NotPlanarException.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/AbstractJGraphXLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/AbstractJungLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/AbstractLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/AbstractPrefuseLayouter.java (99%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/AestheticCriteria.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/DefaultGraphLayoutProperties.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/GraphLayoutProperties.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/LayoutAestheticMap.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/LayoutAlgorithms.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/Layouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/LayouterFactory.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/PropertyEnums.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/automatic/AutomaticPropertiesLayout.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/automatic/LayoutPicker.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/box/BoxLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/circle/CircleLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/circle/CircleWithCenterLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/dsl/DSLLayouter.java (99%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/AbstractForceDirectedLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/DAGLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/FruchtermanReingoldLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/KamadaKawaiLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/PrefuseForceDirectedLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/force/directed/SpringLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/organic/JGraphFastorganicLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/organic/JGraphHierarchicalLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/organic/JGraphOrganicLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/organic/JungISOMLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/orthogonal/EntryDirection.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/orthogonal/OrthogonalConnector.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/orthogonal/VisibilityRepresentationLayout.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/router/OrthogonalEdgeRouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/straight/line/ConvexLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/straight/line/TutteLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/symmetric/SymmetricCircleLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/symmetric/SymmetricLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/JGraphCompactTreeLayout.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/JungTreeLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/PrefuseBalloonLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/PrefuseRadialTreeLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/tree/RadialTreeLayouter.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/layout/util/PositionAction.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/Calc.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/CircleLayoutCalc.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/CramersRule.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/CzekanovskiDiceDistance.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/GramSchmidt.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/Line.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/Matrix.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/MatrixUtil.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/math/Triangle.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/operations/GraphOperations.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/ordering/CanonicalOrdering.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/ordering/TopologicalOrdering.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/ordering/circular/Circular.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/ordering/circular/GraphCopy.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/ordering/circular/TriangulatedEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/Bipartite.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/GraphProperties.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/Block.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/Component.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/HopcroftTarjanSplitComponent.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/SplitComponent.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/SplitPair.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/components/SplitTriconnectedComponentType.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/AlgorithmErrorException.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/BiconnectedSplitting.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/HopcroftTarjanSplitting.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/SeparationPair.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/SeparationPairSplitting.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/Splitting.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/properties/splitting/Triple.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/CyclicPermutation.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/DeFrayseeixHeuristic.java (99%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/Permutation.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/PermutationAnalyzator.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/PermutationCycle.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/PermutationGroup.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/nauty/BinaryRepresentation.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/nauty/OrderedPartition.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/nauty/SearchTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/symmetry/nauty/SearchTreeNode.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/traversal/DFSTreeTraversal.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/traversal/DijkstraAlgorithm.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/traversal/GraphTraversal.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/traversal/TraversalUtil.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/bc/BCNodeType.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/bc/BCTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/bc/BCTreeEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/bc/BCTreeNode.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/binary/BinaryTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/binary/BinaryTreeNode.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQNodeLabel.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQNodeMark.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQNodeOrderValid.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQNodeType.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQTreeEdge.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQTreeNode.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/pq/PQTreeReduction.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/AbstractTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/NodeType.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/ProtoSPQRTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/SPQRTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/SPQRTreeNode.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/Skeleton.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/tree/spqr/TreeEdgeWithContent.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/trees/DFSTree.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/util/Pair.java (100%) rename GraphDrawingTheory/src/{ => main/java}/graph/util/Util.java (100%) rename GraphDrawingTheory/src/{ => main/resources}/log4j.properties (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/algorithms/GraphTestCase.java (95%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/algorithms/TestDFSTree.java (94%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/algorithms/TestDijkstra.java (93%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/algorithms/TestLRPartitioning.java (95%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/elements/TestEdge.java (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/elements/TestVertex.java (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/graph/properties/TestGraph.java (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/graph/properties/TestSplitting.java (99%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/layout/LayoutsSpeedTest.java (96%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/operations/TestGraphOperations.java (99%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/planarity/BoyerMyrvoldPlanarityTest.java (99%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/planarity/TestPlanarity.java (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/symmetry/GramSchmidtTest.java (99%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/tree/TestBCTree.java (100%) rename GraphDrawingTheory/{test => src/test/java}/graph/test/tree/TestSPQR.java (100%) delete mode 100644 GraphDrawingTheory/target/.gitignore delete mode 100644 GraphEditor/.classpath delete mode 100644 GraphEditor/.project rename GraphEditor/src/{ => main/java}/gui/actions/main/frame/ExitAction.java (83%) rename GraphEditor/src/{ => main/java}/gui/actions/main/frame/LoadAction.java (93%) rename GraphEditor/src/{ => main/java}/gui/actions/main/frame/NewGraphAction.java (84%) rename GraphEditor/src/{ => main/java}/gui/actions/main/frame/SaveAction.java (95%) rename GraphEditor/src/{ => main/java}/gui/actions/palette/AddVertexAction.java (100%) rename GraphEditor/src/{ => main/java}/gui/actions/palette/LayoutAction.java (100%) rename GraphEditor/src/{ => main/java}/gui/actions/palette/LinkAction.java (100%) rename GraphEditor/src/{ => main/java}/gui/actions/palette/SelectAction.java (100%) rename GraphEditor/src/{ => main/java}/gui/actions/toolbar/RedoAction.java (84%) rename GraphEditor/src/{ => main/java}/gui/actions/toolbar/RemoveAction.java (91%) rename GraphEditor/src/{ => main/java}/gui/actions/toolbar/UndoAction.java (84%) rename GraphEditor/src/{gui/app/Applcation.java => main/java/gui/app/Application.java} (84%) rename GraphEditor/src/{ => main/java}/gui/command/panel/CommandPanel.java (99%) rename GraphEditor/src/{ => main/java}/gui/commands/AddElementCommand.java (100%) rename GraphEditor/src/{ => main/java}/gui/commands/Command.java (100%) rename GraphEditor/src/{ => main/java}/gui/commands/CommandExecutor.java (100%) rename GraphEditor/src/{ => main/java}/gui/commands/MoveCommand.java (100%) rename GraphEditor/src/{ => main/java}/gui/commands/RemoveCommand.java (100%) rename GraphEditor/src/{ => main/java}/gui/components/JDigitsTextField.java (100%) rename GraphEditor/src/{ => main/java}/gui/components/JDoubleTextField.java (100%) rename GraphEditor/src/{ => main/java}/gui/components/NumberFilter.java (100%) rename GraphEditor/src/{ => main/java}/gui/components/TypeComponents.java (100%) rename GraphEditor/src/{ => main/java}/gui/dialogs/LayoutDialog.java (99%) rename GraphEditor/src/{ => main/java}/gui/main/frame/ElementsEnum.java (100%) rename GraphEditor/src/{ => main/java}/gui/main/frame/MainFrame.java (84%) rename GraphEditor/src/{ => main/java}/gui/model/GraphEdge.java (100%) rename GraphEditor/src/{ => main/java}/gui/model/GraphElement.java (100%) rename GraphEditor/src/{ => main/java}/gui/model/GraphModel.java (100%) rename GraphEditor/src/{ => main/java}/gui/model/GraphVertex.java (100%) rename GraphEditor/src/{ => main/java}/gui/model/IGraphElement.java (100%) rename GraphEditor/src/{ => main/java}/gui/model/SelectionModel.java (100%) rename GraphEditor/src/{ => main/java}/gui/panels/layout/HierarchicalLayoutPanel.java (100%) rename GraphEditor/src/{ => main/java}/gui/panels/layout/LayoutPanelFactory.java (100%) rename GraphEditor/src/{ => main/java}/gui/panels/layout/LayoutPropertyPanel.java (99%) rename GraphEditor/src/{ => main/java}/gui/panels/layout/NodeLinkTreeLayoutPanel.java (100%) rename GraphEditor/src/{ => main/java}/gui/panels/layout/SymmetricLayoutPanel.java (100%) rename GraphEditor/src/{ => main/java}/gui/properties/EdgePropertiesPanel.java (99%) rename GraphEditor/src/{ => main/java}/gui/properties/GraphModelPropertiesPanel.java (99%) rename GraphEditor/src/{ => main/java}/gui/properties/PropertiesFactory.java (100%) rename GraphEditor/src/{ => main/java}/gui/properties/PropertiesPanel.java (100%) rename GraphEditor/src/{ => main/java}/gui/properties/VertexPropertiesPanel.java (99%) rename GraphEditor/src/{ => main/java}/gui/state/AddState.java (100%) rename GraphEditor/src/{ => main/java}/gui/state/LassoSelectState.java (100%) rename GraphEditor/src/{ => main/java}/gui/state/LinkState.java (100%) rename GraphEditor/src/{ => main/java}/gui/state/MoveState.java (100%) rename GraphEditor/src/{ => main/java}/gui/state/SelectState.java (100%) rename GraphEditor/src/{ => main/java}/gui/state/State.java (100%) rename GraphEditor/src/{ => main/java}/gui/util/GuiUtil.java (100%) rename GraphEditor/src/{ => main/java}/gui/util/StatusBar.java (100%) rename GraphEditor/src/{ => main/java}/gui/view/GraphView.java (100%) rename GraphEditor/src/{ => main/java}/gui/view/painters/EdgePainter.java (100%) rename GraphEditor/src/{ => main/java}/gui/view/painters/IElementPainter.java (100%) rename GraphEditor/src/{ => main/java}/gui/view/painters/PaintingUtil.java (100%) rename GraphEditor/src/{ => main/java}/gui/view/painters/VertexPainter.java (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/edit-icon-png-16x16-540.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/exit.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/load.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/new.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/newundo_largeimage_1.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/redo.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/remove.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/save.png (100%) rename GraphEditor/src/{gui/resources => main/resources/icons}/undo.png (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/23queenstourgraph.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/33fangraph.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/6graph114.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex1.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex2.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex3.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex3_1.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex3_2.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex4.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex5.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex6.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/convex7.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/pentatope.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/planarfacestest1.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/pqembedding.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/pqtreeplanar.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/separations pair paper graph.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/triconnectivity test.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/utility graph.graph (100%) rename GraphEditor/{ => src/test/resources}/test_graphs/visibility.graph (100%) delete mode 100644 GraphEditor/target/classes/gui/resources/edit-icon-png-16x16-540.png delete mode 100644 GraphEditor/target/classes/gui/resources/exit.png delete mode 100644 GraphEditor/target/classes/gui/resources/load.png delete mode 100644 GraphEditor/target/classes/gui/resources/new.png delete mode 100644 GraphEditor/target/classes/gui/resources/newundo_largeimage_1.png delete mode 100644 GraphEditor/target/classes/gui/resources/redo.png delete mode 100644 GraphEditor/target/classes/gui/resources/remove.png delete mode 100644 GraphEditor/target/classes/gui/resources/save.png delete mode 100644 GraphEditor/target/classes/gui/resources/undo.png delete mode 100644 GraphLayoutDSL/.classpath delete mode 100644 GraphLayoutDSL/.gitignore delete mode 100644 GraphLayoutDSL/.project rename GraphLayoutDSL/src/{ => main/java}/app/App.java (100%) rename GraphLayoutDSL/src/{ => main/java}/interfaces/ILayout.java (100%) rename GraphLayoutDSL/src/{ => main/java}/interfaces/ILayoutGraph.java (100%) rename GraphLayoutDSL/src/{ => main/java}/interfaces/ILayoutSubgraphs.java (100%) rename GraphLayoutDSL/src/{ => main/java}/interpreter/Interpreter.py (100%) rename GraphLayoutDSL/src/{ => main/java}/interpreter/__init__.py (100%) rename GraphLayoutDSL/src/{ => main/java}/interpreter/java/Interpreter.java (96%) rename GraphLayoutDSL/src/{ => main/java}/language/layout.dot (100%) rename GraphLayoutDSL/src/{ => main/java}/language/layout.png (100%) rename GraphLayoutDSL/src/{ => main/java}/language/layout.tx (100%) rename GraphLayoutDSL/src/{ => main/java}/models/java/LayoutGraph.java (100%) rename GraphLayoutDSL/src/{ => main/java}/models/java/LayoutSubgraphs.java (100%) rename GraphLayoutDSL/src/{ => main/java}/models/pythonmodels.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/arpeggio/__init__.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/arpeggio/cleanpeg.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/arpeggio/export.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/arpeggio/peg.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/arpeggio/utils.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/__init__.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/const.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/exceptions.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/export.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/metamodel.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/model.py (100%) rename GraphLayoutDSL/src/{ => main/java}/modules/textx/textx.py (100%) rename GraphLayoutDSL/src/{ => main/java}/util/Factory.java (100%) rename GraphLayoutDSL/{test => src/test/java}/dsl/test/TestLanguageAndInterpreter.java (72%) delete mode 100644 GraphLayoutDSL/target/classes/interpreter/Interpreter.py delete mode 100644 GraphLayoutDSL/target/classes/interpreter/__init__.py delete mode 100644 GraphLayoutDSL/target/classes/language/layout.dot delete mode 100644 GraphLayoutDSL/target/classes/language/layout.png delete mode 100644 GraphLayoutDSL/target/classes/language/layout.tx delete mode 100644 GraphLayoutDSL/target/classes/models/pythonmodels.py delete mode 100644 GraphLayoutDSL/target/classes/modules/arpeggio/__init__.py delete mode 100644 GraphLayoutDSL/target/classes/modules/arpeggio/cleanpeg.py delete mode 100644 GraphLayoutDSL/target/classes/modules/arpeggio/export.py delete mode 100644 GraphLayoutDSL/target/classes/modules/arpeggio/peg.py delete mode 100644 GraphLayoutDSL/target/classes/modules/arpeggio/utils.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/__init__.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/const.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/exceptions.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/export.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/metamodel.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/model.py delete mode 100644 GraphLayoutDSL/target/classes/modules/textx/textx.py create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index bb49aa9..8ddb90d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,45 +1,5 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse - -*/target/* +.project +.settings/* +**/.classpath +*/bin/ +*/target/* \ No newline at end of file diff --git a/GraphDrawingTheory/.classpath b/GraphDrawingTheory/.classpath deleted file mode 100644 index 3f5ccfb..0000000 --- a/GraphDrawingTheory/.classpath +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GraphDrawingTheory/.gitignore b/GraphDrawingTheory/.gitignore deleted file mode 100644 index f0e3219..0000000 --- a/GraphDrawingTheory/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse -/target diff --git a/GraphDrawingTheory/.project b/GraphDrawingTheory/.project deleted file mode 100644 index 057bae7..0000000 --- a/GraphDrawingTheory/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - GraphDrawingTheory - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/GraphDrawingTheory/pom.xml b/GraphDrawingTheory/pom.xml index 227a223..ee2f9f8 100644 --- a/GraphDrawingTheory/pom.xml +++ b/GraphDrawingTheory/pom.xml @@ -1,73 +1,71 @@ - - 4.0.0 - GraphDrawingTheory - GraphDrawingTheory - 0.1.0-SNAPSHOT - - src - test - - - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - - - - org.tinyjee.jgraphx - jgraphx - 3.4.1.3 - compile - - - log4j - log4j - 1.2.17 - compile - - - org.prefuse - prefuse - beta-20071021 - compile - - - gov.nist.math - jama - 1.0.3 - compile - - - net.sf.jung - jung-visualization - 2.0.1 - compile - - - net.sf.jung - jung-algorithms - 2.0.1 - compile - - - net.sf.jung - jung-graph-impl - 2.0.1 - compile - - - org.python - jython-standalone - 2.7.1b2 - compile - - + - - + + GraphDrawing + GraphDrawing + 0.1.0-SNAPSHOT + .. + + + 4.0.0 + GraphDrawingTheory + GraphDrawingTheory + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + + org.tinyjee.jgraphx + jgraphx + + + log4j + log4j + + + org.prefuse + prefuse + + + gov.nist.math + jama + + + net.sf.jung + jung-visualization + + + net.sf.jung + jung-algorithms + + + net.sf.jung + jung-graph-impl + + + org.python + jython-standalone + + + GraphLayoutDSL + GraphLayoutDSL + ${project.version} + + + junit + junit + test + + \ No newline at end of file diff --git a/GraphDrawingTheory/src/graph/algorithm/AlgorithmExecutor.java b/GraphDrawingTheory/src/main/java/graph/algorithm/AlgorithmExecutor.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/AlgorithmExecutor.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/AlgorithmExecutor.java diff --git a/GraphDrawingTheory/src/graph/algorithm/ExecuteResult.java b/GraphDrawingTheory/src/main/java/graph/algorithm/ExecuteResult.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/ExecuteResult.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/ExecuteResult.java diff --git a/GraphDrawingTheory/src/graph/algorithm/cycles/JohnsonSimpleCycles.java b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/JohnsonSimpleCycles.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/cycles/JohnsonSimpleCycles.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/cycles/JohnsonSimpleCycles.java index d8e5726..1727ef8 100644 --- a/GraphDrawingTheory/src/graph/algorithm/cycles/JohnsonSimpleCycles.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/JohnsonSimpleCycles.java @@ -17,10 +17,6 @@ =============================================================================*/ package graph.algorithm.cycles; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -30,6 +26,10 @@ import java.util.Set; import java.util.Stack; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + /** * Find all simple cycles of a directed graph using the Johnson's * algorithm. diff --git a/GraphDrawingTheory/src/graph/algorithm/cycles/PatonSimpleCycles.java b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/PatonSimpleCycles.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/cycles/PatonSimpleCycles.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/cycles/PatonSimpleCycles.java index 15628d3..65683db 100644 --- a/GraphDrawingTheory/src/graph/algorithm/cycles/PatonSimpleCycles.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/PatonSimpleCycles.java @@ -17,10 +17,6 @@ =============================================================================*/ package graph.algorithm.cycles; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -29,6 +25,10 @@ import java.util.Set; import java.util.Stack; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + /** * Find a cycle basis of an undirected graph using the Paton's * algorithm. diff --git a/GraphDrawingTheory/src/graph/algorithm/cycles/SimpleCyclesFinder.java b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleCyclesFinder.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/cycles/SimpleCyclesFinder.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleCyclesFinder.java index 45c573f..ac7d245 100644 --- a/GraphDrawingTheory/src/graph/algorithm/cycles/SimpleCyclesFinder.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleCyclesFinder.java @@ -1,11 +1,11 @@ package graph.algorithm.cycles; +import java.util.List; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; -import java.util.List; - public class SimpleCyclesFinder> { public SimpleCyclesFinder(){ diff --git a/GraphDrawingTheory/src/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java rename to GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java index 32de41b..9d76aa0 100644 --- a/GraphDrawingTheory/src/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithm/cycles/SimpleUndirectedCyclesFinder.java @@ -1,9 +1,5 @@ package graph.algorithm.cycles; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -11,6 +7,10 @@ import java.util.Map; import java.util.Set; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + public class SimpleUndirectedCyclesFinder> { diff --git a/GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentation.java b/GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentation.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentation.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentation.java index 1a6bcc4..d9bc2c2 100644 --- a/GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentation.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentation.java @@ -17,10 +17,10 @@ import graph.elements.Vertex; import graph.exception.CannotBeAppliedException; import graph.traversal.GraphTraversal; +import graph.tree.bc.BCNodeType; import graph.tree.bc.BCTree; import graph.tree.bc.BCTreeEdge; import graph.tree.bc.BCTreeNode; -import graph.tree.bc.BCNodeType; import graph.util.Util; /** diff --git a/GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentationLabel.java b/GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentationLabel.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentationLabel.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentationLabel.java index 388f185..cca4402 100644 --- a/GraphDrawingTheory/src/graph/algorithms/connectivity/PlanarAugmentationLabel.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/connectivity/PlanarAugmentationLabel.java @@ -6,8 +6,8 @@ import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; -import graph.tree.bc.BCTreeNode; import graph.tree.bc.BCNodeType; +import graph.tree.bc.BCTreeNode; /** * A bundle of pendants together with its parent diff --git a/GraphDrawingTheory/src/graph/algorithms/drawing/ConvexDrawing.java b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/ConvexDrawing.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/drawing/ConvexDrawing.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/drawing/ConvexDrawing.java diff --git a/GraphDrawingTheory/src/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java index f9c0df5..2582fb0 100644 --- a/GraphDrawingTheory/src/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/CyclicSymmetricGraphDrawing.java @@ -1,5 +1,10 @@ package graph.algorithms.drawing; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; @@ -9,11 +14,6 @@ import graph.symmetry.nauty.McKayGraphLabelingAlgorithm; import graph.util.Pair; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * Concentric symmrtic drawing algorithms based on Car and Kocay's algorithm * @author xx diff --git a/GraphDrawingTheory/src/graph/algorithms/drawing/PlanarConvexEmbedding.java b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/PlanarConvexEmbedding.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/drawing/PlanarConvexEmbedding.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/drawing/PlanarConvexEmbedding.java diff --git a/GraphDrawingTheory/src/graph/algorithms/drawing/TutteEmbedding.java b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/TutteEmbedding.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/drawing/TutteEmbedding.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/drawing/TutteEmbedding.java index e30ee3b..d8d37cc 100644 --- a/GraphDrawingTheory/src/graph/algorithms/drawing/TutteEmbedding.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/TutteEmbedding.java @@ -1,5 +1,11 @@ package graph.algorithms.drawing; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; @@ -7,12 +13,6 @@ import graph.math.CramersRule; import graph.math.Matrix; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class TutteEmbedding> { diff --git a/GraphDrawingTheory/src/graph/algorithms/drawing/VisibilityRepresentation.java b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/VisibilityRepresentation.java similarity index 99% rename from GraphDrawingTheory/src/graph/algorithms/drawing/VisibilityRepresentation.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/drawing/VisibilityRepresentation.java index f41fb62..1548a2f 100644 --- a/GraphDrawingTheory/src/graph/algorithms/drawing/VisibilityRepresentation.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/drawing/VisibilityRepresentation.java @@ -1,5 +1,12 @@ package graph.algorithms.drawing; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import graph.algorithms.numbering.STNumbering; import graph.algorithms.planarity.BoyerMyrvoldPlanarity; import graph.algorithms.planarity.PlanarFaces; @@ -11,14 +18,6 @@ import graph.exception.CannotBeAppliedException; import graph.exception.NotPlanarException; import graph.ordering.TopologicalOrdering; -import jnr.ffi.Struct.ssize_t; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; /** Given a graph G = (V, E), a visibility representation Γ, for G maps every vertex v in V to a horizontal vertex segment Γ(v) and every edge (u, v) ∈ E to a diff --git a/GraphDrawingTheory/src/graph/algorithms/interlacement/InterlacementGraphEdge.java b/GraphDrawingTheory/src/main/java/graph/algorithms/interlacement/InterlacementGraphEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/interlacement/InterlacementGraphEdge.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/interlacement/InterlacementGraphEdge.java diff --git a/GraphDrawingTheory/src/graph/algorithms/interlacement/InterlacementGraphVertex.java b/GraphDrawingTheory/src/main/java/graph/algorithms/interlacement/InterlacementGraphVertex.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/interlacement/InterlacementGraphVertex.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/interlacement/InterlacementGraphVertex.java index 395f778..3425f86 100644 --- a/GraphDrawingTheory/src/graph/algorithms/interlacement/InterlacementGraphVertex.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/interlacement/InterlacementGraphVertex.java @@ -1,11 +1,11 @@ package graph.algorithms.interlacement; +import java.awt.Dimension; + import graph.elements.Edge; import graph.elements.Path; import graph.elements.Vertex; -import java.awt.Dimension; - public class InterlacementGraphVertex> implements Vertex{ private Path content; diff --git a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartition.java b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartition.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartition.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartition.java index 6ee1740..0bc6211 100644 --- a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartition.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartition.java @@ -1,16 +1,16 @@ package graph.algorithms.lrpartition; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; import graph.traversal.DFSTreeTraversal; import graph.trees.DFSTree; -import java.util.ArrayList; -import java.util.List; - -import org.apache.log4j.Logger; - /** * A partition B = L U R of DFS oriented graph's diff --git a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionEdge.java b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionEdge.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionEdge.java index aa56015..30ee940 100644 --- a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionEdge.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionEdge.java @@ -1,12 +1,12 @@ package graph.algorithms.lrpartition; -import graph.elements.Edge; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; import java.util.Set; +import graph.elements.Edge; +import graph.elements.Vertex; + public class LRPartitionEdge >{ diff --git a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionSet.java b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionSet.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionSet.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionSet.java index 3c2170a..e82f641 100644 --- a/GraphDrawingTheory/src/graph/algorithms/lrpartition/LRPartitionSet.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/lrpartition/LRPartitionSet.java @@ -1,15 +1,15 @@ package graph.algorithms.lrpartition; -import graph.elements.Edge; -import graph.elements.Vertex; -import graph.trees.DFSTree; - import java.util.ArrayList; import java.util.List; import java.util.Random; import org.apache.log4j.Logger; +import graph.elements.Edge; +import graph.elements.Vertex; +import graph.trees.DFSTree; + public class LRPartitionSet> { diff --git a/GraphDrawingTheory/src/graph/algorithms/numbering/DFSNumbering.java b/GraphDrawingTheory/src/main/java/graph/algorithms/numbering/DFSNumbering.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/numbering/DFSNumbering.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/numbering/DFSNumbering.java index 56db1df..eea3f37 100644 --- a/GraphDrawingTheory/src/graph/algorithms/numbering/DFSNumbering.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/numbering/DFSNumbering.java @@ -1,15 +1,15 @@ package graph.algorithms.numbering; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; import graph.traversal.DFSTreeTraversal; import graph.trees.DFSTree; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; - public class DFSNumbering> extends Numbering{ private DFSTree dfsTree; diff --git a/GraphDrawingTheory/src/graph/algorithms/numbering/Numbering.java b/GraphDrawingTheory/src/main/java/graph/algorithms/numbering/Numbering.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/numbering/Numbering.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/numbering/Numbering.java index 0482794..3fad7da 100644 --- a/GraphDrawingTheory/src/graph/algorithms/numbering/Numbering.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/numbering/Numbering.java @@ -1,10 +1,10 @@ package graph.algorithms.numbering; +import java.util.List; + import graph.elements.Edge; import graph.elements.Vertex; -import java.util.List; - public abstract class Numbering> { protected List order; diff --git a/GraphDrawingTheory/src/graph/algorithms/numbering/STNumbering.java b/GraphDrawingTheory/src/main/java/graph/algorithms/numbering/STNumbering.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/numbering/STNumbering.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/numbering/STNumbering.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java index 9431210..6f772f4 100644 --- a/GraphDrawingTheory/src/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/BoyerMyrvoldPlanarity.java @@ -1,14 +1,5 @@ package graph.algorithms.planarity; -import graph.algorithms.numbering.DFSNumbering; -import graph.algorithms.numbering.Numbering; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.enumerations.Direction; -import graph.traversal.DFSTreeTraversal; -import graph.trees.DFSTree; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,6 +11,15 @@ import org.apache.log4j.Logger; +import graph.algorithms.numbering.DFSNumbering; +import graph.algorithms.numbering.Numbering; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.enumerations.Direction; +import graph.traversal.DFSTreeTraversal; +import graph.trees.DFSTree; + /** * The Boyer-Myrvold algorithm is a planarity testing algorithm which uses reverse DFS order as numbering diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/Embedding.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/Embedding.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/Embedding.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/Embedding.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/FraysseixMendezPlanarity.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/FraysseixMendezPlanarity.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/FraysseixMendezPlanarity.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/FraysseixMendezPlanarity.java index 989445d..87c7451 100644 --- a/GraphDrawingTheory/src/graph/algorithms/planarity/FraysseixMendezPlanarity.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/FraysseixMendezPlanarity.java @@ -1,5 +1,9 @@ package graph.algorithms.planarity; +import java.util.List; + +import org.apache.log4j.Logger; + import graph.algorithms.lrpartition.LRPartition; import graph.elements.Edge; import graph.elements.EdgeDirection; @@ -9,10 +13,6 @@ import graph.traversal.GraphTraversal; import graph.trees.DFSTree; -import java.util.List; - -import org.apache.log4j.Logger; - /** * An algorithm for checking the planarity of a graph based on Fraysseix and Mendez's algorithm * @author xxx diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/MaximumPlanaritySubgraph.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/MaximumPlanaritySubgraph.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/MaximumPlanaritySubgraph.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/MaximumPlanaritySubgraph.java index b009927..1f42a62 100644 --- a/GraphDrawingTheory/src/graph/algorithms/planarity/MaximumPlanaritySubgraph.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/MaximumPlanaritySubgraph.java @@ -1,14 +1,14 @@ package graph.algorithms.planarity; +import java.util.ArrayList; +import java.util.List; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; import graph.traversal.DFSTreeTraversal; import graph.trees.DFSTree; -import java.util.ArrayList; -import java.util.List; - /** * A widely used standard heuristic for finding a maximal planar subgraph is to start with * a spanning tree of G, and to iteratively try to add the remaining edges one by one diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/PQTreePlanarity.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PQTreePlanarity.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/PQTreePlanarity.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PQTreePlanarity.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/PlanarEmbedding.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarEmbedding.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/PlanarEmbedding.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarEmbedding.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/PlanarFaces.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarFaces.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/PlanarFaces.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarFaces.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/PlanarityTestingAlgorithm.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarityTestingAlgorithm.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/PlanarityTestingAlgorithm.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/PlanarityTestingAlgorithm.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/dual/DualGraphEdge.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/DualGraphEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/dual/DualGraphEdge.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/DualGraphEdge.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/dual/DualGraphVertex.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/DualGraphVertex.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/dual/DualGraphVertex.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/DualGraphVertex.java diff --git a/GraphDrawingTheory/src/graph/algorithms/planarity/dual/STDualGraph.java b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/STDualGraph.java similarity index 100% rename from GraphDrawingTheory/src/graph/algorithms/planarity/dual/STDualGraph.java rename to GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/STDualGraph.java index b12a439..a0be052 100644 --- a/GraphDrawingTheory/src/graph/algorithms/planarity/dual/STDualGraph.java +++ b/GraphDrawingTheory/src/main/java/graph/algorithms/planarity/dual/STDualGraph.java @@ -1,14 +1,14 @@ package graph.algorithms.planarity.dual; +import java.util.ArrayList; +import java.util.List; + import graph.algorithms.planarity.PlanarFaces; import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; import graph.exception.NotPlanarException; -import java.util.ArrayList; -import java.util.List; - /** * Given a planar st-graph G, the dual planar st-graph G = (V ∗, E∗) is a digraph with the following properties: diff --git a/GraphDrawingTheory/src/graph/drawing/Drawing.java b/GraphDrawingTheory/src/main/java/graph/drawing/Drawing.java similarity index 100% rename from GraphDrawingTheory/src/graph/drawing/Drawing.java rename to GraphDrawingTheory/src/main/java/graph/drawing/Drawing.java index 3283511..b69a5f0 100644 --- a/GraphDrawingTheory/src/graph/drawing/Drawing.java +++ b/GraphDrawingTheory/src/main/java/graph/drawing/Drawing.java @@ -1,8 +1,5 @@ package graph.drawing; -import graph.elements.Edge; -import graph.elements.Vertex; - import java.awt.Point; import java.awt.geom.Point2D; import java.util.ArrayList; @@ -10,6 +7,9 @@ import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.Vertex; + /** * A drawing Γ of a graph G = (V, E) is a mapping of each vertex v in V to a distinct point Γ(v) and of each edge e = (u, v) in E to a simple open Jordan curve Γ(e), diff --git a/GraphDrawingTheory/src/graph/elements/Edge.java b/GraphDrawingTheory/src/main/java/graph/elements/Edge.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/Edge.java rename to GraphDrawingTheory/src/main/java/graph/elements/Edge.java diff --git a/GraphDrawingTheory/src/graph/elements/EdgeDirection.java b/GraphDrawingTheory/src/main/java/graph/elements/EdgeDirection.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/EdgeDirection.java rename to GraphDrawingTheory/src/main/java/graph/elements/EdgeDirection.java diff --git a/GraphDrawingTheory/src/graph/elements/Graph.java b/GraphDrawingTheory/src/main/java/graph/elements/Graph.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/Graph.java rename to GraphDrawingTheory/src/main/java/graph/elements/Graph.java diff --git a/GraphDrawingTheory/src/graph/elements/Path.java b/GraphDrawingTheory/src/main/java/graph/elements/Path.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/Path.java rename to GraphDrawingTheory/src/main/java/graph/elements/Path.java diff --git a/GraphDrawingTheory/src/graph/elements/Vertex.java b/GraphDrawingTheory/src/main/java/graph/elements/Vertex.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/Vertex.java rename to GraphDrawingTheory/src/main/java/graph/elements/Vertex.java diff --git a/GraphDrawingTheory/src/graph/elements/VertexDegreeComparator.java b/GraphDrawingTheory/src/main/java/graph/elements/VertexDegreeComparator.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/VertexDegreeComparator.java rename to GraphDrawingTheory/src/main/java/graph/elements/VertexDegreeComparator.java diff --git a/GraphDrawingTheory/src/graph/elements/impl/GraphEdge.java b/GraphDrawingTheory/src/main/java/graph/elements/impl/GraphEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/impl/GraphEdge.java rename to GraphDrawingTheory/src/main/java/graph/elements/impl/GraphEdge.java diff --git a/GraphDrawingTheory/src/graph/elements/impl/GraphVertex.java b/GraphDrawingTheory/src/main/java/graph/elements/impl/GraphVertex.java similarity index 100% rename from GraphDrawingTheory/src/graph/elements/impl/GraphVertex.java rename to GraphDrawingTheory/src/main/java/graph/elements/impl/GraphVertex.java diff --git a/GraphDrawingTheory/src/graph/enumerations/Direction.java b/GraphDrawingTheory/src/main/java/graph/enumerations/Direction.java similarity index 100% rename from GraphDrawingTheory/src/graph/enumerations/Direction.java rename to GraphDrawingTheory/src/main/java/graph/enumerations/Direction.java diff --git a/GraphDrawingTheory/src/graph/exception/CannotBeAppliedException.java b/GraphDrawingTheory/src/main/java/graph/exception/CannotBeAppliedException.java similarity index 100% rename from GraphDrawingTheory/src/graph/exception/CannotBeAppliedException.java rename to GraphDrawingTheory/src/main/java/graph/exception/CannotBeAppliedException.java diff --git a/GraphDrawingTheory/src/graph/exception/DSLException.java b/GraphDrawingTheory/src/main/java/graph/exception/DSLException.java similarity index 100% rename from GraphDrawingTheory/src/graph/exception/DSLException.java rename to GraphDrawingTheory/src/main/java/graph/exception/DSLException.java diff --git a/GraphDrawingTheory/src/graph/exception/NotPlanarException.java b/GraphDrawingTheory/src/main/java/graph/exception/NotPlanarException.java similarity index 100% rename from GraphDrawingTheory/src/graph/exception/NotPlanarException.java rename to GraphDrawingTheory/src/main/java/graph/exception/NotPlanarException.java diff --git a/GraphDrawingTheory/src/graph/layout/AbstractJGraphXLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/AbstractJGraphXLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/AbstractJGraphXLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/AbstractJGraphXLayouter.java index bb611f3..03344b1 100644 --- a/GraphDrawingTheory/src/graph/layout/AbstractJGraphXLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/AbstractJGraphXLayouter.java @@ -1,10 +1,5 @@ package graph.layout; -import graph.drawing.Drawing; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.awt.Dimension; import java.awt.geom.Point2D; import java.util.ArrayList; @@ -17,6 +12,11 @@ import com.mxgraph.model.mxIGraphModel; import com.mxgraph.view.mxGraph; +import graph.drawing.Drawing; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + public abstract class AbstractJGraphXLayouter> extends AbstractLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/AbstractJungLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/AbstractJungLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/AbstractJungLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/AbstractJungLayouter.java index 6479ceb..6ef8eb5 100644 --- a/GraphDrawingTheory/src/graph/layout/AbstractJungLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/AbstractJungLayouter.java @@ -1,5 +1,7 @@ package graph.layout; +import java.awt.geom.Point2D; + import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.visualization.DefaultVisualizationModel; import graph.drawing.Drawing; @@ -7,8 +9,6 @@ import graph.elements.Graph; import graph.elements.Vertex; -import java.awt.geom.Point2D; - public abstract class AbstractJungLayouter> extends AbstractLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/AbstractLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/AbstractLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/AbstractLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/AbstractLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/AbstractPrefuseLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/AbstractPrefuseLayouter.java similarity index 99% rename from GraphDrawingTheory/src/graph/layout/AbstractPrefuseLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/AbstractPrefuseLayouter.java index 10ec178..dc90d88 100644 --- a/GraphDrawingTheory/src/graph/layout/AbstractPrefuseLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/AbstractPrefuseLayouter.java @@ -1,15 +1,14 @@ package graph.layout; +import java.awt.geom.Point2D; +import java.util.HashMap; +import java.util.Map; + import graph.drawing.Drawing; import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; import graph.layout.util.PositionAction; - -import java.awt.geom.Point2D; -import java.util.HashMap; -import java.util.Map; - import prefuse.Display; import prefuse.Visualization; import prefuse.action.ActionList; diff --git a/GraphDrawingTheory/src/graph/layout/AestheticCriteria.java b/GraphDrawingTheory/src/main/java/graph/layout/AestheticCriteria.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/AestheticCriteria.java rename to GraphDrawingTheory/src/main/java/graph/layout/AestheticCriteria.java diff --git a/GraphDrawingTheory/src/graph/layout/DefaultGraphLayoutProperties.java b/GraphDrawingTheory/src/main/java/graph/layout/DefaultGraphLayoutProperties.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/DefaultGraphLayoutProperties.java rename to GraphDrawingTheory/src/main/java/graph/layout/DefaultGraphLayoutProperties.java diff --git a/GraphDrawingTheory/src/graph/layout/GraphLayoutProperties.java b/GraphDrawingTheory/src/main/java/graph/layout/GraphLayoutProperties.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/GraphLayoutProperties.java rename to GraphDrawingTheory/src/main/java/graph/layout/GraphLayoutProperties.java diff --git a/GraphDrawingTheory/src/graph/layout/LayoutAestheticMap.java b/GraphDrawingTheory/src/main/java/graph/layout/LayoutAestheticMap.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/LayoutAestheticMap.java rename to GraphDrawingTheory/src/main/java/graph/layout/LayoutAestheticMap.java diff --git a/GraphDrawingTheory/src/graph/layout/LayoutAlgorithms.java b/GraphDrawingTheory/src/main/java/graph/layout/LayoutAlgorithms.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/LayoutAlgorithms.java rename to GraphDrawingTheory/src/main/java/graph/layout/LayoutAlgorithms.java diff --git a/GraphDrawingTheory/src/graph/layout/Layouter.java b/GraphDrawingTheory/src/main/java/graph/layout/Layouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/Layouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/Layouter.java diff --git a/GraphDrawingTheory/src/graph/layout/LayouterFactory.java b/GraphDrawingTheory/src/main/java/graph/layout/LayouterFactory.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/LayouterFactory.java rename to GraphDrawingTheory/src/main/java/graph/layout/LayouterFactory.java diff --git a/GraphDrawingTheory/src/graph/layout/PropertyEnums.java b/GraphDrawingTheory/src/main/java/graph/layout/PropertyEnums.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/PropertyEnums.java rename to GraphDrawingTheory/src/main/java/graph/layout/PropertyEnums.java diff --git a/GraphDrawingTheory/src/graph/layout/automatic/AutomaticPropertiesLayout.java b/GraphDrawingTheory/src/main/java/graph/layout/automatic/AutomaticPropertiesLayout.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/automatic/AutomaticPropertiesLayout.java rename to GraphDrawingTheory/src/main/java/graph/layout/automatic/AutomaticPropertiesLayout.java diff --git a/GraphDrawingTheory/src/graph/layout/automatic/LayoutPicker.java b/GraphDrawingTheory/src/main/java/graph/layout/automatic/LayoutPicker.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/automatic/LayoutPicker.java rename to GraphDrawingTheory/src/main/java/graph/layout/automatic/LayoutPicker.java diff --git a/GraphDrawingTheory/src/graph/layout/box/BoxLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/box/BoxLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/box/BoxLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/box/BoxLayouter.java index 7526129..b8f29b1 100644 --- a/GraphDrawingTheory/src/graph/layout/box/BoxLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/box/BoxLayouter.java @@ -1,5 +1,9 @@ package graph.layout.box; +import java.awt.Dimension; +import java.awt.Point; +import java.util.List; + import graph.drawing.Drawing; import graph.elements.Edge; import graph.elements.Graph; @@ -8,10 +12,6 @@ import graph.layout.GraphLayoutProperties; import graph.layout.PropertyEnums.BoxProperties; -import java.awt.Dimension; -import java.awt.Point; -import java.util.List; - /** * A simple layout algorithm which places elements in a table like structure * Suitable if the elements are not linked diff --git a/GraphDrawingTheory/src/graph/layout/circle/CircleLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/circle/CircleLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/circle/CircleLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/circle/CircleLayouter.java index 8c2a355..0f7536b 100644 --- a/GraphDrawingTheory/src/graph/layout/circle/CircleLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/circle/CircleLayouter.java @@ -1,5 +1,9 @@ package graph.layout.circle; +import java.awt.geom.Point2D; +import java.util.List; +import java.util.Map; + import graph.drawing.Drawing; import graph.elements.Edge; import graph.elements.Graph; @@ -10,10 +14,6 @@ import graph.math.CircleLayoutCalc; import graph.ordering.circular.Circular; -import java.awt.geom.Point2D; -import java.util.List; -import java.util.Map; - public class CircleLayouter> extends AbstractLayouter{ public CircleLayouter() { diff --git a/GraphDrawingTheory/src/graph/layout/circle/CircleWithCenterLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/circle/CircleWithCenterLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/circle/CircleWithCenterLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/circle/CircleWithCenterLayouter.java index fd84f97..687250a 100644 --- a/GraphDrawingTheory/src/graph/layout/circle/CircleWithCenterLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/circle/CircleWithCenterLayouter.java @@ -1,5 +1,7 @@ package graph.layout.circle; +import java.awt.geom.Point2D; + import graph.drawing.Drawing; import graph.elements.Edge; import graph.elements.Graph; @@ -7,8 +9,6 @@ import graph.layout.AbstractLayouter; import graph.layout.GraphLayoutProperties; -import java.awt.geom.Point2D; - /** * This layouter takes places vertices on a circumference of a circle, diff --git a/GraphDrawingTheory/src/graph/layout/dsl/DSLLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/dsl/DSLLayouter.java similarity index 99% rename from GraphDrawingTheory/src/graph/layout/dsl/DSLLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/dsl/DSLLayouter.java index 30a9cbf..7a476ef 100644 --- a/GraphDrawingTheory/src/graph/layout/dsl/DSLLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/dsl/DSLLayouter.java @@ -1,5 +1,11 @@ package graph.layout.dsl; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.swing.SwingConstants; + import graph.algorithms.drawing.ConvexDrawing; import graph.algorithms.planarity.FraysseixMendezPlanarity; import graph.drawing.Drawing; @@ -8,7 +14,6 @@ import graph.elements.Vertex; import graph.exception.CannotBeAppliedException; import graph.exception.DSLException; -import graph.layout.AestheticCriteria; import graph.layout.DefaultGraphLayoutProperties; import graph.layout.GraphLayoutProperties; import graph.layout.LayoutAlgorithms; @@ -30,13 +35,6 @@ import interfaces.ILayout; import interfaces.ILayoutGraph; import interpreter.java.Interpreter; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingConstants; - import models.java.LayoutGraph; import models.java.LayoutSubgraphs; diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/AbstractForceDirectedLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/AbstractForceDirectedLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/AbstractForceDirectedLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/AbstractForceDirectedLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/DAGLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/DAGLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/DAGLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/DAGLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/FruchtermanReingoldLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/FruchtermanReingoldLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/FruchtermanReingoldLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/FruchtermanReingoldLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/KamadaKawaiLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/KamadaKawaiLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/KamadaKawaiLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/KamadaKawaiLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/PrefuseForceDirectedLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/PrefuseForceDirectedLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/PrefuseForceDirectedLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/PrefuseForceDirectedLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/force/directed/SpringLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/force/directed/SpringLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/force/directed/SpringLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/force/directed/SpringLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/organic/JGraphFastorganicLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphFastorganicLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/organic/JGraphFastorganicLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphFastorganicLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/organic/JGraphHierarchicalLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphHierarchicalLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/organic/JGraphHierarchicalLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphHierarchicalLayouter.java index 0c92fb0..66665cc 100644 --- a/GraphDrawingTheory/src/graph/layout/organic/JGraphHierarchicalLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphHierarchicalLayouter.java @@ -1,13 +1,13 @@ package graph.layout.organic; +import com.mxgraph.layout.hierarchical.mxHierarchicalLayout; + import graph.elements.Edge; import graph.elements.Vertex; import graph.layout.AbstractJGraphXLayouter; import graph.layout.GraphLayoutProperties; import graph.layout.PropertyEnums.HierarchicalProperties; -import com.mxgraph.layout.hierarchical.mxHierarchicalLayout; - public class JGraphHierarchicalLayouter> extends AbstractJGraphXLayouter { public JGraphHierarchicalLayouter(){ diff --git a/GraphDrawingTheory/src/graph/layout/organic/JGraphOrganicLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphOrganicLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/organic/JGraphOrganicLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/organic/JGraphOrganicLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/organic/JungISOMLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/organic/JungISOMLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/organic/JungISOMLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/organic/JungISOMLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/orthogonal/EntryDirection.java b/GraphDrawingTheory/src/main/java/graph/layout/orthogonal/EntryDirection.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/orthogonal/EntryDirection.java rename to GraphDrawingTheory/src/main/java/graph/layout/orthogonal/EntryDirection.java diff --git a/GraphDrawingTheory/src/graph/layout/orthogonal/OrthogonalConnector.java b/GraphDrawingTheory/src/main/java/graph/layout/orthogonal/OrthogonalConnector.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/orthogonal/OrthogonalConnector.java rename to GraphDrawingTheory/src/main/java/graph/layout/orthogonal/OrthogonalConnector.java index 9d53a5b..f26fa2a 100644 --- a/GraphDrawingTheory/src/graph/layout/orthogonal/OrthogonalConnector.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/orthogonal/OrthogonalConnector.java @@ -1,11 +1,11 @@ package graph.layout.orthogonal; -import graph.elements.Vertex; - import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class OrthogonalConnector { private V vertex; diff --git a/GraphDrawingTheory/src/graph/layout/orthogonal/VisibilityRepresentationLayout.java b/GraphDrawingTheory/src/main/java/graph/layout/orthogonal/VisibilityRepresentationLayout.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/orthogonal/VisibilityRepresentationLayout.java rename to GraphDrawingTheory/src/main/java/graph/layout/orthogonal/VisibilityRepresentationLayout.java diff --git a/GraphDrawingTheory/src/graph/layout/router/OrthogonalEdgeRouter.java b/GraphDrawingTheory/src/main/java/graph/layout/router/OrthogonalEdgeRouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/router/OrthogonalEdgeRouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/router/OrthogonalEdgeRouter.java diff --git a/GraphDrawingTheory/src/graph/layout/straight/line/ConvexLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/straight/line/ConvexLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/straight/line/ConvexLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/straight/line/ConvexLayouter.java index db0a658..e446aa3 100644 --- a/GraphDrawingTheory/src/graph/layout/straight/line/ConvexLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/straight/line/ConvexLayouter.java @@ -1,5 +1,8 @@ package graph.layout.straight.line; +import java.awt.geom.Point2D; +import java.util.Map; + import graph.algorithms.drawing.ConvexDrawing; import graph.drawing.Drawing; import graph.elements.Edge; @@ -8,9 +11,6 @@ import graph.layout.AbstractLayouter; import graph.layout.GraphLayoutProperties; -import java.awt.geom.Point2D; -import java.util.Map; - public class ConvexLayouter> extends AbstractLayouter { @Override diff --git a/GraphDrawingTheory/src/graph/layout/straight/line/TutteLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/straight/line/TutteLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/straight/line/TutteLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/straight/line/TutteLayouter.java index 1e41f07..af98e78 100644 --- a/GraphDrawingTheory/src/graph/layout/straight/line/TutteLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/straight/line/TutteLayouter.java @@ -1,5 +1,9 @@ package graph.layout.straight.line; +import java.awt.geom.Point2D; +import java.util.List; +import java.util.Map; + import graph.algorithms.drawing.TutteEmbedding; import graph.algorithms.planarity.BoyerMyrvoldPlanarity; import graph.drawing.Drawing; @@ -10,10 +14,6 @@ import graph.layout.PropertyEnums.TutteProperties; import graph.layout.symmetric.SymmetricLayouter; -import java.awt.geom.Point2D; -import java.util.List; -import java.util.Map; - public class TutteLayouter > extends SymmetricLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/symmetric/SymmetricCircleLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricCircleLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/symmetric/SymmetricCircleLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricCircleLayouter.java index 4425182..8b28303 100644 --- a/GraphDrawingTheory/src/graph/layout/symmetric/SymmetricCircleLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricCircleLayouter.java @@ -1,5 +1,11 @@ package graph.layout.symmetric; +import java.awt.geom.Point2D; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + import graph.algorithms.drawing.CyclicSymmetricGraphDrawing; import graph.drawing.Drawing; import graph.elements.Edge; @@ -9,12 +15,6 @@ import graph.layout.PropertyEnums.SymmetricProperties; import graph.symmetry.Permutation; -import java.awt.geom.Point2D; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - public class SymmetricCircleLayouter > extends SymmetricLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/symmetric/SymmetricLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/symmetric/SymmetricLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricLayouter.java index ff47d61..1c87a1a 100644 --- a/GraphDrawingTheory/src/graph/layout/symmetric/SymmetricLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/symmetric/SymmetricLayouter.java @@ -1,5 +1,7 @@ package graph.layout.symmetric; +import java.awt.geom.Point2D; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; @@ -8,8 +10,6 @@ import graph.symmetry.Permutation; import graph.symmetry.nauty.McKayGraphLabelingAlgorithm; -import java.awt.geom.Point2D; - public abstract class SymmetricLayouter > extends AbstractLayouter{ protected Permutation p; diff --git a/GraphDrawingTheory/src/graph/layout/tree/JGraphCompactTreeLayout.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/JGraphCompactTreeLayout.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/JGraphCompactTreeLayout.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/JGraphCompactTreeLayout.java diff --git a/GraphDrawingTheory/src/graph/layout/tree/JungTreeLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/JungTreeLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/JungTreeLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/JungTreeLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/tree/PrefuseBalloonLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseBalloonLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/PrefuseBalloonLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseBalloonLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java index a224b3b..44e990d 100644 --- a/GraphDrawingTheory/src/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseNodeLinkTreeLayouter.java @@ -1,11 +1,11 @@ package graph.layout.tree; -import prefuse.action.layout.graph.NodeLinkTreeLayout; import graph.elements.Edge; import graph.elements.Vertex; import graph.layout.AbstractPrefuseLayouter; import graph.layout.GraphLayoutProperties; import graph.layout.PropertyEnums.NodeLinkTreeProperties; +import prefuse.action.layout.graph.NodeLinkTreeLayout; public class PrefuseNodeLinkTreeLayouter> extends AbstractPrefuseLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/tree/PrefuseRadialTreeLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseRadialTreeLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/PrefuseRadialTreeLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseRadialTreeLayouter.java index b58b1f3..5e15343 100644 --- a/GraphDrawingTheory/src/graph/layout/tree/PrefuseRadialTreeLayouter.java +++ b/GraphDrawingTheory/src/main/java/graph/layout/tree/PrefuseRadialTreeLayouter.java @@ -1,11 +1,11 @@ package graph.layout.tree; -import prefuse.action.layout.graph.RadialTreeLayout; import graph.elements.Edge; import graph.elements.Vertex; import graph.layout.AbstractPrefuseLayouter; import graph.layout.GraphLayoutProperties; import graph.layout.PropertyEnums.RadialTree2Properties; +import prefuse.action.layout.graph.RadialTreeLayout; public class PrefuseRadialTreeLayouter> extends AbstractPrefuseLayouter{ diff --git a/GraphDrawingTheory/src/graph/layout/tree/RadialTreeLayouter.java b/GraphDrawingTheory/src/main/java/graph/layout/tree/RadialTreeLayouter.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/tree/RadialTreeLayouter.java rename to GraphDrawingTheory/src/main/java/graph/layout/tree/RadialTreeLayouter.java diff --git a/GraphDrawingTheory/src/graph/layout/util/PositionAction.java b/GraphDrawingTheory/src/main/java/graph/layout/util/PositionAction.java similarity index 100% rename from GraphDrawingTheory/src/graph/layout/util/PositionAction.java rename to GraphDrawingTheory/src/main/java/graph/layout/util/PositionAction.java diff --git a/GraphDrawingTheory/src/graph/math/Calc.java b/GraphDrawingTheory/src/main/java/graph/math/Calc.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/Calc.java rename to GraphDrawingTheory/src/main/java/graph/math/Calc.java diff --git a/GraphDrawingTheory/src/graph/math/CircleLayoutCalc.java b/GraphDrawingTheory/src/main/java/graph/math/CircleLayoutCalc.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/CircleLayoutCalc.java rename to GraphDrawingTheory/src/main/java/graph/math/CircleLayoutCalc.java index 5b533fa..d4e358b 100644 --- a/GraphDrawingTheory/src/graph/math/CircleLayoutCalc.java +++ b/GraphDrawingTheory/src/main/java/graph/math/CircleLayoutCalc.java @@ -1,7 +1,5 @@ package graph.math; -import graph.elements.Vertex; - import java.awt.Point; import java.awt.geom.Point2D; import java.util.ArrayList; @@ -11,6 +9,8 @@ import java.util.List; import java.util.Map; +import graph.elements.Vertex; + public class CircleLayoutCalc { diff --git a/GraphDrawingTheory/src/graph/math/CramersRule.java b/GraphDrawingTheory/src/main/java/graph/math/CramersRule.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/CramersRule.java rename to GraphDrawingTheory/src/main/java/graph/math/CramersRule.java diff --git a/GraphDrawingTheory/src/graph/math/CzekanovskiDiceDistance.java b/GraphDrawingTheory/src/main/java/graph/math/CzekanovskiDiceDistance.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/CzekanovskiDiceDistance.java rename to GraphDrawingTheory/src/main/java/graph/math/CzekanovskiDiceDistance.java index 4b21f7d..af7b9d3 100644 --- a/GraphDrawingTheory/src/graph/math/CzekanovskiDiceDistance.java +++ b/GraphDrawingTheory/src/main/java/graph/math/CzekanovskiDiceDistance.java @@ -1,14 +1,14 @@ package graph.math; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + /** With respect to Czekanovski-Dice distance, * two vertices are close to each other if they * have many common vertices*/ diff --git a/GraphDrawingTheory/src/graph/math/GramSchmidt.java b/GraphDrawingTheory/src/main/java/graph/math/GramSchmidt.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/GramSchmidt.java rename to GraphDrawingTheory/src/main/java/graph/math/GramSchmidt.java diff --git a/GraphDrawingTheory/src/graph/math/Line.java b/GraphDrawingTheory/src/main/java/graph/math/Line.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/Line.java rename to GraphDrawingTheory/src/main/java/graph/math/Line.java diff --git a/GraphDrawingTheory/src/graph/math/Matrix.java b/GraphDrawingTheory/src/main/java/graph/math/Matrix.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/Matrix.java rename to GraphDrawingTheory/src/main/java/graph/math/Matrix.java diff --git a/GraphDrawingTheory/src/graph/math/MatrixUtil.java b/GraphDrawingTheory/src/main/java/graph/math/MatrixUtil.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/MatrixUtil.java rename to GraphDrawingTheory/src/main/java/graph/math/MatrixUtil.java diff --git a/GraphDrawingTheory/src/graph/math/Triangle.java b/GraphDrawingTheory/src/main/java/graph/math/Triangle.java similarity index 100% rename from GraphDrawingTheory/src/graph/math/Triangle.java rename to GraphDrawingTheory/src/main/java/graph/math/Triangle.java diff --git a/GraphDrawingTheory/src/graph/operations/GraphOperations.java b/GraphDrawingTheory/src/main/java/graph/operations/GraphOperations.java similarity index 100% rename from GraphDrawingTheory/src/graph/operations/GraphOperations.java rename to GraphDrawingTheory/src/main/java/graph/operations/GraphOperations.java index b5c5357..395cf96 100644 --- a/GraphDrawingTheory/src/graph/operations/GraphOperations.java +++ b/GraphDrawingTheory/src/main/java/graph/operations/GraphOperations.java @@ -1,12 +1,12 @@ package graph.operations; +import java.util.ArrayList; +import java.util.List; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; -import java.util.ArrayList; -import java.util.List; - public class GraphOperations> { diff --git a/GraphDrawingTheory/src/graph/ordering/CanonicalOrdering.java b/GraphDrawingTheory/src/main/java/graph/ordering/CanonicalOrdering.java similarity index 100% rename from GraphDrawingTheory/src/graph/ordering/CanonicalOrdering.java rename to GraphDrawingTheory/src/main/java/graph/ordering/CanonicalOrdering.java diff --git a/GraphDrawingTheory/src/graph/ordering/TopologicalOrdering.java b/GraphDrawingTheory/src/main/java/graph/ordering/TopologicalOrdering.java similarity index 100% rename from GraphDrawingTheory/src/graph/ordering/TopologicalOrdering.java rename to GraphDrawingTheory/src/main/java/graph/ordering/TopologicalOrdering.java diff --git a/GraphDrawingTheory/src/graph/ordering/circular/Circular.java b/GraphDrawingTheory/src/main/java/graph/ordering/circular/Circular.java similarity index 100% rename from GraphDrawingTheory/src/graph/ordering/circular/Circular.java rename to GraphDrawingTheory/src/main/java/graph/ordering/circular/Circular.java index fb4a66e..743b4f6 100644 --- a/GraphDrawingTheory/src/graph/ordering/circular/Circular.java +++ b/GraphDrawingTheory/src/main/java/graph/ordering/circular/Circular.java @@ -1,5 +1,11 @@ package graph.ordering.circular; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.log4j.Logger; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Path; @@ -7,12 +13,6 @@ import graph.elements.VertexDegreeComparator; import graph.traversal.GraphTraversal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.log4j.Logger; - public class Circular> { private Graph graph; diff --git a/GraphDrawingTheory/src/graph/ordering/circular/GraphCopy.java b/GraphDrawingTheory/src/main/java/graph/ordering/circular/GraphCopy.java similarity index 100% rename from GraphDrawingTheory/src/graph/ordering/circular/GraphCopy.java rename to GraphDrawingTheory/src/main/java/graph/ordering/circular/GraphCopy.java index 8ced70c..6608ca2 100644 --- a/GraphDrawingTheory/src/graph/ordering/circular/GraphCopy.java +++ b/GraphDrawingTheory/src/main/java/graph/ordering/circular/GraphCopy.java @@ -1,12 +1,12 @@ package graph.ordering.circular; +import java.util.ArrayList; +import java.util.List; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; -import java.util.ArrayList; -import java.util.List; - public class GraphCopy> extends Graph { diff --git a/GraphDrawingTheory/src/graph/ordering/circular/TriangulatedEdge.java b/GraphDrawingTheory/src/main/java/graph/ordering/circular/TriangulatedEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/ordering/circular/TriangulatedEdge.java rename to GraphDrawingTheory/src/main/java/graph/ordering/circular/TriangulatedEdge.java diff --git a/GraphDrawingTheory/src/graph/properties/Bipartite.java b/GraphDrawingTheory/src/main/java/graph/properties/Bipartite.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/Bipartite.java rename to GraphDrawingTheory/src/main/java/graph/properties/Bipartite.java index 8c5bc52..4187926 100644 --- a/GraphDrawingTheory/src/graph/properties/Bipartite.java +++ b/GraphDrawingTheory/src/main/java/graph/properties/Bipartite.java @@ -1,14 +1,14 @@ package graph.properties; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + /** * Bipartite graph (or bigraph) is a graph whose vertices can be divided into two disjoint sets U and V *(that is, U and V are each independent sets) such that every edge connects a vertex in U to one in V. diff --git a/GraphDrawingTheory/src/graph/properties/GraphProperties.java b/GraphDrawingTheory/src/main/java/graph/properties/GraphProperties.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/GraphProperties.java rename to GraphDrawingTheory/src/main/java/graph/properties/GraphProperties.java diff --git a/GraphDrawingTheory/src/graph/properties/components/Block.java b/GraphDrawingTheory/src/main/java/graph/properties/components/Block.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/Block.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/Block.java diff --git a/GraphDrawingTheory/src/graph/properties/components/Component.java b/GraphDrawingTheory/src/main/java/graph/properties/components/Component.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/Component.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/Component.java index c42d6a0..68835f0 100644 --- a/GraphDrawingTheory/src/graph/properties/components/Component.java +++ b/GraphDrawingTheory/src/main/java/graph/properties/components/Component.java @@ -1,11 +1,11 @@ package graph.properties.components; -import graph.elements.Edge; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Edge; +import graph.elements.Vertex; + public class Component> { protected List edges; diff --git a/GraphDrawingTheory/src/graph/properties/components/HopcroftTarjanSplitComponent.java b/GraphDrawingTheory/src/main/java/graph/properties/components/HopcroftTarjanSplitComponent.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/HopcroftTarjanSplitComponent.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/HopcroftTarjanSplitComponent.java diff --git a/GraphDrawingTheory/src/graph/properties/components/SplitComponent.java b/GraphDrawingTheory/src/main/java/graph/properties/components/SplitComponent.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/SplitComponent.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/SplitComponent.java diff --git a/GraphDrawingTheory/src/graph/properties/components/SplitPair.java b/GraphDrawingTheory/src/main/java/graph/properties/components/SplitPair.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/SplitPair.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/SplitPair.java diff --git a/GraphDrawingTheory/src/graph/properties/components/SplitTriconnectedComponentType.java b/GraphDrawingTheory/src/main/java/graph/properties/components/SplitTriconnectedComponentType.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/components/SplitTriconnectedComponentType.java rename to GraphDrawingTheory/src/main/java/graph/properties/components/SplitTriconnectedComponentType.java diff --git a/GraphDrawingTheory/src/graph/properties/splitting/AlgorithmErrorException.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/AlgorithmErrorException.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/AlgorithmErrorException.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/AlgorithmErrorException.java diff --git a/GraphDrawingTheory/src/graph/properties/splitting/BiconnectedSplitting.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/BiconnectedSplitting.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/BiconnectedSplitting.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/BiconnectedSplitting.java index ab63c8f..29be0bf 100644 --- a/GraphDrawingTheory/src/graph/properties/splitting/BiconnectedSplitting.java +++ b/GraphDrawingTheory/src/main/java/graph/properties/splitting/BiconnectedSplitting.java @@ -1,13 +1,13 @@ package graph.properties.splitting; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; import java.util.Stack; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + /** * Finds all biconnected components of a graph * efficiently, by using the depth-first search diff --git a/GraphDrawingTheory/src/graph/properties/splitting/HopcroftTarjanSplitting.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/HopcroftTarjanSplitting.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/HopcroftTarjanSplitting.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/HopcroftTarjanSplitting.java index ef3ca7c..2bf8e14 100644 --- a/GraphDrawingTheory/src/graph/properties/splitting/HopcroftTarjanSplitting.java +++ b/GraphDrawingTheory/src/main/java/graph/properties/splitting/HopcroftTarjanSplitting.java @@ -1,12 +1,5 @@ package graph.properties.splitting; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.properties.components.HopcroftTarjanSplitComponent; -import graph.properties.components.SplitTriconnectedComponentType; -import graph.util.Util; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -15,6 +8,13 @@ import org.apache.log4j.Logger; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.properties.components.HopcroftTarjanSplitComponent; +import graph.properties.components.SplitTriconnectedComponentType; +import graph.util.Util; + /** * Implementation based on Hopcroft and Tarjan's algorithm: * J. E. Hopcroft and R. E. Tarjan, Dividing a graph into triconnected components, diff --git a/GraphDrawingTheory/src/graph/properties/splitting/SeparationPair.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/SeparationPair.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/SeparationPair.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/SeparationPair.java diff --git a/GraphDrawingTheory/src/graph/properties/splitting/SeparationPairSplitting.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/SeparationPairSplitting.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/SeparationPairSplitting.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/SeparationPairSplitting.java index 35e0b96..5fbe45c 100644 --- a/GraphDrawingTheory/src/graph/properties/splitting/SeparationPairSplitting.java +++ b/GraphDrawingTheory/src/main/java/graph/properties/splitting/SeparationPairSplitting.java @@ -1,11 +1,5 @@ package graph.properties.splitting; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.properties.components.SplitPair; -import graph.trees.DFSTree; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -13,6 +7,12 @@ import org.apache.log4j.Logger; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.properties.components.SplitPair; +import graph.trees.DFSTree; + public class SeparationPairSplitting> { /** diff --git a/GraphDrawingTheory/src/graph/properties/splitting/Splitting.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/Splitting.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/Splitting.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/Splitting.java diff --git a/GraphDrawingTheory/src/graph/properties/splitting/Triple.java b/GraphDrawingTheory/src/main/java/graph/properties/splitting/Triple.java similarity index 100% rename from GraphDrawingTheory/src/graph/properties/splitting/Triple.java rename to GraphDrawingTheory/src/main/java/graph/properties/splitting/Triple.java diff --git a/GraphDrawingTheory/src/graph/symmetry/CyclicPermutation.java b/GraphDrawingTheory/src/main/java/graph/symmetry/CyclicPermutation.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/CyclicPermutation.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/CyclicPermutation.java index 4b519d3..4329468 100644 --- a/GraphDrawingTheory/src/graph/symmetry/CyclicPermutation.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/CyclicPermutation.java @@ -1,10 +1,10 @@ package graph.symmetry; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class CyclicPermutation { diff --git a/GraphDrawingTheory/src/graph/symmetry/DeFrayseeixHeuristic.java b/GraphDrawingTheory/src/main/java/graph/symmetry/DeFrayseeixHeuristic.java similarity index 99% rename from GraphDrawingTheory/src/graph/symmetry/DeFrayseeixHeuristic.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/DeFrayseeixHeuristic.java index df292b9..2e9ecfe 100644 --- a/GraphDrawingTheory/src/graph/symmetry/DeFrayseeixHeuristic.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/DeFrayseeixHeuristic.java @@ -1,13 +1,5 @@ package graph.symmetry; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.math.CzekanovskiDiceDistance; -import graph.math.GramSchmidt; -import graph.math.MatrixUtil; -import graph.util.Pair; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -15,6 +7,13 @@ import Jama.EigenvalueDecomposition; import Jama.Matrix; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.math.CzekanovskiDiceDistance; +import graph.math.GramSchmidt; +import graph.math.MatrixUtil; +import graph.util.Pair; public class DeFrayseeixHeuristic> { diff --git a/GraphDrawingTheory/src/graph/symmetry/Permutation.java b/GraphDrawingTheory/src/main/java/graph/symmetry/Permutation.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/Permutation.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/Permutation.java diff --git a/GraphDrawingTheory/src/graph/symmetry/PermutationAnalyzator.java b/GraphDrawingTheory/src/main/java/graph/symmetry/PermutationAnalyzator.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/PermutationAnalyzator.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/PermutationAnalyzator.java index d640327..9b8a340 100644 --- a/GraphDrawingTheory/src/graph/symmetry/PermutationAnalyzator.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/PermutationAnalyzator.java @@ -1,15 +1,15 @@ package graph.symmetry; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.symmetry.nauty.McKayGraphLabelingAlgorithm; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.symmetry.nauty.McKayGraphLabelingAlgorithm; + public class PermutationAnalyzator> { private List permutations; diff --git a/GraphDrawingTheory/src/graph/symmetry/PermutationCycle.java b/GraphDrawingTheory/src/main/java/graph/symmetry/PermutationCycle.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/PermutationCycle.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/PermutationCycle.java index a28a47a..7ca2835 100644 --- a/GraphDrawingTheory/src/graph/symmetry/PermutationCycle.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/PermutationCycle.java @@ -1,10 +1,10 @@ package graph.symmetry; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class PermutationCycle { private List cycle = new ArrayList(); diff --git a/GraphDrawingTheory/src/graph/symmetry/PermutationGroup.java b/GraphDrawingTheory/src/main/java/graph/symmetry/PermutationGroup.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/PermutationGroup.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/PermutationGroup.java diff --git a/GraphDrawingTheory/src/graph/symmetry/nauty/BinaryRepresentation.java b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/BinaryRepresentation.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/nauty/BinaryRepresentation.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/nauty/BinaryRepresentation.java index fa458c7..ccf034b 100644 --- a/GraphDrawingTheory/src/graph/symmetry/nauty/BinaryRepresentation.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/BinaryRepresentation.java @@ -1,11 +1,11 @@ package graph.symmetry.nauty; +import java.util.List; + import graph.elements.Edge; import graph.elements.Graph; import graph.elements.Vertex; -import java.util.List; - public class BinaryRepresentation> { private Graph graph; diff --git a/GraphDrawingTheory/src/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java index 5a68a02..108b1d5 100644 --- a/GraphDrawingTheory/src/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/McKayGraphLabelingAlgorithm.java @@ -1,17 +1,17 @@ package graph.symmetry.nauty; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.symmetry.Permutation; -import graph.util.Pair; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.symmetry.Permutation; +import graph.util.Pair; + /** * Implementation of McKay's canonical graph labeling algorithm * @author xx diff --git a/GraphDrawingTheory/src/graph/symmetry/nauty/OrderedPartition.java b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/OrderedPartition.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/nauty/OrderedPartition.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/nauty/OrderedPartition.java index 45614a4..9ab518b 100644 --- a/GraphDrawingTheory/src/graph/symmetry/nauty/OrderedPartition.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/OrderedPartition.java @@ -1,10 +1,10 @@ package graph.symmetry.nauty; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class OrderedPartition { private List> partition; diff --git a/GraphDrawingTheory/src/graph/symmetry/nauty/SearchTree.java b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/nauty/SearchTree.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTree.java index 8f746fc..ba6f004 100644 --- a/GraphDrawingTheory/src/graph/symmetry/nauty/SearchTree.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTree.java @@ -1,10 +1,10 @@ package graph.symmetry.nauty; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class SearchTree{ private SearchTreeNode root; diff --git a/GraphDrawingTheory/src/graph/symmetry/nauty/SearchTreeNode.java b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTreeNode.java similarity index 100% rename from GraphDrawingTheory/src/graph/symmetry/nauty/SearchTreeNode.java rename to GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTreeNode.java index 613bbaf..d15f1b1 100644 --- a/GraphDrawingTheory/src/graph/symmetry/nauty/SearchTreeNode.java +++ b/GraphDrawingTheory/src/main/java/graph/symmetry/nauty/SearchTreeNode.java @@ -1,10 +1,10 @@ package graph.symmetry.nauty; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; +import graph.elements.Vertex; + public class SearchTreeNode{ private OrderedPartition nodePartition; diff --git a/GraphDrawingTheory/src/graph/traversal/DFSTreeTraversal.java b/GraphDrawingTheory/src/main/java/graph/traversal/DFSTreeTraversal.java similarity index 100% rename from GraphDrawingTheory/src/graph/traversal/DFSTreeTraversal.java rename to GraphDrawingTheory/src/main/java/graph/traversal/DFSTreeTraversal.java diff --git a/GraphDrawingTheory/src/graph/traversal/DijkstraAlgorithm.java b/GraphDrawingTheory/src/main/java/graph/traversal/DijkstraAlgorithm.java similarity index 100% rename from GraphDrawingTheory/src/graph/traversal/DijkstraAlgorithm.java rename to GraphDrawingTheory/src/main/java/graph/traversal/DijkstraAlgorithm.java index ac8465e..7e5a730 100644 --- a/GraphDrawingTheory/src/graph/traversal/DijkstraAlgorithm.java +++ b/GraphDrawingTheory/src/main/java/graph/traversal/DijkstraAlgorithm.java @@ -1,11 +1,5 @@ package graph.traversal; -import graph.elements.Edge; -import graph.elements.EdgeDirection; -import graph.elements.Graph; -import graph.elements.Path; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -14,6 +8,12 @@ import java.util.Map; import java.util.Set; +import graph.elements.Edge; +import graph.elements.EdgeDirection; +import graph.elements.Graph; +import graph.elements.Path; +import graph.elements.Vertex; + /** * Algorithm for finding a path between two graph vertices in a graph diff --git a/GraphDrawingTheory/src/graph/traversal/GraphTraversal.java b/GraphDrawingTheory/src/main/java/graph/traversal/GraphTraversal.java similarity index 100% rename from GraphDrawingTheory/src/graph/traversal/GraphTraversal.java rename to GraphDrawingTheory/src/main/java/graph/traversal/GraphTraversal.java diff --git a/GraphDrawingTheory/src/graph/traversal/TraversalUtil.java b/GraphDrawingTheory/src/main/java/graph/traversal/TraversalUtil.java similarity index 100% rename from GraphDrawingTheory/src/graph/traversal/TraversalUtil.java rename to GraphDrawingTheory/src/main/java/graph/traversal/TraversalUtil.java diff --git a/GraphDrawingTheory/src/graph/tree/bc/BCNodeType.java b/GraphDrawingTheory/src/main/java/graph/tree/bc/BCNodeType.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/bc/BCNodeType.java rename to GraphDrawingTheory/src/main/java/graph/tree/bc/BCNodeType.java diff --git a/GraphDrawingTheory/src/graph/tree/bc/BCTree.java b/GraphDrawingTheory/src/main/java/graph/tree/bc/BCTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/bc/BCTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/bc/BCTree.java diff --git a/GraphDrawingTheory/src/graph/tree/bc/BCTreeEdge.java b/GraphDrawingTheory/src/main/java/graph/tree/bc/BCTreeEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/bc/BCTreeEdge.java rename to GraphDrawingTheory/src/main/java/graph/tree/bc/BCTreeEdge.java diff --git a/GraphDrawingTheory/src/graph/tree/bc/BCTreeNode.java b/GraphDrawingTheory/src/main/java/graph/tree/bc/BCTreeNode.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/bc/BCTreeNode.java rename to GraphDrawingTheory/src/main/java/graph/tree/bc/BCTreeNode.java diff --git a/GraphDrawingTheory/src/graph/tree/binary/BinaryTree.java b/GraphDrawingTheory/src/main/java/graph/tree/binary/BinaryTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/binary/BinaryTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/binary/BinaryTree.java index a46cdc9..a6cc4a2 100644 --- a/GraphDrawingTheory/src/graph/tree/binary/BinaryTree.java +++ b/GraphDrawingTheory/src/main/java/graph/tree/binary/BinaryTree.java @@ -1,10 +1,5 @@ package graph.tree.binary; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; -import graph.exception.CannotBeAppliedException; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -12,6 +7,11 @@ import org.apache.log4j.Logger; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; +import graph.exception.CannotBeAppliedException; + /** * A binary tree constructed from a given undirected graph */ diff --git a/GraphDrawingTheory/src/graph/tree/binary/BinaryTreeNode.java b/GraphDrawingTheory/src/main/java/graph/tree/binary/BinaryTreeNode.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/binary/BinaryTreeNode.java rename to GraphDrawingTheory/src/main/java/graph/tree/binary/BinaryTreeNode.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQNodeLabel.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeLabel.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQNodeLabel.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeLabel.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQNodeMark.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeMark.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQNodeMark.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeMark.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQNodeOrderValid.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeOrderValid.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQNodeOrderValid.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeOrderValid.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQNodeType.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeType.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQNodeType.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQNodeType.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQTree.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQTree.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQTreeEdge.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeEdge.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQTreeEdge.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeEdge.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQTreeNode.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeNode.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQTreeNode.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeNode.java diff --git a/GraphDrawingTheory/src/graph/tree/pq/PQTreeReduction.java b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeReduction.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/pq/PQTreeReduction.java rename to GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeReduction.java index 65fd0ed..94ece4d 100644 --- a/GraphDrawingTheory/src/graph/tree/pq/PQTreeReduction.java +++ b/GraphDrawingTheory/src/main/java/graph/tree/pq/PQTreeReduction.java @@ -1,8 +1,5 @@ package graph.tree.pq; -import graph.elements.Edge; -import graph.elements.Vertex; - import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -11,6 +8,9 @@ import org.apache.log4j.Logger; +import graph.elements.Edge; +import graph.elements.Vertex; + public class PQTreeReduction> { diff --git a/GraphDrawingTheory/src/graph/tree/spqr/AbstractTree.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/AbstractTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/AbstractTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/AbstractTree.java diff --git a/GraphDrawingTheory/src/graph/tree/spqr/NodeType.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/NodeType.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/NodeType.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/NodeType.java diff --git a/GraphDrawingTheory/src/graph/tree/spqr/ProtoSPQRTree.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/ProtoSPQRTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/ProtoSPQRTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/ProtoSPQRTree.java diff --git a/GraphDrawingTheory/src/graph/tree/spqr/SPQRTree.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/SPQRTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/SPQRTree.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/SPQRTree.java diff --git a/GraphDrawingTheory/src/graph/tree/spqr/SPQRTreeNode.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/SPQRTreeNode.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/SPQRTreeNode.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/SPQRTreeNode.java index aaab61b..4b2f5b7 100644 --- a/GraphDrawingTheory/src/graph/tree/spqr/SPQRTreeNode.java +++ b/GraphDrawingTheory/src/main/java/graph/tree/spqr/SPQRTreeNode.java @@ -1,13 +1,13 @@ package graph.tree.spqr; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.awt.Dimension; import java.util.ArrayList; import java.util.List; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + public class SPQRTreeNode> implements Vertex{ diff --git a/GraphDrawingTheory/src/graph/tree/spqr/Skeleton.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/Skeleton.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/Skeleton.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/Skeleton.java diff --git a/GraphDrawingTheory/src/graph/tree/spqr/TreeEdgeWithContent.java b/GraphDrawingTheory/src/main/java/graph/tree/spqr/TreeEdgeWithContent.java similarity index 100% rename from GraphDrawingTheory/src/graph/tree/spqr/TreeEdgeWithContent.java rename to GraphDrawingTheory/src/main/java/graph/tree/spqr/TreeEdgeWithContent.java diff --git a/GraphDrawingTheory/src/graph/trees/DFSTree.java b/GraphDrawingTheory/src/main/java/graph/trees/DFSTree.java similarity index 100% rename from GraphDrawingTheory/src/graph/trees/DFSTree.java rename to GraphDrawingTheory/src/main/java/graph/trees/DFSTree.java index 96b4c50..6da7419 100644 --- a/GraphDrawingTheory/src/graph/trees/DFSTree.java +++ b/GraphDrawingTheory/src/main/java/graph/trees/DFSTree.java @@ -1,11 +1,5 @@ package graph.trees; -import graph.elements.Edge; -import graph.elements.EdgeDirection; -import graph.elements.Graph; -import graph.elements.Path; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -14,6 +8,12 @@ import java.util.List; import java.util.Map; +import graph.elements.Edge; +import graph.elements.EdgeDirection; +import graph.elements.Graph; +import graph.elements.Path; +import graph.elements.Vertex; + public class DFSTree> extends Graph{ private V root; diff --git a/GraphDrawingTheory/src/graph/util/Pair.java b/GraphDrawingTheory/src/main/java/graph/util/Pair.java similarity index 100% rename from GraphDrawingTheory/src/graph/util/Pair.java rename to GraphDrawingTheory/src/main/java/graph/util/Pair.java diff --git a/GraphDrawingTheory/src/graph/util/Util.java b/GraphDrawingTheory/src/main/java/graph/util/Util.java similarity index 100% rename from GraphDrawingTheory/src/graph/util/Util.java rename to GraphDrawingTheory/src/main/java/graph/util/Util.java index 3e4fa58..396cf26 100644 --- a/GraphDrawingTheory/src/graph/util/Util.java +++ b/GraphDrawingTheory/src/main/java/graph/util/Util.java @@ -1,13 +1,13 @@ package graph.util; -import graph.elements.Edge; -import graph.elements.Graph; -import graph.elements.Vertex; - import java.util.ArrayList; import java.util.List; import java.util.Random; +import graph.elements.Edge; +import graph.elements.Graph; +import graph.elements.Vertex; + public class Util { @SuppressWarnings("unchecked") diff --git a/GraphDrawingTheory/src/log4j.properties b/GraphDrawingTheory/src/main/resources/log4j.properties similarity index 100% rename from GraphDrawingTheory/src/log4j.properties rename to GraphDrawingTheory/src/main/resources/log4j.properties diff --git a/GraphDrawingTheory/test/graph/test/algorithms/GraphTestCase.java b/GraphDrawingTheory/src/test/java/graph/test/algorithms/GraphTestCase.java similarity index 95% rename from GraphDrawingTheory/test/graph/test/algorithms/GraphTestCase.java rename to GraphDrawingTheory/src/test/java/graph/test/algorithms/GraphTestCase.java index 88b207e..c62ed18 100644 --- a/GraphDrawingTheory/test/graph/test/algorithms/GraphTestCase.java +++ b/GraphDrawingTheory/src/test/java/graph/test/algorithms/GraphTestCase.java @@ -1,11 +1,12 @@ package graph.test.algorithms; +import org.junit.Before; + import graph.elements.Graph; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; -import junit.framework.TestCase; -public class GraphTestCase extends TestCase{ +public class GraphTestCase{ protected Graph graph; protected TestVertex vert1 = new TestVertex("1"); @@ -36,7 +37,8 @@ public class GraphTestCase extends TestCase{ protected TestEdge edge14 = new TestEdge(vert1, vert11); protected TestEdge edge15 = new TestEdge(vert7, vert3); - @Override + + @Before public void setUp(){ graph = new Graph(false); diff --git a/GraphDrawingTheory/test/graph/test/algorithms/TestDFSTree.java b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDFSTree.java similarity index 94% rename from GraphDrawingTheory/test/graph/test/algorithms/TestDFSTree.java rename to GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDFSTree.java index 52f5a0b..8fdfd41 100644 --- a/GraphDrawingTheory/test/graph/test/algorithms/TestDFSTree.java +++ b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDFSTree.java @@ -1,16 +1,19 @@ package graph.test.algorithms; +import static org.junit.Assert.assertEquals; + +import org.junit.Ignore; +import org.junit.Test; + import graph.elements.Graph; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; import graph.traversal.DFSTreeTraversal; import graph.trees.DFSTree; -import org.junit.Test; - +@Ignore public class TestDFSTree extends GraphTestCase{ - @Test public void test(){ DFSTreeTraversal traversal = new DFSTreeTraversal<>(graph); diff --git a/GraphDrawingTheory/test/graph/test/algorithms/TestDijkstra.java b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDijkstra.java similarity index 93% rename from GraphDrawingTheory/test/graph/test/algorithms/TestDijkstra.java rename to GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDijkstra.java index 56073fc..f1e4e7a 100644 --- a/GraphDrawingTheory/test/graph/test/algorithms/TestDijkstra.java +++ b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestDijkstra.java @@ -1,11 +1,13 @@ package graph.test.algorithms; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; import graph.traversal.DijkstraAlgorithm; -import org.junit.Test; - public class TestDijkstra extends GraphTestCase{ diff --git a/GraphDrawingTheory/test/graph/test/algorithms/TestLRPartitioning.java b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestLRPartitioning.java similarity index 95% rename from GraphDrawingTheory/test/graph/test/algorithms/TestLRPartitioning.java rename to GraphDrawingTheory/src/test/java/graph/test/algorithms/TestLRPartitioning.java index 7affeaf..94ce77b 100644 --- a/GraphDrawingTheory/test/graph/test/algorithms/TestLRPartitioning.java +++ b/GraphDrawingTheory/src/test/java/graph/test/algorithms/TestLRPartitioning.java @@ -1,16 +1,20 @@ package graph.test.algorithms; +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + import graph.algorithms.lrpartition.LRPartition; import graph.elements.Graph; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; import graph.traversal.DFSTreeTraversal; import graph.trees.DFSTree; -import junit.framework.TestCase; - -import org.junit.Test; -public class TestLRPartitioning extends TestCase{ +@Ignore +public class TestLRPartitioning { private Graph graph; private TestVertex vert1 = new TestVertex("1"); @@ -41,7 +45,7 @@ public class TestLRPartitioning extends TestCase{ private TestEdge edge14 = new TestEdge(vert1, vert11); private TestEdge edge15 = new TestEdge(vert7, vert3); - @Override + @Before public void setUp(){ graph = new Graph(false); diff --git a/GraphDrawingTheory/test/graph/test/elements/TestEdge.java b/GraphDrawingTheory/src/test/java/graph/test/elements/TestEdge.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/elements/TestEdge.java rename to GraphDrawingTheory/src/test/java/graph/test/elements/TestEdge.java diff --git a/GraphDrawingTheory/test/graph/test/elements/TestVertex.java b/GraphDrawingTheory/src/test/java/graph/test/elements/TestVertex.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/elements/TestVertex.java rename to GraphDrawingTheory/src/test/java/graph/test/elements/TestVertex.java index b1874f9..ac883ee 100644 --- a/GraphDrawingTheory/test/graph/test/elements/TestVertex.java +++ b/GraphDrawingTheory/src/test/java/graph/test/elements/TestVertex.java @@ -1,9 +1,9 @@ package graph.test.elements; -import graph.elements.Vertex; - import java.awt.Dimension; +import graph.elements.Vertex; + public class TestVertex implements Vertex{ @Override diff --git a/GraphDrawingTheory/test/graph/test/graph/properties/TestGraph.java b/GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestGraph.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/graph/properties/TestGraph.java rename to GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestGraph.java index e80bd43..fb3b650 100644 --- a/GraphDrawingTheory/test/graph/test/graph/properties/TestGraph.java +++ b/GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestGraph.java @@ -1,5 +1,7 @@ package graph.test.graph.properties; +import org.junit.Test; + import graph.elements.Graph; import graph.properties.Bipartite; import graph.test.elements.TestEdge; @@ -7,8 +9,6 @@ import graph.traversal.GraphTraversal; import junit.framework.TestCase; -import org.junit.Test; - public class TestGraph extends TestCase{ diff --git a/GraphDrawingTheory/test/graph/test/graph/properties/TestSplitting.java b/GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestSplitting.java similarity index 99% rename from GraphDrawingTheory/test/graph/test/graph/properties/TestSplitting.java rename to GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestSplitting.java index 4658a7a..42fb6f0 100644 --- a/GraphDrawingTheory/test/graph/test/graph/properties/TestSplitting.java +++ b/GraphDrawingTheory/src/test/java/graph/test/graph/properties/TestSplitting.java @@ -1,17 +1,16 @@ package graph.test.graph.properties; +import java.util.List; + +import org.junit.Test; + import graph.elements.Graph; import graph.properties.components.SplitPair; import graph.properties.splitting.Splitting; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; - -import java.util.List; - import junit.framework.TestCase; -import org.junit.Test; - public class TestSplitting extends TestCase{ TestVertex vert1 = new TestVertex("1"); diff --git a/GraphDrawingTheory/test/graph/test/layout/LayoutsSpeedTest.java b/GraphDrawingTheory/src/test/java/graph/test/layout/LayoutsSpeedTest.java similarity index 96% rename from GraphDrawingTheory/test/graph/test/layout/LayoutsSpeedTest.java rename to GraphDrawingTheory/src/test/java/graph/test/layout/LayoutsSpeedTest.java index 55ee678..9f01a59 100644 --- a/GraphDrawingTheory/test/graph/test/layout/LayoutsSpeedTest.java +++ b/GraphDrawingTheory/src/test/java/graph/test/layout/LayoutsSpeedTest.java @@ -5,18 +5,12 @@ import java.util.List; import java.util.Map; -import org.apache.commons.collections15.map.HashedMap; - import graph.algorithm.AlgorithmExecutor; import graph.algorithm.ExecuteResult; import graph.elements.Graph; -import graph.layout.DefaultGraphLayoutProperties; import graph.layout.GraphLayoutProperties; import graph.layout.LayoutAlgorithms; import graph.layout.Layouter; -import graph.layout.PropertyEnums.CircleProperties; -import graph.layout.PropertyEnums.SymmetricProperties; -import graph.symmetry.Permutation; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; import graph.traversal.DFSTreeTraversal; diff --git a/GraphDrawingTheory/test/graph/test/operations/TestGraphOperations.java b/GraphDrawingTheory/src/test/java/graph/test/operations/TestGraphOperations.java similarity index 99% rename from GraphDrawingTheory/test/graph/test/operations/TestGraphOperations.java rename to GraphDrawingTheory/src/test/java/graph/test/operations/TestGraphOperations.java index bfe97c3..2560f72 100644 --- a/GraphDrawingTheory/test/graph/test/operations/TestGraphOperations.java +++ b/GraphDrawingTheory/src/test/java/graph/test/operations/TestGraphOperations.java @@ -1,17 +1,16 @@ package graph.test.operations; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + import graph.elements.Graph; import graph.operations.GraphOperations; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; - -import java.util.ArrayList; -import java.util.List; - import junit.framework.TestCase; -import org.junit.Test; - public class TestGraphOperations extends TestCase{ @Test diff --git a/GraphDrawingTheory/test/graph/test/planarity/BoyerMyrvoldPlanarityTest.java b/GraphDrawingTheory/src/test/java/graph/test/planarity/BoyerMyrvoldPlanarityTest.java similarity index 99% rename from GraphDrawingTheory/test/graph/test/planarity/BoyerMyrvoldPlanarityTest.java rename to GraphDrawingTheory/src/test/java/graph/test/planarity/BoyerMyrvoldPlanarityTest.java index e144f92..29b4fbd 100644 --- a/GraphDrawingTheory/test/graph/test/planarity/BoyerMyrvoldPlanarityTest.java +++ b/GraphDrawingTheory/src/test/java/graph/test/planarity/BoyerMyrvoldPlanarityTest.java @@ -1,13 +1,12 @@ package graph.test.planarity; +import org.junit.Test; + import graph.algorithms.planarity.BoyerMyrvoldPlanarity; import graph.algorithms.planarity.PlanarityTestingAlgorithm; import graph.elements.Graph; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; - -import org.junit.Test; - import junit.framework.TestCase; public class BoyerMyrvoldPlanarityTest extends TestCase { diff --git a/GraphDrawingTheory/test/graph/test/planarity/TestPlanarity.java b/GraphDrawingTheory/src/test/java/graph/test/planarity/TestPlanarity.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/planarity/TestPlanarity.java rename to GraphDrawingTheory/src/test/java/graph/test/planarity/TestPlanarity.java diff --git a/GraphDrawingTheory/test/graph/test/symmetry/GramSchmidtTest.java b/GraphDrawingTheory/src/test/java/graph/test/symmetry/GramSchmidtTest.java similarity index 99% rename from GraphDrawingTheory/test/graph/test/symmetry/GramSchmidtTest.java rename to GraphDrawingTheory/src/test/java/graph/test/symmetry/GramSchmidtTest.java index 22116c0..83ba3ff 100644 --- a/GraphDrawingTheory/test/graph/test/symmetry/GramSchmidtTest.java +++ b/GraphDrawingTheory/src/test/java/graph/test/symmetry/GramSchmidtTest.java @@ -1,11 +1,10 @@ package graph.test.symmetry; -import graph.math.GramSchmidt; -import junit.framework.TestCase; - import org.junit.Test; import Jama.Matrix; +import graph.math.GramSchmidt; +import junit.framework.TestCase; public class GramSchmidtTest extends TestCase{ diff --git a/GraphDrawingTheory/test/graph/test/tree/TestBCTree.java b/GraphDrawingTheory/src/test/java/graph/test/tree/TestBCTree.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/tree/TestBCTree.java rename to GraphDrawingTheory/src/test/java/graph/test/tree/TestBCTree.java index 81a69f1..9ea0fec 100644 --- a/GraphDrawingTheory/test/graph/test/tree/TestBCTree.java +++ b/GraphDrawingTheory/src/test/java/graph/test/tree/TestBCTree.java @@ -1,13 +1,13 @@ package graph.test.tree; +import org.junit.Test; + import graph.elements.Graph; import graph.test.elements.TestEdge; import graph.test.elements.TestVertex; import graph.tree.bc.BCTree; import junit.framework.TestCase; -import org.junit.Test; - public class TestBCTree extends TestCase { TestVertex vertA = new TestVertex("A"); diff --git a/GraphDrawingTheory/test/graph/test/tree/TestSPQR.java b/GraphDrawingTheory/src/test/java/graph/test/tree/TestSPQR.java similarity index 100% rename from GraphDrawingTheory/test/graph/test/tree/TestSPQR.java rename to GraphDrawingTheory/src/test/java/graph/test/tree/TestSPQR.java index 39dab67..c79a5bd 100644 --- a/GraphDrawingTheory/test/graph/test/tree/TestSPQR.java +++ b/GraphDrawingTheory/src/test/java/graph/test/tree/TestSPQR.java @@ -1,5 +1,7 @@ package graph.test.tree; +import org.junit.Test; + import graph.elements.Graph; import graph.exception.CannotBeAppliedException; import graph.test.elements.TestEdge; @@ -8,8 +10,6 @@ import graph.tree.spqr.SPQRTree; import junit.framework.TestCase; -import org.junit.Test; - public class TestSPQR extends TestCase{ TestVertex vert1 = new TestVertex("1"); diff --git a/GraphDrawingTheory/target/.gitignore b/GraphDrawingTheory/target/.gitignore deleted file mode 100644 index 751bd89..0000000 --- a/GraphDrawingTheory/target/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/test-classes/ diff --git a/GraphEditor/.classpath b/GraphEditor/.classpath deleted file mode 100644 index d89c37c..0000000 --- a/GraphEditor/.classpath +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/GraphEditor/.project b/GraphEditor/.project deleted file mode 100644 index bcc9b9f..0000000 --- a/GraphEditor/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - GraphEditor - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - diff --git a/GraphEditor/pom.xml b/GraphEditor/pom.xml index cdae5df..4fa1060 100644 --- a/GraphEditor/pom.xml +++ b/GraphEditor/pom.xml @@ -1,46 +1,46 @@ - - 4.0.0 - GraphEditor - GraphEditor - 0.1.0-SNAPSHOT - - src - - - src - - **/*.java - - - - - - maven-compiler-plugin - 3.1 - - - - - - - - - - log4j - log4j - 1.2.17 - - - com.miglayout - miglayout-swing - 5.0 - - - com.thoughtworks.xstream - xstream - 1.4.8 - - - - + + + GraphDrawing + GraphDrawing + 0.1.0-SNAPSHOT + .. + + + 4.0.0 + GraphEditor + GraphEditor + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + + + GraphDrawingTheory + GraphDrawingTheory + ${project.version} + + + log4j + log4j + + + com.miglayout + miglayout-swing + + + com.thoughtworks.xstream + xstream + + \ No newline at end of file diff --git a/GraphEditor/src/gui/actions/main/frame/ExitAction.java b/GraphEditor/src/main/java/gui/actions/main/frame/ExitAction.java similarity index 83% rename from GraphEditor/src/gui/actions/main/frame/ExitAction.java rename to GraphEditor/src/main/java/gui/actions/main/frame/ExitAction.java index b89f269..81d7d8e 100644 --- a/GraphEditor/src/gui/actions/main/frame/ExitAction.java +++ b/GraphEditor/src/main/java/gui/actions/main/frame/ExitAction.java @@ -16,7 +16,7 @@ public class ExitAction extends AbstractAction{ public ExitAction(){ putValue(NAME, "Exit"); putValue(SHORT_DESCRIPTION, "Close application"); - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/exit.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/exit.png"))); } diff --git a/GraphEditor/src/gui/actions/main/frame/LoadAction.java b/GraphEditor/src/main/java/gui/actions/main/frame/LoadAction.java similarity index 93% rename from GraphEditor/src/gui/actions/main/frame/LoadAction.java rename to GraphEditor/src/main/java/gui/actions/main/frame/LoadAction.java index d7a3322..3e61a86 100644 --- a/GraphEditor/src/gui/actions/main/frame/LoadAction.java +++ b/GraphEditor/src/main/java/gui/actions/main/frame/LoadAction.java @@ -1,9 +1,5 @@ package gui.actions.main.frame; -import gui.main.frame.MainFrame; -import gui.model.GraphModel; -import gui.view.GraphView; - import java.awt.event.ActionEvent; import java.io.File; @@ -15,6 +11,10 @@ import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.StaxDriver; +import gui.main.frame.MainFrame; +import gui.model.GraphModel; +import gui.view.GraphView; + public class LoadAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -22,7 +22,7 @@ public class LoadAction extends AbstractAction { public LoadAction(){ putValue(NAME, "Load"); - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/load.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/load.png"))); putValue(SHORT_DESCRIPTION, "Load graph"); xstream = new XStream(new StaxDriver()); } diff --git a/GraphEditor/src/gui/actions/main/frame/NewGraphAction.java b/GraphEditor/src/main/java/gui/actions/main/frame/NewGraphAction.java similarity index 84% rename from GraphEditor/src/gui/actions/main/frame/NewGraphAction.java rename to GraphEditor/src/main/java/gui/actions/main/frame/NewGraphAction.java index c35ae86..e60628e 100644 --- a/GraphEditor/src/gui/actions/main/frame/NewGraphAction.java +++ b/GraphEditor/src/main/java/gui/actions/main/frame/NewGraphAction.java @@ -1,12 +1,12 @@ package gui.actions.main.frame; -import gui.main.frame.MainFrame; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ImageIcon; +import gui.main.frame.MainFrame; + public class NewGraphAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -14,7 +14,7 @@ public class NewGraphAction extends AbstractAction { public NewGraphAction(){ putValue(NAME, "New"); putValue(SHORT_DESCRIPTION, "Create new graph"); - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/new.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/new.png"))); } @Override diff --git a/GraphEditor/src/gui/actions/main/frame/SaveAction.java b/GraphEditor/src/main/java/gui/actions/main/frame/SaveAction.java similarity index 95% rename from GraphEditor/src/gui/actions/main/frame/SaveAction.java rename to GraphEditor/src/main/java/gui/actions/main/frame/SaveAction.java index b5b8648..2c031a3 100644 --- a/GraphEditor/src/gui/actions/main/frame/SaveAction.java +++ b/GraphEditor/src/main/java/gui/actions/main/frame/SaveAction.java @@ -1,8 +1,5 @@ package gui.actions.main.frame; -import gui.main.frame.MainFrame; -import gui.model.GraphModel; - import java.awt.event.ActionEvent; import java.io.File; import java.io.FileOutputStream; @@ -15,6 +12,9 @@ import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.StaxDriver; +import gui.main.frame.MainFrame; +import gui.model.GraphModel; + public class SaveAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -22,7 +22,7 @@ public class SaveAction extends AbstractAction { public SaveAction(){ putValue(NAME, "Save"); - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/save.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/save.png"))); putValue(SHORT_DESCRIPTION, "Save graph"); xstream = new XStream(new StaxDriver()); } diff --git a/GraphEditor/src/gui/actions/palette/AddVertexAction.java b/GraphEditor/src/main/java/gui/actions/palette/AddVertexAction.java similarity index 100% rename from GraphEditor/src/gui/actions/palette/AddVertexAction.java rename to GraphEditor/src/main/java/gui/actions/palette/AddVertexAction.java index 3d81d72..89d96b9 100644 --- a/GraphEditor/src/gui/actions/palette/AddVertexAction.java +++ b/GraphEditor/src/main/java/gui/actions/palette/AddVertexAction.java @@ -1,12 +1,12 @@ package gui.actions.palette; -import gui.main.frame.ElementsEnum; -import gui.main.frame.MainFrame; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; +import gui.main.frame.ElementsEnum; +import gui.main.frame.MainFrame; + public class AddVertexAction extends AbstractAction{ /** diff --git a/GraphEditor/src/gui/actions/palette/LayoutAction.java b/GraphEditor/src/main/java/gui/actions/palette/LayoutAction.java similarity index 100% rename from GraphEditor/src/gui/actions/palette/LayoutAction.java rename to GraphEditor/src/main/java/gui/actions/palette/LayoutAction.java index 7291733..461f065 100644 --- a/GraphEditor/src/gui/actions/palette/LayoutAction.java +++ b/GraphEditor/src/main/java/gui/actions/palette/LayoutAction.java @@ -1,10 +1,17 @@ package gui.actions.palette; +import java.awt.event.ActionEvent; +import java.awt.geom.Point2D; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.JOptionPane; + import graph.drawing.Drawing; import graph.elements.Graph; import graph.exception.CannotBeAppliedException; -import graph.layout.LayoutAlgorithms; import graph.layout.GraphLayoutProperties; +import graph.layout.LayoutAlgorithms; import graph.layout.Layouter; import gui.dialogs.LayoutDialog; import gui.main.frame.MainFrame; @@ -12,13 +19,6 @@ import gui.model.GraphVertex; import gui.view.GraphView; -import java.awt.event.ActionEvent; -import java.awt.geom.Point2D; -import java.util.List; - -import javax.swing.AbstractAction; -import javax.swing.JOptionPane; - public class LayoutAction extends AbstractAction{ /** diff --git a/GraphEditor/src/gui/actions/palette/LinkAction.java b/GraphEditor/src/main/java/gui/actions/palette/LinkAction.java similarity index 100% rename from GraphEditor/src/gui/actions/palette/LinkAction.java rename to GraphEditor/src/main/java/gui/actions/palette/LinkAction.java index 36791a1..52b946e 100644 --- a/GraphEditor/src/gui/actions/palette/LinkAction.java +++ b/GraphEditor/src/main/java/gui/actions/palette/LinkAction.java @@ -1,11 +1,11 @@ package gui.actions.palette; -import gui.main.frame.MainFrame; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; +import gui.main.frame.MainFrame; + public class LinkAction extends AbstractAction{ /** diff --git a/GraphEditor/src/gui/actions/palette/SelectAction.java b/GraphEditor/src/main/java/gui/actions/palette/SelectAction.java similarity index 100% rename from GraphEditor/src/gui/actions/palette/SelectAction.java rename to GraphEditor/src/main/java/gui/actions/palette/SelectAction.java index 57739c0..456cf2f 100644 --- a/GraphEditor/src/gui/actions/palette/SelectAction.java +++ b/GraphEditor/src/main/java/gui/actions/palette/SelectAction.java @@ -1,11 +1,11 @@ package gui.actions.palette; -import gui.main.frame.MainFrame; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; +import gui.main.frame.MainFrame; + public class SelectAction extends AbstractAction{ /** diff --git a/GraphEditor/src/gui/actions/toolbar/RedoAction.java b/GraphEditor/src/main/java/gui/actions/toolbar/RedoAction.java similarity index 84% rename from GraphEditor/src/gui/actions/toolbar/RedoAction.java rename to GraphEditor/src/main/java/gui/actions/toolbar/RedoAction.java index 384a908..00693e0 100644 --- a/GraphEditor/src/gui/actions/toolbar/RedoAction.java +++ b/GraphEditor/src/main/java/gui/actions/toolbar/RedoAction.java @@ -1,12 +1,12 @@ package gui.actions.toolbar; -import gui.commands.CommandExecutor; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ImageIcon; +import gui.commands.CommandExecutor; + public class RedoAction extends AbstractAction{ /** @@ -15,7 +15,7 @@ public class RedoAction extends AbstractAction{ private static final long serialVersionUID = 1L; public RedoAction() { - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/redo.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/redo.png"))); putValue(NAME, "Redo"); putValue(SHORT_DESCRIPTION, "Redo previous action"); diff --git a/GraphEditor/src/gui/actions/toolbar/RemoveAction.java b/GraphEditor/src/main/java/gui/actions/toolbar/RemoveAction.java similarity index 91% rename from GraphEditor/src/gui/actions/toolbar/RemoveAction.java rename to GraphEditor/src/main/java/gui/actions/toolbar/RemoveAction.java index 0a2deba..e025832 100644 --- a/GraphEditor/src/gui/actions/toolbar/RemoveAction.java +++ b/GraphEditor/src/main/java/gui/actions/toolbar/RemoveAction.java @@ -1,11 +1,5 @@ package gui.actions.toolbar; -import gui.commands.CommandExecutor; -import gui.commands.RemoveCommand; -import gui.main.frame.MainFrame; -import gui.model.GraphElement; -import gui.view.GraphView; - import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; @@ -13,6 +7,12 @@ import javax.swing.AbstractAction; import javax.swing.ImageIcon; +import gui.commands.CommandExecutor; +import gui.commands.RemoveCommand; +import gui.main.frame.MainFrame; +import gui.model.GraphElement; +import gui.view.GraphView; + public class RemoveAction extends AbstractAction { /** @@ -21,7 +21,7 @@ public class RemoveAction extends AbstractAction { private static final long serialVersionUID = 1L; public RemoveAction(){ - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/remove.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/remove.png"))); putValue(NAME, "Delete"); putValue(SHORT_DESCRIPTION, "Delete selected elements"); diff --git a/GraphEditor/src/gui/actions/toolbar/UndoAction.java b/GraphEditor/src/main/java/gui/actions/toolbar/UndoAction.java similarity index 84% rename from GraphEditor/src/gui/actions/toolbar/UndoAction.java rename to GraphEditor/src/main/java/gui/actions/toolbar/UndoAction.java index 39af3bf..e522269 100644 --- a/GraphEditor/src/gui/actions/toolbar/UndoAction.java +++ b/GraphEditor/src/main/java/gui/actions/toolbar/UndoAction.java @@ -1,12 +1,12 @@ package gui.actions.toolbar; -import gui.commands.CommandExecutor; - import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ImageIcon; +import gui.commands.CommandExecutor; + public class UndoAction extends AbstractAction{ /** @@ -15,7 +15,7 @@ public class UndoAction extends AbstractAction{ private static final long serialVersionUID = 1L; public UndoAction(){ - putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/gui/resources/undo.png"))); + putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/icons/undo.png"))); putValue(NAME, "Undo"); putValue(SHORT_DESCRIPTION, "Undo previous action"); diff --git a/GraphEditor/src/gui/app/Applcation.java b/GraphEditor/src/main/java/gui/app/Application.java similarity index 84% rename from GraphEditor/src/gui/app/Applcation.java rename to GraphEditor/src/main/java/gui/app/Application.java index e3e05b3..38d3760 100644 --- a/GraphEditor/src/gui/app/Applcation.java +++ b/GraphEditor/src/main/java/gui/app/Application.java @@ -2,7 +2,7 @@ import gui.main.frame.MainFrame; -public class Applcation { +public class Application { public static void main(String[] args){ MainFrame.getInstance().setVisible(true); diff --git a/GraphEditor/src/gui/command/panel/CommandPanel.java b/GraphEditor/src/main/java/gui/command/panel/CommandPanel.java similarity index 99% rename from GraphEditor/src/gui/command/panel/CommandPanel.java rename to GraphEditor/src/main/java/gui/command/panel/CommandPanel.java index 89c74de..2cfce4e 100644 --- a/GraphEditor/src/gui/command/panel/CommandPanel.java +++ b/GraphEditor/src/main/java/gui/command/panel/CommandPanel.java @@ -1,14 +1,23 @@ package gui.command.panel; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + import graph.algorithm.AlgorithmExecutor; import graph.algorithm.ExecuteResult; import graph.algorithm.cycles.SimpleCyclesFinder; import graph.algorithm.cycles.SimpleUndirectedCyclesFinder; import graph.algorithms.drawing.ConvexDrawing; import graph.algorithms.drawing.VisibilityRepresentation; -import graph.algorithms.planarity.BoyerMyrvoldPlanarity; import graph.algorithms.planarity.FraysseixMendezPlanarity; -import graph.algorithms.planarity.PQTreePlanarity; import graph.algorithms.planarity.PlanarityTestingAlgorithm; import graph.drawing.Drawing; import graph.elements.Graph; @@ -31,18 +40,6 @@ import gui.view.GraphView; import gui.view.painters.EdgePainter; import gui.view.painters.VertexPainter; - -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; - import net.miginfocom.swing.MigLayout; public class CommandPanel extends JPanel{ diff --git a/GraphEditor/src/gui/commands/AddElementCommand.java b/GraphEditor/src/main/java/gui/commands/AddElementCommand.java similarity index 100% rename from GraphEditor/src/gui/commands/AddElementCommand.java rename to GraphEditor/src/main/java/gui/commands/AddElementCommand.java diff --git a/GraphEditor/src/gui/commands/Command.java b/GraphEditor/src/main/java/gui/commands/Command.java similarity index 100% rename from GraphEditor/src/gui/commands/Command.java rename to GraphEditor/src/main/java/gui/commands/Command.java diff --git a/GraphEditor/src/gui/commands/CommandExecutor.java b/GraphEditor/src/main/java/gui/commands/CommandExecutor.java similarity index 100% rename from GraphEditor/src/gui/commands/CommandExecutor.java rename to GraphEditor/src/main/java/gui/commands/CommandExecutor.java diff --git a/GraphEditor/src/gui/commands/MoveCommand.java b/GraphEditor/src/main/java/gui/commands/MoveCommand.java similarity index 100% rename from GraphEditor/src/gui/commands/MoveCommand.java rename to GraphEditor/src/main/java/gui/commands/MoveCommand.java index bfe4c8c..c939f04 100644 --- a/GraphEditor/src/gui/commands/MoveCommand.java +++ b/GraphEditor/src/main/java/gui/commands/MoveCommand.java @@ -1,14 +1,14 @@ package gui.commands; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + import gui.model.GraphEdge; import gui.model.GraphElement; import gui.model.GraphVertex; import gui.view.GraphView; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - public class MoveCommand extends Command { diff --git a/GraphEditor/src/gui/commands/RemoveCommand.java b/GraphEditor/src/main/java/gui/commands/RemoveCommand.java similarity index 100% rename from GraphEditor/src/gui/commands/RemoveCommand.java rename to GraphEditor/src/main/java/gui/commands/RemoveCommand.java index 26a0045..f535fa4 100644 --- a/GraphEditor/src/gui/commands/RemoveCommand.java +++ b/GraphEditor/src/main/java/gui/commands/RemoveCommand.java @@ -1,5 +1,8 @@ package gui.commands; +import java.util.ArrayList; +import java.util.List; + import gui.model.GraphEdge; import gui.model.GraphElement; import gui.model.GraphModel; @@ -9,9 +12,6 @@ import gui.view.painters.IElementPainter; import gui.view.painters.VertexPainter; -import java.util.ArrayList; -import java.util.List; - public class RemoveCommand extends Command{ diff --git a/GraphEditor/src/gui/components/JDigitsTextField.java b/GraphEditor/src/main/java/gui/components/JDigitsTextField.java similarity index 100% rename from GraphEditor/src/gui/components/JDigitsTextField.java rename to GraphEditor/src/main/java/gui/components/JDigitsTextField.java diff --git a/GraphEditor/src/gui/components/JDoubleTextField.java b/GraphEditor/src/main/java/gui/components/JDoubleTextField.java similarity index 100% rename from GraphEditor/src/gui/components/JDoubleTextField.java rename to GraphEditor/src/main/java/gui/components/JDoubleTextField.java diff --git a/GraphEditor/src/gui/components/NumberFilter.java b/GraphEditor/src/main/java/gui/components/NumberFilter.java similarity index 100% rename from GraphEditor/src/gui/components/NumberFilter.java rename to GraphEditor/src/main/java/gui/components/NumberFilter.java diff --git a/GraphEditor/src/gui/components/TypeComponents.java b/GraphEditor/src/main/java/gui/components/TypeComponents.java similarity index 100% rename from GraphEditor/src/gui/components/TypeComponents.java rename to GraphEditor/src/main/java/gui/components/TypeComponents.java diff --git a/GraphEditor/src/gui/dialogs/LayoutDialog.java b/GraphEditor/src/main/java/gui/dialogs/LayoutDialog.java similarity index 99% rename from GraphEditor/src/gui/dialogs/LayoutDialog.java rename to GraphEditor/src/main/java/gui/dialogs/LayoutDialog.java index 3d606cc..a412065 100644 --- a/GraphEditor/src/gui/dialogs/LayoutDialog.java +++ b/GraphEditor/src/main/java/gui/dialogs/LayoutDialog.java @@ -1,12 +1,5 @@ package gui.dialogs; -import graph.layout.LayoutAlgorithms; -import graph.layout.DefaultGraphLayoutProperties; -import graph.layout.GraphLayoutProperties; -import gui.main.frame.MainFrame; -import gui.panels.layout.LayoutPanelFactory; -import gui.panels.layout.LayoutPropertyPanel; - import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -18,6 +11,12 @@ import javax.swing.JLabel; import javax.swing.JPanel; +import graph.layout.DefaultGraphLayoutProperties; +import graph.layout.GraphLayoutProperties; +import graph.layout.LayoutAlgorithms; +import gui.main.frame.MainFrame; +import gui.panels.layout.LayoutPanelFactory; +import gui.panels.layout.LayoutPropertyPanel; import net.miginfocom.swing.MigLayout; public class LayoutDialog extends JDialog{ diff --git a/GraphEditor/src/gui/main/frame/ElementsEnum.java b/GraphEditor/src/main/java/gui/main/frame/ElementsEnum.java similarity index 100% rename from GraphEditor/src/gui/main/frame/ElementsEnum.java rename to GraphEditor/src/main/java/gui/main/frame/ElementsEnum.java diff --git a/GraphEditor/src/gui/main/frame/MainFrame.java b/GraphEditor/src/main/java/gui/main/frame/MainFrame.java similarity index 84% rename from GraphEditor/src/gui/main/frame/MainFrame.java rename to GraphEditor/src/main/java/gui/main/frame/MainFrame.java index 4ace46e..d23db28 100644 --- a/GraphEditor/src/gui/main/frame/MainFrame.java +++ b/GraphEditor/src/main/java/gui/main/frame/MainFrame.java @@ -1,5 +1,23 @@ package gui.main.frame; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.geom.Point2D; + +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSplitPane; +import javax.swing.JTabbedPane; +import javax.swing.JToggleButton; +import javax.swing.JToolBar; + import graph.elements.Graph; import gui.actions.main.frame.ExitAction; import gui.actions.main.frame.LoadAction; @@ -24,29 +42,11 @@ import gui.util.GuiUtil; import gui.util.StatusBar; import gui.view.GraphView; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.geom.Point2D; - -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JSplitPane; -import javax.swing.JTabbedPane; -import javax.swing.JToggleButton; -import javax.swing.JToolBar; - import net.miginfocom.swing.MigLayout; -public class MainFrame extends JFrame{ +public class MainFrame extends JFrame { + private static final String MESSAGE_GRAPH_NOT_FOUND = "Graph not found, select the option create a new Graph!"; /** * */ @@ -68,7 +68,7 @@ public class MainFrame extends JFrame{ private RedoAction redoAction = new RedoAction(); private UndoAction undoAction = new UndoAction(); - public MainFrame(){ + public MainFrame() { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setSize(800, 600); @@ -93,15 +93,15 @@ public void windowClosing(WindowEvent e) { } - private void initGui(){ - + private void initGui() { + JPanel centralPanel = new JPanel(new MigLayout("fill")); add(centralPanel, "grow"); - + JPanel leftPanel = new JPanel(new MigLayout("fill")); pane = new JTabbedPane(); leftPanel.add(pane, "grow"); - + JSplitPane rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); JPanel palettePanel = new JPanel(new MigLayout()); ButtonGroup group = new ButtonGroup(); @@ -113,34 +113,34 @@ private void initGui(){ btnEdge = new JToggleButton(new LinkAction()); palettePanel.add(btnEdge, "wrap"); group.add(btnEdge); - + btnSelect = new JToggleButton(new SelectAction()); palettePanel.add(btnSelect, "wrap"); group.add(btnSelect); - + palettePanel.add(new JButton(new LayoutAction())); - + propertiesPanel = new JPanel(new MigLayout("fill")); propertiesPanel.add(new JLabel("Properties"), "dock north"); - + rightSplitPane.setLeftComponent(palettePanel); rightSplitPane.setRightComponent(propertiesPanel); - + commandPanel = new CommandPanel(); leftPanel.add(commandPanel, "dock south"); - + JSplitPane centralSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); centralSplitPane.setRightComponent(rightSplitPane); centralSplitPane.setResizeWeight(0.9); centralSplitPane.setLeftComponent(leftPanel); centralPanel.add(centralSplitPane, "grow"); - + statusBar = new StatusBar(); add(statusBar, "height 20:20:20, dock south"); } - - private void initMenu(){ + + private void initMenu() { menuBar = new JMenuBar(); @@ -154,7 +154,7 @@ private void initMenu(){ JMenuItem undoMi = new JMenuItem(undoAction); JMenuItem redoMi = new JMenuItem(redoAction); JMenuItem removeMi = new JMenuItem(removeAction); - + editMenu.add(newMi); editMenu.addSeparator(); editMenu.add(undoMi); @@ -166,13 +166,13 @@ private void initMenu(){ fileMenu.add(loadMi); fileMenu.addSeparator(); fileMenu.add(exitMi); - + menuBar.add(fileMenu); menuBar.add(editMenu); setJMenuBar(menuBar); } - private void initToolBar(){ + private void initToolBar() { toolBar = new JToolBar(); add(toolBar, "dock north"); toolBar.add(newGraphAction); @@ -185,29 +185,30 @@ private void initToolBar(){ toolBar.add(redoAction); } - public static MainFrame getInstance(){ + public static MainFrame getInstance() { if (instance == null) instance = new MainFrame(); return instance; } - - public GraphView getCurrentView(){ + public GraphView getCurrentView() { if (pane.getComponentCount() > 0) return (GraphView) pane.getSelectedComponent(); return null; } - public void addNewDiagram(){ + + public void addNewDiagram() { Graph graph = new Graph(); GraphView view = new GraphView(graph); pane.add(view); } - public void addDiagram(GraphView view){ + + public void addDiagram(GraphView view) { pane.add(view); } - - public void setPropertiesPanel(PropertiesPanel panel){ + + public void setPropertiesPanel(PropertiesPanel panel) { if (propertiesPanel.getComponentCount() > 1) propertiesPanel.remove(1); if (panel != null) @@ -215,45 +216,49 @@ public void setPropertiesPanel(PropertiesPanel panel){ propertiesPanel.revalidate(); propertiesPanel.repaint(); } - - public void updateStatusBarPosition(Point2D position){ - statusBar.setPositionText((int)position.getX() + ", " + (int)position.getY()); + + public void updateStatusBarPosition(Point2D position) { + statusBar.setPositionText((int) position.getX() + ", " + (int) position.getY()); } - public void changeToAdd(ElementsEnum elementType){ + public void changeToAdd(ElementsEnum elementType) { btnVertex.setSelected(true); GraphView currentView = getCurrentView(); - currentView.setCurrentState(new AddState(currentView, ElementsEnum.VERTEX)); - statusBar.setLabelText("Add"); + if (currentView == null) { + JOptionPane.showMessageDialog(this, MESSAGE_GRAPH_NOT_FOUND); + } else { + currentView.setCurrentState(new AddState(currentView, ElementsEnum.VERTEX)); + statusBar.setLabelText("Add"); + } } - public void changeToLink(){ + public void changeToLink() { btnEdge.setSelected(true); GraphView currentView = getCurrentView(); currentView.setCurrentState(new LinkState(currentView)); statusBar.setLabelText("Link"); - } - public void changeToSelect(){ + public void changeToSelect() { btnSelect.setSelected(true); GraphView currentView = getCurrentView(); currentView.setCurrentState(new SelectState(currentView)); statusBar.setLabelText("Select"); } - - public void changeToLassoSelect(){ + + public void changeToLassoSelect() { GraphView currentView = getCurrentView(); currentView.setCurrentState(new LassoSelectState(currentView)); statusBar.setLabelText("Lasso selection"); - + } - public void changeToMoveState(Point2D mousePosition){ + public void changeToMoveState(Point2D mousePosition) { GraphView currentView = getCurrentView(); - currentView.setCurrentState(new MoveState(currentView.getSelectionModel().getSelectedVertices(), currentView, mousePosition)); + currentView.setCurrentState( + new MoveState(currentView.getSelectionModel().getSelectedVertices(), currentView, mousePosition)); statusBar.setLabelText("Move state"); } } diff --git a/GraphEditor/src/gui/model/GraphEdge.java b/GraphEditor/src/main/java/gui/model/GraphEdge.java similarity index 100% rename from GraphEditor/src/gui/model/GraphEdge.java rename to GraphEditor/src/main/java/gui/model/GraphEdge.java index ab9fefc..7871c0d 100644 --- a/GraphEditor/src/gui/model/GraphEdge.java +++ b/GraphEditor/src/main/java/gui/model/GraphEdge.java @@ -1,12 +1,12 @@ package gui.model; -import graph.elements.Edge; - import java.awt.Color; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; +import graph.elements.Edge; + public class GraphEdge extends GraphElement implements Edge{ private GraphVertex origin, destination; diff --git a/GraphEditor/src/gui/model/GraphElement.java b/GraphEditor/src/main/java/gui/model/GraphElement.java similarity index 100% rename from GraphEditor/src/gui/model/GraphElement.java rename to GraphEditor/src/main/java/gui/model/GraphElement.java diff --git a/GraphEditor/src/gui/model/GraphModel.java b/GraphEditor/src/main/java/gui/model/GraphModel.java similarity index 100% rename from GraphEditor/src/gui/model/GraphModel.java rename to GraphEditor/src/main/java/gui/model/GraphModel.java index 4fa2d2a..1e43cd6 100644 --- a/GraphEditor/src/gui/model/GraphModel.java +++ b/GraphEditor/src/main/java/gui/model/GraphModel.java @@ -1,11 +1,11 @@ package gui.model; -import graph.elements.Graph; -import gui.view.GraphView; - import java.awt.Color; import java.util.Observable; +import graph.elements.Graph; +import gui.view.GraphView; + public class GraphModel extends Observable implements IGraphElement{ private Graph graph; diff --git a/GraphEditor/src/gui/model/GraphVertex.java b/GraphEditor/src/main/java/gui/model/GraphVertex.java similarity index 100% rename from GraphEditor/src/gui/model/GraphVertex.java rename to GraphEditor/src/main/java/gui/model/GraphVertex.java index 88f77bf..521145e 100644 --- a/GraphEditor/src/gui/model/GraphVertex.java +++ b/GraphEditor/src/main/java/gui/model/GraphVertex.java @@ -1,11 +1,11 @@ package gui.model; -import graph.elements.Vertex; - import java.awt.Color; import java.awt.Dimension; import java.awt.geom.Point2D; +import graph.elements.Vertex; + public class GraphVertex extends GraphElement implements Vertex{ private Dimension size; diff --git a/GraphEditor/src/gui/model/IGraphElement.java b/GraphEditor/src/main/java/gui/model/IGraphElement.java similarity index 100% rename from GraphEditor/src/gui/model/IGraphElement.java rename to GraphEditor/src/main/java/gui/model/IGraphElement.java diff --git a/GraphEditor/src/gui/model/SelectionModel.java b/GraphEditor/src/main/java/gui/model/SelectionModel.java similarity index 100% rename from GraphEditor/src/gui/model/SelectionModel.java rename to GraphEditor/src/main/java/gui/model/SelectionModel.java index 03964e6..8956ee6 100644 --- a/GraphEditor/src/gui/model/SelectionModel.java +++ b/GraphEditor/src/main/java/gui/model/SelectionModel.java @@ -1,11 +1,11 @@ package gui.model; -import gui.view.GraphView; - import java.util.ArrayList; import java.util.List; import java.util.Observable; +import gui.view.GraphView; + public class SelectionModel extends Observable{ private List selectedVertices = new ArrayList(); diff --git a/GraphEditor/src/gui/panels/layout/HierarchicalLayoutPanel.java b/GraphEditor/src/main/java/gui/panels/layout/HierarchicalLayoutPanel.java similarity index 100% rename from GraphEditor/src/gui/panels/layout/HierarchicalLayoutPanel.java rename to GraphEditor/src/main/java/gui/panels/layout/HierarchicalLayoutPanel.java index ec891a1..b7f1cd3 100644 --- a/GraphEditor/src/gui/panels/layout/HierarchicalLayoutPanel.java +++ b/GraphEditor/src/main/java/gui/panels/layout/HierarchicalLayoutPanel.java @@ -1,12 +1,12 @@ package gui.panels.layout; -import graph.layout.GraphLayoutProperties; -import graph.layout.PropertyEnums.HierarchicalProperties; - import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.SwingConstants; +import graph.layout.GraphLayoutProperties; +import graph.layout.PropertyEnums.HierarchicalProperties; + public class HierarchicalLayoutPanel extends LayoutPropertyPanel{ private static final long serialVersionUID = 1L; diff --git a/GraphEditor/src/gui/panels/layout/LayoutPanelFactory.java b/GraphEditor/src/main/java/gui/panels/layout/LayoutPanelFactory.java similarity index 100% rename from GraphEditor/src/gui/panels/layout/LayoutPanelFactory.java rename to GraphEditor/src/main/java/gui/panels/layout/LayoutPanelFactory.java index 79efd45..b981f35 100644 --- a/GraphEditor/src/gui/panels/layout/LayoutPanelFactory.java +++ b/GraphEditor/src/main/java/gui/panels/layout/LayoutPanelFactory.java @@ -1,5 +1,8 @@ package gui.panels.layout; +import java.util.HashMap; +import java.util.Map; + import graph.layout.LayoutAlgorithms; import graph.layout.PropertyEnums.BalloonProperties; import graph.layout.PropertyEnums.BoxProperties; @@ -19,9 +22,6 @@ import graph.layout.PropertyEnums.TreeProperties; import graph.layout.PropertyEnums.TutteProperties; -import java.util.HashMap; -import java.util.Map; - public class LayoutPanelFactory { private static Map panelsMap= new HashMap(); diff --git a/GraphEditor/src/gui/panels/layout/LayoutPropertyPanel.java b/GraphEditor/src/main/java/gui/panels/layout/LayoutPropertyPanel.java similarity index 99% rename from GraphEditor/src/gui/panels/layout/LayoutPropertyPanel.java rename to GraphEditor/src/main/java/gui/panels/layout/LayoutPropertyPanel.java index c8c7fe1..81ea28f 100644 --- a/GraphEditor/src/gui/panels/layout/LayoutPropertyPanel.java +++ b/GraphEditor/src/main/java/gui/panels/layout/LayoutPropertyPanel.java @@ -1,11 +1,5 @@ package gui.panels.layout; -import graph.layout.GraphLayoutProperties; -import graph.layout.PropertyEnums; -import gui.components.JDigitsTextField; -import gui.components.JDoubleTextField; -import gui.components.TypeComponents; - import java.awt.Component; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -19,6 +13,11 @@ import javax.swing.JPanel; import javax.swing.JTextField; +import graph.layout.GraphLayoutProperties; +import graph.layout.PropertyEnums; +import gui.components.JDigitsTextField; +import gui.components.JDoubleTextField; +import gui.components.TypeComponents; import net.miginfocom.swing.MigLayout; public class LayoutPropertyPanel extends JPanel { diff --git a/GraphEditor/src/gui/panels/layout/NodeLinkTreeLayoutPanel.java b/GraphEditor/src/main/java/gui/panels/layout/NodeLinkTreeLayoutPanel.java similarity index 100% rename from GraphEditor/src/gui/panels/layout/NodeLinkTreeLayoutPanel.java rename to GraphEditor/src/main/java/gui/panels/layout/NodeLinkTreeLayoutPanel.java index 60351b3..fa0ac83 100644 --- a/GraphEditor/src/gui/panels/layout/NodeLinkTreeLayoutPanel.java +++ b/GraphEditor/src/main/java/gui/panels/layout/NodeLinkTreeLayoutPanel.java @@ -1,11 +1,11 @@ package gui.panels.layout; -import graph.layout.GraphLayoutProperties; -import graph.layout.PropertyEnums.NodeLinkTreeProperties; - import javax.swing.JComboBox; import javax.swing.JLabel; +import graph.layout.GraphLayoutProperties; +import graph.layout.PropertyEnums.NodeLinkTreeProperties; + public class NodeLinkTreeLayoutPanel extends LayoutPropertyPanel{ private static final long serialVersionUID = 1L; diff --git a/GraphEditor/src/gui/panels/layout/SymmetricLayoutPanel.java b/GraphEditor/src/main/java/gui/panels/layout/SymmetricLayoutPanel.java similarity index 100% rename from GraphEditor/src/gui/panels/layout/SymmetricLayoutPanel.java rename to GraphEditor/src/main/java/gui/panels/layout/SymmetricLayoutPanel.java index 3a83dd4..d462599 100644 --- a/GraphEditor/src/gui/panels/layout/SymmetricLayoutPanel.java +++ b/GraphEditor/src/main/java/gui/panels/layout/SymmetricLayoutPanel.java @@ -1,5 +1,10 @@ package gui.panels.layout; +import java.awt.Component; +import java.util.List; + +import javax.swing.JComboBox; + import graph.elements.Graph; import graph.layout.PropertyEnums.SymmetricProperties; import graph.symmetry.Permutation; @@ -8,11 +13,6 @@ import gui.model.GraphEdge; import gui.model.GraphVertex; -import java.awt.Component; -import java.util.List; - -import javax.swing.JComboBox; - public class SymmetricLayoutPanel extends LayoutPropertyPanel{ /** diff --git a/GraphEditor/src/gui/properties/EdgePropertiesPanel.java b/GraphEditor/src/main/java/gui/properties/EdgePropertiesPanel.java similarity index 99% rename from GraphEditor/src/gui/properties/EdgePropertiesPanel.java rename to GraphEditor/src/main/java/gui/properties/EdgePropertiesPanel.java index 72822eb..5af4d7e 100644 --- a/GraphEditor/src/gui/properties/EdgePropertiesPanel.java +++ b/GraphEditor/src/main/java/gui/properties/EdgePropertiesPanel.java @@ -1,9 +1,5 @@ package gui.properties; -import gui.main.frame.MainFrame; -import gui.model.GraphEdge; -import gui.model.IGraphElement; - import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -13,6 +9,9 @@ import javax.swing.JLabel; import javax.swing.JTextField; +import gui.main.frame.MainFrame; +import gui.model.GraphEdge; +import gui.model.IGraphElement; import net.miginfocom.swing.MigLayout; public class EdgePropertiesPanel extends PropertiesPanel { diff --git a/GraphEditor/src/gui/properties/GraphModelPropertiesPanel.java b/GraphEditor/src/main/java/gui/properties/GraphModelPropertiesPanel.java similarity index 99% rename from GraphEditor/src/gui/properties/GraphModelPropertiesPanel.java rename to GraphEditor/src/main/java/gui/properties/GraphModelPropertiesPanel.java index f01a02a..0fc94a4 100644 --- a/GraphEditor/src/gui/properties/GraphModelPropertiesPanel.java +++ b/GraphEditor/src/main/java/gui/properties/GraphModelPropertiesPanel.java @@ -1,9 +1,5 @@ package gui.properties; -import gui.main.frame.MainFrame; -import gui.model.GraphModel; -import gui.model.IGraphElement; - import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -18,6 +14,9 @@ import javax.swing.JLabel; import javax.swing.JTextField; +import gui.main.frame.MainFrame; +import gui.model.GraphModel; +import gui.model.IGraphElement; import net.miginfocom.swing.MigLayout; public class GraphModelPropertiesPanel extends PropertiesPanel{ diff --git a/GraphEditor/src/gui/properties/PropertiesFactory.java b/GraphEditor/src/main/java/gui/properties/PropertiesFactory.java similarity index 100% rename from GraphEditor/src/gui/properties/PropertiesFactory.java rename to GraphEditor/src/main/java/gui/properties/PropertiesFactory.java index 567711e..af2b022 100644 --- a/GraphEditor/src/gui/properties/PropertiesFactory.java +++ b/GraphEditor/src/main/java/gui/properties/PropertiesFactory.java @@ -1,12 +1,12 @@ package gui.properties; +import java.util.HashMap; +import java.util.Map; + import gui.model.GraphEdge; import gui.model.GraphModel; -import gui.model.IGraphElement; import gui.model.GraphVertex; - -import java.util.HashMap; -import java.util.Map; +import gui.model.IGraphElement; public class PropertiesFactory { diff --git a/GraphEditor/src/gui/properties/PropertiesPanel.java b/GraphEditor/src/main/java/gui/properties/PropertiesPanel.java similarity index 100% rename from GraphEditor/src/gui/properties/PropertiesPanel.java rename to GraphEditor/src/main/java/gui/properties/PropertiesPanel.java index 835ca18..9170eea 100644 --- a/GraphEditor/src/gui/properties/PropertiesPanel.java +++ b/GraphEditor/src/main/java/gui/properties/PropertiesPanel.java @@ -1,9 +1,9 @@ package gui.properties; -import gui.model.IGraphElement; - import javax.swing.JPanel; +import gui.model.IGraphElement; + public abstract class PropertiesPanel extends JPanel{ private static final long serialVersionUID = 1L; diff --git a/GraphEditor/src/gui/properties/VertexPropertiesPanel.java b/GraphEditor/src/main/java/gui/properties/VertexPropertiesPanel.java similarity index 99% rename from GraphEditor/src/gui/properties/VertexPropertiesPanel.java rename to GraphEditor/src/main/java/gui/properties/VertexPropertiesPanel.java index a3574bd..347783d 100644 --- a/GraphEditor/src/gui/properties/VertexPropertiesPanel.java +++ b/GraphEditor/src/main/java/gui/properties/VertexPropertiesPanel.java @@ -1,9 +1,5 @@ package gui.properties; -import gui.main.frame.MainFrame; -import gui.model.IGraphElement; -import gui.model.GraphVertex; - import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -15,6 +11,9 @@ import javax.swing.JLabel; import javax.swing.JTextField; +import gui.main.frame.MainFrame; +import gui.model.GraphVertex; +import gui.model.IGraphElement; import net.miginfocom.swing.MigLayout; public class VertexPropertiesPanel extends PropertiesPanel{ diff --git a/GraphEditor/src/gui/state/AddState.java b/GraphEditor/src/main/java/gui/state/AddState.java similarity index 100% rename from GraphEditor/src/gui/state/AddState.java rename to GraphEditor/src/main/java/gui/state/AddState.java index 59abd39..ada18c9 100644 --- a/GraphEditor/src/gui/state/AddState.java +++ b/GraphEditor/src/main/java/gui/state/AddState.java @@ -1,5 +1,9 @@ package gui.state; +import java.awt.event.MouseEvent; + +import javax.swing.SwingUtilities; + import gui.commands.AddElementCommand; import gui.commands.Command; import gui.commands.CommandExecutor; @@ -8,10 +12,6 @@ import gui.model.GraphVertex; import gui.view.GraphView; -import java.awt.event.MouseEvent; - -import javax.swing.SwingUtilities; - public class AddState extends State{ private ElementsEnum currentElementType; diff --git a/GraphEditor/src/gui/state/LassoSelectState.java b/GraphEditor/src/main/java/gui/state/LassoSelectState.java similarity index 100% rename from GraphEditor/src/gui/state/LassoSelectState.java rename to GraphEditor/src/main/java/gui/state/LassoSelectState.java index ead23d4..6756ce8 100644 --- a/GraphEditor/src/gui/state/LassoSelectState.java +++ b/GraphEditor/src/main/java/gui/state/LassoSelectState.java @@ -1,11 +1,11 @@ package gui.state; +import java.awt.event.MouseEvent; + import gui.main.frame.MainFrame; import gui.properties.PropertiesFactory; import gui.view.GraphView; -import java.awt.event.MouseEvent; - public class LassoSelectState extends State{ diff --git a/GraphEditor/src/gui/state/LinkState.java b/GraphEditor/src/main/java/gui/state/LinkState.java similarity index 100% rename from GraphEditor/src/gui/state/LinkState.java rename to GraphEditor/src/main/java/gui/state/LinkState.java index 9a66127..78013fa 100644 --- a/GraphEditor/src/gui/state/LinkState.java +++ b/GraphEditor/src/main/java/gui/state/LinkState.java @@ -1,5 +1,12 @@ package gui.state; +import java.awt.event.MouseEvent; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.SwingUtilities; + import gui.commands.AddElementCommand; import gui.commands.Command; import gui.commands.CommandExecutor; @@ -8,13 +15,6 @@ import gui.model.GraphVertex; import gui.view.GraphView; -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.SwingUtilities; - public class LinkState extends State{ diff --git a/GraphEditor/src/gui/state/MoveState.java b/GraphEditor/src/main/java/gui/state/MoveState.java similarity index 100% rename from GraphEditor/src/gui/state/MoveState.java rename to GraphEditor/src/main/java/gui/state/MoveState.java index fa634f1..def3191 100644 --- a/GraphEditor/src/gui/state/MoveState.java +++ b/GraphEditor/src/main/java/gui/state/MoveState.java @@ -1,5 +1,12 @@ package gui.state; +import java.awt.event.MouseEvent; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.SwingUtilities; + import gui.commands.Command; import gui.commands.CommandExecutor; import gui.commands.MoveCommand; @@ -9,13 +16,6 @@ import gui.model.GraphVertex; import gui.view.GraphView; -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.SwingUtilities; - public class MoveState extends State{ private List vertices; diff --git a/GraphEditor/src/gui/state/SelectState.java b/GraphEditor/src/main/java/gui/state/SelectState.java similarity index 100% rename from GraphEditor/src/gui/state/SelectState.java rename to GraphEditor/src/main/java/gui/state/SelectState.java index 47240eb..6f9ca0f 100644 --- a/GraphEditor/src/gui/state/SelectState.java +++ b/GraphEditor/src/main/java/gui/state/SelectState.java @@ -1,14 +1,14 @@ package gui.state; +import java.awt.event.MouseEvent; + import gui.main.frame.MainFrame; import gui.model.GraphEdge; -import gui.model.IGraphElement; import gui.model.GraphVertex; +import gui.model.IGraphElement; import gui.properties.PropertiesFactory; import gui.view.GraphView; -import java.awt.event.MouseEvent; - public class SelectState extends State{ diff --git a/GraphEditor/src/gui/state/State.java b/GraphEditor/src/main/java/gui/state/State.java similarity index 100% rename from GraphEditor/src/gui/state/State.java rename to GraphEditor/src/main/java/gui/state/State.java index 48adfd9..cd061f7 100644 --- a/GraphEditor/src/gui/state/State.java +++ b/GraphEditor/src/main/java/gui/state/State.java @@ -1,14 +1,14 @@ package gui.state; -import gui.main.frame.MainFrame; -import gui.view.GraphView; - import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import gui.main.frame.MainFrame; +import gui.view.GraphView; + public abstract class State implements MouseListener, MouseMotionListener, KeyListener { diff --git a/GraphEditor/src/gui/util/GuiUtil.java b/GraphEditor/src/main/java/gui/util/GuiUtil.java similarity index 100% rename from GraphEditor/src/gui/util/GuiUtil.java rename to GraphEditor/src/main/java/gui/util/GuiUtil.java index a93c644..fd1eb9d 100644 --- a/GraphEditor/src/gui/util/GuiUtil.java +++ b/GraphEditor/src/main/java/gui/util/GuiUtil.java @@ -1,9 +1,9 @@ package gui.util; -import gui.main.frame.MainFrame; - import javax.swing.JOptionPane; +import gui.main.frame.MainFrame; + public class GuiUtil { public static int showConfirmDialogCancel(String message){ diff --git a/GraphEditor/src/gui/util/StatusBar.java b/GraphEditor/src/main/java/gui/util/StatusBar.java similarity index 100% rename from GraphEditor/src/gui/util/StatusBar.java rename to GraphEditor/src/main/java/gui/util/StatusBar.java diff --git a/GraphEditor/src/gui/view/GraphView.java b/GraphEditor/src/main/java/gui/view/GraphView.java similarity index 100% rename from GraphEditor/src/gui/view/GraphView.java rename to GraphEditor/src/main/java/gui/view/GraphView.java index 5316543..382aebb 100644 --- a/GraphEditor/src/gui/view/GraphView.java +++ b/GraphEditor/src/main/java/gui/view/GraphView.java @@ -1,21 +1,5 @@ package gui.view; -import graph.elements.Graph; -import gui.actions.toolbar.RemoveAction; -import gui.main.frame.MainFrame; -import gui.model.GraphEdge; -import gui.model.GraphElement; -import gui.model.GraphModel; -import gui.model.GraphVertex; -import gui.model.IGraphElement; -import gui.model.SelectionModel; -import gui.state.SelectState; -import gui.state.State; -import gui.view.GraphView.GraphController.CancelAction; -import gui.view.painters.EdgePainter; -import gui.view.painters.IElementPainter; -import gui.view.painters.VertexPainter; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; @@ -40,6 +24,22 @@ import javax.swing.AbstractAction; import javax.swing.JPanel; +import graph.elements.Graph; +import gui.actions.toolbar.RemoveAction; +import gui.main.frame.MainFrame; +import gui.model.GraphEdge; +import gui.model.GraphElement; +import gui.model.GraphModel; +import gui.model.GraphVertex; +import gui.model.IGraphElement; +import gui.model.SelectionModel; +import gui.state.SelectState; +import gui.state.State; +import gui.view.GraphView.GraphController.CancelAction; +import gui.view.painters.EdgePainter; +import gui.view.painters.IElementPainter; +import gui.view.painters.VertexPainter; + public class GraphView extends JPanel implements Observer{ private static final long serialVersionUID = 1L; diff --git a/GraphEditor/src/gui/view/painters/EdgePainter.java b/GraphEditor/src/main/java/gui/view/painters/EdgePainter.java similarity index 100% rename from GraphEditor/src/gui/view/painters/EdgePainter.java rename to GraphEditor/src/main/java/gui/view/painters/EdgePainter.java index ecbf90a..5edbdc9 100644 --- a/GraphEditor/src/gui/view/painters/EdgePainter.java +++ b/GraphEditor/src/main/java/gui/view/painters/EdgePainter.java @@ -1,9 +1,5 @@ package gui.view.painters; -import graph.elements.Graph; -import gui.model.GraphEdge; -import gui.model.GraphVertex; - import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.Rectangle; @@ -11,6 +7,10 @@ import java.awt.geom.Line2D; import java.awt.geom.Point2D; +import graph.elements.Graph; +import gui.model.GraphEdge; +import gui.model.GraphVertex; + public class EdgePainter implements IElementPainter{ private GraphEdge edge; diff --git a/GraphEditor/src/gui/view/painters/IElementPainter.java b/GraphEditor/src/main/java/gui/view/painters/IElementPainter.java similarity index 100% rename from GraphEditor/src/gui/view/painters/IElementPainter.java rename to GraphEditor/src/main/java/gui/view/painters/IElementPainter.java diff --git a/GraphEditor/src/gui/view/painters/PaintingUtil.java b/GraphEditor/src/main/java/gui/view/painters/PaintingUtil.java similarity index 100% rename from GraphEditor/src/gui/view/painters/PaintingUtil.java rename to GraphEditor/src/main/java/gui/view/painters/PaintingUtil.java diff --git a/GraphEditor/src/gui/view/painters/VertexPainter.java b/GraphEditor/src/main/java/gui/view/painters/VertexPainter.java similarity index 100% rename from GraphEditor/src/gui/view/painters/VertexPainter.java rename to GraphEditor/src/main/java/gui/view/painters/VertexPainter.java index 2b9d897..97e360d 100644 --- a/GraphEditor/src/gui/view/painters/VertexPainter.java +++ b/GraphEditor/src/main/java/gui/view/painters/VertexPainter.java @@ -1,7 +1,5 @@ package gui.view.painters; -import gui.model.GraphVertex; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; @@ -12,6 +10,8 @@ import java.awt.geom.Ellipse2D; import java.awt.geom.Point2D; +import gui.model.GraphVertex; + public class VertexPainter implements IElementPainter { private GraphVertex vertex; diff --git a/GraphEditor/src/gui/resources/edit-icon-png-16x16-540.png b/GraphEditor/src/main/resources/icons/edit-icon-png-16x16-540.png similarity index 100% rename from GraphEditor/src/gui/resources/edit-icon-png-16x16-540.png rename to GraphEditor/src/main/resources/icons/edit-icon-png-16x16-540.png diff --git a/GraphEditor/src/gui/resources/exit.png b/GraphEditor/src/main/resources/icons/exit.png similarity index 100% rename from GraphEditor/src/gui/resources/exit.png rename to GraphEditor/src/main/resources/icons/exit.png diff --git a/GraphEditor/src/gui/resources/load.png b/GraphEditor/src/main/resources/icons/load.png similarity index 100% rename from GraphEditor/src/gui/resources/load.png rename to GraphEditor/src/main/resources/icons/load.png diff --git a/GraphEditor/src/gui/resources/new.png b/GraphEditor/src/main/resources/icons/new.png similarity index 100% rename from GraphEditor/src/gui/resources/new.png rename to GraphEditor/src/main/resources/icons/new.png diff --git a/GraphEditor/src/gui/resources/newundo_largeimage_1.png b/GraphEditor/src/main/resources/icons/newundo_largeimage_1.png similarity index 100% rename from GraphEditor/src/gui/resources/newundo_largeimage_1.png rename to GraphEditor/src/main/resources/icons/newundo_largeimage_1.png diff --git a/GraphEditor/src/gui/resources/redo.png b/GraphEditor/src/main/resources/icons/redo.png similarity index 100% rename from GraphEditor/src/gui/resources/redo.png rename to GraphEditor/src/main/resources/icons/redo.png diff --git a/GraphEditor/src/gui/resources/remove.png b/GraphEditor/src/main/resources/icons/remove.png similarity index 100% rename from GraphEditor/src/gui/resources/remove.png rename to GraphEditor/src/main/resources/icons/remove.png diff --git a/GraphEditor/src/gui/resources/save.png b/GraphEditor/src/main/resources/icons/save.png similarity index 100% rename from GraphEditor/src/gui/resources/save.png rename to GraphEditor/src/main/resources/icons/save.png diff --git a/GraphEditor/src/gui/resources/undo.png b/GraphEditor/src/main/resources/icons/undo.png similarity index 100% rename from GraphEditor/src/gui/resources/undo.png rename to GraphEditor/src/main/resources/icons/undo.png diff --git a/GraphEditor/test_graphs/23queenstourgraph.graph b/GraphEditor/src/test/resources/test_graphs/23queenstourgraph.graph similarity index 100% rename from GraphEditor/test_graphs/23queenstourgraph.graph rename to GraphEditor/src/test/resources/test_graphs/23queenstourgraph.graph diff --git a/GraphEditor/test_graphs/33fangraph.graph b/GraphEditor/src/test/resources/test_graphs/33fangraph.graph similarity index 100% rename from GraphEditor/test_graphs/33fangraph.graph rename to GraphEditor/src/test/resources/test_graphs/33fangraph.graph diff --git a/GraphEditor/test_graphs/6graph114.graph b/GraphEditor/src/test/resources/test_graphs/6graph114.graph similarity index 100% rename from GraphEditor/test_graphs/6graph114.graph rename to GraphEditor/src/test/resources/test_graphs/6graph114.graph diff --git a/GraphEditor/test_graphs/convex1.graph b/GraphEditor/src/test/resources/test_graphs/convex1.graph similarity index 100% rename from GraphEditor/test_graphs/convex1.graph rename to GraphEditor/src/test/resources/test_graphs/convex1.graph diff --git a/GraphEditor/test_graphs/convex2.graph b/GraphEditor/src/test/resources/test_graphs/convex2.graph similarity index 100% rename from GraphEditor/test_graphs/convex2.graph rename to GraphEditor/src/test/resources/test_graphs/convex2.graph diff --git a/GraphEditor/test_graphs/convex3.graph b/GraphEditor/src/test/resources/test_graphs/convex3.graph similarity index 100% rename from GraphEditor/test_graphs/convex3.graph rename to GraphEditor/src/test/resources/test_graphs/convex3.graph diff --git a/GraphEditor/test_graphs/convex3_1.graph b/GraphEditor/src/test/resources/test_graphs/convex3_1.graph similarity index 100% rename from GraphEditor/test_graphs/convex3_1.graph rename to GraphEditor/src/test/resources/test_graphs/convex3_1.graph diff --git a/GraphEditor/test_graphs/convex3_2.graph b/GraphEditor/src/test/resources/test_graphs/convex3_2.graph similarity index 100% rename from GraphEditor/test_graphs/convex3_2.graph rename to GraphEditor/src/test/resources/test_graphs/convex3_2.graph diff --git a/GraphEditor/test_graphs/convex4.graph b/GraphEditor/src/test/resources/test_graphs/convex4.graph similarity index 100% rename from GraphEditor/test_graphs/convex4.graph rename to GraphEditor/src/test/resources/test_graphs/convex4.graph diff --git a/GraphEditor/test_graphs/convex5.graph b/GraphEditor/src/test/resources/test_graphs/convex5.graph similarity index 100% rename from GraphEditor/test_graphs/convex5.graph rename to GraphEditor/src/test/resources/test_graphs/convex5.graph diff --git a/GraphEditor/test_graphs/convex6.graph b/GraphEditor/src/test/resources/test_graphs/convex6.graph similarity index 100% rename from GraphEditor/test_graphs/convex6.graph rename to GraphEditor/src/test/resources/test_graphs/convex6.graph diff --git a/GraphEditor/test_graphs/convex7.graph b/GraphEditor/src/test/resources/test_graphs/convex7.graph similarity index 100% rename from GraphEditor/test_graphs/convex7.graph rename to GraphEditor/src/test/resources/test_graphs/convex7.graph diff --git a/GraphEditor/test_graphs/pentatope.graph b/GraphEditor/src/test/resources/test_graphs/pentatope.graph similarity index 100% rename from GraphEditor/test_graphs/pentatope.graph rename to GraphEditor/src/test/resources/test_graphs/pentatope.graph diff --git a/GraphEditor/test_graphs/planarfacestest1.graph b/GraphEditor/src/test/resources/test_graphs/planarfacestest1.graph similarity index 100% rename from GraphEditor/test_graphs/planarfacestest1.graph rename to GraphEditor/src/test/resources/test_graphs/planarfacestest1.graph diff --git a/GraphEditor/test_graphs/pqembedding.graph b/GraphEditor/src/test/resources/test_graphs/pqembedding.graph similarity index 100% rename from GraphEditor/test_graphs/pqembedding.graph rename to GraphEditor/src/test/resources/test_graphs/pqembedding.graph diff --git a/GraphEditor/test_graphs/pqtreeplanar.graph b/GraphEditor/src/test/resources/test_graphs/pqtreeplanar.graph similarity index 100% rename from GraphEditor/test_graphs/pqtreeplanar.graph rename to GraphEditor/src/test/resources/test_graphs/pqtreeplanar.graph diff --git a/GraphEditor/test_graphs/separations pair paper graph.graph b/GraphEditor/src/test/resources/test_graphs/separations pair paper graph.graph similarity index 100% rename from GraphEditor/test_graphs/separations pair paper graph.graph rename to GraphEditor/src/test/resources/test_graphs/separations pair paper graph.graph diff --git a/GraphEditor/test_graphs/triconnectivity test.graph b/GraphEditor/src/test/resources/test_graphs/triconnectivity test.graph similarity index 100% rename from GraphEditor/test_graphs/triconnectivity test.graph rename to GraphEditor/src/test/resources/test_graphs/triconnectivity test.graph diff --git a/GraphEditor/test_graphs/utility graph.graph b/GraphEditor/src/test/resources/test_graphs/utility graph.graph similarity index 100% rename from GraphEditor/test_graphs/utility graph.graph rename to GraphEditor/src/test/resources/test_graphs/utility graph.graph diff --git a/GraphEditor/test_graphs/visibility.graph b/GraphEditor/src/test/resources/test_graphs/visibility.graph similarity index 100% rename from GraphEditor/test_graphs/visibility.graph rename to GraphEditor/src/test/resources/test_graphs/visibility.graph diff --git a/GraphEditor/target/classes/gui/resources/edit-icon-png-16x16-540.png b/GraphEditor/target/classes/gui/resources/edit-icon-png-16x16-540.png deleted file mode 100644 index 1e60329b9f2cb844969b3546419e6a66157c8078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140730 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 qvkg6bRKx$4_QvuFub5?-@#T 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%0Aobs`IZfObKXToO zo=4tpm6$xQt2s31z7xvxwqnevK0+I8k|dNBrY|TJCCXgRjajIWvAY;KTLNLkR4LnR zcdKb@?;CDxoS!=m`k#-_Zr0T~x`6s%k7pE|zWy;N$K(7JXd4^=W zAU-#jTHwQntL>g-Ga1c~)Sg8Vj!@=1I|VA$45~S4+us=oAm%eCVr=S>L^(>!;>!g67;omylEURm? zB>!3v7^aSsd0{7A|LbVw$MJ6vQ9>~592lTJzVA5v$z-_~G_$-r5>0Q+m0*T=2Es3= ztZ`-apBV$Ji5pX`Rtu)4Ox;I zn6_9-?0^*__iZi6NX(&1UNkuz1k@%kUcQ z`}IZ7oiie1-v1^H7izqro#YWSUv^Ubs{>KdbM?i`cia5Zz~|ZqTv*wNXx*%J<;K(O zy*X658`86-{ute1vZWR8@q47~TTx=i3B0msrw@5vKA2|veu&8Qhxg+(_`jFQ1=gZ$ z*c@{bh(P2tpk^^}qP=KSD_X#$OOUPwx-#%@_fvmpNCCdtXiLxFn?Sjy{02dGsX#cw z?kSc+p(u#t5UiDcEY^8FT!@n&%h&|Xj!)h>0E6fx1MFBP((JkBrYCcMJ#5rOgJ`Wg z<7k<=$*_1pKs}#_oV>{AhS{uD3Zp&#sR3wbLC-y0fnNNa#kX_)ek&NTw;O-pf*7rF z)452Kh8UMv&W z!*8n@^gKi@H2JCll_rv#v8@q2-yVCYGUYr{1Gr`^d1O*9Jt)y9H>*xZ3#>scUguvzpLcF@71d|y=2u482=_Dy5 z>T1cyQBE=g#07<^+6`;3JgN*4Q={|5rs|J)&gknaNNst?h6`S-n0~;+eNH6cU{SO=h5-6Y8&hX+s2!v!yq9-9EAtNJ)zbLfS=5gWM_Z=$d zxQ4=$vs}6==IAD_IKWD%PcEN%8YN5(kNWSP6v+Q|PIhhUae8q1>^zVDyN1u7Os#x>I*6au~#^z2%lAd@ZLL4V^a z^6;>?S(ZEidbSOO{#}lJ^Qk&Fjav z-)fzO0`tDdIjwnH*u9u*a(4v0p)~j0zk$feHE4eMObqxgse{Vqub3y54&?H!|R87&n|J zQV22&Ut;gcEDM#5s&wv+)je=uC2q?0ygTVY8d;GM9=-NxYLrIi2L8Qvk?to!P2j4A zPliI?+s&$4=ST-BHD|uwi|XbG-eHk4=%)!VP>d<)gxgM4uQsgU*NT{~rzW=|4~4Gl z2D0v#-}2tf$mx#CbR-7Bu6_1HC+x0(hG{RH5CA`<)n%-mnHjL#ocvADQ z*q-Hg-m%Dpq4rQDp4IyRoZpG-=JL_0H!ba;CFT7I352Ze7S~0np=a7K-*|Qlbdx zB8?CnQvCBd33}Ez(3;e{`{wX>3K$64>xsmZ;3QZY{?d4!@#vWT=t_l+i-!JLr$XD% z)D4OF^!=?76&01anayg0$-efRsVRqn;OCGn37m5l_%re9lG7dEd@1j~up5ybKJ^tOSx zvR5UI6Dm0K&<2Ed4a7eS#e3&=8f3?`UP}1}eLwgRu#rUhJzDY zqf)3v{ZHLwp92%xU?pNK<8XBgCG242{E_W?w3LLK9{utn`TOaKmFEC^bqVeU|IzewbWj1le z#r4}pf@EMy3Yi5GxoME&vsBpg)-_oiXRiAcT!+X70ojNm0W-~E!^*)7ANw}y>{X2K>Ihga{ZSfwcB3w2YxL*9a^~-iQJ>J3a zO{0rs-TfEcOj*^;!v04N+i6ZK#-BE^hExQ+CWtXwC+;3E@KJrFXx@w|3Gaj7ceVBF zs+k{5b03GjZ!#)DlwYGJb88q3d!Td!oJK%}ZT-i^E`>Zd3eW;U!>L2eR?lL!5Lk@CEa1yu%EL&LW!ijCIMaVUVsO~N6OC@N;vWwff4~wE556FrPnoshNIr= zR>gmq)$WPe3>a1&PQDPBShxsX+SEGJ{5O$9$pv$s7~`CkLfkDt%m#Vxid=vpUbG{t zMG1qYSDW+5fnYx5gRHW4W`oDz!QnXoX%$CHe-);;xsBym zPJEHTG#~7D`SedrmJ9rwja4@3;H`6h!x+`Mml56H|Nb>8{kxEYOD^euR>61kv)^ek z%2&2Dc2w=92T+Kmx&q$IpuN_uK0Kn3_J7j>)!dIay6J0zBIaMNZeqsoc0x*{r)i=OsKq3M#dypGES4Pj?%SJ=}DJ#i-lIpHrXf zvpj(haA5aQXI1SBPJyMyw;Bz^sktN>cd``QS+}6?@gLMcQN4sitDq!w)=1VrN}GfZaUc!*@0bOz}{pospQ>~kgio1 zn@c~zzviOu=XWNd@0ZoE-+4hNqh})Zu0FWuP))XY@Ws2fZiykSgK}Bb^=3QEof^7P zRJuu?QuU`{1i_W`!)@}#a_dLCNOrcWoTUy>wg;prt6=|b$!DeffChG-=PSFU>;wtz zF`(uW>(_isanZBfdVzT5_KijQC+&NO9^U?$wQKPi-HX#^qr4k8Rvct3czI@7-Pqp^ zxpIKUa-ZbOMCYt|aQpYDlBx%Eg3rgTvN(rg3-7x~3(z+A*j+l#j2MvkYV;OcRJWY{ ziRZvP}ie7QZo-ZZ*#ZSQ9S8!!CQ z6!$+m+U88&vR*T?BJ}kWwR}pVh0n1<;8tBlamhK)aEhXjSvxmg%e`)=LpP-Pvtdo^ ztAaD6B3J$W!iI86sVad-dO44|i{M8MBeNZCmD|PGfLd+0 zpWa!MtIHQhD7{Az^u$gf%7vtK8TFC?yHSv-{)+w6mDh$r#1+CxCMK=KxRQrUe=&*L zEjT{8)cUgL_rcZj&yc8Iwv38lFcJY9jK%$>vuKDtrxti4yzKWbPx_6XBRuPZJ zXwK)^&4!yz_E_ZeueFQ;=>Dpe3!=eG-jg8=8r<^6f@cMsv<<&zk=O(?L6h|M2=7Z@ zLiHcI=mb0@#e%O~#gy}GVUeql%jbvj5tKK=s8QraUL87yrg!}ZrwohEi*Mgl0yY-i z-;;jRQ|>B%W6h^&?xv3Ii80M%avV1IvO|%-wd$F8!iMYlH+#;{c(?dzVTyb{tk1L~ z;@gz`U4%I4VHN2gyV_`qrTX$!=Ed3(d<%z^Q20}@)MVb3S|QZW1%!N;vC`<0{qyH~ zKCw@e0T+4PI~A4bQzvRb9G}uD?+d(LcHw(_9o96{9{(di@mvwo)6$Z|^BVV=GU~k! zM~Qwa4=nuC59&qs;Ax;IDbg0 zen)1_E|IXrSm6$83$f0K+DBW34k#7Qzl^1vax6l`2v0vlmBg+!8+LEphLf>>>2@bI zW*V9ir;|&L1GitAWJcm?G9SLmTjBTBKWbHyQ!Z(-5KRp8ACW3!B>G7@A%4pSb?n|! z-rCkwKZ~r~B#)}lwq8HTcHbu@iE^_#_=3HF);go;6}?KXXn5@Iafn6!+07w(b;&)X z-R{XVZ$H!4hK}WocZ)N(VW>VbJV+>F)Kc!BC{%%Vf+S}`S+HSN z#^h|&$D2#StX@}c50CD~JH7ajPUAqO4JC>UIPNI5!cicfC;KdwMP=gVCx2JIaUqX` zGozH=XwW#VmSqN;be~kVJ|oq7+t4l5wsdDF4i>hwl%L4j(ZN(u(WY1BSv4+dYQ~C` zJF)!W5pmv$e5XkqN-|Ro_zG6Ab?|<_vtl^)R5OjQo3hi{`9-;VAYfGdEMXCYg^wv@FR*t;!_i@C&?f`##}}3K32Z>LaLjE zJXAonG9#K*nEJa^ZNT40f7?2JsE-%kZgEknu=|a5HT(mKBto5sTN9hYl(7mBUj2y?t@Yw1rOUkD{ zizG4Yi1y03_U8!8Wr&+ty_s%DqdMnksd-atjJImy;B{SYXv8PK+zRdy>5a_#<4x~M zw8Lif7+fN%4Fw)LEK${bim%Z$SnpgN0+vO(mSHw{30SfE^v{U+Hk_}ZrunII*B{-v z^Q+1s!=}m9*1F$@X|X7{(K%J`DdKHAVy1@B{S{#)3xpODetFjzIC0q zbmXjWujgDd#7bw&9w7O0($XL{b2*Trt9)QT5K&p~`{(GX^k7=jiOycl<~=1j+CI@k zAAZFtj9^=$W6Vu5twb?((9P1^d>1ojSs1HxW;`49wdA+F~=||s{6T*31r;c&& z!RB_e#8dp(q1X-biCGz%C`LN03Kv|u_3s6@6N4Kshxm2?JPuX+BgE%K58?D8ULw8xclF38_)=uw-cIc3JS<7cRG zlJBtyh&yY2Ha}&_!fgLm(xC3k?!yX&kaQ7SN(thq^E+|v>froWcJc4!D`AO|B}s2S9GZ^UY-3V#bzgwQDMOV@;!-%aO~-%B>9$ta9To- zX3OL|C%exg3nPd5`$8s)wcT95K{f_&mux?X67kmH3sIlMk6{G705`p|$TJC@8TVf# zHnntr$ZE27I>5v!h*Nz-`pPu>g{i{|QnJ~5F-z#=5BHd2c%;A!G#M||vG}+@g8`#e zeA6EXjB^%9YRMk|zGT*5E1vJjHbn$-*|gy4@9b$W5NU>cq~q5wHwls9ibx8$7vJ2F$`F;J5k4?{<0$s_K5My;JM$Iqu?C*0{f5Cv$zpHF;)>-Rc{P3Zaq?(yvY?ibxhqm|Pbsgmk>?lcC8 zIWtU8l?f^`l*dssjcXgI=2m^?jIva-A68hh|2_Kio8@U`EPd*@z2nka6xLhz(vrVl zpJiBLKGvnLjaA(>bM@@DO!E((&so`llYF|FgNGFTkI&TIH7@(WZdZPY#{CH<1;b+s z@^86wgP6jDjwqQrK||X z8N2(I{jg>@OBX;NVW1z>qRr@iSZ*;r<_f$_ek=F9JS4YBI6)<UcNDhVlCBcji_bzHrK$J?;4GjzPyJ~! z@s~kxXLjtrKn)nYRBfz(gP$#uO-}5rAp!e6`kj z^hrs3mow7lMLP2Y#+UhMOrd}dw{I1{=1Qm6uM1;I)n45aWqs9i-qEzT793N3lGT3; zd03bZD8QVPgjTBkN=grGK!j&#{qpP^?sd*&MNZ$1idH&_7Y4eXX?e{mEPc5ioMqJT zb6eh_HFr4v7%r#uRR#KeI}g(2!+yBASP;3C z*$6SIpfC^g>TihaYpST!?5Oy2R?=hsjRX_m(;=kx*Y{0{7kzk<*wJ+O?{9LvUH@J} zs;UECn=O5%(2!Fgp^fG$hnXv+Zx2>_jgpd@%OqA~VlKQyYa~a@p_h^UZ~mZsa4X}} zbfz_TK?Y#d-%mnLh9_D3yf5Vkal#NX(9PLPH-+sb)w1GGft$A9hIY+Em`-WNat&c6 z&S>hHU&fMr+-8fbiu`ib%_%VnPn7B^{aDERAR6acq5qAFH`bjvnBTxm{B&(DAHtpv z>KSxXVHh0~MPuqt$3&}jrS8x5XywMU8YHr$F3_^=?e_F~xvIM|Y!&p_1z#-^slP+n z?59JY$B6f3OFt|i2PvHkZyBPfU&tmfbA;|Ikw`JdUJJY_CY8+O*obEpEPzP3qhCd&Qn5_hG)}{NKNLAhr_A7ZK+j6k1ui zS#inJ3}_Y!@ZQPug^M{ot#^HrpfeUw5>;?NJW?JXFDJp5V*rT=Mq7a^ee3L&dQN6P zXKTJ9^VQBj_O-&t@58Fy+?S-TQfF}PVcYx9Nd-G%aiuYkw zG5J{d1d$4rf$0V&xN-vGr7C;GSGJ1SlxSVl?!s*jOf2VB;qnbtb2IpuPF{pI7?I*@ zRB9s8zB^+KHyy9lVv@+lcerc06)4FCV4os4(s5={#dO{P%8=lru{FzqOcN zte>`#L#+tq;)WzvACX7V%n+HZ_|tLpDH%;&b)1(IS;?{gUQcuAUV0r?cq3{BHR z?{QynbN*$Q`7NxpvY%ER3hChpbpQ&Rf%L)0iWLctk@JoD@me;^ww2p-;zb>S@P7v< zk>)I#6w%~RTA~|g6=yOuG$%q9M)eX|M^1?x-q5a-wOTLFpm|7aW4l$?+|q6R+1TVM`Hi zoS|tRuh%_X4;@~UTUyRvJ9tdUwo|JJMY=k$|MAMlx1OL4tuf6cO=Vy%o*j++@7q9i zJ({4ng5H{c$Fe*=Oa1aUuR6%-8$MPP#jQAjzg&ACPGZ`V^Qs?~*(Lq7v`E=x|J#7W zRi;`VW?C=t@a_>LZEgHUf?N6ami1jLrQnOt5&tHvylna@Q&aFy$tlzxtyoGztW~jqE z>XxCnk~1)&dD!p_gdU5fcKH-_i_gt;bre_fIJ&6~3h@*#_-N5!>f*Uk?{lSxxK@O< zp6svQk$kBI)QN7pS+xvw_ld6e`yBAz_lK^J0{;zd;f-FWi|2%9R|_`Fx2Aj-PKk0m z2_#ZpD1RFZgd80!Z(oglZV!va*c;W3PD|*N6BS^<`I)nz?uo z*8&E4F1)B0=35)m;I%mzxs87!>PEnM)d+3iA?1@{#N;UxtrQ>fxG}hlB{L#MsIAb1 z^uBd!&as?4%w3moaM0p$&o~KdZFws{s(M!S6rDD3(5t@x5p@0{=tWoq38fmF?Vf_& z_`8n_1kQ-E6Er?yd{UY9{FKo77kGZ-Jlez@bA;e7M0Jdr{!SCapQSjQClZ!=+(Ta@ zwYrT?Pv>_v;e=CvIb<|G$&pie@Ye%&KBDwN6_$1PW#=9$hmk8g$x86(II7>=q^DZ?pMR?DkCk@> z65I7o`&6X(Vy_?vuS?h)jg6c~Tc+Gh7WVVQb3D@sM;oSt1T-6?3TMiriKH;AYF&(& zndoQ76*AU}DGjTjeaFgP;PtT-U%^;z^4fXUP#Jpkf3J={ZivdiRS`B7rClC!ZU4Te zA;glu_RhBKfzfYo-Xh*?j>diFND=@Gmd@c>!9lMH)2P0lQkh3h2u6;ET zecA;S5pPcP%x?@Ia*(+35HsV@^dpaMA@pEV1lFu1+7NOe>fO1mHcfk6Ic*Lh7VI)` zJs1Wl3;^{ba4O!=sk2hZslQ@zX4@JW>KyzfGLQ*E`0w2{4(tlu%m9&8F)fc%9vHOp zHCoa1NYT3|=#dW)84jO#$dc8ISyxS8{+j7oMi(RjKZPDa2aw^y5RBSPV0T#EPs_S? zcdWUwA*^T_d3g8jB^2O_J$VZqC?x*PE-bN_DE{>CtQrj99e~}@_fp~NkDuT-=P0!p zO?#01iNCCYnW;-6-A?X!BWgddb1{pZD{2tRl&MQ2{r2uOeDzT$mZ#E^X7OhT*GvN~ z(Ld5PBb4&D?)g1FbHKl~gGM_uc<&8@0<(^1^|iGCxm8Ch%X(E=a(@9j)gA8EAe#RV zS%n{CpA)uoZz+3`*Yo>Ept%9$2wL?llAjX4rE@wYEMBL~G!VWDyn{tTfyht+q9qVe z{^JaSe{lC*{frG-D_(uGY~e#VQ!)L4|%*8VoNL5uHy zHA5XtlvU8MIw9o#pF?Efvu2%!q> zWf@cKl>c`DqXs<$?f=s%l;_O&e-HiHzv2doEZVL_N(GDzP7#XB?5)zXzW+cj@&!je zRm2oS7TT|Xx)PE%yAKaXm8ED3C4F2&pIm;(4o2B=sYYxg!Sn}FXz%&+Mev5o0(^Q- zl~DsmEb;J&Yk&wZP}V8FMSQN7f^P_{QDn8BS|kOWn&&JotG&BjU#gq&RKU%rSl>rS zO(&)}+51p`L3%kBFFj~BuR~N+)F{{C_SSWWH-aGW@rFgB^6w*rqPJI)`qY8ftWQxj zrnPL`(a1RP@w9}jPW@aeLvjd3AQ97uSfxxw=I?V>WyftCP|?h z4F^K6;~LH9b_u-13FJtE!}7sA$ZS0(9`TFD=W)Hen^!18_Td(g&OK0&1|a3ua}Is8+deBv1femY z*{qVkk)xDHuCD{_Y_|=dshlmHj7|}M!Z;bzl{Hddao;jfHSfoJGb%^iaCZ~muD#?i zBb1B(UEV~>A=^v#o|LRP&w7ouU1Xcqhex7g-~&t88@suYLBbIW+lONb@Ci+L={wHn z+2H-(!Mp8cjzsp~>qE4GJSx1lRrm7d;~lmS1haib$t#&(AOEJ~xe|U(`?xyY6?z{C?`(T~kWRWT<#Ax;OA>nDPdtW@;Mz~(dr0d)SguQjzE*Ziw z6bdrA8~lcy!h*tRP8|6h?EDb%og*$`W!qS&Dpf2H;`@Vd=@F8KCL3x@vml({9fm;> zLaJGw2y2^<$SdD-UK4L;0q-YQR9~OS)C_Dr2^CqON0EfYPK73K8r|#a`Kfqyjp%cE z!^bZ+a!+F?W52Lzh|&{>SSDL3jr(Z% zTv!p&{K%e>TxE&FKp-O-(QxFKJk=BbDql#}#Q#Uuf;lsoyA&_p;B!b?Xbl<$h8#{9 zJHJ6g$(DNd-3HtYHLv)^s3vFeu;bAYVD}}@BkIwheM(Smwu*}s^F=G^Op9ai9W9(& zkdd8*gZLc>iL!m_dzK9P7d*4(+<#S!GK&uLZT(H096AF;eC95k!$>Rg=I05(eOF?= zV96^8*pEV%!`}7J##5;3PJ~*kK(0EWr~{STaHlKbyV{>=s&Uvu>Nreudx_3B+nr)T zOYVt<*dZfgT)#KfYDHfB%dt^qzyw7YSo>^T(p*R}QX*Q<&gL|tSkd4@@K2ev zO?Fn6zG7Y-6W;3|U`cB$NAeI7QCB@w*W6{`SJjsPM2?biu>fWom2!mscNkhdvM?tF zZ~Na54Ys3cpGWy}o~C@et&Xc50=##gCRH7Oq~|JYets?c3cdBT<7|OIE(CfL<-eE# z=|8fwiW@TLuF6f_FeJupV7v^8;T`;uxN4riNAUFY#wyB916`kdUz3~2$~L9vNSD^D z%3`nnn}jsf8!FFy&ajz*;9gxwCu37`j6)O#C#i@+uH{+-6D2vu{fe%8D>9J0C>={% zyY5$xF-xBu)vwxtLnp()55lNttB6KXTysk%WUSGET$_0)p73o%0#$+NB}G>#7q7_S zQNi7v*D&Yvvc03DvdU)J(yQYmx@N<=y|WSK!c=c3T=c;=DWd!wVHE!0_&9P=h(R$G z!M1nK4X%pblL715MKV1`_9yxqm+p{s1ht6`T?sr@B{alXlysh5w_w2Xs8BE-o-O~Q zQA;6!=;BXEJeCaCAx@N%$71ySHK!hH# z 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 diff --git a/GraphEditor/target/classes/gui/resources/load.png b/GraphEditor/target/classes/gui/resources/load.png deleted file mode 100644 index f47d6305a2942cb7897cc2255854014933f9faa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3415 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 diff --git a/GraphEditor/target/classes/gui/resources/new.png b/GraphEditor/target/classes/gui/resources/new.png deleted file mode 100644 index d459c5bce3f9a9a4efc50fa327442739bfba0e2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 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 diff --git a/GraphEditor/target/classes/gui/resources/redo.png b/GraphEditor/target/classes/gui/resources/redo.png deleted file mode 100644 index fad330a54f47d9a2aea62ba06aa0f58d57c4348f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3447 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 diff --git a/GraphEditor/target/classes/gui/resources/save.png b/GraphEditor/target/classes/gui/resources/save.png deleted file mode 100644 index ad61e6762eee16fec7299dbe67890594a8cfc897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3360 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 - - - - - - - - - - - - - - - - - diff --git a/GraphLayoutDSL/.gitignore b/GraphLayoutDSL/.gitignore deleted file mode 100644 index 751c70c..0000000 --- a/GraphLayoutDSL/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -*/target/* - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse diff --git a/GraphLayoutDSL/.project b/GraphLayoutDSL/.project deleted file mode 100644 index fa376d8..0000000 --- a/GraphLayoutDSL/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - GraphLayoutDSL - - - - - - org.python.pydev.PyDevBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - org.python.pydev.pythonNature - - diff --git a/GraphLayoutDSL/pom.xml b/GraphLayoutDSL/pom.xml index 01c09ae..176f557 100644 --- a/GraphLayoutDSL/pom.xml +++ b/GraphLayoutDSL/pom.xml @@ -1,31 +1,44 @@ - - 4.0.0 - GraphLayoutDSL - GraphLayoutDSL - 0.0.1-SNAPSHOT - - src - - - maven-compiler-plugin - 3.1 - - - - - - - - - - org.python - jython-standalone - 2.7.1b2 - - - commons-io - commons-io - 2.5 - - + + 4.0.0 + + + GraphDrawing + GraphDrawing + 0.1.0-SNAPSHOT + .. + + + GraphLayoutDSL + GraphLayoutDSL + jar + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + + + org.python + jython-standalone + + + commons-io + commons-io + + + junit + junit + test + + \ No newline at end of file diff --git a/GraphLayoutDSL/src/app/App.java b/GraphLayoutDSL/src/main/java/app/App.java similarity index 100% rename from GraphLayoutDSL/src/app/App.java rename to GraphLayoutDSL/src/main/java/app/App.java diff --git a/GraphLayoutDSL/src/interfaces/ILayout.java b/GraphLayoutDSL/src/main/java/interfaces/ILayout.java similarity index 100% rename from GraphLayoutDSL/src/interfaces/ILayout.java rename to GraphLayoutDSL/src/main/java/interfaces/ILayout.java diff --git a/GraphLayoutDSL/src/interfaces/ILayoutGraph.java b/GraphLayoutDSL/src/main/java/interfaces/ILayoutGraph.java similarity index 100% rename from GraphLayoutDSL/src/interfaces/ILayoutGraph.java rename to GraphLayoutDSL/src/main/java/interfaces/ILayoutGraph.java diff --git a/GraphLayoutDSL/src/interfaces/ILayoutSubgraphs.java b/GraphLayoutDSL/src/main/java/interfaces/ILayoutSubgraphs.java similarity index 100% rename from GraphLayoutDSL/src/interfaces/ILayoutSubgraphs.java rename to GraphLayoutDSL/src/main/java/interfaces/ILayoutSubgraphs.java diff --git a/GraphLayoutDSL/src/interpreter/Interpreter.py b/GraphLayoutDSL/src/main/java/interpreter/Interpreter.py similarity index 100% rename from GraphLayoutDSL/src/interpreter/Interpreter.py rename to GraphLayoutDSL/src/main/java/interpreter/Interpreter.py diff --git a/GraphLayoutDSL/src/interpreter/__init__.py b/GraphLayoutDSL/src/main/java/interpreter/__init__.py similarity index 100% rename from GraphLayoutDSL/src/interpreter/__init__.py rename to GraphLayoutDSL/src/main/java/interpreter/__init__.py diff --git a/GraphLayoutDSL/src/interpreter/java/Interpreter.java b/GraphLayoutDSL/src/main/java/interpreter/java/Interpreter.java similarity index 96% rename from GraphLayoutDSL/src/interpreter/java/Interpreter.java rename to GraphLayoutDSL/src/main/java/interpreter/java/Interpreter.java index b5ba151..2dc2f2f 100644 --- a/GraphLayoutDSL/src/interpreter/java/Interpreter.java +++ b/GraphLayoutDSL/src/main/java/interpreter/java/Interpreter.java @@ -1,23 +1,21 @@ package interpreter.java; -import interfaces.ILayout; -import interfaces.ILayoutGraph; -import interfaces.ILayoutSubgraphs; - import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import models.java.LayoutGraph; -import models.java.LayoutSubgraphs; - import org.python.core.PyInstance; import org.python.core.PyObjectDerived; import org.python.core.PyString; import org.python.util.PythonInterpreter; +import interfaces.ILayout; +import interfaces.ILayoutGraph; +import interfaces.ILayoutSubgraphs; +import models.java.LayoutGraph; +import models.java.LayoutSubgraphs; import util.Factory; /** @@ -54,8 +52,8 @@ public Interpreter() { interpreter.exec("import sys; sys.path.insert(0, '" + languageDir + "')"); - // interpreter.exec("import sys; sys.path.insert(0, '" + modulesDir + "')"); - // interpreter.exec("import sys; sys.path.insert(0, '" + modelsDir + "')"); +// interpreter.exec("import sys; sys.path.insert(0, '" + modulesDir + "')"); +// interpreter.exec("import sys; sys.path.insert(0, '" + modelsDir + "')"); interpreter.exec("import sys; print sys.path"); interpreter.exec("from interpreter.Interpreter import Interpreter"); grammarInterpreter = (PyInstance) interpreter.eval("Interpreter()"); diff --git a/GraphLayoutDSL/src/language/layout.dot b/GraphLayoutDSL/src/main/java/language/layout.dot similarity index 100% rename from GraphLayoutDSL/src/language/layout.dot rename to GraphLayoutDSL/src/main/java/language/layout.dot diff --git a/GraphLayoutDSL/src/language/layout.png b/GraphLayoutDSL/src/main/java/language/layout.png similarity index 100% rename from GraphLayoutDSL/src/language/layout.png rename to GraphLayoutDSL/src/main/java/language/layout.png diff --git a/GraphLayoutDSL/src/language/layout.tx b/GraphLayoutDSL/src/main/java/language/layout.tx similarity index 100% rename from GraphLayoutDSL/src/language/layout.tx rename to GraphLayoutDSL/src/main/java/language/layout.tx diff --git a/GraphLayoutDSL/src/models/java/LayoutGraph.java b/GraphLayoutDSL/src/main/java/models/java/LayoutGraph.java similarity index 100% rename from GraphLayoutDSL/src/models/java/LayoutGraph.java rename to GraphLayoutDSL/src/main/java/models/java/LayoutGraph.java index 2c3cfd0..3b139f1 100644 --- a/GraphLayoutDSL/src/models/java/LayoutGraph.java +++ b/GraphLayoutDSL/src/main/java/models/java/LayoutGraph.java @@ -1,10 +1,10 @@ package models.java; -import interfaces.ILayoutGraph; - import java.util.List; import java.util.Map; +import interfaces.ILayoutGraph; + public class LayoutGraph implements ILayoutGraph{ diff --git a/GraphLayoutDSL/src/models/java/LayoutSubgraphs.java b/GraphLayoutDSL/src/main/java/models/java/LayoutSubgraphs.java similarity index 100% rename from GraphLayoutDSL/src/models/java/LayoutSubgraphs.java rename to GraphLayoutDSL/src/main/java/models/java/LayoutSubgraphs.java index 9c01cab..f096f5d 100644 --- a/GraphLayoutDSL/src/models/java/LayoutSubgraphs.java +++ b/GraphLayoutDSL/src/main/java/models/java/LayoutSubgraphs.java @@ -1,10 +1,10 @@ package models.java; +import java.util.List; + import interfaces.ILayoutGraph; import interfaces.ILayoutSubgraphs; -import java.util.List; - public class LayoutSubgraphs implements ILayoutSubgraphs{ private List subgraphs; diff --git a/GraphLayoutDSL/src/models/pythonmodels.py b/GraphLayoutDSL/src/main/java/models/pythonmodels.py similarity index 100% rename from GraphLayoutDSL/src/models/pythonmodels.py rename to GraphLayoutDSL/src/main/java/models/pythonmodels.py diff --git a/GraphLayoutDSL/src/modules/arpeggio/__init__.py b/GraphLayoutDSL/src/main/java/modules/arpeggio/__init__.py similarity index 100% rename from GraphLayoutDSL/src/modules/arpeggio/__init__.py rename to GraphLayoutDSL/src/main/java/modules/arpeggio/__init__.py diff --git a/GraphLayoutDSL/src/modules/arpeggio/cleanpeg.py b/GraphLayoutDSL/src/main/java/modules/arpeggio/cleanpeg.py similarity index 100% rename from GraphLayoutDSL/src/modules/arpeggio/cleanpeg.py rename to GraphLayoutDSL/src/main/java/modules/arpeggio/cleanpeg.py diff --git a/GraphLayoutDSL/src/modules/arpeggio/export.py b/GraphLayoutDSL/src/main/java/modules/arpeggio/export.py similarity index 100% rename from GraphLayoutDSL/src/modules/arpeggio/export.py rename to GraphLayoutDSL/src/main/java/modules/arpeggio/export.py diff --git a/GraphLayoutDSL/src/modules/arpeggio/peg.py b/GraphLayoutDSL/src/main/java/modules/arpeggio/peg.py similarity index 100% rename from GraphLayoutDSL/src/modules/arpeggio/peg.py rename to GraphLayoutDSL/src/main/java/modules/arpeggio/peg.py diff --git a/GraphLayoutDSL/src/modules/arpeggio/utils.py b/GraphLayoutDSL/src/main/java/modules/arpeggio/utils.py similarity index 100% rename from GraphLayoutDSL/src/modules/arpeggio/utils.py rename to GraphLayoutDSL/src/main/java/modules/arpeggio/utils.py diff --git a/GraphLayoutDSL/src/modules/textx/__init__.py b/GraphLayoutDSL/src/main/java/modules/textx/__init__.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/__init__.py rename to GraphLayoutDSL/src/main/java/modules/textx/__init__.py diff --git a/GraphLayoutDSL/src/modules/textx/const.py b/GraphLayoutDSL/src/main/java/modules/textx/const.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/const.py rename to GraphLayoutDSL/src/main/java/modules/textx/const.py diff --git a/GraphLayoutDSL/src/modules/textx/exceptions.py b/GraphLayoutDSL/src/main/java/modules/textx/exceptions.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/exceptions.py rename to GraphLayoutDSL/src/main/java/modules/textx/exceptions.py diff --git a/GraphLayoutDSL/src/modules/textx/export.py b/GraphLayoutDSL/src/main/java/modules/textx/export.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/export.py rename to GraphLayoutDSL/src/main/java/modules/textx/export.py diff --git a/GraphLayoutDSL/src/modules/textx/metamodel.py b/GraphLayoutDSL/src/main/java/modules/textx/metamodel.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/metamodel.py rename to GraphLayoutDSL/src/main/java/modules/textx/metamodel.py diff --git a/GraphLayoutDSL/src/modules/textx/model.py b/GraphLayoutDSL/src/main/java/modules/textx/model.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/model.py rename to GraphLayoutDSL/src/main/java/modules/textx/model.py diff --git a/GraphLayoutDSL/src/modules/textx/textx.py b/GraphLayoutDSL/src/main/java/modules/textx/textx.py similarity index 100% rename from GraphLayoutDSL/src/modules/textx/textx.py rename to GraphLayoutDSL/src/main/java/modules/textx/textx.py diff --git a/GraphLayoutDSL/src/util/Factory.java b/GraphLayoutDSL/src/main/java/util/Factory.java similarity index 100% rename from GraphLayoutDSL/src/util/Factory.java rename to GraphLayoutDSL/src/main/java/util/Factory.java diff --git a/GraphLayoutDSL/test/dsl/test/TestLanguageAndInterpreter.java b/GraphLayoutDSL/src/test/java/dsl/test/TestLanguageAndInterpreter.java similarity index 72% rename from GraphLayoutDSL/test/dsl/test/TestLanguageAndInterpreter.java rename to GraphLayoutDSL/src/test/java/dsl/test/TestLanguageAndInterpreter.java index 449c591..034fe65 100644 --- a/GraphLayoutDSL/test/dsl/test/TestLanguageAndInterpreter.java +++ b/GraphLayoutDSL/src/test/java/dsl/test/TestLanguageAndInterpreter.java @@ -1,34 +1,39 @@ package dsl.test; -import interpreter.java.Interpreter; -import models.java.LayoutGraph; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; -import junit.framework.TestCase; +import interpreter.java.Interpreter; +import models.java.LayoutGraph; -public class TestLanguageAndInterpreter extends TestCase{ +@Ignore +public class TestLanguageAndInterpreter { private Interpreter interpreter; - - @Override - public void setUp(){ + + @Before + public void setUp() { interpreter = Interpreter.getInstance(); } - + @Test - public void testAlgorithms(){ + public void testAlgorithms() { LayoutGraph result; - result = (LayoutGraph) interpreter.execute("layout graph algorithm level based tree horizontal = 5, vertical = 10"); + result = (LayoutGraph) interpreter + .execute("layout graph algorithm level based tree horizontal = 5, vertical = 10"); assertEquals("level", result.getAlgorithm().get("name")); assertEquals(5, result.getAlgorithm().get("xDist")); assertEquals(10, result.getAlgorithm().get("yDist")); - + result = (LayoutGraph) interpreter.execute("layout graph algorithm node link tree orientation = left"); assertEquals("node", result.getAlgorithm().get("name")); assertEquals("left", result.getAlgorithm().get("orientation")); - + result = (LayoutGraph) interpreter.execute("layout graph algorithm hierarchical same " + "layer spacing = 10, parent border = 10, move parent, hierarchy spacing = 3, fine tune "); assertEquals("hierarchical", result.getAlgorithm().get("name")); @@ -37,16 +42,18 @@ public void testAlgorithms(){ assertEquals(true, result.getAlgorithm().get("moveParent")); assertEquals(3.0, result.getAlgorithm().get("interHierarchySpacing")); assertEquals(true, result.getAlgorithm().get("fineTune")); - + result = (LayoutGraph) interpreter.execute("layout graph algorithm circular"); assertEquals("circular", result.getAlgorithm().get("name")); - - result = (LayoutGraph) interpreter.execute("layout graph algorithm Kamada Kawai distance multiplier = 23.2, length factor = 4"); + + result = (LayoutGraph) interpreter + .execute("layout graph algorithm Kamada Kawai distance multiplier = 23.2, length factor = 4"); assertEquals("Kamada", result.getAlgorithm().get("name")); assertEquals(23.2, result.getAlgorithm().get("distanceMultiplier")); assertEquals(4.0, result.getAlgorithm().get("lengthFactor")); - - result = (LayoutGraph) interpreter.execute("layout graph algorithm organic fine tune, fine tuning radius = 12.2, optimize edge crossings, edge crossing factor = 12, optimize node distribution, average scale factor = 23, optimize border line, border line factor = 12"); + + result = (LayoutGraph) interpreter.execute( + "layout graph algorithm organic fine tune, fine tuning radius = 12.2, optimize edge crossings, edge crossing factor = 12, optimize node distribution, average scale factor = 23, optimize border line, border line factor = 12"); assertEquals("organic", result.getAlgorithm().get("name")); assertEquals(true, result.getAlgorithm().get("fineTune")); assertEquals(12.2, result.getAlgorithm().get("fineTuningRadius")); @@ -56,13 +63,14 @@ public void testAlgorithms(){ assertEquals(23.0, result.getAlgorithm().get("averageScaleFactor")); assertEquals(true, result.getAlgorithm().get("optimizeBorderLine")); assertEquals(12.0, result.getAlgorithm().get("borderLineFactor")); - + } - + @Test - public void testAestheticCriteria(){ + public void testAestheticCriteria() { LayoutGraph result; - result = (LayoutGraph) interpreter.execute("layout graph criteria maximize minimal angle threshold=5, uniform flow direction = left, distribute nodes evenly "); + result = (LayoutGraph) interpreter.execute( + "layout graph criteria maximize minimal angle threshold=5, uniform flow direction = left, distribute nodes evenly "); assertNotNull(result); assertEquals(3, result.getAestheticCriteria().size()); assertEquals(5, result.getAestheticCriteria().get(0).get("threshold")); @@ -70,7 +78,7 @@ public void testAestheticCriteria(){ assertEquals("flow", result.getAestheticCriteria().get(1).get("criterion")); assertEquals("left", result.getAestheticCriteria().get(1).get("direction")); assertEquals("distribute", result.getAestheticCriteria().get(2).get("criterion")); - + } } diff --git a/GraphLayoutDSL/target/classes/interpreter/Interpreter.py b/GraphLayoutDSL/target/classes/interpreter/Interpreter.py deleted file mode 100644 index 268aaeb..0000000 --- a/GraphLayoutDSL/target/classes/interpreter/Interpreter.py +++ /dev/null @@ -1,102 +0,0 @@ -from textx.metamodel import metamodel_from_file -from textx.export import metamodel_export, model_export -from textx.exceptions import TextXSyntaxError -from pythonmodels import MLayoutGraph, MLayoutSubgraphs -import os -import sys - -class Interpreter(): - - def __init__(self,): - metamodel_dir = sys.path[0] - metamodel_path = os.path.join(metamodel_dir, "layout.tx") - metamodel = metamodel_from_file(metamodel_path) - self.metamodel = metamodel - - def execute(self, model_str): - - try: - model = self.metamodel.model_from_str(model_str) - except TextXSyntaxError as e: - print(e.message) - return MLayoutGraph(exception = e.message) - - - if model.__class__.__name__ == 'LayoutGraph': - layoutGraph = Interpreter.execute_one(model.layoutType, 'graph') - print('graph') - return layoutGraph - else: - print('subgraphs') - subgraphs = [] - for layoutSubgraph in model.layoutSubgraphs: - - subgraph = layoutSubgraph.subgraph - if subgraph == None: - graph = 'others' - else: - vertices = '' - content = True - for i,vertex in enumerate(subgraph.vertices): - if vertex.index: - vertices = vertices + str(vertex.index) - content = False - else: - vertices = vertices + vertex.content - if i < len(subgraph.vertices) - 1: - vertices = vertices + ',' - graph = vertices - - - layoutType = layoutSubgraph.layoutType - layoutOneSubgraph = Interpreter.execute_one(layoutType, graph) - layoutOneSubgraph.attr_graphContent = content - - subgraphs.append(layoutOneSubgraph) - - return MLayoutSubgraphs(subgraphs) - - return 'executed' - - @staticmethod - def execute_one(layout, graph): - - if layout.__class__.__name__ == "LayoutStyle": - layoutType = "style" - elif layout.__class__.__name__ == "LayoutAlgorithm": - layoutType = "algorithm" - else: - layoutType = "criteria" - - if layoutType == 'algorithm': - #a map that will contain all information about the algorithm - algorithmProperties = {} - algorithm = layout.algorithm - #the algorithm could be of numerous classes - for attr, value in algorithm.__dict__.iteritems(): - if not (attr.startswith('_') or attr == 'parent'): - if attr == 'properties': - for property in value: - for propertyAttr, propertyValue in property.__dict__.iteritems(): - if not (propertyAttr.startswith('_') or propertyAttr == 'parent'): - algorithmProperties[propertyAttr] = propertyValue - else: - algorithmProperties[attr] = value - - layoutGraph = MLayoutGraph(graph = graph, type = layoutType, algorithm = algorithmProperties) - return layoutGraph - elif layoutType == 'style': - style = layout.style - layoutGraph = MLayoutGraph(graph = graph, type = layoutType, style = style) - return layoutGraph - elif layoutType == 'criteria': - criteriaList = []; - criteria = layout.aestheticCriteria - for criterion in criteria: - criterionProperties = {} - for attr, value in criterion.__dict__.iteritems(): - if not (attr.startswith('_') or attr == 'parent'): - criterionProperties[attr] = value - criteriaList.append(criterionProperties) - layoutGraph = MLayoutGraph(graph = graph, type = layoutType, aestheticCriteria = criteriaList) - return layoutGraph diff --git a/GraphLayoutDSL/target/classes/interpreter/__init__.py b/GraphLayoutDSL/target/classes/interpreter/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/GraphLayoutDSL/target/classes/language/layout.dot b/GraphLayoutDSL/target/classes/language/layout.dot deleted file mode 100644 index 731649e..0000000 --- a/GraphLayoutDSL/target/classes/language/layout.dot +++ /dev/null @@ -1,177 +0,0 @@ - - digraph xtext { - fontname = "Bitstream Vera Sans" - fontsize = 8 - node[ - shape=record, - style=filled, - fillcolor=aliceblue - ] - edge[dir=black,arrowtail=empty] - - -85336648[ label="{OrthogonalAlgorithm|+name:STRING\lrectangular:BOOL\l}"] - -85340296[ label="{Comment|\/\/.*$}"] - -49028264[ label="{AestheticCriteion|}"] -49028264 -> 49029176 [dir=back] -49028264 -> 49031912 [dir=back] -49028264 -> 85310200 [dir=back] -49028264 -> 85311112 [dir=back] -49028264 -> 85312024 [dir=back] -49028264 -> 85312936 [dir=back] -49028264 -> 85313848 [dir=back] -49028264 -> 85314760 [dir=back] - -85327528[ label="{ForceDirectedAlgorithm|}"] -85327528 -> 85328440 [dir=back] -85327528 -> 85329352 [dir=back] -85327528 -> 85330264 [dir=back] -85327528 -> 85331176 [dir=back] -85327528 -> 85332088 [dir=back] - -85334824[ label="{TutteEmbedding|+name:STRING\l+dist:INT\l}"] - -85317496[ label="{RadialTreeAlgorithm|+name:STRING\l+xDist:INT\l+yDist:INT\l}"] - -85328440[ label="{KamadaKawai|+name:STRING\l+distanceMultiplier:FLOAT\l+lengthFactor:FLOAT\l+maxIterations:INT\l}"] - -49020968 -> 49021880[arrowtail=diamond, dir=both, headlabel="layoutSubgraphs 1..*"] -49020968[ label="{LayoutSubgraphs|}"] - -85325704 -> 85338472[arrowtail=diamond, dir=both, headlabel="automorphism "] -85325704[ label="{ConcentricSymmetricAlgorithm|+name:STRING\l}"] - -85315672[ label="{LayoutAlgorithmEnum|}"] -85315672 -> 85316584 [dir=back] -85315672 -> 85333912 [dir=back] -85315672 -> 85322968 [dir=back] -85315672 -> 85323880 [dir=back] -85315672 -> 85324792 [dir=back] -85315672 -> 85327528 [dir=back] -85315672 -> 85333000 [dir=back] - -49022792 -> 85337560[arrowtail=diamond, dir=both, headlabel="vertices 1..*"] -49022792[ label="{Subgraph|}"] - -85330264[ label="{Spring|+name:STRING\l+stretch:FLOAT\l+resolutionRange:INT\l+forceMultiplier:FLOAT\l}"] - -49023704[ label="{LayoutEnum|}"] -49023704 -> 49024616 [dir=back] -49023704 -> 49026440 [dir=back] -49023704 -> 49027352 [dir=back] - -85312024 -> 85338472[arrowtail=diamond, dir=both, headlabel="automorphism "] -85312024[ label="{Symmetry|+criterion:STRING\l}"] - -85332088[ label="{Organic|+name:STRING\loptimizeEdgeCrossings:BOOL\l+edgeCrossingFactor:FLOAT\loptimizeEdgeDistance:BOOL\l+edgeDistanceFactor:FLOAT\loptimizeBorderLine:BOOL\l+borderLineFactor:FLOAT\loptimizeNodeDistribution:BOOL\l+nodeDistributionFactor:FLOAT\lfineTune:BOOL\l+fineTuningRadius:FLOAT\l+averageNodeArea:FLOAT\l+averageScaleFactor:FLOAT\l+maxIterations:INT\l}"] - -85339384[ label="{Orientation|left\|right\|up\|down}"] - -85333000[ label="{BoxAlgorithm|+name:STRING\l+numOfColumns:INT\l}"] - -85322968[ label="{HierarchicalAlgorithm|+name:STRING\lresizeParent:BOOL\lmoveParent:BOOL\l+parentBorder:INT\l+interCellSpacing:FLOAT\l+interRankSpacing:FLOAT\l+interHierarchySpacing:FLOAT\l+parallelEdgeSpacing:FLOAT\l+orientation:Orientation\lfineTuning:BOOL\l}"] - -85310200[ label="{MinimumBands|+criterion:STRING\l}"] - -85331176[ label="{FastOrganic|+type:STRING\l+name:STRING\l+forceConstant:FLOAT\l+minimalDistanceLimit:FLOAT\l+initialTemperature:FLOAT\l+maxIterations:INT\l}"] - -49025528[ label="{LayoutStyleEnum|automatic\|circular\|tree\|hierarchical\|symmetric\|general}"] - -85333912[ label="{StraightLineAlgorithm|}"] -85333912 -> 85334824 [dir=back] -85333912 -> 85335736 [dir=back] -85333912 -> 85336648 [dir=back] - -85311112[ label="{UniformFlow|+direction:Orientation\l}"] - -85329352[ label="{FruchtermanReingold|+name:STRING\l+attractionMultiplier:FLOAT\l+resolutionMultiplier:FLOAT\l+maxIterations:INT\l}"] - -85321144[ label="{BalloonTreeAlgorithm|+name:STRING\l+minRadius:INT\l}"] - -49020056 -> 49023704[arrowtail=diamond, dir=both, headlabel="layoutType "] -49020056[ label="{LayoutGraph|}"] - -49031000[ label="{Planar|+criterion:STRING\l}"] - -85319320[ label="{CompactTreeAlgorithm|+name:STRING\lhorizontal:BOOL\linvert:BOOL\lresizeParents:BOOL\l+levelDistance:INT\l+nodeDistance:INT\l}"] - -85320232[ label="{NodeLinkTreeAlgorithm|+name:STRING\l+orientation:Orientation\l+spacingSiblings:FLOAT\l+spacingSubtrees:FLOAT\l+spacingLevels:FLOAT\l+offsetRootNode:FLOAT\l}"] - -85318408[ label="{LevelBasedTreeAlgorithm|+name:STRING\l+xDist:INT\l+yDist:INT\l}"] - -49026440 -> 49028264[arrowtail=diamond, dir=both, headlabel="aestheticCriteria 1..*"] -49026440[ label="{AestheticCriteria|+howToLayout:STRING\l}"] - -85314760[ label="{EdgeVariation|+criterion:STRING\l}"] - -85316584[ label="{TreeAlgorithm|}"] -85316584 -> 85317496 [dir=back] -85316584 -> 85318408 [dir=back] -85316584 -> 85319320 [dir=back] -85316584 -> 85320232 [dir=back] -85316584 -> 85321144 [dir=back] - -49021880 -> 49022792[arrowtail=diamond, dir=both, headlabel="subgraph "] -49021880 -> 49023704[arrowtail=diamond, dir=both, headlabel="layoutType "] -49021880[ label="{LayoutSubraph|}"] - -49029176[ label="{EdgeCrossings|}"] -49029176 -> 49030088 [dir=back] -49029176 -> 49031000 [dir=back] - -85337560[ label="{Vertex|+index:INT\l}"] - -85312936[ label="{NodeDistribution|+criterion:STRING\l}"] - -85324792[ label="{SymmetricAlgorithm|}"] -85324792 -> 85325704 [dir=back] -85324792 -> 85326616 [dir=back] - -49024616[ label="{LayoutStyle|+howToLayout:STRING\l+style:LayoutStyleEnum\l}"] - -49031912[ label="{MinimumAngles|+criterion:STRING\l+threshold:INT\l}"] - -49019144[ label="{Layout|}"] -49019144 -> 49020056 [dir=back] -49019144 -> 49020968 [dir=back] - -85323880[ label="{CircularAlgorithm|+name:STRING\loptimize:BOOL\l+dist:INT\l}"] - -85338472 -> 85337560[arrowtail=diamond, dir=both, headlabel="vertices 1..*"] -85338472[ label="{Automorphism|}"] - -49027352 -> 85315672[arrowtail=diamond, dir=both, headlabel="algorithm "] -49027352[ label="{LayoutAlgorithm|+howToLayout:STRING\l}"] - -49030088[ label="{MinimizeCrossings|+criterion:STRING\l}"] - -85335736[ label="{ConvexAlgorithm|+name:STRING\l+dist:INT\l}"] - -85326616[ label="{PlanarSymmetricAlgorithm|+type:STRING\l}"] - -85313848[ label="{EdgeLengths|+criterion:STRING\l}"] - -44763880[ label="{STRING|}"] - -49017320[ label="{NUMBER|}"] -49017320 -> 44766616 [dir=back] -49017320 -> 44765704 [dir=back] - -44766616[ label="{FLOAT|}"] - -49018232[ label="{BASETYPE|}"] -49018232 -> 49017320 [dir=back] -49018232 -> 44762968 [dir=back] -49018232 -> 44763880 [dir=back] -49018232 -> 44764792 [dir=back] - -44765704[ label="{INT|}"] - -44762968[ label="{ID|}"] - -44764792[ label="{BOOL|}"] - - -} diff --git a/GraphLayoutDSL/target/classes/language/layout.png b/GraphLayoutDSL/target/classes/language/layout.png deleted file mode 100644 index 7f12d51b628675d8759c2af915b36c7764b397ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405871 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 HZGU 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 z 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 V$G#<};3)Y_+OIm>6Sp2Z^`Dt~j*|cY diff --git a/GraphLayoutDSL/target/classes/language/layout.tx b/GraphLayoutDSL/target/classes/language/layout.tx deleted file mode 100644 index 758398f..0000000 --- a/GraphLayoutDSL/target/classes/language/layout.tx +++ /dev/null @@ -1,494 +0,0 @@ -Layout: - LayoutGraph | LayoutSubgraphs -; - -LayoutGraph: - 'lay' 'out' 'graph' layoutType = LayoutEnum -; - -LayoutSubgraphs: - 'lay' 'out' layoutSubgraphs += LayoutSubraph[';'] -; - -LayoutSubraph: - (subgraph = Subgraph | 'others') layoutType = LayoutEnum -; - -Subgraph: - 'subgraph' vertices += Vertex[','] -; - - -LayoutEnum: - LayoutStyle | AestheticCriteria | LayoutAlgorithm -; - -LayoutStyle: - 'style' style = LayoutStyleEnum -; - -LayoutStyleEnum: - 'automatic' | 'circular' | 'tree' | 'hierarchical' | 'symmetric' | 'general' -; - -AestheticCriteria: - 'criteria' aestheticCriteria += AestheticCriteion[','] -; - -LayoutAlgorithm: - 'algorithm' algorithm = LayoutAlgorithmEnum -; - -AestheticCriteion: - EdgeCrossings | MinimumAngles | MinimumBands | - UniformFlow | Symmetry | - NodeDistribution | EdgeLengths | EdgeVariation -; - -EdgeCrossings: - MinimizeCrossings | Planar -; - -MinimizeCrossings: - 'minimize'? 'edge' criterion = 'crossings' -; -Planar: - criterion = 'planar' -; - -MinimumAngles: - ('maximize' 'minimal')? criterion = 'angle' ('threshold' '=' threshold = INT)? -; - -MinimumBands: - 'minimize'? criterion = 'bands' -; - -UniformFlow: - 'uniform'? criterion = 'flow' ('direction' '=' direction = Orientation)? -; - -Symmetry: - criterion = 'symmetric' ('automorphism' automorphism = Automorphism)? -; - - -NodeDistribution: - criterion = 'distribute' 'nodes' 'evenly' -; - -EdgeLengths: - criterion = 'optimize' 'edges' 'lengths' -; - -EdgeVariation: - criterion = 'similar' 'edges' 'lengths' -; - - -LayoutAlgorithmEnum: - TreeAlgorithm | StraightLineAlgorithm | HierarchicalAlgorithm | - CircularAlgorithm | SymmetricAlgorithm | ForceDirectedAlgorithm | - BoxAlgorithm -; - -TreeAlgorithm: - RadialTreeAlgorithm | LevelBasedTreeAlgorithm | CompactTreeAlgorithm | - NodeLinkTreeAlgorithm | BalloonTreeAlgorithm -; - -RadialTreeAlgorithm: - name = 'radial' 'tree' - properties *= RadialTreeAlgorithmProperty[','] -; - -RadialTreeAlgorithmProperty: - HorizontalTreeProperty | VerticalTreeProperty -; - -HorizontalTreeProperty: - 'horizontal' 'distance'? '=' xDist = INT -; - -VerticalTreeProperty: - 'vertical' 'distance'? '=' yDist = INT -; - -LevelBasedTreeAlgorithm: - name = 'level' 'based' 'tree' - properties *= LevelBasedTreeAlgorithmProperty[','] -; - -LevelBasedTreeAlgorithmProperty: - HorizontalTreeProperty | VerticalTreeProperty -; - -CompactTreeAlgorithm: - name = 'compact' 'tree' - properties *= CompactTreeAlgorithmProperty[','] -; - -CompactTreeAlgorithmProperty: - IsHorizontalProperty | IsInvertProperty | IsResizeParentsProperty | - LevelDistanceProperty | NodeDistanceProperty -; - -IsHorizontalProperty: - horizontal ?= 'horizontal' -; - -IsInvertProperty: - invert ?= 'invert' -; - -IsResizeParentsProperty: - resizeParents ?= 'resize' 'parents' -; - -LevelDistanceProperty: - 'level' ' distance' '=' levelDistance = INT -; - -NodeDistanceProperty: - 'node' 'distance' '=' nodeDistance = INT -; - -NodeLinkTreeAlgorithm: - name = 'node' 'link' 'tree' - properties *= NodeLinkTreeAlgorithmProperty[','] -; - -NodeLinkTreeAlgorithmProperty: - OrientationProperty | SpacingSiblingsProperty | SpacingSubtreesProperty | - SpacingLevelsProperty | OffsetForRootNodeProperty -; - -OrientationProperty: - 'orientation' '=' orientation = Orientation -; - -SpacingSiblingsProperty: - 'spacing' 'between'? 'siblings' '=' spacingSiblings = FLOAT -; - -SpacingSubtreesProperty: - 'spacing' 'between'? 'subtrees' '=' spacingSubtrees = FLOAT -; - -SpacingLevelsProperty: - 'spacing' 'between'? 'depth'? 'levels' '=' spacingLevels = FLOAT -; - -OffsetForRootNodeProperty: - 'offset' 'for'? 'root' 'node'? '=' offsetRootNode = FLOAT -; - -BalloonTreeAlgorithm: - name = 'balloon' 'tree' - properties *= BalloonTreeAlgorithmProperty[','] -; - -//this was done in order to avoid inconsistencies with other rules of this kind and to enable easy addition of additional properties -BalloonTreeAlgorithmProperty: - MinimalRadiusProperty -; - -MinimalRadiusProperty: - 'minimal' 'radius' '=' minRadius = INT -; - -HierarchicalAlgorithm: - name = 'hierarchical' - properties *= HierarchicalAlgorithmProperty[','] -; - -HierarchicalAlgorithmProperty: - IsResizeParentsProperty | ParentBorderProperty | IsMoveParentProperty | - IntraCellSpacingProperty | InterRankSpacingProperty | InterHierarchySpacingProperty | - ParallelEdgesSpacingProperty | OrientationProperty | IsFineTuneProperty -; - -IsMoveParentProperty: - moveParent ?= 'move' 'parent' -; - -ParentBorderProperty: - 'parent' 'border' '=' parentBorder = INT -; - -IntraCellSpacingProperty: - 'same' 'layer' 'spacing' '=' intraCellSpacing = FLOAT -; - -InterRankSpacingProperty: - 'adjacent' 'layers' 'spacing' '=' interRankSpacing = FLOAT -; - -InterHierarchySpacingProperty: - 'hierarchy' 'spacing' '=' interHierarchySpacing = FLOAT -; - -ParallelEdgesSpacingProperty: - 'parallel' 'edges' 'spacing' '=' parallelEdgesSpacing = FLOAT -; - -IsFineTuneProperty: - fineTune ?= 'fine' 'tune' -; - -CircularAlgorithm: - name = 'circular' - properties *= CircularAlgorithmProperty[','] -; - -CircularAlgorithmProperty: - IsOptimizeCrossingProperty | DistanceProperty -; - -IsOptimizeCrossingProperty: - optimize ?= 'optimize' 'crossings' -; -DistanceProperty: - 'distance' '=' dist = INT -; - -SymmetricAlgorithm: - ConcentricSymmetricAlgorithm | PlanarSymmetricAlgorithm -; - -ConcentricSymmetricAlgorithm: - name = 'concentric' 'symmetric' - properties *= ConcentricSymmetricAlgorithmProperty[','] - -; - -ConcentricSymmetricAlgorithmProperty: - AutomorphismProperty -; -AutomorphismProperty: - 'automorphism' '=' automorphism = Automorphism -; - -PlanarSymmetricAlgorithm: - type = 'planar' 'name = symmetric' -; - -ForceDirectedAlgorithm: - KamadaKawai | FruchtermanReingold | Spring | - FastOrganic | Organic -; - -KamadaKawai: - name = 'Kamada' 'Kawai' - properties *= KamadaKawaiProperties[','] -; - -KamadaKawaiProperties: - DisconnectedDistanceMultiplierProperty | LengthFactorProperty | - MaxIterationsProperty -; - -DisconnectedDistanceMultiplierProperty: - 'disconnected'? 'distance' 'multiplier' '=' distanceMultiplier = FLOAT -; -LengthFactorProperty: - 'length' 'factor' '=' lengthFactor = FLOAT -; -MaxIterationsProperty: - 'maximum' 'iterations' '=' maxIterations = INT -; - -FruchtermanReingold: - name = 'Fruchterman' 'Reingold' - properties *= FruchtermanReingoldProperty[','] -; - -FruchtermanReingoldProperty: - AttractionMultiplierProperty | ResolutionMultiplierProperty | MaxIterationsProperty -; - -AttractionMultiplierProperty: - 'attraction' 'multiplier' '=' attractionMultiplier = FLOAT -; - -ResolutionMultiplierProperty: - 'resolution' 'multiplier' '=' resolutionMultiplier = FLOAT -; - -Spring: - name = 'spring' - properties *= SpringProperty[','] -; - -SpringProperty: - StretchProperty | RepulsionRangeProperty | ForceMultiplierProperty -; - -StretchProperty: - 'stretch' '=' stretch = FLOAT -; - -RepulsionRangeProperty: - 'repulsion' 'range' '=' resolutionRange = INT -; - -ForceMultiplierProperty: - 'force' 'multiplier' '=' forceMultiplier = FLOAT -; - -FastOrganic: - type = 'fast' name = 'organic' - properties *= FastOrganicProperty[','] -; - -FastOrganicProperty: - ForceConstantProperty | MinimalDistanceLimitProperty | - InitialTemperatureProperty | MaxIterationsProperty -; - -ForceConstantProperty: - 'force' 'constant' '=' forceConstant = FLOAT -; - -MinimalDistanceLimitProperty: - 'minimal' 'distance' 'limit' '=' minimalDistanceLimit = FLOAT -; - -InitialTemperatureProperty: - 'initial' 'temperature' '=' initialTemperature = FLOAT -; - -Organic: - name = 'organic' - properties *= OrganicProperty[','] -; - -OrganicProperty: - EdgeCrossingFactorProperty | IsOptimizeEdgeCrossingsProperty | - EdgeDistanceFactorProperty | IsOptimizeEdgeDistanceProperty | - BorderLineFactorProperty | IsOptimizeBorderLineProperty | - NodeDistributionFactorProperty | IsOptimizeNodeDistributionProperty | - FineTuningRadiusProperty | IsFineTuneProperty | - AverageNodeAreaProperty | AverageScaleFactorProperty | - MaxIterationsProperty -; - -IsOptimizeEdgeCrossingsProperty: - optimizeEdgeCrossings ?= 'optimize' 'edge' 'crossings' -; - -EdgeCrossingFactorProperty: - 'edge' 'crossing' 'factor' '=' edgeCrossingFactor = FLOAT -; - -IsOptimizeEdgeDistanceProperty: - optimizeEdgeDistance ?= 'optimize' 'edge' 'distance' -; - -EdgeDistanceFactorProperty: - 'edge' 'distance' 'factor' '=' edgeDistanceFactor = FLOAT -; - - -IsOptimizeBorderLineProperty: - optimizeBorderLine ?= 'optimize' 'border' 'line' -; - -BorderLineFactorProperty: - 'border' 'line' 'factor' '=' borderLineFactor = FLOAT -; - - -IsOptimizeNodeDistributionProperty: - optimizeNodeDistribution ?= 'optimize' 'node' 'distribution' -; - -NodeDistributionFactorProperty: - 'node' 'distribution' 'factor' '=' nodeDistributionFactor = FLOAT -; - -FineTuningRadiusProperty: - 'fine' 'tuning' 'radius' '=' fineTuningRadius = FLOAT -; - -AverageNodeAreaProperty: - 'average' 'node' 'area' '=' averageNodeArea = FLOAT -; - -AverageScaleFactorProperty: - 'average' 'scale' 'factor' '=' averageScaleFactor = FLOAT -; - - -BoxAlgorithm: - name = 'box' - properties *= BoxAlgorithmPropery[','] -; - -BoxAlgorithmPropery: - ColumnsProperty -; - -ColumnsProperty: - 'columns' '=' numOfColumns = INT -; - - -StraightLineAlgorithm: - TutteEmbedding | ConvexAlgorithm | OrthogonalAlgorithm -; - -TutteEmbedding: - name = 'Tutte' 'embedding' - properties *= TutteEmbeddingProperty[','] -; - -TutteEmbeddingProperty: - DistanceProperty -; - -DistanceProperty: - 'distance' '=' dist = INT -; - -ConvexAlgorithm: - name = 'convex' - properties *= ConvexAlgorithmProperty[','] -; - -ConvexAlgorithmProperty: - DistanceProperty -; - -OrthogonalAlgorithm: - name = 'orthogonal' - properties *= OrthogonalAlgorithmProperty[','] -; - -//it is almost certain that there will be more properties -OrthogonalAlgorithmProperty: - RectnagularProperty -; - -RectnagularProperty: - rectangular ?= 'rectangular' -; - - -Vertex: - 'v' index = INT | content = STRING -; - -Automorphism: - '(' vertices += Vertex[','] ')' -; - -Orientation: - 'left' | 'right' | 'up' | 'down' -; - -Comment: - /\/\/.*$/ -; - - \ No newline at end of file diff --git a/GraphLayoutDSL/target/classes/models/pythonmodels.py b/GraphLayoutDSL/target/classes/models/pythonmodels.py deleted file mode 100644 index 960efda..0000000 --- a/GraphLayoutDSL/target/classes/models/pythonmodels.py +++ /dev/null @@ -1,49 +0,0 @@ -from interfaces import ILayoutSubgraphs, ILayoutGraph - -class MLayoutGraph(ILayoutGraph): - '''This class contains all information regarding - how a graph should be laid out. It is also used - to describe how a subgraph should be laid out''' - - - def __init__(self, graph = None, type = None, style = "", graphContent = False, aestheticCriteria = None, - algorithm = None, exception = ""): - self.attr_graph = graph - self.attr_type = type - self.attr_style = style - self.attr_aestheticCriteria = aestheticCriteria - self.attr_algorithm = algorithm - self.attr_graphContent = graphContent - self.attr_exception = exception - - def getGraph(self): - return self.attr_graph - - def getType(self): - return self.attr_type - - def getStyle(self): - return self.attr_style - - def getAestheticCriteria(self): - return self.attr_aestheticCriteria - - def getAlgorithm(self): - return self.attr_algorithm - - def isGraphContent(self): - return self.attr_graphContent - - def getException(self): - return self.attr_exception - - -class MLayoutSubgraphs(ILayoutSubgraphs): - '''This class contains a list of instructions - regarding how to lay out subgraphs''' - - def __init__(self, subgraphs): - self.att_subgraphs = subgraphs - - def getSubgraphs(self): - return self.att_subgraphs \ No newline at end of file diff --git a/GraphLayoutDSL/target/classes/modules/arpeggio/__init__.py b/GraphLayoutDSL/target/classes/modules/arpeggio/__init__.py deleted file mode 100644 index 705551b..0000000 --- a/GraphLayoutDSL/target/classes/modules/arpeggio/__init__.py +++ /dev/null @@ -1,1734 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################### -# Name: arpeggio.py -# Purpose: PEG parser interpreter -# Author: Igor R. Dejanović -# Copyright: (c) 2009-2015 Igor R. Dejanović -# License: MIT License -# -# This is an implementation of packrat parser interpreter based on PEG -# grammars. Grammars are defined using Python language constructs or the PEG -# textual notation. -############################################################################### - -from __future__ import print_function, unicode_literals -import sys -if sys.version < '3': - text = unicode -else: - text = str - -import codecs -import re -import bisect -from arpeggio.utils import isstr -import types - -DEFAULT_WS = '\t\n\r ' -NOMATCH_MARKER = 0 - - -class ArpeggioError(Exception): - """ - Base class for arpeggio errors. - """ - def __init__(self, message): - self.message = message - - def __str__(self): - return repr(self.message) - - -class GrammarError(ArpeggioError): - """ - Error raised during parser building phase used to indicate error in the - grammar definition. - """ - - -class SemanticError(ArpeggioError): - """ - Error raised during the phase of semantic analysis used to indicate - semantic error. - """ - - -class NoMatch(Exception): - """ - Exception raised by the Match classes during parsing to indicate that the - match is not successful. - - Args: - rules (list of ParserExpression): Rules that are tried at the position - of the exception. - position (int): A position in the input stream where exception - occurred. - parser (Parser): An instance of a parser. - """ - def __init__(self, rules, position, parser): - self.rules = rules - self.position = position - self.parser = parser - - def __str__(self): - def rule_to_exp_str(rule): - if hasattr(rule, '_exp_str'): - # Rule may override expected report string - return rule._exp_str - elif rule.root: - return rule.rule_name - elif isinstance(rule, Match) and \ - not isinstance(rule, EndOfFile): - return "'{}'".format(rule.to_match) - else: - return rule.name - - what_is_expected = ["{}".format(rule_to_exp_str(r)) for r in self.rules] - - if len(what_is_expected) == 0: - what_str = "'{}'".format(what_is_expected[0]) - else: - what_str = " or ".join(what_is_expected) - - if self.parser.file_name: - return "Expected {} at {}:{} => '{}'."\ - .format(what_str, - self.parser.file_name, - text(self.parser.pos_to_linecol(self.position)), - self.parser.context(position=self.position)) - else: - return "Expected {} at position {} => '{}'."\ - .format(what_str, - text(self.parser.pos_to_linecol(self.position)), - self.parser.context(position=self.position)) - - def __unicode__(self): - return self.__str__() - - -def flatten(_iterable): - '''Flattening of python iterables.''' - result = [] - for e in _iterable: - if hasattr(e, "__iter__") and not type(e) in [text, NonTerminal]: - result.extend(flatten(e)) - else: - result.append(e) - return result - - -class DebugPrinter(object): - """ - Mixin class for adding debug print support. - - Attributes: - debug (bool): If true debugging messages will be printed. - _current_ident(int): Current identation level for prints. - """ - - def __init__(self, **kwargs): - - self.debug = kwargs.pop("debug", False) - self._current_ident = 0 - - super(DebugPrinter, self).__init__(**kwargs) - - def dprint(self, message, ident_change=0): - """ - Handle debug message. Current implementation will print to stdout using - the current identation level. - """ - if ident_change < 0: - self._current_ident += ident_change - - print(("%s%s" % (" " * self._current_ident, message))) - - if ident_change > 0: - self._current_ident += ident_change - - -# --------------------------------------------------------- -# Parser Model (PEG Abstract Semantic Graph) elements - - -class ParsingExpression(object): - """ - An abstract class for all parsing expressions. - Represents the node of the Parser Model. - - Attributes: - elements: A list (or other python object) used as a staging structure - for python based grammar definition. Used in _from_python for - building nodes list of child parser expressions. - rule_name (str): The name of the parser rule if this is the root rule. - root (bool): Does this parser expression represents the - root of the parser rule? The root parser rule will create - non-terminal node of the parse tree during parsing. - nodes (list of ParsingExpression): A list of child parser expressions. - suppress (bool): If this is set to True than no ParseTreeNode will be - created for this ParsingExpression. Default False. - """ - def __init__(self, *elements, **kwargs): - - if len(elements) == 1: - elements = elements[0] - self.elements = elements - - self.rule_name = kwargs.get('rule_name', '') - self.root = kwargs.get('root', False) - - nodes = kwargs.get('nodes', []) - if not hasattr(nodes, '__iter__'): - nodes = [nodes] - self.nodes = nodes - - self.suppress = kwargs.get('suppress', False) - - # Memoization. Every node cache the parsing results for the given input - # positions. - self._result_cache = {} # position -> parse tree at the position - - @property - def desc(self): - return "{}{}".format(self.name, "-" if self.suppress else "") - - @property - def name(self): - if self.root: - return "%s=%s" % (self.rule_name, self.__class__.__name__) - else: - return self.__class__.__name__ - - @property - def id(self): - if self.root: - return self.rule_name - else: - return id(self) - - def _clear_cache(self, processed=None): - """ - Clears memoization cache. Should be called on input change and end - of parsing. - - Args: - processed (set): Set of processed nodes to prevent infinite loops. - """ - - self._result_cache = {} - - if not processed: - processed = set() - - for node in self.nodes: - if node not in processed: - processed.add(node) - node._clear_cache(processed) - - def parse(self, parser): - - if parser.debug: - name = self.name - if name.startswith('__asgn'): - name = "{}[{}]".format(self.name, self._attr_name) - parser.dprint(">> Matching rule {}{} at position {} => {}" - .format(name, - " in {}".format(parser.in_rule) - if parser.in_rule else "", - parser.position, - parser.context()), 1) - - # Current position could change in recursive calls - # so save it. - c_pos = parser.position - - # Memoization. - # If this position is already parsed by this parser expression use - # the result - if parser.memoization: - try: - result, new_pos = self._result_cache[c_pos] - parser.position = new_pos - parser.cache_hits += 1 - if parser.debug: - parser.dprint( - "** Cache hit for [{}, {}] = '{}' : new_pos={}" - .format(name, c_pos, text(result), text(new_pos))) - parser.dprint( - "<<+ Matched rule {} at position {}" - .format(name, new_pos), -1) - - # If NoMatch is recorded at this position raise. - if result is NOMATCH_MARKER: - raise parser.nm - - # else return cached result - return result - - except KeyError: - parser.cache_misses += 1 - - - # Remember last parsing expression and set this as - # the new last. - last_pexpression = parser.last_pexpression - parser.last_pexpression = self - - if self.rule_name: - # If we are entering root rule - # remember previous root rule name and set - # this one on the parser to be available for - # debugging messages - previous_root_rule_name = parser.in_rule - parser.in_rule = self.rule_name - - try: - result = self._parse(parser) - if self.suppress or (type(result) is list and - result and result[0] is None): - result = None - - except NoMatch: - parser.position = c_pos # Backtracking - # Memoize NoMatch at this position for this rule - if parser.memoization: - self._result_cache[c_pos] = (NOMATCH_MARKER, c_pos) - raise - - finally: - # Recover last parsing expression. - parser.last_pexpression = last_pexpression - - if parser.debug: - parser.dprint("<<{} rule {}{} at position {} => {}" - .format("- Not matched" - if parser.position is c_pos - else "+ Matched", - name, - " in {}".format(parser.in_rule) - if parser.in_rule else "", - parser.position, - parser.context()), -1) - - # If leaving root rule restore previous root rule name. - if self.rule_name: - parser.in_rule = previous_root_rule_name - - # For root rules flatten non-terminal/list - if self.root and result and not isinstance(result, Terminal): - if not isinstance(result, NonTerminal): - result = flatten(result) - - # Tree reduction will eliminate Non-terminal with single child. - if parser.reduce_tree and len(result) == 1: - result = result[0] - - # If the result is not parse tree node it must be a plain list - # so create a new NonTerminal. - if not isinstance(result, ParseTreeNode): - result = NonTerminal(self, result) - - # Result caching for use by memoization. - if parser.memoization: - self._result_cache[c_pos] = (result, parser.position) - - return result - - -class Sequence(ParsingExpression): - """ - Will match sequence of parser expressions in exact order they are defined. - """ - - def __init__(self, *elements, **kwargs): - super(Sequence, self).__init__(*elements, **kwargs) - self.ws = kwargs.pop('ws', None) - self.skipws = kwargs.pop('skipws', None) - - def _parse(self, parser): - results = [] - c_pos = parser.position - - if self.ws is not None: - old_ws = parser.ws - parser.ws = self.ws - - if self.skipws is not None: - old_skipws = parser.skipws - parser.skipws = self.skipws - - # Prefetching - append = results.append - - try: - for e in self.nodes: - result = e.parse(parser) - if result: - append(result) - - except NoMatch: - parser.position = c_pos # Backtracking - raise - - finally: - if self.ws is not None: - parser.ws = old_ws - if self.skipws is not None: - parser.skipws = old_skipws - - if results: - return results - - -class OrderedChoice(Sequence): - """ - Will match one of the parser expressions specified. Parser will try to - match expressions in the order they are defined. - """ - def _parse(self, parser): - result = None - match = False - c_pos = parser.position - for e in self.nodes: - try: - result = e.parse(parser) - if result is not None: - match = True - result = [result] - break - except NoMatch: - parser.position = c_pos # Backtracking - - if not match: - parser._nm_raise(self, c_pos, parser) - - return result - - -class Repetition(ParsingExpression): - """ - Base class for all repetition-like parser expressions (?,*,+) - Args: - eolterm(bool): Flag that indicates that end of line should - terminate repetition match. - """ - def __init__(self, *elements, **kwargs): - super(Repetition, self).__init__(*elements, **kwargs) - if 'eolterm' in kwargs: - self.eolterm = kwargs['eolterm'] - else: - self.eolterm = False - - -class Optional(Repetition): - """ - Optional will try to match parser expression specified and will not fail - in case match is not successful. - """ - def _parse(self, parser): - result = None - c_pos = parser.position - - # Set parser for optional mode - oldin_optional = parser.in_optional - parser.in_optional = True - - try: - result = [self.nodes[0].parse(parser)] - except NoMatch: - parser.position = c_pos # Backtracking - - # Restore in_optional state - parser.in_optional = oldin_optional - - return result - - -class ZeroOrMore(Repetition): - """ - ZeroOrMore will try to match parser expression specified zero or more - times. It will never fail. - """ - def _parse(self, parser): - results = [] - - if self.eolterm: - # Remember current eolterm and set eolterm of - # this repetition - old_eolterm = parser.eolterm - parser.eolterm = self.eolterm - - # Set parser for optional mode - oldin_optional = parser.in_optional - parser.in_optional = True - - # Prefetching - append = results.append - p = self.nodes[0].parse - - while True: - try: - c_pos = parser.position - result = p(parser) - if not result: - break - append(result) - except NoMatch: - parser.position = c_pos # Backtracking - break - - if self.eolterm: - # Restore previous eolterm - parser.eolterm = old_eolterm - - # Restore in_optional state - parser.in_optional = oldin_optional - - return results - - -class OneOrMore(Repetition): - """ - OneOrMore will try to match parser expression specified one or more times. - """ - def _parse(self, parser): - results = [] - first = True - - if self.eolterm: - # Remember current eolterm and set eolterm of - # this repetition - old_eolterm = parser.eolterm - parser.eolterm = self.eolterm - - # Set parser for optional mode - oldin_optional = parser.in_optional - - # Prefetching - append = results.append - p = self.nodes[0].parse - - try: - while True: - try: - c_pos = parser.position - result = p(parser) - if not result: - break - append(result) - first = False - parser.in_optional = True - except NoMatch: - parser.position = c_pos # Backtracking - - if first: - raise - - break - finally: - if self.eolterm: - # Restore previous eolterm - parser.eolterm = old_eolterm - - # Restore in_optional state - parser.in_optional = oldin_optional - - return results - - -class SyntaxPredicate(ParsingExpression): - """ - Base class for all syntax predicates (and, not, empty). - Predicates are parser expressions that will do the match but will not - consume any input. - """ - - -class And(SyntaxPredicate): - """ - This predicate will succeed if the specified expression matches current - input. - """ - def _parse(self, parser): - c_pos = parser.position - for e in self.nodes: - try: - e.parse(parser) - except NoMatch: - parser.position = c_pos - raise - parser.position = c_pos - - -class Not(SyntaxPredicate): - """ - This predicate will succeed if the specified expression doesn't match - current input. - """ - def _parse(self, parser): - c_pos = parser.position - for e in self.nodes: - try: - e.parse(parser) - except NoMatch: - parser.position = c_pos - return - parser.position = c_pos - parser._nm_raise(self, c_pos, parser) - - -class Empty(SyntaxPredicate): - """ - This predicate will always succeed without consuming input. - """ - def _parse(self, parser): - pass - - -class Decorator(ParsingExpression): - """ - Decorator are special kind of parsing expression used to mark - a containing pexpression and give it some special semantics. - For example, decorators are used to mark pexpression as lexical - rules (see :class:Lex). - """ - - -class Combine(Decorator): - """ - This decorator defines pexpression that represents a lexeme rule. - This rules will always return a Terminal parse tree node. - Whitespaces will be preserved. Comments will not be matched. - """ - def _parse(self, parser): - results = [] - - oldin_lex_rule = parser.in_lex_rule - parser.in_lex_rule = True - c_pos = parser.position - try: - for parser_model_node in self.nodes: - results.append(parser_model_node.parse(parser)) - - results = flatten(results) - - # Create terminal from result - return Terminal(self, c_pos, - "".join([x.flat_str() for x in results])) - except NoMatch: - parser.position = c_pos # Backtracking - raise - finally: - parser.in_lex_rule = oldin_lex_rule - - -class Match(ParsingExpression): - """ - Base class for all classes that will try to match something from the input. - """ - def __init__(self, rule_name, root=False): - super(Match, self).__init__(rule_name=rule_name, root=root) - - @property - def name(self): - if self.root: - return "%s=%s(%s)" % (self.rule_name, self.__class__.__name__, - self.to_match) - else: - return "%s(%s)" % (self.__class__.__name__, self.to_match) - - def _parse_comments(self, parser): - """Parse comments.""" - - try: - parser.in_parse_comments = True - if parser.comments_model: - try: - while True: - # TODO: Consumed whitespaces and comments should be - # attached to the first match ahead. - parser.comments.append( - parser.comments_model.parse(parser)) - if parser.skipws: - parser._skip_ws() - except NoMatch: - # NoMatch in comment matching is perfectly - # legal and no action should be taken. - pass - finally: - parser.in_parse_comments = False - - def parse(self, parser): - - if parser.skipws and not parser.in_lex_rule: - parser._skip_ws() - - if parser.debug: - parser.dprint( - "?? Try match rule {}{} at position {} => {}" - .format(self.name, - " in {}".format(parser.in_rule) - if parser.in_rule else "", - parser.position, - parser.context())) - - if parser.position in parser.comment_positions: - # Skip comments if already parsed. - parser.position = parser.comment_positions[parser.position] - else: - if not parser.in_parse_comments and not parser.in_lex_rule: - comment_start = parser.position - self._parse_comments(parser) - parser.comment_positions[comment_start] = parser.position - - result = self._parse(parser) - if not self.suppress: - return result - - -class RegExMatch(Match): - ''' - This Match class will perform input matching based on Regular Expressions. - - Args: - to_match (regex string): A regular expression string to match. - It will be used to create regular expression using re.compile. - ignore_case(bool): If case insensitive match is needed. - Default is None to support propagation from global parser setting. - str_repr(str): A string that is used to represent this regex. - - ''' - def __init__(self, to_match, rule_name='', root=False, ignore_case=None, - str_repr=None): - super(RegExMatch, self).__init__(rule_name, root) - self.to_match_regex = to_match - self.ignore_case = ignore_case - - self.to_match = str_repr if str_repr is not None else to_match - - def compile(self): - flags = re.MULTILINE - if self.ignore_case: - flags |= re.IGNORECASE - self.regex = re.compile(self.to_match_regex, flags) - - def __str__(self): - return self.to_match - - def __unicode__(self): - return self.__str__() - - def _parse(self, parser): - c_pos = parser.position - m = self.regex.match(parser.input, c_pos) - if m: - matched = m.group() - if parser.debug: - parser.dprint( - "++ Match '%s' at %d => '%s'" % - (matched, c_pos, parser.context(len(matched)))) - parser.position += len(matched) - if matched: - return Terminal(self, c_pos, matched) - else: - if parser.debug: - parser.dprint("-- NoMatch at {}".format(c_pos)) - parser._nm_raise(self, c_pos, parser) - - -class StrMatch(Match): - """ - This Match class will perform input matching by a string comparison. - - Args: - to_match (str): A string to match. - ignore_case(bool): If case insensitive match is needed. - Default is None to support propagation from global parser setting. - """ - def __init__(self, to_match, rule_name='', root=False, ignore_case=None): - super(StrMatch, self).__init__(rule_name, root) - self.to_match = to_match - self.ignore_case = ignore_case - - def _parse(self, parser): - c_pos = parser.position - input_frag = parser.input[c_pos:c_pos+len(self.to_match)] - if self.ignore_case: - match = input_frag.lower() == self.to_match.lower() - else: - match = input_frag == self.to_match - if match: - if parser.debug: - parser.dprint( - "++ Match '{}' at {} => '{}'" - .format(self.to_match, c_pos, - parser.context(len(self.to_match)))) - parser.position += len(self.to_match) - - # If this match is inside sequence than mark for suppression - suppress = type(parser.last_pexpression) is Sequence - - return Terminal(self, c_pos, self.to_match, suppress=suppress) - else: - if parser.debug: - parser.dprint( - "-- No match '{}' at {} => '{}'" - .format(self.to_match, c_pos, - parser.context(len(self.to_match)))) - parser._nm_raise(self, c_pos, parser) - - def __str__(self): - return self.to_match - - def __unicode__(self): - return self.__str__() - - def __eq__(self, other): - return self.to_match == text(other) - - def __hash__(self): - return hash(self.to_match) - - -# HACK: Kwd class is a bit hackish. Need to find a better way to -# introduce different classes of string tokens. -class Kwd(StrMatch): - """ - A specialization of StrMatch to specify keywords of the language. - """ - def __init__(self, to_match): - super(Kwd, self).__init__(to_match) - self.to_match = to_match - self.root = True - self.rule_name = 'keyword' - - -class EndOfFile(Match): - """ - The Match class that will succeed in case end of input is reached. - """ - def __init__(self): - super(EndOfFile, self).__init__("EOF") - - @property - def name(self): - return "EOF" - - def _parse(self, parser): - c_pos = parser.position - if len(parser.input) == c_pos: - return Terminal(EOF(), c_pos, '', suppress=True) - else: - if parser.debug: - parser.dprint("!! EOF not matched.") - parser._nm_raise(self, c_pos, parser) - - -def EOF(): - return EndOfFile() - -# --------------------------------------------------------- - - -# --------------------------------------------------- -# Parse Tree node classes - -class ParseTreeNode(object): - """ - Abstract base class representing node of the Parse Tree. - The node can be terminal(the leaf of the parse tree) or non-terminal. - - Attributes: - rule (ParsingExpression): The rule that created this node. - rule_name (str): The name of the rule that created this node if - root rule or empty string otherwise. - position (int): A position in the input stream where the match - occurred. - error (bool): Is this a false parse tree node created during error - recovery. - comments : A parse tree of comment(s) attached to this node. - """ - def __init__(self, rule, position, error): - assert rule - assert rule.rule_name is not None - self.rule = rule - self.rule_name = rule.rule_name - self.position = position - self.error = error - self.comments = None - - @property - def name(self): - return "%s [%s]" % (self.rule_name, self.position) - - def visit(self, visitor): - """ - Visitor pattern implementation. - - Args: - visitor(PTNodeVisitor): The visitor object. - """ - if visitor.debug: - visitor.dprint("Visiting {} type:{} str:{}" - .format(self.name, type(self).__name__, text(self))) - - children = SemanticActionResults() - if isinstance(self, NonTerminal): - for node in self: - child = node.visit(visitor) - # If visit returns None suppress that child node - if child is not None: - children.append_result(node.rule_name, child) - - visit_name = "visit_%s" % self.rule_name - if hasattr(visitor, visit_name): - # Call visit method. - result = getattr(visitor, visit_name)(self, children) - - # If there is a method with 'second' prefix save - # the result of visit for post-processing - if hasattr(visitor, "second_%s" % self.rule_name): - visitor.for_second_pass.append((self.rule_name, result)) - - return result - - elif visitor.defaults: - # If default actions are enabled - return visitor.visit__default__(self, children) - - -class Terminal(ParseTreeNode): - """ - Leaf node of the Parse Tree. Represents matched string. - - Attributes: - rule (ParsingExpression): The rule that created this terminal. - position (int): A position in the input stream where match occurred. - value (str): Matched string at the given position or missing token - name in the case of an error node. - suppress(bool): If True this terminal can be ignored in semantic - analysis. - """ - - __slots__ = ['rule', 'rule_name', 'position', 'error', 'comments', - 'value', 'suppress'] - - def __init__(self, rule, position, value, error=False, suppress=False): - super(Terminal, self).__init__(rule, position, error) - self.value = value - self.suppress = suppress - - @property - def desc(self): - if self.value: - return "%s '%s' [%s]" % (self.rule_name, self.value, self.position) - else: - return "%s [%s]" % (self.rule_name, self.position) - - def flat_str(self): - return self.value - - def __str__(self): - return self.value - - def __unicode__(self): - return self.__str__() - - def __repr__(self): - return self.desc - - def __eq__(self, other): - return text(self) == text(other) - - -class NonTerminal(ParseTreeNode, list): - """ - Non-leaf node of the Parse Tree. Represents language syntax construction. - At the same time used in ParseTreeNode navigation expressions. - See test_ptnode_navigation_expressions.py for examples of navigation - expressions. - - Attributes: - nodes (list of ParseTreeNode): Children parse tree nodes. - _filtered (bool): Is this NT a dynamically created filtered NT. - This is used internally. - - """ - - __slots__ = ['rule', 'rule_name', 'position', 'error', 'comments', - '_filtered', '_expr_cache'] - - def __init__(self, rule, nodes, error=False, _filtered=False): - - # Inherit position from the first child node - position = nodes[0].position - - super(NonTerminal, self).__init__(rule, position, error) - - self.extend(flatten([nodes])) - self._filtered = _filtered - - @property - def value(self): - """Terminal protocol.""" - return text(self) - - @property - def desc(self): - return self.name - - def flat_str(self): - """ - Return flatten string representation. - """ - return "".join([x.flat_str() for x in self]) - - def __str__(self): - return " | ".join([text(x) for x in self]) - - def __unicode__(self): - return self.__str__() - - def __repr__(self): - return "[ %s ]" % ", ".join([repr(x) for x in self]) - - def __getattr__(self, rule_name): - """ - Find a child (non)terminal by the rule name. - - Args: - rule_name(str): The name of the rule that is referenced from - this node rule. - """ - # Prevent infinite recursion - if rule_name in ['_expr_cache', '_filtered', 'rule', 'rule_name', - 'position', 'append', 'extend']: - raise AttributeError - - try: - # First check the cache - if rule_name in self._expr_cache: - return self._expr_cache[rule_name] - except AttributeError: - # Navigation expression cache. Used for lookup by rule name. - self._expr_cache = {} - - # If result is not found in the cache collect all nodes - # with the given rule name and create new NonTerminal - # and cache it for later access. - nodes = [] - rule = None - for n in self: - if self._filtered: - # For filtered NT rule_name is a rule on - # each of its children - for m in n: - if m.rule_name == rule_name: - nodes.append(m) - rule = m.rule - else: - if n.rule_name == rule_name: - nodes.append(n) - rule = n.rule - - result = NonTerminal(rule=rule, nodes=nodes, _filtered=True) - self._expr_cache[rule_name] = result - return result - - -# ---------------------------------------------------- -# Semantic Actions -# -class PTNodeVisitor(DebugPrinter): - """ - Base class for all parse tree visitors. - """ - def __init__(self, defaults=True, **kwargs): - """ - Args: - defaults(bool): If the default visit method should be applied in - case no method is defined. - """ - self.for_second_pass = [] - self.defaults = defaults - - super(PTNodeVisitor, self).__init__(**kwargs) - - def visit__default__(self, node, children): - """ - Called if no visit method is defined for the node. - - Args: - node(ParseTreeNode): - children(processed children ParseTreeNode-s): - """ - if isinstance(node, Terminal): - # Default for Terminal is to convert to string unless suppress flag - # is set in which case it is suppressed by setting to None. - retval = text(node) if not node.suppress else None - else: - retval = node - # Special case. If only one child exist return it. - if len(children) == 1: - retval = children[0] - else: - # If there is only one non-string child return - # that by default. This will support e.g. bracket - # removals. - last_non_str = None - for c in children: - if not isstr(c): - if last_non_str is None: - last_non_str = c - else: - # If there is multiple non-string objects - # by default convert non-terminal to string - if self.debug: - self.dprint("*** Warning: Multiple " - "non-string objects found in " - "default visit. Converting non-" - "terminal to a string.") - retval = text(node) - break - else: - # Return the only non-string child - retval = last_non_str - - return retval - - -def visit_parse_tree(parse_tree, visitor): - """ - Applies visitor to parse_tree and runs the second pass - afterwards. - - Args: - parse_tree(ParseTreeNode): - visitor(PTNodeVisitor): - """ - if not parse_tree: - raise Exception( - "Parse tree is empty. You did call parse(), didn't you?") - - if visitor.debug: - visitor.dprint("ASG: First pass") - - # Visit tree. - result = parse_tree.visit(visitor) - - # Second pass - if visitor.debug: - visitor.dprint("ASG: Second pass") - for sa_name, asg_node in visitor.for_second_pass: - getattr(visitor, "second_%s" % sa_name)(asg_node) - - return result - - -class SemanticAction(object): - """ - Semantic actions are executed during semantic analysis. They are in charge - of producing Abstract Semantic Graph (ASG) out of the parse tree. - Every non-terminal and terminal can have semantic action defined which will - be triggered during semantic analysis. - Semantic action triggering is separated in two passes. first_pass method is - required and the method called second_pass is optional and will be called - if exists after the first pass. Second pass can be used for forward - referencing, e.g. linking to the declaration registered in the first pass - stage. - """ - def first_pass(self, parser, node, nodes): - """ - Called in the first pass of tree walk. - This is the default implementation used if no semantic action is - defined. - """ - if isinstance(node, Terminal): - # Default for Terminal is to convert to string unless suppress flag - # is set in which case it is suppressed by setting to None. - retval = text(node) if not node.suppress else None - else: - retval = node - # Special case. If only one child exist return it. - if len(nodes) == 1: - retval = nodes[0] - else: - # If there is only one non-string child return - # that by default. This will support e.g. bracket - # removals. - last_non_str = None - for c in nodes: - if not isstr(c): - if last_non_str is None: - last_non_str = c - else: - # If there is multiple non-string objects - # by default convert non-terminal to string - if parser.debug: - parser.dprint( - "*** Warning: Multiple non-" - "string objects found in applying " - "default semantic action. Converting " - "non-terminal to string.") - retval = text(node) - break - else: - # Return the only non-string child - retval = last_non_str - - return retval - - -class SemanticActionResults(list): - """ - Used in visitor methods call to supply results of semantic analysis - of children parse tree nodes. - Enables dot access by the name of the rule similar to NonTerminal - tree navigation. - Enables index access as well as iteration. - """ - def __init__(self): - self.results = {} - - def append_result(self, name, result): - if name: - if name not in self.results: - self.results[name] = [] - self.results[name].append(result) - - self.append(result) - - def __getattr__(self, attr_name): - if attr_name == 'results': - raise AttributeError - - return self.results.get(attr_name, []) - - -# Common semantic actions -class SemanticActionSingleChild(SemanticAction): - def first_pass(self, parser, node, children): - return children[0] - - -class SemanticActionBodyWithBraces(SemanticAction): - def first_pass(self, parser, node, children): - return children[1:-1] - - -class SemanticActionToString(SemanticAction): - def first_pass(self, parser, node, children): - return text(node) - -# ---------------------------------------------------- -# Parsers - - -class Parser(DebugPrinter): - """ - Abstract base class for all parsers. - - Attributes: - comments_model: parser model for comments. - comments(list): A list of ParseTreeNode for matched comments. - sem_actions(dict): A dictionary of semantic actions keyed by the - rule name. - parse_tree(NonTerminal): The parse tree consisting of NonTerminal and - Terminal instances. - in_rule (str): Current rule name. - in_parse_comments (bool): True if parsing comments. - in_optional (bool): True if parsing optionals (Optional, ZeroOrMore or - OneOrMore after first). - in_lex_rule (bool): True if in lexical rule. Currently used in Combine - decorator to convert match to a single Terminal. - last_pexpression (ParsingExpression): Last parsing expression traversed. - """ - def __init__(self, skipws=True, ws=None, reduce_tree=False, - autokwd=False, ignore_case=False, memoization=False, **kwargs): - """ - Args: - skipws (bool): Should the whitespace skipping be done. Default is - True. - ws (str): A string consisting of whitespace characters. - reduce_tree (bool): If true non-terminals with single child will be - eliminated from the parse tree. Default is False. - autokwd(bool): If keyword-like StrMatches are matched on word - boundaries. Default is False. - ignore_case(bool): If case is ignored (default=False) - memoization(bool): If memoization should be used - (a.k.a. packrat parsing) - """ - - super(Parser, self).__init__(**kwargs) - - # Used to indicate state in which parser should not - # treat newlines as whitespaces. - self._eolterm = False - - self.skipws = skipws - if ws is not None: - self.ws = ws - else: - self.ws = DEFAULT_WS - - self.reduce_tree = reduce_tree - self.autokwd = autokwd - self.ignore_case = ignore_case - self.memoization = memoization - self.comments_model = None - self.comments = [] - self.comment_positions = {} - self.sem_actions = {} - - self.parse_tree = None - - # Create regex used for autokwd matching - flags = 0 - if ignore_case: - flags = re.IGNORECASE - self.keyword_regex = re.compile(r'[^\d\W]\w*', flags) - - # Keep track of root rule we are currently in. - # Used for debugging purposes - self.in_rule = '' - - self.in_parse_comments = False - - # If under optional PE (Optional or ZeroOrMore or OneOrMore after - # first occurence) we do not store NoMatch for error reporting. - self.in_optional = False - - # Are we in lexical rule. If so do not - # skip whitespaces. - self.in_lex_rule = False - - # Last parsing expression traversed - self.last_pexpression = None - - @property - def ws(self): - return self._ws - - @ws.setter - def ws(self, new_value): - self._real_ws = new_value - self._ws = new_value - if self.eolterm: - self._ws = self._ws.replace('\n', '').replace('\r', '') - - @property - def eolterm(self): - return self._eolterm - - @eolterm.setter - def eolterm(self, new_value): - # Toggle newline char in ws on eolterm property set. - # During eolterm state parser should not treat - # newline as a whitespace. - self._eolterm = new_value - if self._eolterm: - self._ws = self._ws.replace('\n', '').replace('\r', '') - else: - self._ws = self._real_ws - - def parse(self, _input, file_name=None): - """ - Parses input and produces parse tree. - - Args: - _input(str): An input string to parse. - file_name(str): If input is loaded from file this can be - set to file name. It is used in error messages. - """ - self.position = 0 # Input position - self.nm = None # Last NoMatch exception - self.line_ends = [] - self.input = _input - self.file_name = file_name - self.comment_positions = {} - self.cache_hits = 0 - self.cache_misses = 0 - try: - self.parse_tree = self._parse() - finally: - # At end of parsing clear all memoization caches. - # Do this here to free memory. - if self.memoization: - self._clear_caches() - - # In debug mode export parse tree to dot file for - # visualization - if self.debug: - from arpeggio.export import PTDOTExporter - root_rule_name = self.parse_tree.rule_name - PTDOTExporter().exportFile( - self.parse_tree, "{}_parse_tree.dot".format(root_rule_name)) - return self.parse_tree - - def parse_file(self, file_name): - """ - Parses content from the given file. - Args: - file_name(str): A file name. - """ - with codecs.open(file_name, 'r', 'utf-8') as f: - content = f.read() - - return self.parse(content, file_name=file_name) - - def getASG(self, sem_actions=None, defaults=True): - """ - Creates Abstract Semantic Graph (ASG) from the parse tree. - - Args: - sem_actions (dict): The semantic actions dictionary to use for - semantic analysis. Rule names are the keys and semantic action - objects are values. - defaults (bool): If True a default semantic action will be - applied in case no action is defined for the node. - """ - if not self.parse_tree: - raise Exception( - "Parse tree is empty. You did call parse(), didn't you?") - - if sem_actions is None: - if not self.sem_actions: - raise Exception("Semantic actions not defined.") - else: - sem_actions = self.sem_actions - - if type(sem_actions) is not dict: - raise Exception("Semantic actions parameter must be a dictionary.") - - for_second_pass = [] - - def tree_walk(node): - """ - Walking the parse tree and calling first_pass for every registered - semantic actions and creating list of object that needs to be - called in the second pass. - """ - - if self.debug: - self.dprint( - "Walking down %s type: %s str: %s" % - (node.name, type(node).__name__, text(node))) - - children = SemanticActionResults() - if isinstance(node, NonTerminal): - for n in node: - child = tree_walk(n) - if child is not None: - children.append_result(n.rule_name, child) - - if self.debug: - self.dprint("Processing %s = '%s' type:%s len:%d" % - (node.name, text(node), type(node).__name__, - len(node) if isinstance(node, list) else 0)) - for i, a in enumerate(children): - self.dprint(" %d:%s type:%s" % - (i+1, text(a), type(a).__name__)) - - if node.rule_name in sem_actions: - sem_action = sem_actions[node.rule_name] - if isinstance(sem_action, types.FunctionType): - retval = sem_action(self, node, children) - else: - retval = sem_action.first_pass(self, node, children) - - if hasattr(sem_action, "second_pass"): - for_second_pass.append((node.rule_name, retval)) - - if self.debug: - action_name = sem_action.__name__ \ - if hasattr(sem_action, '__name__') \ - else sem_action.__class__.__name__ - self.dprint(" Applying semantic action %s" % action_name) - - else: - if defaults: - # If no rule is present use some sane defaults - if self.debug: - self.dprint(" Applying default semantic action.") - - retval = SemanticAction().first_pass(self, node, children) - - else: - retval = node - - if self.debug: - if retval is None: - self.dprint(" Suppressed.") - else: - self.dprint(" Resolved to = %s type:%s" % - (text(retval), type(retval).__name__)) - return retval - - if self.debug: - self.dprint("ASG: First pass") - asg = tree_walk(self.parse_tree) - - # Second pass - if self.debug: - self.dprint("ASG: Second pass") - for sa_name, asg_node in for_second_pass: - sem_actions[sa_name].second_pass(self, asg_node) - - return asg - - def pos_to_linecol(self, pos): - """ - Calculate (line, column) tuple for the given position in the stream. - """ - if not self.line_ends: - try: - # TODO: Check this implementation on Windows. - self.line_ends.append(self.input.index("\n")) - while True: - try: - self.line_ends.append( - self.input.index("\n", self.line_ends[-1] + 1)) - except ValueError: - break - except ValueError: - pass - - line = bisect.bisect_left(self.line_ends, pos) - col = pos - if line > 0: - col -= self.line_ends[line - 1] - if self.input[self.line_ends[line - 1]] in '\n\r': - col -= 1 - return line + 1, col + 1 - - def context(self, length=None, position=None): - """ - Returns current context substring, i.e. the substring around current - position. - Args: - length(int): If given used to mark with asterisk a length chars - from the current position. - position(int): The position in the input stream. - """ - if not position: - position = self.position - if length: - retval = "{}*{}*{}".format( - text(self.input[max(position - 10, 0):position]), - text(self.input[position:position + length]), - text(self.input[position + length:position + 10])) - else: - retval = "{}*{}".format( - text(self.input[max(position - 10, 0):position]), - text(self.input[position:position + 10])) - - return retval.replace('\n', ' ').replace('\r', '') - - def _skip_ws(self): - """ - Skiping whitespace characters. - """ - pos = self.position - ws = self.ws - while pos < len(self.input) and \ - self.input[pos] in ws: - pos += 1 - self.position = pos - - def _nm_raise(self, *args): - """ - Register new NoMatch object if the input is consumed - from the last NoMatch and raise last NoMatch. - - Args: - args: A NoMatch instance or (value, position, parser) - """ - - if len(args) == 1: - exc = args[0] - if exc.position > self.nm.position: - self.nm = exc - else: - rule, position, parser = args - if self.nm is None or not parser.in_parse_comments: - if not self.nm or position > self.nm.position: - self.nm = NoMatch([rule], position, parser) - elif position == self.nm.position and isinstance(rule, Match): - self.nm.rules.append(rule) - - raise self.nm - - def _clear_caches(self): - """ - Clear memoization caches if packrat parser is used. - """ - self.parser_model._clear_cache() - if self.comments_model: - self.comments_model._clear_cache() - - -class CrossRef(object): - ''' - Used for rule reference resolving. - ''' - def __init__(self, target_rule_name, position=-1): - self.target_rule_name = target_rule_name - self.position = position - - -class ParserPython(Parser): - - def __init__(self, language_def, comment_def=None, *args, **kwargs): - """ - Constructs parser from python statements and expressions. - - Args: - language_def (python function): A python function that defines - the root rule of the grammar. - comment_def (python function): A python function that defines - the root rule of the comments grammar. - """ - super(ParserPython, self).__init__(*args, **kwargs) - - # PEG Abstract Syntax Graph - self.parser_model = self._from_python(language_def) - - self.comments_model = None - if comment_def: - self.comments_model = self._from_python(comment_def) - self.comments_model.root = True - self.comments_model.rule_name = comment_def.__name__ - - # In debug mode export parser model to dot for - # visualization - if self.debug: - from arpeggio.export import PMDOTExporter - root_rule = language_def.__name__ - PMDOTExporter().exportFile(self.parser_model, - "{}_parser_model.dot".format(root_rule)) - - def _parse(self): - return self.parser_model.parse(self) - - def _from_python(self, expression): - """ - Create parser model from the definition given in the form of python - functions returning lists, tuples, callables, strings and - ParsingExpression objects. - - Returns: - Parser Model (PEG Abstract Semantic Graph) - """ - __rule_cache = {"EndOfFile": EndOfFile()} - __for_resolving = [] # Expressions that needs crossref resolvnih - self.__cross_refs = 0 - - def inner_from_python(expression): - retval = None - if isinstance(expression, types.FunctionType): - # If this expression is a parser rule - rule_name = expression.__name__ - if rule_name in __rule_cache: - c_rule = __rule_cache.get(rule_name) - if self.debug: - self.dprint("Rule {} founded in cache." - .format(rule_name)) - if isinstance(c_rule, CrossRef): - self.__cross_refs += 1 - if self.debug: - self.dprint("CrossRef usage: {}" - .format(c_rule.target_rule_name)) - return c_rule - - # Semantic action for the rule - if hasattr(expression, "sem"): - self.sem_actions[rule_name] = expression.sem - - # Register rule cross-ref to support recursion - __rule_cache[rule_name] = CrossRef(rule_name) - - curr_expr = expression - while isinstance(curr_expr, types.FunctionType): - # If function directly returns another function - # go into until non-function is returned. - curr_expr = curr_expr() - retval = inner_from_python(curr_expr) - retval.rule_name = rule_name - retval.root = True - - # Update cache - __rule_cache[rule_name] = retval - if self.debug: - self.dprint("New rule: {} -> {}" - .format(rule_name, retval.__class__.__name__)) - - elif type(expression) is text or isinstance(expression, StrMatch): - if type(expression) is text: - retval = StrMatch(expression, ignore_case=self.ignore_case) - else: - retval = expression - if expression.ignore_case is None: - expression.ignore_case = self.ignore_case - - if self.autokwd: - to_match = retval.to_match - match = self.keyword_regex.match(to_match) - if match and match.span() == (0, len(to_match)): - retval = RegExMatch(r'{}\b'.format(to_match), - ignore_case=self.ignore_case, - str_repr=to_match) - retval.compile() - - elif isinstance(expression, RegExMatch): - # Regular expression are not compiled yet - # to support global settings propagation from - # parser. - if expression.ignore_case is None: - expression.ignore_case = self.ignore_case - expression.compile() - - retval = expression - - elif isinstance(expression, Match): - retval = expression - - elif isinstance(expression, Sequence) or \ - isinstance(expression, Repetition) or \ - isinstance(expression, SyntaxPredicate) or \ - isinstance(expression, Decorator): - retval = expression - retval.nodes.append(inner_from_python(retval.elements)) - if any((isinstance(x, CrossRef) for x in retval.nodes)): - __for_resolving.append(retval) - - elif type(expression) in [list, tuple]: - if type(expression) is list: - retval = OrderedChoice(expression) - else: - retval = Sequence(expression) - - retval.nodes = [inner_from_python(e) for e in expression] - if any((isinstance(x, CrossRef) for x in retval.nodes)): - __for_resolving.append(retval) - - else: - raise GrammarError("Unrecognized grammar element '%s'." % - text(expression)) - - return retval - - # Cross-ref resolving - def resolve(): - for e in __for_resolving: - for i, node in enumerate(e.nodes): - if isinstance(node, CrossRef): - self.__cross_refs -= 1 - e.nodes[i] = __rule_cache[node.target_rule_name] - - parser_model = inner_from_python(expression) - resolve() - assert self.__cross_refs == 0, "Not all crossrefs are resolved!" - return parser_model - - def errors(self): - pass diff --git a/GraphLayoutDSL/target/classes/modules/arpeggio/cleanpeg.py b/GraphLayoutDSL/target/classes/modules/arpeggio/cleanpeg.py deleted file mode 100644 index 1283064..0000000 --- a/GraphLayoutDSL/target/classes/modules/arpeggio/cleanpeg.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -####################################################################### -# Name: cleanpeg.py -# Purpose: This module is a variation of the original peg.py. -# The syntax is slightly changed to be more readable and familiar to -# python users. It is based on the Yash's suggestion - issue 11 -# Author: Igor R. Dejanovic -# Copyright: (c) 2014 Igor R. Dejanovic -# License: MIT License -####################################################################### - -from __future__ import print_function, unicode_literals - -from arpeggio import * -from arpeggio import RegExMatch as _ -from .peg import PEGVisitor -from .peg import ParserPEG as ParserPEGOrig - -__all__ = ['ParserPEG'] - - -# PEG syntax rules -def peggrammar(): return OneOrMore(rule), EOF -def rule(): return rule_name, ASSIGNMENT, ordered_choice -def ordered_choice(): return sequence, ZeroOrMore(SLASH, sequence) -def sequence(): return OneOrMore(prefix) -def prefix(): return Optional([AND,NOT]), sufix -def sufix(): return expression, Optional([QUESTION, STAR, PLUS]) -def expression(): return [regex, rule_crossref, - (OPEN, ordered_choice, CLOSE), - str_match], Not(ASSIGNMENT) - -# PEG Lexical rules -def ASSIGNMENT(): return "=" -def SLASH(): return "/" -def STAR(): return "*" -def QUESTION(): return "?" -def PLUS(): return "+" -def AND(): return "&" -def NOT(): return "!" -def OPEN(): return "(" -def CLOSE(): return ")" -def regex(): return "r'", _(r"(\\\'|[^\'])*"),"'" -def rule_name(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") -def rule_crossref(): return rule_name -#def literal(): return [_(r"\'(\\\'|[^\'])*\'"),_(r'"[^"]*"')] -def str_match(): return _(r'(\'(\\\'|[^\'])*\')|("[^"]*")') -def comment(): return _("#.*\n") - - -class ParserPEG(ParserPEGOrig): - - def _from_peg(self, language_def): - parser = ParserPython(peggrammar, comment, reduce_tree=False, - debug=self.debug) - parser.root_rule_name = self.root_rule_name - parse_tree = parser.parse(language_def) - - return visit_parse_tree(parse_tree, PEGVisitor(self.root_rule_name, - self.comment_rule_name, - self.ignore_case, - debug=self.debug)) diff --git a/GraphLayoutDSL/target/classes/modules/arpeggio/export.py b/GraphLayoutDSL/target/classes/modules/arpeggio/export.py deleted file mode 100644 index 5b92784..0000000 --- a/GraphLayoutDSL/target/classes/modules/arpeggio/export.py +++ /dev/null @@ -1,221 +0,0 @@ -# -*- coding: utf-8 -*- -####################################################################### -# Name: export.py -# Purpose: Export support for arpeggio -# Author: Igor R. Dejanović -# Copyright: (c) 2009 Igor R. Dejanović -# License: MIT License -####################################################################### - -from __future__ import unicode_literals -import io -from arpeggio import Terminal - - -class Exporter(object): - """ - Base class for all Exporters. - """ - - def __init__(self): - super(Exporter, self).__init__() - - # Export initialization - self._render_set = set() # Used in rendering to prevent - # rendering - # of the same node multiple times - - self._adapter_map = {} # Used as a registry of adapters to - # ensure that the same adapter is - # returned for the same adaptee object - - def export(self, obj): - """ - Export of an obj to a string. - """ - self._outf = io.StringIO() - self._export(obj) - content = self._outf.getvalue() - self._outf.close() - return content - - def exportFile(self, obj, file_name): - """ - Export of obj to a file. - """ - self._outf = io.open(file_name, "w", encoding="utf-8") - self._export(obj) - self._outf.close() - - def _export(self, obj): - self._outf.write(self._start()) - self._render_node(obj) - self._outf.write(self._end()) - - def _start(self): - """ - Override this to specify the beginning of the graph representation. - """ - return "" - - def _end(self): - """ - Override this to specify the end of the graph representation. - """ - return "" - - -class ExportAdapter(object): - """ - Base adapter class for the export support. - Adapter should be defined for every export and graph type. - - Attributes: - adaptee: A node to adapt. - export: An export object used as a context of the export. - """ - def __init__(self, node, export): - self.adaptee = node # adaptee is adapted graph node - self.export = export - - -# ------------------------------------------------------------------------- -# Support for DOT language - - -class DOTExportAdapter(ExportAdapter): - """ - Base adapter class for the DOT export support. - """ - @property - def id(self): - """ - Graph node unique identification. - """ - raise NotImplementedError() - - @property - def desc(self): - """ - Graph node textual description. - """ - raise NotImplementedError() - - @property - def neighbours(self): - """ - A set of adjacent graph nodes. - """ - raise NotImplementedError() - - -class PMDOTExportAdapter(DOTExportAdapter): - """ - Adapter for ParsingExpression graph types (parser model). - """ - @property - def id(self): - return id(self.adaptee) - - @property - def desc(self): - return self.adaptee.desc - - @property - def neighbours(self): - if not hasattr(self, "_neighbours"): - self._neighbours= [] - - # Registry of adapters used in this export - adapter_map = self.export._adapter_map - - for c, n in enumerate(self.adaptee.nodes): - if isinstance(n, PMDOTExportAdapter): - # if the neighbour node is already adapted use that adapter - self._neighbours.append((str(c + 1), n)) - elif id(n) in adapter_map: - # current node is adaptee -> there is registered adapter - self._neighbours.append((str(c + 1), adapter_map[id(n)])) - else: - # Create new adapter - adapter = PMDOTExportAdapter(n, self.export) - self._neighbours.append((str(c + 1), adapter)) - adapter_map[adapter.id] = adapter - - return self._neighbours - - -class PTDOTExportAdapter(PMDOTExportAdapter): - """ - Adapter for ParseTreeNode graph types. - """ - @property - def neighbours(self): - if isinstance(self.adaptee, Terminal): - return [] - else: - if not hasattr(self, "_neighbours"): - self._neighbours = [] - for c, n in enumerate(self.adaptee): - adapter = PTDOTExportAdapter(n, self.export) - self._neighbours.append((str(c + 1), adapter)) - return self._neighbours - - -class DOTExporter(Exporter): - """ - Export to DOT language (part of GraphViz, see http://www.graphviz.org/) - """ - def _render_node(self, node): - if not node in self._render_set: - self._render_set.add(node) - self._outf.write('\n%s [label="%s"];' % - (node.id, self._dot_label_esc(node.desc))) - #TODO Comment handling -# if hasattr(node, "comments") and root.comments: -# retval += self.node(root.comments) -# retval += '\n%s->%s [label="comment"]' % \ - #(id(root), id(root.comments)) - for name, n in node.neighbours: - self._outf.write('\n%s->%s [label="%s"]' % - (node.id, n.id, name)) - self._outf.write('\n') - self._render_node(n) - - def _start(self): - return "digraph arpeggio_graph {" - - def _end(self): - return "\n}" - - def _dot_label_esc(self, to_esc): - to_esc = to_esc.replace("\\", "\\\\") - to_esc = to_esc.replace('\"', '\\"') - to_esc = to_esc.replace('\n', '\\n') - return to_esc - - -class PMDOTExporter(DOTExporter): - """ - A convenience DOTExport extension that uses ParserExpressionDOTExportAdapter - """ - def export(self, obj): - return super(PMDOTExporter, self).\ - export(PMDOTExportAdapter(obj, self)) - - def exportFile(self, obj, file_name): - return super(PMDOTExporter, self).\ - exportFile(PMDOTExportAdapter(obj, self), file_name) - - -class PTDOTExporter(DOTExporter): - """ - A convenience DOTExport extension that uses PTDOTExportAdapter - """ - def export(self, obj): - return super(PTDOTExporter, self).\ - export(PTDOTExportAdapter(obj, self)) - - def exportFile(self, obj, file_name): - return super(PTDOTExporter, self).\ - exportFile(PTDOTExportAdapter(obj, self), file_name) diff --git a/GraphLayoutDSL/target/classes/modules/arpeggio/peg.py b/GraphLayoutDSL/target/classes/modules/arpeggio/peg.py deleted file mode 100644 index ae00a23..0000000 --- a/GraphLayoutDSL/target/classes/modules/arpeggio/peg.py +++ /dev/null @@ -1,258 +0,0 @@ -# -*- coding: utf-8 -*- -####################################################################### -# Name: peg.py -# Purpose: Implementing PEG language -# Author: Igor R. Dejanovic -# Copyright: (c) 2009-2014 Igor R. Dejanovic -# License: MIT License -####################################################################### - -from __future__ import print_function, unicode_literals -import sys -if sys.version < '3': - text = unicode -else: - text = str - -import copy -from arpeggio import * -from arpeggio import RegExMatch as _ - -__all__ = ['ParserPEG'] - - -# PEG syntax rules -def peggrammar(): return OneOrMore(rule), EOF -def rule(): return rule_name, LEFT_ARROW, ordered_choice, ";" -def ordered_choice(): return sequence, ZeroOrMore(SLASH, sequence) -def sequence(): return OneOrMore(prefix) -def prefix(): return Optional([AND,NOT]), sufix -def sufix(): return expression, Optional([QUESTION, STAR, PLUS]) -def expression(): return [regex, rule_crossref, - (OPEN, ordered_choice, CLOSE), - str_match] - -# PEG Lexical rules -def LEFT_ARROW(): return "<-" -def SLASH(): return "/" -def STAR(): return "*" -def QUESTION(): return "?" -def PLUS(): return "+" -def AND(): return "&" -def NOT(): return "!" -def OPEN(): return "(" -def CLOSE(): return ")" -def regex(): return "r'", _(r"(\\\'|[^\'])*"),"'" -def rule_name(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") -def rule_crossref(): return rule_name -#def literal(): return [_(r"\'(\\\'|[^\'])*\'"),_(r'"[^"]*"')] -def str_match(): return _(r'(\'(\\\'|[^\'])*\')|("[^"]*")') -def comment(): return "//", _(".*\n") - - -class PEGVisitor(PTNodeVisitor): - """ - Visitor that transforms parse tree to a PEG parser for the given language. - """ - - def __init__(self, root_rule_name, comment_rule_name, ignore_case, - *args, **kwargs): - super(PEGVisitor, self).__init__(*args, **kwargs) - self.root_rule_name = root_rule_name - self.comment_rule_name = comment_rule_name - self.ignore_case = ignore_case - # Used for linking phase - self.peg_rules = { - "EOF": EndOfFile() - } - - def visit_peggrammar(self, node, children): - - def _resolve(node): - """ - Resolves CrossRefs from the parser model. - """ - - if node in self.resolved: - return node - self.resolved.add(node) - - def get_rule_by_name(rule_name): - try: - return self.peg_rules[rule_name] - except KeyError: - raise SemanticError("Rule \"{}\" does not exists." - .format(rule_name)) - - def resolve_rule_by_name(rule_name): - - if self.debug: - self.dprint("Resolving crossref {}".format(rule_name)) - - resolved_rule = get_rule_by_name(rule_name) - while type(resolved_rule) is CrossRef: - target_rule = resolved_rule.target_rule_name - resolved_rule = get_rule_by_name(target_rule) - - # If resolved rule hasn't got the same name it - # should be cloned and preserved in the peg_rules cache - if resolved_rule.rule_name != rule_name: - resolved_rule = copy.copy(resolved_rule) - resolved_rule.rule_name = rule_name - self.peg_rules[rule_name] = resolved_rule - if self.debug: - self.dprint("Resolving: cloned to {} = > {}" - .format(resolved_rule.rule_name, - resolved_rule.name)) - return resolved_rule - - if isinstance(node, CrossRef): - # The root rule is a cross-ref - resolved_rule = resolve_rule_by_name(node.target_rule_name) - return _resolve(resolved_rule) - else: - # Resolve children nodes - for i, n in enumerate(node.nodes): - node.nodes[i] = _resolve(n) - self.resolved.add(node) - return node - - # Find root and comment rules - self.resolved = set() - comment_rule = None - for rule in children: - if rule.rule_name == self.root_rule_name: - root_rule = _resolve(rule) - if rule.rule_name == self.comment_rule_name: - comment_rule = _resolve(rule) - - assert root_rule, "Root rule not found!" - return root_rule, comment_rule - - def visit_rule(self, node, children): - rule_name = children[0] - if len(children) > 2: - retval = Sequence(nodes=children[1:]) - else: - retval = children[1] - - retval.rule_name = rule_name - retval.root = True - - # Keep a map of parser rules for cross reference - # resolving. - self.peg_rules[rule_name] = retval - return retval - - def visit_sequence(self, node, children): - if len(children) > 1: - return Sequence(nodes=children[:]) - else: - # If only one child rule exists reduce. - return children[0] - - def visit_ordered_choice(self, node, children): - if len(children) > 1: - retval = OrderedChoice(nodes=children[:]) - else: - # If only one child rule exists reduce. - retval = children[0] - return retval - - def visit_prefix(self, node, children): - if len(children) == 2: - if children[0] == NOT(): - retval = Not() - else: - retval = And() - if type(children[1]) is list: - retval.nodes = children[1] - else: - retval.nodes = [children[1]] - else: - # If there is no optional prefix reduce. - retval = children[0] - - return retval - - def visit_sufix(self, node, children): - if len(children) == 2: - if children[1] == STAR(): - retval = ZeroOrMore(children[0]) - elif children[1] == QUESTION(): - retval = Optional(children[0]) - else: - retval = OneOrMore(children[0]) - if type(children[0]) is list: - retval.nodes = children[0] - else: - retval.nodes = [children[0]] - else: - retval = children[0] - - return retval - - def visit_rule_crossref(self, node, children): - return CrossRef(node.value) - - def visit_regex(self, node, children): - match = RegExMatch(children[0], - ignore_case=self.ignore_case) - match.compile() - return match - - def visit_str_match(self, node, children): - match_str = node.value[1:-1] - match_str = match_str.replace("\\'", "'")\ - .replace("\\\\", "\\")\ - .replace("\\n", "\n")\ - .replace("\\t", "\t") - match_str - return StrMatch(match_str, ignore_case=self.ignore_case) - - -class ParserPEG(Parser): - - def __init__(self, language_def, root_rule_name, comment_rule_name=None, - *args, **kwargs): - """ - Constructs parser from textual PEG definition. - - Args: - language_def (str): A string describing language grammar using - PEG notation. - root_rule_name(str): The name of the root rule. - comment_rule_name(str): The name of the rule for comments. - """ - super(ParserPEG, self).__init__(*args, **kwargs) - self.root_rule_name = root_rule_name - self.comment_rule_name = comment_rule_name - - # PEG Abstract Syntax Graph - self.parser_model, self.comments_model = self._from_peg(language_def) - # Comments should be optional and there can be more of them - if self.comments_model: - self.comments_model.root = True - self.comments_model.rule_name = comment_rule_name - - # In debug mode export parser model to dot for - # visualization - if self.debug: - from arpeggio.export import PMDOTExporter - root_rule = self.parser_model.rule_name - PMDOTExporter().exportFile( - self.parser_model, "{}_peg_parser_model.dot".format(root_rule)) - - def _parse(self): - return self.parser_model.parse(self) - - def _from_peg(self, language_def): - parser = ParserPython(peggrammar, comment, reduce_tree=False, - debug=self.debug) - parser.root_rule_name = self.root_rule_name - parse_tree = parser.parse(language_def) - - return visit_parse_tree(parse_tree, PEGVisitor(self.root_rule_name, - self.comment_rule_name, - self.ignore_case, - debug=self.debug)) diff --git a/GraphLayoutDSL/target/classes/modules/arpeggio/utils.py b/GraphLayoutDSL/target/classes/modules/arpeggio/utils.py deleted file mode 100644 index 93905ea..0000000 --- a/GraphLayoutDSL/target/classes/modules/arpeggio/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -Various utilities. -""" - -# isstr check if object is of string type. -# This works for both python 2 and 3 -# Taken from http://stackoverflow.com/questions/11301138/how-to-check-if-variable-is-string-with-python-2-and-3-compatibility -try: - basestring # attempt to evaluate basestring - def isstr(s): - return isinstance(s, basestring) -except NameError: - def isstr(s): - return isinstance(s, str) \ No newline at end of file diff --git a/GraphLayoutDSL/target/classes/modules/textx/__init__.py b/GraphLayoutDSL/target/classes/modules/textx/__init__.py deleted file mode 100644 index 8d1c8b6..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/GraphLayoutDSL/target/classes/modules/textx/const.py b/GraphLayoutDSL/target/classes/modules/textx/const.py deleted file mode 100644 index 835a03d..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/const.py +++ /dev/null @@ -1,14 +0,0 @@ -# Multiplicities -MULT_ONE = '1' -MULT_OPTIONAL = '0..1' -MULT_ZEROORMORE = '0..*' -MULT_ONEORMORE = '1..*' - -# Rule types -# Common rules are rules that have direct or indirect assignments. -RULE_COMMON = "common" -# If the rule is ordered choice of other rules where there *MUST BE* assignments -# down the reference tree that this rule is abstract. -RULE_ABSTRACT = "abstract" -# If there is no direct or indirect assignments the rule is match rule. -RULE_MATCH = "match" diff --git a/GraphLayoutDSL/target/classes/modules/textx/exceptions.py b/GraphLayoutDSL/target/classes/modules/textx/exceptions.py deleted file mode 100644 index ede1f39..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/exceptions.py +++ /dev/null @@ -1,15 +0,0 @@ -# TextX Exceptions -class TextXError(Exception): - def __init__(self, message, line=None, col=None): - super(TextXError, self).__init__(message) - self.line = line - self.col = col - - -class TextXSemanticError(TextXError): - pass - - -class TextXSyntaxError(TextXError): - pass - diff --git a/GraphLayoutDSL/target/classes/modules/textx/export.py b/GraphLayoutDSL/target/classes/modules/textx/export.py deleted file mode 100644 index 0a12ddc..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/export.py +++ /dev/null @@ -1,221 +0,0 @@ -# -*- coding: utf-8 -*- -####################################################################### -# Name: export.py -# Purpose: Export of textX based models and metamodels to dot file -# Author: Igor R. Dejanovic -# Copyright: (c) 2014-2016 Igor R. Dejanovic -# License: MIT License -####################################################################### -from __future__ import unicode_literals -from arpeggio import Match, OrderedChoice, Sequence, OneOrMore, ZeroOrMore,\ - Optional, SyntaxPredicate -from .const import MULT_ZEROORMORE, MULT_ONEORMORE, MULT_ONE, RULE_ABSTRACT, \ - RULE_COMMON, RULE_MATCH -from .textx import PRIMITIVE_PYTHON_TYPES, BASE_TYPE_NAMES -import codecs -import sys -if sys.version < '3': - text = unicode -else: - text = str - - -HEADER = ''' - digraph xtext { - fontname = "Bitstream Vera Sans" - fontsize = 8 - node[ - shape=record, - style=filled, - fillcolor=aliceblue - ] - nodesep = 0.3 - edge[dir=black,arrowtail=empty] - - -''' - -def match_abstract_str(cls): - """ - For a given abstract or match rule meta-class returns a nice string - representation for the body. - """ - def r(s): - if s.root: - if s in visited or s.rule_name in BASE_TYPE_NAMES or \ - (hasattr(s, '_tx_class') and - s._tx_class._tx_type is not RULE_MATCH): - return s.rule_name - - visited.add(s) - if isinstance(s, Match): - result = text(s) - elif isinstance(s, OrderedChoice): - result = "|".join([r(x) for x in s.nodes]) - elif isinstance(s, Sequence): - result = " ".join([r(x) for x in s.nodes]) - elif isinstance(s, ZeroOrMore): - result = "({})*".format(r(s.nodes[0])) - elif isinstance(s, OneOrMore): - result = "({})+".format(r(s.nodes[0])) - elif isinstance(s, Optional): - result = "{}?".format(r(s.nodes[0])) - elif isinstance(s, SyntaxPredicate): - result = "" - return "{}{}".format(result, "-" if s.suppress else "") - - mstr = "" - if cls.__name__ not in BASE_TYPE_NAMES and \ - not (cls._tx_type is RULE_ABSTRACT and - cls.__name__ != cls._tx_peg_rule.rule_name): - e = cls._tx_peg_rule - visited = set() - if not isinstance(e, Match): - visited.add(e) - if isinstance(e, OrderedChoice): - mstr = "|".join([r(x) for x in e.nodes - if x.rule_name in BASE_TYPE_NAMES or not x.root]) - elif isinstance(e, Sequence): - mstr = " ".join([r(x) for x in e.nodes]) - else: - mstr = r(e) - - mstr = dot_escape(mstr) - - return mstr - -def dot_escape(s): - return s.replace('\n', r'\n')\ - .replace('\\', '\\\\')\ - .replace('"', r'\"')\ - .replace('|', r'\|')\ - .replace('{', r'\{')\ - .replace('}', r'\}')\ - .replace('>', r'\>')\ - .replace('<', r'\<')\ - .replace('?', r'\?') - - -def dot_repr(o): - if type(o) is text: - return "'{}'".format(dot_escape(text(o))) - else: - return text(o) - - -def metamodel_export(metamodel, file_name): - - with codecs.open(file_name, 'w', encoding="utf-8") as f: - f.write(HEADER) - - for cls in metamodel: - name = cls.__name__ - attrs = "" - if cls._tx_type is not RULE_COMMON: - attrs = match_abstract_str(cls) - else: - for attr in cls._tx_attrs.values(): - arrowtail = "arrowtail=diamond, dir=both, " \ - if attr.cont else "" - mult_list = attr.mult in [MULT_ZEROORMORE, MULT_ONEORMORE] - required = "+" if attr.mult in \ - [MULT_ONE, MULT_ONEORMORE] else "" - attr_type = "list[{}]".format(attr.cls.__name__) \ - if mult_list else attr.cls.__name__ - if attr.ref: - # If attribute is a reference - mult = attr.mult if not attr.mult == MULT_ONE else "" - f.write('{} -> {}[{}headlabel="{} {}"]\n' - .format(id(cls), id(attr.cls), arrowtail, - attr.name, mult)) - else: - # If it is plain type - attrs += "{}{}:{}\\l".format(required, - attr.name, attr_type) - - f.write('{}[ label="{{{}|{}}}"]\n'.format( - id(cls), "*{}".format(name) - if cls._tx_type is RULE_ABSTRACT else name, attrs)) - - for inherited_by in cls._tx_inh_by: - f.write('{} -> {} [dir=back]\n' - .format(id(cls), id(inherited_by))) - - f.write("\n") - - f.write("\n}\n") - - -def model_export(model, file_name): - - processed_set = set() - - with codecs.open(file_name, 'w', encoding="utf-8") as f: - f.write(HEADER) - - def _export(obj): - - if obj is None or obj in processed_set or type(obj) \ - in PRIMITIVE_PYTHON_TYPES: - return - - processed_set.add(obj) - - attrs = "" - obj_cls = obj.__class__ - name = "" - for attr_name, attr in obj_cls._tx_attrs.items(): - - attr_value = getattr(obj, attr_name) - - endmark = 'arrowtail=diamond dir=both' if attr.cont else "" - required = "+" if attr.mult in \ - [MULT_ONE, MULT_ONEORMORE] else "" - - if attr.mult in [MULT_ONEORMORE, MULT_ZEROORMORE]: - if all([type(x) in PRIMITIVE_PYTHON_TYPES for x in attr_value]): - attrs += "{}{}:list=[".format(required, attr_name) - attrs += ",".join([dot_repr(x) for x in attr_value]) - attrs += "]\\l" - else: - for idx, list_obj in enumerate(attr_value): - if list_obj is not None: - if type(list_obj) in PRIMITIVE_PYTHON_TYPES: - f.write( - '{} -> "{}:{}" [label="{}:{}" {}]\n' - .format(id(obj), list_obj, - type(list_obj).__name__, - attr_name, idx, endmark)) - else: - f.write('{} -> {} [label="{}:{}" {}]\n' - .format(id(obj), id(list_obj), - attr_name, idx, endmark)) - _export(list_obj) - else: - - # Plain attributes - if type(attr_value) is text and attr_name != 'name': - attr_value = dot_repr(attr_value) - - if type(attr_value) in PRIMITIVE_PYTHON_TYPES: - if attr_name == 'name': - name = attr_value - else: - attrs += "{}{}:{}={}\\l".format( - required, attr_name, type(attr_value) - .__name__, attr_value) - else: - # Object references - if attr_value is not None: - f.write('{} -> {} [label="{}" {}]\n'.format( - id(obj), id(attr_value), - attr_name, endmark)) - _export(attr_value) - - name = "{}:{}".format(name, obj_cls.__name__) - - f.write('{}[label="{{{}|{}}}"]\n'.format(id(obj), name, attrs)) - - _export(model) - - f.write('\n}\n') diff --git a/GraphLayoutDSL/target/classes/modules/textx/metamodel.py b/GraphLayoutDSL/target/classes/modules/textx/metamodel.py deleted file mode 100644 index a20b607..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/metamodel.py +++ /dev/null @@ -1,498 +0,0 @@ -####################################################################### -# Name: metamodel.py -# Purpose: Meta-model construction. -# Author: Igor R. Dejanovic -# Copyright: (c) 2014 Igor R. Dejanovic -# License: MIT License -####################################################################### - -import codecs -import os -from collections import OrderedDict -from arpeggio import DebugPrinter -from .textx import language_from_str, python_type, BASE_TYPE_NAMES, ID, BOOL,\ - INT, FLOAT, STRING, NUMBER, BASETYPE -from .const import MULT_ONE, MULT_ZEROORMORE, MULT_ONEORMORE, RULE_MATCH - - -class MetaAttr(object): - """ - A metaclass for attribute description. - - Attributes: - name(str): Attribute name. - cls(str, TextXClass or base python type): The type of the attribute. - mult(str): Multiplicity - cont(bool): Is this attribute contained inside object. - ref(bool): Is this attribute a reference. If it is not a reference - it must be containment. - bool_assignment(bool): Is this attribute specified using bool - assignment '?='. Default is False. - position(int): A position in the input string where attribute is - defined. - """ - def __init__(self, name, cls=None, mult=MULT_ONE, cont=True, ref=False, - bool_assignment=False, position=0): - self.name = name - self.cls = cls - self.mult = mult - self.cont = cont - self.ref = ref - self.bool_assignment = bool_assignment - self.position = position - - -class TextXClass(object): - """Base class for all language classes.""" - pass - - -class TextXMetaModel(DebugPrinter): - """ - Meta-model contains all information about language abstract syntax. - Furthermore, this class is in charge for model instantiation and new - language class creation. - - Attributes: - rootcls(TextXClass): A language class that is a root of the metamodel. - namespaces(dict): A dict from abs. file name to the dict in the form - {clsname: cls} that holds meta-classes imported from the given - grammar file. Special key 'base' is used for BASETYPE classes. - None key is used for all classes imported from the grammar - given as a string. - _namespace_stack(list): A stack of namespace names (usually absolute - filenames). Used to keep track of the current namespace. - imported_namespaces(dict): A dict from namespace name to the list of - references to imported namespaces. Used in searches for the - unqualified rules. - builtins(dict): A dict of named object used in linking phase. - References to named objects not defined in the model will be - searched here. - user_classes(dict): A dict of user supplied classes to use instead of - generic ones. - obj_processors(dict): A dict of user supplied object processors. - """ - - def __init__(self, file_name=None, classes=None, builtins=None, - auto_init_attributes=True, ignore_case=False, - skipws=True, ws=None, autokwd=False, memoization=False, - **kwargs): - """ - Args: - file_name(str): A file name if meta-model is going to be - constructed from file or None otherwise. - classes(list of python classes): Custom meta-classes used - instead of generic ones. - builtins(dict of named objects): Named objects used in linking - phase. This objects are part of each model. - auto_init_attributes(bool): If set than model attributes will be - automatically initialized to non-None values (e.g. for INT - attribute value will be 0, for BOOL it will be False). If this - parameter is False than all attributes will have a value - of None if not defined in the model. The only exception is - bool assignment ('?=') which always have a default of False. - Default is True. - ignore_case(bool): If case is ignored (default=False) - skipws (bool): Should the whitespace skipping be done. - Default is True. - ws (str): A string consisting of whitespace characters. - autokwd(bool): If keyword-like matches should be matched on word - boundaries. Default is False. - memoization(bool): If memoization should be used (a.k.a. packrat - parsing). Default is False. - debug(bool): Should debug messages be printed. - """ - super(TextXMetaModel, self).__init__(**kwargs) - - self.file_name = file_name - self.rootcls = None - - self.builtins = builtins - - # Convert classes to dict for easier lookup - self.user_classes = {} - if classes: - for c in classes: - self.user_classes[c.__name__] = c - - self.auto_init_attributes = auto_init_attributes - self.ignore_case = ignore_case - self.skipws = skipws - self.ws = ws - self.autokwd = autokwd - self.memoization = memoization - - # Registered model processors - self._model_processors = [] - - # Registered object processors - self.obj_processors = {} - - # Namespaces - self.namespaces = {} - self._namespace_stack = [] - - # Imported namespaces - self.imported_namespaces = {} - - # Create new namespace for BASETYPE classes - self._enter_namespace('base') - - # Base types hierarchy should exist in each meta-model - base_id = self._new_class('ID', ID, 0) - base_string = self._new_class('STRING', STRING, 0) - base_bool = self._new_class('BOOL', BOOL, 0) - base_int = self._new_class('INT', INT, 0) - base_float = self._new_class('FLOAT', FLOAT, 0) - base_number = self._new_class('NUMBER', NUMBER, 0, - [base_float, base_int]) - self._new_class('BASETYPE', BASETYPE, 0, - [base_number, base_bool, base_id, base_string]) - - # If file_name is given its absolute path will be a namespace - if file_name: - file_name = os.path.abspath(file_name) - - # Enter namespace for given file or None if metamodel is - # constructed from string. - self._enter_namespace(file_name) - - def _enter_namespace(self, namespace_name): - """ - A namespace is usually an absolute file name of the grammar. - A special namespace 'base' is used for BASETYPE namespace. - """ - if namespace_name not in self.namespaces: - self.namespaces[namespace_name] = {} - - # BASETYPE namespace is imported in each namespace - self.imported_namespaces[namespace_name] = \ - [self.namespaces['base']] - - self._namespace_stack.append(namespace_name) - - def _leave_namespace(self): - """ - Leaves current namespace (i.e. grammar file). - """ - self._namespace_stack.pop() - - def _fqn_to_namespace(self, fqn): - """ - Based on current namespace and given fqn returns the absolute - filename of the fqn cls grammar file. - Args: - fqn(str): A fully qualified name of the class. - Returns: - An absolute file name of the grammar fqn rule/class came from. - """ - - current_namespace = self._namespace_stack[-1] - current_dir = '' - if current_namespace and current_namespace != 'base': - current_dir = os.path.dirname(current_namespace) - namespace = "%s.tx" % os.path.join(current_dir, - *(fqn.split("."))[:-1]) - - return namespace - - def _set_rule(self, name, rule): - """ - For the given rule/class name sets PEG rule. - """ - self[name]._tx_peg_rule = rule - rule._tx_class = self[name] - - def _new_import(self, import_name): - """ - Starts a new import. - Args: - import_name(str): A relative import in the dot syntax - (e.g. "first.second.expressions") - """ - - # Find the absolute file name of the import based on the relative - # import_name and current grammar file (namespace) - current_namespace = self._namespace_stack[-1] - current_dir = '' - if current_namespace and current_namespace != 'base': - current_dir = os.path.dirname(current_namespace) - import_file_name = "%s.tx" % os.path.join(current_dir, - *import_name.split(".")) - - if import_file_name not in self.namespaces: - self._enter_namespace(import_file_name) - if self.debug: - self.dprint("*** IMPORTING FILE: %s" % import_file_name) - metamodel_from_file(import_file_name, metamodel=self) - self._leave_namespace() - - # Add the import to the imported_namespaces for current namespace - # so that resolving of current grammar searches imported grammars - # in the order of import - self.imported_namespaces[current_namespace].append( - self.namespaces[import_file_name]) - - def _new_class(self, name, peg_rule, position, inherits=None, root=False, - rule_type=RULE_MATCH): - """ - Creates a new class with the given name in the current namespace. - Args: - name(str): The name of the class. - peg_rule(ParserExpression): An arpeggio peg rule used to match - this class. - positon(int): A position in the input where class is defined. - root(bool): Is this class a root class of the metamodel. - rule_type: The type of the rule this meta-class is for. One of - RULE_COMMON, RULE_ABSTRACT or RULE_MATCH. - """ - - class Meta(TextXClass): - """ - Dynamic metaclass. Each textX rule will result in creating - one Meta class with the type name of the rule. - Model is a graph of python instances of this metaclasses. - Attributes: - _tx_attrs(dict): A dict of meta-attributes keyed by name. Used by - common rules. - _tx_inh_by(list): Classes that inherits this one. Used by - abstract rules. - _tx_position(int): A position in the input string where this - class is defined. - _tx_type(int): The type of the textX rule this class is created - for. See textx.const - _tx_metamodel(TextXMetaModel): A metamodel this class belongs - to. - _tx_peg_rule(ParsingExpression): An arpeggio PEG rule that - matches this class. - """ - - def __repr__(self): - return "".format(name, hex(id(self))) - - cls = Meta - cls.__name__ = name - - self._init_class(cls, peg_rule, position, inherits, root, rule_type) - - return cls - - def _init_class(self, cls, peg_rule, position, inherits=None, root=False, - rule_type=RULE_MATCH): - """ - Setup meta-class special attributes, namespaces etc. This is called - both for textX created classes as well as user classes. - """ - cls._tx_metamodel = self - - # Attribute information (MetaAttr instances) keyed by name. - cls._tx_attrs = OrderedDict() - - # A list of inheriting classes - cls._tx_inh_by = inherits if inherits else [] - - cls._tx_position = position - - # The type of the rule this meta-class results from. - # There are three rule types: common, abstract and match - # Base types are match rules. - cls._tx_type = rule_type - - cls._tx_peg_rule = peg_rule - if peg_rule: - peg_rule._tx_class = cls - - # Push this class and PEG rule in the current namespace - current_namespace = self.namespaces[self._namespace_stack[-1]] - current_namespace[cls.__name__] = cls - - if root: - self.rootcls = cls - - def _init_obj_attrs(self, obj, user=False): - """ - Initialize obj attributes. - Args: - obj(object): A python object to set attributes to. - user(bool): If this object is a user object mangle attribute names. - """ - for attr in obj.__class__._tx_attrs.values(): - - if user: - # Mangle name to prvent name clashing - attr_name = "_txa_%s" % attr.name - else: - attr_name = attr.name - - if attr.mult in [MULT_ZEROORMORE, MULT_ONEORMORE]: - # list - setattr(obj, attr_name, []) - elif attr.cls.__name__ in BASE_TYPE_NAMES: - # Instantiate base python type - if self.auto_init_attributes: - setattr(obj, attr_name, - python_type(attr.cls.__name__)()) - else: - # See https://github.com/igordejanovic/textX/issues/11 - if attr.bool_assignment: - # Only ?= assignments shall have default - # value of False. - setattr(obj, attr_name, False) - else: - # Set base type attribute to None initially - # in order to be able to detect if an optional - # values are given in the model. Default values - # can be specified using object processors. - setattr(obj, attr_name, None) - else: - # Reference to other obj - setattr(obj, attr_name, None) - - def _new_cls_attr(self, clazz, name, cls=None, mult=MULT_ONE, cont=True, - ref=False, bool_assignment=False, position=0): - """Creates new meta attribute of this class.""" - attr = MetaAttr(name, cls, mult, cont, ref, bool_assignment, - position) - clazz._tx_attrs[name] = attr - return attr - - def validate(self): - """ - Validates metamodel. Called after construction to check for some - textX rules. - """ - # TODO: Implement complex textX validations. - - def __getitem__(self, name): - """ - Search for and return class and peg_rule with the given name. - Returns: - TextXClass, ParsingExpression - """ - if "." in name: - # Name is fully qualified - # Find the absolute file from the current namespace and - # the fully qualified name. - namespace = self._fqn_to_namespace(name) - name = name.split(".")[-1] - return self.namespaces[namespace][name] - else: - # If not fully qualified search in the current namespace - # and after that in the imported_namespaces - if name in self._current_namespace: - return self._current_namespace[name] - - for namespace in \ - self.imported_namespaces[self._namespace_stack[-1]]: - if name in namespace: - return namespace[name] - - raise KeyError("{} metaclass does not exists in the metamodel " - .format(name)) - - def __iter__(self): - """ - Iterate over all classes in the current namespace and imported - namespaces. - """ - - # Current namespace - for name in self._current_namespace: - yield self._current_namespace[name] - - # Imported namespaces - for namespace in \ - self.imported_namespaces[self._namespace_stack[-1]]: - for name in namespace: - # yield class - yield namespace[name] - - def __contains__(self, name): - """ - Check if given name is contained in the current namespace. - The name can be fully qualified. - """ - try: - self[name] - return True - except KeyError: - return False - - @property - def _current_namespace(self): - return self.namespaces[self._namespace_stack[-1]] - - def model_from_str(self, model_str, debug=None): - """ - Instantiates model from the given string. - """ - model = self.parser.get_model_from_str(model_str, debug=debug) - for p in self._model_processors: - p(model, self) - return model - - def model_from_file(self, file_name, encoding='utf-8', debug=None): - """ - Instantiates model from the given file. - """ - model = self.parser.get_model_from_file(file_name, - encoding, debug=debug) - for p in self._model_processors: - p(model, self) - return model - - def register_model_processor(self, model_processor): - """ - Model processor is callable that will be called after - each successful model parse. - This callable receives model and meta-model as its parameters. - """ - self._model_processors.append(model_processor) - - def register_obj_processors(self, obj_processors): - """ - Object processors are callables that will be called after - each successful model object construction. - Those callables receive model object as its parameter. - Registration of new object processors will replace previous. - - Args: - obj_processors(dict): A dictionary where key=class name, - value=callable - """ - self.obj_processors = obj_processors - - -def metamodel_from_str(lang_desc, metamodel=None, **kwargs): - """ - Creates a new metamodel from the textX description given as a string. - - Args: - lang_desc(str): A textX language description. - metamodel(TextXMetaModel): A metamodel that should be used. - other params: See TextXMetaModel. - - """ - if not metamodel: - metamodel = TextXMetaModel(**kwargs) - - language_from_str(lang_desc, metamodel) - - return metamodel - - -def metamodel_from_file(file_name, **kwargs): - """ - Creates new metamodel from the given file. - - Args: - file_name(str): The name of the file with textX language description. - other params: See metamodel_from_str. - """ - with codecs.open(file_name, 'r', 'utf-8') as f: - lang_desc = f.read() - - metamodel = metamodel_from_str(lang_desc=lang_desc, - file_name=file_name, **kwargs) - - return metamodel diff --git a/GraphLayoutDSL/target/classes/modules/textx/model.py b/GraphLayoutDSL/target/classes/modules/textx/model.py deleted file mode 100644 index b858733..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/model.py +++ /dev/null @@ -1,452 +0,0 @@ -####################################################################### -# Name: model.py -# Purpose: Model construction. -# Author: Igor R. Dejanovic -# Copyright: (c) 2014 Igor R. Dejanovic -# License: MIT License -####################################################################### - -import sys -if sys.version < '3': - text = unicode -else: - text = str -import codecs -import traceback -from arpeggio import Parser, Sequence, NoMatch, EOF, Terminal -from .exceptions import TextXSyntaxError, TextXSemanticError -from .const import MULT_ONE, MULT_ONEORMORE, MULT_ZEROORMORE, RULE_COMMON,\ - RULE_ABSTRACT, RULE_MATCH -from .textx import PRIMITIVE_PYTHON_TYPES - - -def convert(value, _type): - """ - Convert instances of textx types to python types. - """ - return { - 'BOOL' : lambda x: x == '1' or x.lower() == 'true', - 'INT' : lambda x: int(x), - 'FLOAT' : lambda x: float(x), - 'STRING': lambda x: x[1:-1].replace(r'\"', r'"').replace(r"\'", "'"), - }.get(_type, lambda x: x)(value) - - -class ObjCrossRef(object): - """ - Used for object cross reference resolving. - - Attributes: - obj_name(str): A name of the target object. - cls(TextXClass): The target object class. - position(int): A position in the input string of this cross-ref. - """ - def __init__(self, obj_name, cls, position): - self.obj_name = obj_name - self.cls = cls - self.position = position - - -def get_model_parser(top_rule, comments_model, **kwargs): - """ - Creates model parser for the given language. - """ - - class TextXModelParser(Parser): - """ - Parser created from textual textX language description. - Semantic actions for this parser will construct object - graph representing model on the given language. - """ - def __init__(self, *args, **kwargs): - super(TextXModelParser, self).__init__(*args, **kwargs) - - # By default first rule is starting rule - # and must be followed by the EOF - self.parser_model = Sequence( - nodes=[top_rule, EOF()], rule_name='Model', root=True) - self.comments_model = comments_model - - # Stack for metaclass instances - self._inst_stack = [] - - # Dict for cross-ref resolving - # { id(class): { obj.name: obj}} - self._instances = {} - - def _parse(self): - try: - return self.parser_model.parse(self) - except NoMatch as e: - line, col = e.parser.pos_to_linecol(e.position) - raise TextXSyntaxError(text(e), line, col) - - def get_model_from_file(self, file_name, encoding, debug): - """ - Creates model from the parse tree from the previous parse call. - If file_name is given file will be parsed before model - construction. - """ - with codecs.open(file_name, 'r', encoding) as f: - model_str = f.read() - - model = self.get_model_from_str(model_str, file_name=file_name, - debug=debug) - - # Register filename of the model for later use. - try: - model._tx_filename = file_name - except AttributeError: - # model is some primitive python type (e.g. str) - pass - return model - - def get_model_from_str(self, model_str, file_name=None, debug=None): - """ - Parses given string and creates model object graph. - """ - old_debug_state = self.debug - - try: - if debug is not None: - self.debug = debug - - if self.debug: - self.dprint("*** PARSING MODEL ***") - - self.parse(model_str, file_name=file_name) - # Transform parse tree to model. Skip root node which - # represents the whole file ending in EOF. - model = parse_tree_to_objgraph(self, self.parse_tree[0]) - finally: - if debug is not None: - self.debug = old_debug_state - - try: - model._tx_filename = None - except AttributeError: - # model is some primitive python type (e.g. str) - pass - return model - - return TextXModelParser(**kwargs) - - -def parse_tree_to_objgraph(parser, parse_tree): - """ - Transforms parse_tree to object graph representing model in a - new language. - """ - - metamodel = parser.metamodel - - def process_match(nt): - """ - Process subtree for match rules. - """ - if isinstance(nt, Terminal): - return convert(nt.value, nt.rule_name) - else: - # If RHS of assignment is NonTerminal it is a product of - # complex match rule. Convert nodes to text and do the join. - if len(nt) > 1: - return "".join([text(process_match(n)) for n in nt]) - else: - return process_match(nt[0]) - - def process_node(node): - if isinstance(node, Terminal): - return convert(node.value, node.rule_name) - - assert node.rule.root,\ - "Not a root node: {}".format(node.rule.rule_name) - # If this node is created by some root rule - # create metaclass instance. - inst = None - if not node.rule_name.startswith('__asgn'): - # If not assignment - # Get class - mclass = metamodel[node.rule_name] - - if mclass._tx_type == RULE_ABSTRACT: - # If this meta-class is product of abstract rule replace it - # with matched concrete meta-class down the inheritance tree. - # Abstract meta-class should never be instantiated. - return process_node(node[0]) - elif mclass._tx_type == RULE_MATCH: - # If this is a product of match rule handle it as a RHS - # of assignment and return plain python type. - return process_match(node) - - if parser.debug: - parser.dprint("CREATING INSTANCE {}".format(node.rule_name)) - - # If user class is given - # use it instead of generic one - if node.rule_name in metamodel.user_classes: - user_class = metamodel.user_classes[node.rule_name] - - # Object initialization will be done afterwards - # At this point we need object to be allocated - # So that nested object get correct reference - inst = user_class.__new__(user_class) - - # Initialize object attributes for user class - parser.metamodel._init_obj_attrs(inst, user=True) - else: - # Generic class will call attributes init - # from the constructor - inst = mclass.__new__(mclass) - - # Initialize object attributes - parser.metamodel._init_obj_attrs(inst) - - # Collect attributes directly on meta-class instance - obj_attrs = inst - - inst._tx_position = node.position - - # Push real obj. and dummy attr obj on the instance stack - parser._inst_stack.append((inst, obj_attrs)) - - for n in node: - if parser.debug: - parser.dprint("Recursing into {} = '{}'" - .format(type(n).__name__, text(n))) - process_node(n) - - parser._inst_stack.pop() - - # If this object is nested add 'parent' reference - if parser._inst_stack: - if node.rule_name in metamodel.user_classes: - obj_attrs._txa_parent = parser._inst_stack[-1][0] - else: - obj_attrs.parent = parser._inst_stack[-1][0] - - # If the class is user supplied we need to done - # proper initialization at this point. - if node.rule_name in metamodel.user_classes: - try: - # Get only attributes defined by the grammar as well - # as `parent` if exists - attrs = {} - if hasattr(obj_attrs, '_txa_parent'): - attrs['parent'] = obj_attrs._txa_parent - del obj_attrs._txa_parent - for a in obj_attrs.__class__._tx_attrs: - attrs[a] = getattr(obj_attrs, "_txa_%s" % a) - delattr(obj_attrs, "_txa_%s" % a) - inst.__init__(**attrs) - except TypeError as e: - # Add class name information in case of - # wrong constructor parameters - # print("Constructor params: {}".format(text(obj_attrs.__dict__))) - e.args += ("for class %s" % - inst.__class__.__name__,) - parser.dprint(traceback.print_exc()) - raise e - - # Special case for 'name' attrib. It is used for cross-referencing - if hasattr(inst, 'name') and inst.name: - # Objects of each class are in its own namespace - if not id(inst.__class__) in parser._instances: - parser._instances[id(inst.__class__)] = {} - parser._instances[id(inst.__class__)][inst.name] = inst - - if parser.debug: - parser.dprint("LEAVING INSTANCE {}".format(node.rule_name)) - - else: - # Handle assignments - attr_name = node.rule._attr_name - op = node.rule_name.split('_')[-1] - model_obj, obj_attr = parser._inst_stack[-1] - cls = metamodel[model_obj.__class__.__name__] - metaattr = cls._tx_attrs[attr_name] - - # Mangle attribute name to prevent name clashing with property - # setters on user classes - if cls.__name__ in metamodel.user_classes: - txa_attr_name = "_txa_%s" % attr_name - else: - txa_attr_name = attr_name - - if parser.debug: - parser.dprint('Handling assignment: {} {}...' - .format(op, txa_attr_name)) - - if op == 'optional': - setattr(obj_attr, txa_attr_name, True) - - elif op == 'plain': - attr_value = getattr(obj_attr, txa_attr_name) - if attr_value and type(attr_value) is not list: - raise TextXSemanticError( - "Multiple assignments to attribute {} at {}" - .format(attr_name, - parser.pos_to_linecol(node.position))) - - # Convert tree bellow assignment to proper value - value = process_node(node[0]) - - if metaattr.ref and not metaattr.cont: - # If this is non-containing reference create ObjCrossRef - value = ObjCrossRef(obj_name=value, cls=metaattr.cls, - position=node[0].position) - - if type(attr_value) is list: - attr_value.append(value) - else: - setattr(obj_attr, txa_attr_name, value) - - elif op in ['list', 'oneormore', 'zeroormore']: - for n in node: - # If the node is separator skip - if n.rule_name != 'sep': - # Convert node to proper type - # Rule links will be resolved later - value = process_node(n) - - if metaattr.ref and not metaattr.cont: - # If this is non-containing reference - # create ObjCrossRef - value = ObjCrossRef(obj_name=value, - cls=metaattr.cls, - position=node[0].position) - - if not hasattr(obj_attr, txa_attr_name) or \ - getattr(obj_attr, txa_attr_name) is None: - setattr(obj_attr, txa_attr_name, []) - getattr(obj_attr, txa_attr_name).append(value) - else: - # This shouldn't happen - assert False - - return inst - - def resolve_refs(model): - """ - Resolves model references. - """ - # TODO: Scoping and name-space rules. - - resolved_set = set() - metamodel = parser.metamodel - - def _resolve_link_rule_ref(obj_ref): - - if obj_ref is None: - return - - assert type(obj_ref) is ObjCrossRef, type(obj_ref) - - if parser.debug: - parser.dprint("Resolving obj crossref: {}:{}" - .format(obj_ref.cls, obj_ref.obj_name)) - - def _inner_resolve_link_rule_ref(cls, obj_name): - """ - Depth-first resolving of link rule reference. - """ - if cls._tx_type is RULE_ABSTRACT: - for inherited in cls._tx_inh_by: - result = _inner_resolve_link_rule_ref(inherited, obj_name) - if result: - return result - elif cls._tx_type == RULE_COMMON: - if id(cls) in parser._instances: - objs = parser._instances[id(cls)] - if obj_name in objs: - return objs[obj_name] - - result = _inner_resolve_link_rule_ref(obj_ref.cls, obj_ref.obj_name) - if result: - return result - - # As a fall-back search builtins if given - if metamodel.builtins: - if obj_ref.obj_name in metamodel.builtins: - # TODO: Classes must match - return metamodel.builtins[obj_ref.obj_name] - - line, col = parser.pos_to_linecol(obj_ref.position) - raise TextXSemanticError( - 'Unknown object "{}" of class "{}" at {}' - .format(obj_ref.obj_name, obj_ref.cls.__name__, (line, col)), - line=line, col=col) - - def _resolve_obj_attributes(o): - if parser.debug: - parser.dprint("RESOLVING CLASS: {}" - .format(o.__class__.__name__)) - if o in resolved_set: - return - resolved_set.add(o) - - # If this object has attributes (created using a common rule) - if hasattr(o.__class__, "_tx_attrs"): - for attr in o.__class__._tx_attrs.values(): - if parser.debug: - parser.dprint("RESOLVING ATTR: {}".format(attr.name)) - parser.dprint("mult={}, ref={}, con={}".format( - attr.mult, - attr.ref, attr.cont)) - attr_value = getattr(o, attr.name) - if attr.mult in [MULT_ONEORMORE, MULT_ZEROORMORE]: - for idx, list_attr_value in enumerate(attr_value): - if attr.ref: - if attr.cont: - _resolve_obj_attributes(list_attr_value) - else: - attr_value[idx] = \ - _resolve_link_rule_ref(list_attr_value) - else: - if attr.ref: - if attr.cont: - _resolve_obj_attributes(attr_value) - else: - setattr(o, attr.name, - _resolve_link_rule_ref(attr_value)) - - _resolve_obj_attributes(model) - - def call_obj_processors(model_obj): - """ - Depth-first model object processing. - """ - - if type(model_obj) in PRIMITIVE_PYTHON_TYPES: - metaclass = type(model_obj) - else: - metaclass = metamodel[model_obj.__class__.__name__] - - for metaattr in metaclass._tx_attrs.values(): - # If attribute is containment reference go down - if metaattr.ref and metaattr.cont: - attr = getattr(model_obj, metaattr.name) - if attr: - if metaattr.mult != MULT_ONE: - for obj in attr: - if obj: - call_obj_processors(obj) - else: - call_obj_processors(attr) - - obj_processor = metamodel.obj_processors.get(metaclass.__name__, None) - if obj_processor: - obj_processor(model_obj) - - model = process_node(parse_tree) - resolve_refs(model) - assert not parser._inst_stack - - # We have model loaded and all link resolved - # So we shall do a depth-first call of object - # processors if any processor is defined. - if metamodel.obj_processors: - if parser.debug: - parser.dprint("CALLING OBJECT PROCESSORS") - call_obj_processors(model) - - return model diff --git a/GraphLayoutDSL/target/classes/modules/textx/textx.py b/GraphLayoutDSL/target/classes/modules/textx/textx.py deleted file mode 100644 index b2bbcb6..0000000 --- a/GraphLayoutDSL/target/classes/modules/textx/textx.py +++ /dev/null @@ -1,915 +0,0 @@ -####################################################################### -# Name: textx.py -# Purpose: Implementation of textX language in Arpeggio. -# Author: Igor R. Dejanovic -# Copyright: (c) 2014 Igor R. Dejanovic -# License: MIT License -# -# The idea for this language is shamelessly stolen from the Xtext language -# but there are some subtle differences in both syntax and semantics. -# To make things clear I have named this language textX ;) -####################################################################### - -from __future__ import unicode_literals -import sys -if sys.version < '3': - text = unicode -else: - text = str - -import re -from arpeggio import StrMatch, Optional, ZeroOrMore, OneOrMore, Sequence,\ - OrderedChoice, Not, And, RegExMatch, Match, NoMatch, EOF, \ - ParsingExpression, SemanticAction, ParserPython, SemanticActionSingleChild -from arpeggio.export import PMDOTExporter -from arpeggio import RegExMatch as _ - -from .exceptions import TextXSyntaxError, TextXSemanticError -from .const import MULT_ZEROORMORE, MULT_ONEORMORE, \ - MULT_OPTIONAL, RULE_COMMON, RULE_MATCH, RULE_ABSTRACT - - -# textX grammar -def textx_model(): return ZeroOrMore(import_stm), ZeroOrMore(textx_rule), EOF - -def import_stm(): return 'import', grammar_to_import -def grammar_to_import(): return _(r'(\w|\.)+') - -# Rules -def textx_rule(): return rule_name, Optional(rule_params), ":", textx_rule_body, ";" -def rule_params(): return '[', rule_param, ZeroOrMore(',', rule_param), ']' -def rule_param(): return param_name, Optional('=', string_value) -def param_name(): return ident -def textx_rule_body(): return choice - -def choice(): return sequence, ZeroOrMore("|", sequence) -def sequence(): return OneOrMore(repeatable_expr) -def repeatable_expr(): return expression, Optional(repeat_operator), Optional('-') -def expression(): return [assignment, (Optional(syntactic_predicate), - [simple_match, rule_ref, - bracketed_choice])] -def bracketed_choice(): return '(', choice, ')' -def repeat_operator(): return ['*', '?', '+'], Optional(repeat_modifiers) -def repeat_modifiers(): return '[', OneOrMore([simple_match, - 'eolterm']), ']' -def syntactic_predicate(): return ['!', '&'] -def simple_match(): return [str_match, re_match] - -# Assignment -def assignment(): return attribute, assignment_op, assignment_rhs -def attribute(): return ident -def assignment_op(): return ["=", "*=", "+=", "?="] -def assignment_rhs(): return [simple_match, reference], Optional(repeat_modifiers) - -# References -def reference(): return [rule_ref, obj_ref] -def rule_ref(): return ident -def obj_ref(): return '[', class_name, Optional('|', obj_ref_rule), ']' - -def rule_name(): return ident -def obj_ref_rule(): return ident -def class_name(): return ident - -def str_match(): return [("'", _(r"((\\')|[^'])*"),"'"),\ - ('"', _(r'((\\")|[^"])*'),'"')] -def re_match(): return "/", _(r"((\\/)|[^/])*"), "/" -def ident(): return _(r'\w+') -def integer(): return _(r'[-+]?[0-9]+') -def string_value(): return [_(r"'((\\')|[^'])*'"), - _(r'"((\\")|[^"])*"')] - -# Comments -def comment(): return [comment_line, comment_block] -def comment_line(): return _(r'//.*?$') -def comment_block(): return _(r'/\*(.|\n)*?\*/') - - - -# Special rules - primitive types -ID = _(r'[^\d\W]\w*\b', rule_name='ID', root=True) -BOOL = _(r'(True|true|False|false|0|1)\b', rule_name='BOOL', root=True) -INT = _(r'[-+]?[0-9]+\b', rule_name='INT', root=True) -FLOAT = _(r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\b', 'FLOAT', root=True) -STRING = _(r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')', 'STRING', root=True) -NUMBER = OrderedChoice(nodes=[FLOAT, INT], rule_name='NUMBER', root=True) -BASETYPE = OrderedChoice(nodes=[NUMBER, BOOL, ID, STRING], - rule_name='BASETYPE', root=True) - -BASE_TYPE_RULES = {rule.rule_name: rule - for rule in [ID, BOOL, INT, FLOAT, - STRING, NUMBER, BASETYPE]} -BASE_TYPE_NAMES = BASE_TYPE_RULES.keys() - -PRIMITIVE_PYTHON_TYPES = [int, float, text, bool] - -for regex in [ID, BOOL, INT, FLOAT, STRING]: - regex.compile() - - -def python_type(textx_type_name): - """Return Python type from the name of base textx type.""" - return { - 'ID': text, - 'BOOL': bool, - 'INT': int, - 'FLOAT': float, - 'STRING': text, - 'NUMBER': float, - 'BASETYPE': text, - }.get(textx_type_name, textx_type_name) - - -class RuleCrossRef(object): - """ - Used during meta-model parser construction for cross reference resolving - of PEG rules, to support forward references. - - Attributes: - rule_name(str): A name of the PEG rule that should be used to match - this cross-ref. For link rule references it will be ID by default. - cls(str or ClassCrossRef): Target class which is matched by the - rule_name rule or which name is matched by the rule_name rule (for - link rule references). - Used for rule references in the RHS of the assignments to - determine attribute type. - position(int): A position in the input string of this cross-ref. - """ - def __init__(self, rule_name, cls, position): - self.rule_name = rule_name - self.cls = cls - self.position = position - self.suppress = False - - def __str__(self): - return self.rule_name - - def __unicode__(self): - return self.__str__() - - -class ClassCrossRef(object): - """ - Used for class reference resolving on the meta-model level. - References will be resolved after semantic analysis of the meta-model - parse tree. After resolving phase the meta-model will be fully linked. - - Attributes: - cls_name(str): A name of the target meta-model class. - position(int): The position in the input string of this cross-ref. - """ - def __init__(self, cls_name, position=0): - self.cls_name = cls_name - self.position = position - - -# TextX semantic actions -class TextXModelSA(SemanticAction): - def first_pass(self, grammar_parser, node, children): - - metamodel = grammar_parser.metamodel - - if 'Comment' in metamodel: - comments_model = metamodel['Comment']._tx_peg_rule - else: - comments_model = None - - root_rule = children[0] - from .model import get_model_parser - model_parser = get_model_parser(root_rule, comments_model, - ignore_case=metamodel.ignore_case, - skipws=metamodel.skipws, - ws=metamodel.ws, - autokwd=metamodel.autokwd, - memoization=metamodel.memoization, - debug=metamodel.debug) - - model_parser.metamodel = metamodel - - return model_parser - - def _resolve_rule_refs(self, grammar_parser, model_parser): - """Resolves parser ParsingExpression crossrefs.""" - - def _resolve_rule(rule): - """ - Recursively resolve peg rule references. - - Args: - rule(ParsingExpression or RuleCrossRef) - """ - if not isinstance(rule, RuleCrossRef) and rule in resolved_rules: - return rule - resolved_rules.add(rule) - - if grammar_parser.debug: - grammar_parser.dprint("Resolving rule: {}".format(rule)) - - if type(rule) is RuleCrossRef: - rule_name = rule.rule_name - suppress = rule.suppress - if rule_name in model_parser.metamodel: - rule = model_parser.metamodel[rule_name]._tx_peg_rule - if type(rule) is RuleCrossRef: - rule = _resolve_rule(rule) - model_parser.metamodel[rule_name]._tx_peg_rule = rule - if suppress: - # Special case. Suppression on rule reference. - _tx_class = rule._tx_class - rule = Sequence(nodes=[rule], - rule_name=rule_name, - suppress=suppress) - rule._tx_class = _tx_class - else: - line, col = grammar_parser.pos_to_linecol(rule.position) - raise TextXSemanticError( - 'Unexisting rule "{}" at position {}.' - .format(rule.rule_name, - (line, col)), line, col) - - assert isinstance(rule, ParsingExpression),\ - "{}:{}".format(type(rule), text(rule)) - - # Recurse into subrules, and resolve rules. - for idx, child in enumerate(rule.nodes): - if child not in resolved_rules: - child = _resolve_rule(child) - rule.nodes[idx] = child - - return rule - - # Two pass resolving - for i in range(2): - if grammar_parser.debug: - grammar_parser.dprint("RESOLVING RULE CROSS-REFS - PASS {}" - .format(i + 1)) - resolved_rules = set() - # Start from the root of the parser - _resolve_rule(model_parser.parser_model) - # Resolve rules of all meta-classes to handle unreferenced - # rules also. - for cls in model_parser.metamodel: - cls._tx_peg_rule = _resolve_rule(cls._tx_peg_rule) - - - def _determine_rule_types(self, metamodel): - """Determine textX rule/metaclass types""" - - def _determine_rule_type(cls): - """ - Determine rule type (abstract, match, common) and inherited classes. - """ - - if cls in resolved_classes: - return - resolved_classes.add(cls) - - # If there are attributes collected than this is a common - # rule - if len(cls._tx_attrs) > 0: - cls._tx_type = RULE_COMMON - return - - rule = cls._tx_peg_rule - - # Check if this rule is abstract - # Abstract are root rules which haven't got any attributes - # and reference at least one non-match rule. - abstract = False - if rule.rule_name and cls.__name__ != rule.rule_name: - # Special case. Body of the rule is a single rule - # reference and the referenced rule is not match rule. - target_cls = metamodel[rule.rule_name] - _determine_rule_type(target_cls) - abstract = target_cls._tx_type != RULE_MATCH - else: - # Find at leat one referenced rule that is not match - # rule by going down the parser - # model and finding root rules. - def _has_nonmatch_ref(rule): - for r in rule.nodes: - if r.root: - _determine_rule_type(r._tx_class) - result = r._tx_class._tx_type != RULE_MATCH - else: - result = _has_nonmatch_ref(r) - if result: - return True - abstract = _has_nonmatch_ref(rule) - - if abstract: - cls._tx_type = RULE_ABSTRACT - # Add inherited classes to this rule's meta-class - if rule.rule_name and cls.__name__ != rule.rule_name: - if rule._tx_class not in cls._tx_inh_by: - cls._tx_inh_by.append(rule._tx_class) - else: - # Recursivelly append all referenced classes. - def _add_reffered_classes(rule, inh_by): - for r in rule.nodes: - if r.root: - if hasattr(r, '_tx_class'): - _determine_rule_type(r._tx_class) - if r._tx_class._tx_type != RULE_MATCH and\ - r._tx_class not in inh_by: - inh_by.append(r._tx_class) - else: - _add_reffered_classes(r, inh_by) - _add_reffered_classes(rule, cls._tx_inh_by) - - resolved_classes = set() - for cls in metamodel: - _determine_rule_type(cls) - - def _resolve_cls_refs(self, grammar_parser, model_parser): - - resolved_classes = {} - - def _resolve_cls(cls): - - if cls in resolved_classes: - return resolved_classes[cls] - - metamodel = model_parser.metamodel - - to_resolve = cls - if isinstance(cls, ClassCrossRef): - if cls.cls_name not in metamodel: - line, col = grammar_parser.pos_to_linecol(cls.position) - raise TextXSemanticError( - 'Unknown class/rule "{}" at {}.' - .format(cls.cls_name, (line, col)), line, col) - cls = metamodel[cls.cls_name] - resolved_classes[to_resolve] = cls - - if cls._tx_type == RULE_ABSTRACT: - # Resolve inherited classes - for idx, inh in enumerate(cls._tx_inh_by): - inh = _resolve_cls(inh) - cls._tx_inh_by[idx] = inh - - else: - - # If this is not abstract class than it must be common or match. - # Resolve referred classes. - # If there is no attributes collected than it `` - for attr in cls._tx_attrs.values(): - attr.cls = _resolve_cls(attr.cls) - - # If target cls is of a base type or match rule - # then attr can not be a reference. - if attr.cls.__name__ in BASE_TYPE_NAMES \ - or attr.cls._tx_type == RULE_MATCH: - attr.ref = False - attr.cont = True - else: - attr.ref = True - - if grammar_parser.debug: - grammar_parser.dprint( - "Resolved attribute {}:{}[cls={}, cont={}, " - "ref={}, mult={}, pos={}]" - .format(cls.__name__, attr.name, - attr.cls.__name__, - attr.cont, attr.ref, attr.mult, - attr.position)) - - return cls - - - if grammar_parser.debug: - grammar_parser.dprint("RESOLVING METACLASS REFS") - - for cls in model_parser.metamodel: - _resolve_cls(cls) - - def second_pass(self, grammar_parser, model_parser): - """Cross reference resolving for parser model.""" - - if grammar_parser.debug: - grammar_parser.dprint("RESOLVING MODEL PARSER: second_pass") - - self._resolve_rule_refs(grammar_parser, model_parser) - self._determine_rule_types(model_parser.metamodel) - self._resolve_cls_refs(grammar_parser, model_parser) - - return model_parser -textx_model.sem = TextXModelSA() - - -def import_stm_SA(parser, node, children): - parser.metamodel._new_import(children[0]) -import_stm.sem = import_stm_SA - - -def grammar_to_import_SA(parser, node, children): - return text(node) -grammar_to_import.sem = grammar_to_import_SA - - -def textx_rule_SA(parser, node, children): - if len(children) > 2: - rule_name, rule_params, rule = children - else: - rule_name, rule = children - rule_params = {} - - if rule.rule_name.startswith('__asgn') or\ - ((isinstance(rule, Match) or isinstance(rule, RuleCrossRef)) and - rule_params): - # If it is assignment node it must be kept because it could be - # e.g., single assignment in the rule. - # Also, handle a special case where rule consists only of a single match - # or single rule reference and there are rule modifiers defined. - rule = Sequence(nodes=[rule], rule_name=rule_name, - root=True, **rule_params) - else: - if not isinstance(rule, RuleCrossRef): - # Promote rule node to root node. - rule.rule_name = rule_name - rule.root = True - for param in rule_params: - setattr(rule, param, rule_params[param]) - - # Connect meta-class and the PEG rule - parser.metamodel._set_rule(rule_name, rule) - - return rule -textx_rule.sem = textx_rule_SA - - -def rule_name_SA(parser, node, children): - rule_name = str(node) - - if parser.debug: - parser.dprint("Creating class: {}".format(rule_name)) - - # If a class is given by the user use it. Else, create new class. - if rule_name in parser.metamodel.user_classes: - - cls = parser.metamodel.user_classes[rule_name] - - # Initialize special attributes - parser.metamodel._init_class(cls, None, node.position) - else: - # Create class to collect attributes. At this time PEG rule - # is not known. - cls = parser.metamodel._new_class(rule_name, None, node.position) - - parser._current_cls = cls - - # First class will be the root of the meta-model - if not parser.metamodel.rootcls: - parser.metamodel.rootcls = cls - - return rule_name -rule_name.sem = rule_name_SA - - -def rule_params_SA(parser, node, children): - params = {} - for name, value in children[0].items(): - if name not in ['skipws', 'ws']: - raise TextXSyntaxError( - 'Invalid rule param "{}" at {}.' - .format(name, parser.pos_to_linecol(node.position))) - - if name == 'ws' and '\\' in value: - new_value = "" - if "\\n" in value: - new_value += "\n" - if "\\r" in value: - new_value += "\r" - if "\\t" in value: - new_value += "\t" - if " " in value: - new_value += " " - value = new_value - - params[name] = value - - return params -rule_params.sem = rule_params_SA - - -def rule_param_SA(parser, node, children): - if len(children) > 1: - param_name, param_value = children - else: - param_name = children[0] - param_value = True - if param_name.startswith('no'): - param_name = param_name[2:] - param_value = False - - if parser.debug: - parser.dprint("TextX rule param: {}, {}".format(param_name, - param_value)) - - return {param_name: param_value} -rule_param.sem = rule_param_SA - - -def rule_ref_SA(parser, node, children): - rule_name = text(node) - # Here a name of the meta-class (rule) is expected but to support - # forward referencing we are postponing resolving to second_pass. - return RuleCrossRef(rule_name, rule_name, node.position) -rule_ref.sem = rule_ref_SA - - -def textx_rule_body_SA(parser, node, children): - if len(children) > 1: - return OrderedChoice(nodes=children[:]) - else: - return children[0] -textx_rule_body.sem = textx_rule_body_SA - - -def sequence_SA(parser, node, children): - if len(children) > 1: - return Sequence(nodes=children[:]) - else: - return children[0] -sequence.sem = sequence_SA - - -def choice_SA(parser, node, children): - # If there is only one child reduce as - # this ordered choice is unnecessary - if len(children) > 1: - return OrderedChoice(nodes=children[:]) - else: - return children[0] -choice.sem = choice_SA - - -def expression_SA(parser, node, children): - if len(children) > 1: - if children[0] == '!': - return Not(nodes=[children[1]]) - else: - return And(nodes=[children[1]]) - else: - return children[0] -expression.sem=expression_SA - - -def repeat_modifiers_SA(parser, node, children): - modifiers = {} - for modifier in children: - if isinstance(modifier, Match): - # Separator - modifier.rule_name = 'sep' - modifiers['sep'] = modifier - elif type(modifier) == tuple: - modifiers['multiplicity'] = modifier - else: - modifiers['eolterm'] = True - return (modifiers, node.position) -repeat_modifiers.sem = repeat_modifiers_SA - - -def repeat_operator_SA(parser, node, children): - return children -repeat_operator.sem = repeat_operator_SA - - -def repeatable_expr_SA(parser, node, children): - expr = children[0] - rule = expr - repeat_op = False - suppress = False - if len(children) > 1: - # We can have repeat operator and/or suppression operator - if len(children) > 2: - repeat_op = children[1] - suppress = True - else: - if children[1] == '-': - suppress = True - else: - repeat_op = children[1] - - if repeat_op: - if len(repeat_op) > 1: - repeat_op, modifiers = repeat_op - else: - repeat_op = repeat_op[0] - modifiers = None - - if repeat_op == '?': - rule = Optional(nodes=[expr]) - elif repeat_op == '*': - rule = ZeroOrMore(nodes=[expr]) - else: - rule = OneOrMore(nodes=[expr]) - - if modifiers: - modifiers, position = modifiers - # Sanity check. Modifiers do not make - # sense for ? operator at the moment. - if repeat_op == '?': - line, col = parser.pos_to_linecol(position) - raise TextXSyntaxError( - 'Modifiers are not allowed for "?" operator at {}' - .format(text((line, col))), line, col) - # Separator modifier - if 'sep' in modifiers: - sep = modifiers['sep'] - rule = Sequence(nodes=[expr, - ZeroOrMore(nodes=[ - Sequence(nodes=[sep, expr])])]) - if repeat_op == '*': - rule = Optional(nodes=[rule]) - - # End of line termination modifier - if 'eolterm' in modifiers: - rule.eolterm = True - - # Mark rule for suppression - rule.suppress = suppress - - return rule -repeatable_expr.sem = repeatable_expr_SA - - -def assignment_rhs_SA(parser, node, children): - rule = children[0] - modifiers = None - if len(children) > 1: - modifiers = children[1] - - # At this level we do not know the type of assignment (=, +=, *=) - # and we do not have access to the PEG rule so postpone - # rule modification for assignment semantic action. - return (rule, modifiers) -assignment_rhs.sem = assignment_rhs_SA - - -def assignment_SA(parser, node, children): - """ - Create parser rule for assignments and register attribute types - on metaclass. - """ - attr_name = children[0] - op = children[1] - rhs_rule, modifiers = children[2] - cls = parser._current_cls - target_cls = None - - if parser.debug: - parser.dprint("Processing assignment {}{}...".format(attr_name, op)) - - if parser.debug: - parser.dprint("Creating attribute {}:{}".format(cls.__name__, - attr_name)) - parser.dprint("Assignment operation = {}".format(op)) - - if attr_name in cls._tx_attrs: - # If attribute already exists in the metamodel it is - # multiple assignment to the same attribute. - - # Cannot use operator ?= on multiple assignments - if op == '?=': - line, col = parser.pos_to_linecol(node.position) - raise TextXSemanticError( - 'Cannot use "?=" operator on multiple' - ' assignments for attribute "{}" at {}' - .format(attr_name, (line, col)), line, col) - - cls_attr = cls._tx_attrs[attr_name] - # Must be a many multiplicity. - # OneOrMore is "stronger" constraint. - if cls_attr.mult is not MULT_ONEORMORE: - cls_attr.mult = MULT_ZEROORMORE - else: - cls_attr = parser.metamodel._new_cls_attr(cls, name=attr_name, - position=node.position) - - # Keep track of metaclass references and containments - if type(rhs_rule) is tuple and rhs_rule[0] == "obj_ref": - cls_attr.cont = False - cls_attr.ref = True - # Override rhs by its PEG rule for further processing - rhs_rule = rhs_rule[1] - # Target class is not the same as target rule - target_cls = rhs_rule.cls - - base_rule_name = rhs_rule.rule_name - if op == '+=': - assignment_rule = OneOrMore( - nodes=[rhs_rule], - rule_name='__asgn_oneormore', root=True) - cls_attr.mult = MULT_ONEORMORE - elif op == '*=': - assignment_rule = ZeroOrMore( - nodes=[rhs_rule], - rule_name='__asgn_zeroormore', root=True) - if cls_attr.mult is not MULT_ONEORMORE: - cls_attr.mult = MULT_ZEROORMORE - elif op == '?=': - assignment_rule = Optional( - nodes=[rhs_rule], - rule_name='__asgn_optional', root=True) - cls_attr.mult = MULT_OPTIONAL - base_rule_name = 'BOOL' - - # ?= assigment should have default value of False. - # so we shall mark it as such. - cls_attr.bool_assignment = True - - else: - assignment_rule = Sequence( - nodes=[rhs_rule], - rule_name='__asgn_plain', root=True) - - # Modifiers - if modifiers: - modifiers, position = modifiers - # Sanity check. Modifiers do not make - # sense for ?= and = operator at the moment. - if op == '?=' or op == '=': - line, col = parser.pos_to_linecol(position) - raise TextXSyntaxError( - 'Modifiers are not allowed for "{}" operator at {}' - .format(op, text((line, col))), line, col) - - # Separator modifier - if 'sep' in modifiers: - sep = modifiers['sep'] - assignment_rule = Sequence( - nodes=[rhs_rule, - ZeroOrMore(nodes=[Sequence(nodes=[sep, rhs_rule])])], - rule_name='__asgn_list', root=True) - if op == "*=": - assignment_rule.root = False - assignment_rule = Optional(nodes=[assignment_rule], - rule_name='__asgn_list', root=True) - - # End of line termination modifier - if 'eolterm' in modifiers: - assignment_rule.eolterm = True - - if target_cls: - attr_type = target_cls - else: - # Use STRING as default attr class - attr_type = base_rule_name if base_rule_name else 'STRING' - cls_attr.cls = ClassCrossRef(cls_name=attr_type, position=node.position) - - if parser.debug: - parser.dprint("Created attribute {}:{}[cls={}, cont={}, " - "ref={}, mult={}, pos={}]" - .format(cls.__name__, attr_name, cls_attr.cls.cls_name, - cls_attr.cont, cls_attr.ref, cls_attr.mult, - cls_attr.position)) - - assignment_rule._attr_name = attr_name - assignment_rule._exp_str = attr_name # For nice error reporting - return assignment_rule -assignment.sem = assignment_SA - - -def str_match_SA(parser, node, children): - try: - to_match = children[0] - except: - to_match = '' - - # Support for autokwd metamodel param. - if parser.metamodel.autokwd: - match = parser.keyword_regex.match(to_match) - if match and match.span() == (0, len(to_match)): - regex_match = RegExMatch(r'{}\b'.format(to_match), - ignore_case=parser.metamodel.ignore_case, - str_repr=to_match) - regex_match.compile() - return regex_match - return StrMatch(to_match, ignore_case=parser.metamodel.ignore_case) -str_match.sem = str_match_SA - - -def re_match_SA(parser, node, children): - try: - to_match = children[0] - except: - to_match = '' - regex = RegExMatch(to_match, ignore_case=parser.metamodel.ignore_case) - try: - regex.compile() - except Exception as e: - line, col = parser.pos_to_linecol(node[1].position) - raise TextXSyntaxError( - "{} at {}" - .format(text(e), text((line, col))), line, col) - return regex -re_match.sem = re_match_SA - - -def obj_ref_SA(parser, node, children): - # A reference to some other class instance will be the value of - # its "name" attribute. - class_name = children[0] - if class_name in BASE_TYPE_NAMES: - line, col = parser.pos_to_linecol(node.position) - raise TextXSemanticError( - 'Primitive type instances can not be referenced at {}.' - .format((line, col)), line, col) - if len(children) > 1: - rule_name = children[1] - else: - # Default rule for matching obj cross-refs - rule_name = 'ID' - return ("obj_ref", RuleCrossRef(rule_name, class_name, node.position)) -obj_ref.sem = obj_ref_SA - - -def integer_SA(parser, node, children): - return int(node.value) -integer.sem = integer_SA - - -def string_value_SA(parser, node, children): - return node.value.strip("\"'") -string_value.sem = string_value_SA - - -# Default actions -bracketed_choice.sem = SemanticActionSingleChild() - - -# parser object cache. To speed up parser initialization (e.g. during imports) -textX_parsers = {} - - -def language_from_str(language_def, metamodel): - """ - Constructs parser and initializes metamodel from language description - given in textX language. - - Args: - language_def (str): A language description in textX. - metamodel (TextXMetaModel): A metamodel to initialize. - - Returns: - Parser for the new language. - """ - - if metamodel.debug: - metamodel.dprint("*** PARSING LANGUAGE DEFINITION ***") - - # Check the cache for already conctructed textX parser - if metamodel.debug in textX_parsers: - parser = textX_parsers[metamodel.debug] - else: - # Create parser for TextX descriptions from - # the textX grammar specified in this module - parser = ParserPython(textx_model, comment_def=comment, - ignore_case=False, - reduce_tree=False, - memoization=metamodel.memoization, - debug=metamodel.debug) - - # Prepare regex used in keyword-like strmatch detection. - # See str_match_SA - flags = 0 - if metamodel.ignore_case: - flags = re.IGNORECASE - parser.keyword_regex = re.compile(r'[^\d\W]\w*', flags) - - # Cache it for subsequent calls - textX_parsers[metamodel.debug] = parser - - # This is used during parser construction phase. - # Metamodel is filled in. Classes are created based on grammar rules. - parser.metamodel = metamodel - - # Builtin rules representing primitive types - parser.root_rule_name = None - - # Parse language description with textX parser - try: - parser.parse(language_def) - except NoMatch as e: - line, col = parser.pos_to_linecol(e.position) - raise TextXSyntaxError(text(e), line, col) - - # Construct new parser based on the given language description. - lang_parser = parser.getASG() - - # Meta-model is constructed. Validate semantics of metamodel. - parser.metamodel.validate() - - # Meta-model is constructed. Here we connect meta-model and language - # parser for convenience. - lang_parser.metamodel = parser.metamodel - metamodel.parser = lang_parser - - if metamodel.debug: - # Create dot file for debuging purposes - PMDOTExporter().exportFile( - lang_parser.parser_model, - "{}_parser_model.dot".format(metamodel.rootcls.__name__)) - - return lang_parser - diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..40f54af --- /dev/null +++ b/pom.xml @@ -0,0 +1,143 @@ + + + 4.0.0 + + GraphDrawing + GraphDrawing + 0.1.0-SNAPSHOT + pom + + GraphDrawing + http://maven.apache.org + + + UTF-8 + + + + GraphLayoutDSL + GraphDrawingTheory + GraphEditor + + + + + http://repo1.maven.org/maven2/ + maven2 + Maven 2 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + true + + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + + + + + + + org.python + jython-standalone + 2.7.1b2 + + + commons-io + commons-io + 2.5 + + + org.tinyjee.jgraphx + jgraphx + 3.4.1.3 + + + log4j + log4j + 1.2.17 + + + org.prefuse + prefuse + beta-20071021 + + + gov.nist.math + jama + 1.0.3 + + + net.sf.jung + jung-visualization + 2.0.1 + + + net.sf.jung + jung-algorithms + 2.0.1 + + + net.sf.jung + jung-graph-impl + 2.0.1 + + + com.miglayout + miglayout-swing + 5.0 + + + com.thoughtworks.xstream + xstream + 1.4.8 + + + junit + junit + 4.12 + test + + + +