1 package net.sf.jlayercheck.gui;
2
3 import java.awt.BorderLayout;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.net.URL;
8 import java.util.Map;
9 import java.util.TreeMap;
10
11 import javax.swing.JFrame;
12 import javax.swing.JScrollPane;
13 import javax.swing.JSplitPane;
14 import javax.swing.JTree;
15 import javax.swing.event.TreeSelectionEvent;
16 import javax.swing.event.TreeSelectionListener;
17 import javax.swing.tree.DefaultTreeModel;
18 import javax.swing.tree.TreePath;
19 import javax.xml.parsers.ParserConfigurationException;
20
21 import net.sf.jlayercheck.util.DependencyVisitor;
22 import net.sf.jlayercheck.util.XMLConfiguration;
23 import net.sf.jlayercheck.util.XMLConfigurationParser;
24 import net.sf.jlayercheck.util.exceptions.ConfigurationException;
25 import net.sf.jlayercheck.util.exceptions.OverlappingModulesDefinitionException;
26 import net.sf.jlayercheck.util.model.ClassSource;
27 import net.sf.jlayercheck.util.modeltree.ClassNode;
28 import net.sf.jlayercheck.util.modeltree.DefaultModelTree;
29 import net.sf.jlayercheck.util.modeltree.DependenciesTreeModel;
30 import net.sf.jlayercheck.util.modeltree.DependentClassNode;
31 import net.sf.jlayercheck.util.modeltree.DependentModelTree;
32 import net.sf.jlayercheck.util.modeltree.DependentModuleNode;
33 import net.sf.jlayercheck.util.modeltree.DependentPackageNode;
34 import net.sf.jlayercheck.util.modeltree.ModelTree;
35 import net.sf.jlayercheck.util.modeltree.PackageNode;
36
37 import org.xml.sax.SAXException;
38
39
40
41
42
43
44
45
46 public class PackageFrame extends JFrame implements TreeSelectionListener {
47
48
49
50
51 private static final long serialVersionUID = -8443924981257381579L;
52
53 protected DependenciesTree outgoingList;
54 protected DependenciesTree incomingList;
55
56 protected ModelTree modeltree;
57
58 public PackageFrame(String filename) throws IOException, SAXException, ParserConfigurationException, ConfigurationException, OverlappingModulesDefinitionException {
59 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
60 setTitle("JLayerCheck - jlayercheck.sf.net");
61 setSize(500, 500);
62
63
64 InputStream is = null;
65 if (filename == null) {
66 is = getClass().getResource("/jlayercheck.xml").openStream();
67 } else {
68 is = new FileInputStream(filename);
69 }
70 XMLConfiguration xcp = new XMLConfigurationParser().parse(is);
71 DependencyVisitor dv = new DependencyVisitor();
72 Map<String, URL> javaSources = new TreeMap<String, URL>();
73 for(ClassSource source : xcp.getClassSources()) {
74 source.call(dv);
75 javaSources.putAll(source.getSourceFiles());
76 }
77
78 modeltree = xcp.getModelTree(dv);
79 if (modeltree instanceof DefaultModelTree) {
80 ((DefaultModelTree) modeltree).sortNodes();
81 }
82
83 DefaultTreeModel treemodel = new DefaultTreeModel(modeltree);
84
85 getContentPane().setLayout(new BorderLayout());
86
87 JTree testtree = new ModelPackageClassTree(xcp);
88 testtree.setModel(treemodel);
89 JScrollPane scroll = new JScrollPane(testtree);
90 testtree.getSelectionModel().addTreeSelectionListener(this);
91
92 outgoingList = new DependenciesTree();
93 JScrollPane scrollDepOut = new JScrollPane(outgoingList);
94
95 incomingList = new DependenciesTree();
96 JScrollPane scrollDepIn = new JScrollPane(incomingList);
97
98 JSplitPane splitDep = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollDepIn, scrollDepOut);
99 splitDep.setDividerLocation(250);
100
101 JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scroll, splitDep);
102 getContentPane().add(split);
103 }
104
105
106
107
108
109
110
111
112
113 public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException, ConfigurationException, OverlappingModulesDefinitionException {
114 String filename = null;
115 if (args.length != 1) {
116 System.out.println("USAGE: PackageFrame jlayercheck.xml");
117 } else {
118 filename = args[0];
119 }
120 new PackageFrame(filename).setVisible(true);
121 }
122
123 public void valueChanged(TreeSelectionEvent e) {
124 if (e.getNewLeadSelectionPath() != null) {
125 Object selected = e.getNewLeadSelectionPath().getLastPathComponent();
126
127 DependenciesTreeModel model = null;
128
129
130 model = getOutgoingModel(selected, model);
131
132
133 if (model != null) {
134 outgoingList.setModel(model);
135
136 outgoingList.expandAll();
137
138
139 if (((ModelTree) model.getRoot()).getUnassignedModule() != null) {
140 outgoingList.collapsePath(new TreePath(new Object[] {outgoingList.getModel().getRoot(), ((ModelTree) model.getRoot()).getUnassignedModule()}));
141 }
142 }
143
144
145 model = getIncomingModel(selected, model);
146
147
148 if (model != null) {
149 incomingList.setModel(model);
150
151 incomingList.expandAll();
152
153
154 if (((ModelTree) model.getRoot()).getUnassignedModule() != null) {
155 incomingList.collapsePath(new TreePath(new Object[] {incomingList.getModel().getRoot(), ((ModelTree) model.getRoot()).getUnassignedModule()}));
156 }
157 }
158 }
159 }
160
161 protected DependenciesTreeModel getIncomingModel(Object selected, DependenciesTreeModel model) {
162 if (selected instanceof DependentClassNode) {
163 model = ((DependentClassNode) selected).getIncomingDependenciesTreeModel();
164 }
165 if (selected instanceof DependentPackageNode) {
166 model = new DependenciesTreeModel();
167
168
169 mergeIncomingPackage((DependentPackageNode) selected, model);
170 }
171 if (selected instanceof DependentModuleNode) {
172 model = new DependenciesTreeModel();
173
174
175 DependentModuleNode dmn = (DependentModuleNode) selected;
176
177 for(PackageNode pn : dmn.getPackages()) {
178 if (pn instanceof DependentPackageNode) {
179 DependentPackageNode dpn = (DependentPackageNode) pn;
180
181 mergeIncomingPackage(dpn, model);
182 }
183 }
184 }
185 return model;
186 }
187
188 protected DependenciesTreeModel getOutgoingModel(Object selected, DependenciesTreeModel model) {
189 if (selected instanceof DependentClassNode) {
190 model = ((DependentClassNode) selected).getDependenciesTreeModel();
191 }
192 if (selected instanceof DependentPackageNode) {
193 model = new DependenciesTreeModel();
194
195
196 mergePackage((DependentPackageNode) selected, model);
197 }
198 if (selected instanceof DependentModuleNode) {
199 model = new DependenciesTreeModel();
200
201
202 DependentModuleNode dmn = (DependentModuleNode) selected;
203
204 for(PackageNode pn : dmn.getPackages()) {
205 if (pn instanceof DependentPackageNode) {
206 DependentPackageNode dpn = (DependentPackageNode) pn;
207
208 mergePackage(dpn, model);
209 }
210 }
211 }
212 return model;
213 }
214
215 protected void mergePackage(DependentPackageNode dpn, DependenciesTreeModel model) {
216 for(ClassNode cn : dpn.getClasses()) {
217 if (cn instanceof DependentClassNode) {
218 DependentClassNode dcn = (DependentClassNode) cn;
219
220 model.merge((DependentModelTree) dcn.getDependenciesTreeModel().getRoot());
221 }
222 }
223 }
224
225 protected void mergeIncomingPackage(DependentPackageNode dpn, DependenciesTreeModel model) {
226 for(ClassNode cn : dpn.getClasses()) {
227 if (cn instanceof DependentClassNode) {
228 DependentClassNode dcn = (DependentClassNode) cn;
229
230 model.merge((DependentModelTree) dcn.getIncomingDependenciesTreeModel().getRoot());
231 }
232 }
233 }
234 }