View Javadoc

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   * PackageFrame is part of a GUI that is used to test other
41   * dependencies by rearranging the classes and packages in the
42   * modules interactively in a treeview. 
43   *  
44   * @author webmaster@earth3d.org
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  		// load and parse configuration, class and java files
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 	 * @param args
107 	 * @throws OverlappingModulesDefinitionException 
108 	 * @throws ConfigurationException 
109 	 * @throws ParserConfigurationException 
110 	 * @throws SAXException 
111 	 * @throws IOException 
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 			// outgoing dependencies
130 			model = getOutgoingModel(selected, model);
131 			
132 			// show the created model
133 			if (model != null) {
134 				outgoingList.setModel(model);
135 				
136 				outgoingList.expandAll();
137 				
138 				// collapse "unassigned"
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 			// incoming dependencies
145 			model = getIncomingModel(selected, model);
146 			
147 			// show the created model
148 			if (model != null) {
149 				incomingList.setModel(model);
150 				
151 				incomingList.expandAll();
152 				
153 				// collapse "unassigned"
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 			// cumulate all dependencies from all contained classes
169 			mergeIncomingPackage((DependentPackageNode) selected, model);
170 		}
171 		if (selected instanceof DependentModuleNode) {
172 			model = new DependenciesTreeModel();
173 			
174 			// cumulate all dependencies from all contained classes
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 			// cumulate all dependencies from all contained classes
196 			mergePackage((DependentPackageNode) selected, model);
197 		}
198 		if (selected instanceof DependentModuleNode) {
199 			model = new DependenciesTreeModel();
200 			
201 			// cumulate all dependencies from all contained classes
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 }