View Javadoc

1   package net.sf.jlayercheck.util.modeltree;
2   
3   import javax.swing.tree.DefaultTreeModel;
4   
5   import net.sf.jlayercheck.util.model.ClassDependency;
6   
7   /**
8    * Generates a tree model for the dependencies of a single ClassNode.
9    * 
10   * @author webmaster@earth3d.org
11   */
12  public class DependenciesTreeModel extends DefaultTreeModel {
13  	/**
14  	 * 
15  	 */
16  	private static final long serialVersionUID = -3719586478900307613L;
17  
18  	protected static final String UNASSIGNED = "unassigned";
19  	
20  	/**
21  	 * Generates an empty dependency representation model.
22  	 * 
23  	 */
24  	public DependenciesTreeModel() {
25  		super(null);
26  		setRoot(new DependentModelTree());
27  	}
28  	
29  	/**
30  	 * Adds the given ClassNode to the given DependentModelTree.
31  	 * 
32  	 * @param depTree the tree to update
33  	 * @param cd the dependency to add
34  	 * @param depClass the node that has the dependency to add and is used to retrieve the package and model node
35  	 */
36  	public void addClassNodeToDependentModelTree(DependentModelTree depTree, ClassDependency cd, ClassNode depClass) {
37  		
38  		// find the package and class node names where it should be inserted
39  		
40  		PackageNode pn = null;
41  		ModuleNode mn = null;
42  		
43  		if (depClass != null) {
44  			pn = (PackageNode) depClass.getParent();
45  			mn = (ModuleNode) pn.getParent();
46  		} else {
47  			pn = new DefaultPackageNode(UNASSIGNED);
48  			((DefaultPackageNode) pn).setUnassignedPackage(true);
49  			mn = new DefaultModuleNode(UNASSIGNED);
50  			((DefaultModuleNode) mn).setUnassignedModule(true);
51  		}
52  		
53  		// create module if necessary
54  		if (depTree.getModule(mn.getModuleName()) == null) {
55  			DependentModuleNode newModuleNode = new DependentModuleNode(mn.getModuleName(), mn.isUnassignedModule());
56  			if (mn instanceof DependentModuleNode) {
57  				newModuleNode.setUnallowedDependency(((DependentModuleNode) mn).isUnallowedDependency());
58  			}
59  			depTree.add(newModuleNode);
60  		}
61  		
62  		ModuleNode destModule = depTree.getModule(mn.getModuleName());
63  		
64  		// create package if necessary
65  		if (destModule.getPackage(pn.getPackagename()) == null) {
66  			DependentPackageNode newPackageNode = new DependentPackageNode(pn.getPackagename());
67  			if (pn instanceof DependentPackageNode) {
68  				newPackageNode.setUnallowedDependency(((DependentPackageNode) pn).isUnallowedDependency());
69  			}
70  			destModule.add(newPackageNode);
71  		}
72  
73  		PackageNode destPackage = destModule.getPackage(pn.getPackagename());
74  		
75  		// create ClassNode if necessary
76  		if (destPackage.getClass(cd.getDependency()) == null) {
77  			DependentClassNode newClassNode = new DependentClassNode(cd);
78  			if (depClass instanceof DependentClassNode) {
79  				newClassNode.getClassDependency().setUnallowedDependency(((DependentClassNode) depClass).isUnallowedDependency());
80  			}
81  			destPackage.add(newClassNode);
82  		}
83  	}
84  	
85  	/**
86  	 * Merges the other tree into this tree.
87  	 * @param dependenciesTreeModel
88  	 */
89  	public void merge(DependentModelTree depTree) {
90  		for(ModuleNode mn : depTree.getModules()) {
91  			for(PackageNode pn : mn.getPackages()) {
92  				for(ClassNode cn : pn.getClasses()) {
93  					addClassNodeToDependentModelTree((DependentModelTree) getRoot(), new ClassDependency(cn.getName()), cn);
94  				}
95  			}
96  		}
97  		
98  		((DependentModelTree) getRoot()).sortNodes();
99  	}
100 }