View Javadoc

1   package net.sf.jlayercheck.util.modeltree;
2   
3   import java.util.Enumeration;
4   import java.util.SortedSet;
5   import java.util.TreeSet;
6   import java.util.Vector;
7   
8   import javax.swing.tree.DefaultMutableTreeNode;
9   import javax.swing.tree.TreeNode;
10  
11  /**
12   * @see ModelTree
13   * @author webmaster@earth3d.org
14   */
15  public class DefaultModelTree extends DefaultMutableTreeNode implements ModelTree {
16  
17  	/**
18  	 * 
19  	 */
20  	private static final long serialVersionUID = -1419905413709544489L;
21  
22  	public DefaultModelTree() {
23  		setAllowsChildren(true);
24  	}
25  
26  	public Vector<ModuleNode> getModules() {
27  		if (getChildCount() > 0) {
28  			Vector<ModuleNode> result = new Vector<ModuleNode>();
29  			result.addAll(children);
30  			return result;
31  		}
32  		
33  		return new Vector<ModuleNode>();
34  	}
35  
36  	/**
37  	 * Searches for the ModuleNode with the given name.
38  	 * 
39  	 * @param modulename
40  	 * @return
41  	 */
42  	public ModuleNode getModule(String modulename) {
43  		if (getModules() == null) return null;
44  		
45  		for(ModuleNode node : getModules()) {
46  			if (node.getModuleName().equals(modulename)) {
47  				return node;
48  			}
49  		}
50  		
51  		return null;
52  	}
53  
54  	/**
55  	 * Returns the first ClassNode node for the given classname.
56  	 * 
57  	 * @param classname
58  	 * @return
59  	 */
60  	public ClassNode getClassNode(String classname) {
61  		return (ClassNode) findNode(this, ClassNode.class, classname);
62  	}
63  
64  	/**
65  	 * Searches for the first occurence of a node that is an instance of
66  	 * the given class and has the given name.
67  	 * 
68  	 * @param node root node of the tree
69  	 * @param clazz to search for
70  	 * @param name name that the NamedTreeNode should have
71  	 * @return NamedTreeNode
72  	 */
73  	protected TreeNode findNode(TreeNode node, Class<? extends NamedTreeNode> clazz, String name) {
74  		Enumeration<TreeNode> e = node.children();
75  		while(e.hasMoreElements()) {
76  			TreeNode currentNode = e.nextElement();
77  			if (clazz.isInstance(currentNode)) {
78  				if (((NamedTreeNode) currentNode).getName().equals(name)) {
79  					return currentNode;
80  				}
81  			}
82  			
83  			TreeNode childResult = findNode(currentNode, clazz, name);
84  			if (childResult != null) {
85  				return childResult;
86  			}
87  		}
88  		
89  		return null;
90  	}
91  
92  	/**
93  	 * Sorts nodes and sorts the "unassigned" node to the end.
94  	 */
95  	public synchronized void sortNodes() {
96  		SortedSet<ModuleNode> sort = new TreeSet<ModuleNode>();
97  		sort.addAll(getModules());
98  		removeAllChildren();
99  
100 		// re-add all nodes except the "unassigned" node
101 		ModuleNode unassignedModule = null;
102 		for(ModuleNode mn : sort) {
103 			if (mn.isUnassignedModule()) {
104 				assert(unassignedModule == null);
105 				unassignedModule = mn;
106 			} else {
107 				add(mn);
108 			}
109 		}
110 		
111 		// add the "unassigned" node at the end
112 		if (unassignedModule != null) {
113 			add(unassignedModule);
114 		}
115 	}
116 
117 	/**
118 	 * Finds and returns the ModuleNode that is named "unassigned" and contains all
119 	 * packages that do not belong to any module. If it is not
120 	 * found, null is returned.
121 	 * 
122 	 * @return "unassigned" ModuleNode or null
123 	 */
124 	public ModuleNode getUnassignedModule() {
125 		for(ModuleNode mn : getModules()) {
126 			if (mn.isUnassignedModule()) {
127 				return mn;
128 			}
129 		}
130 		
131 		return null;
132 	}
133 
134 	public void merge(ModelTree additionalModelTree) {
135 		for(ModuleNode mn : additionalModelTree.getModules()) {
136 			for(PackageNode pn : mn.getPackages()) {
137 				for(ClassNode cn : pn.getClasses()) {
138 					ModuleNode thisMn = getModule(mn.getModuleName());
139 					if (thisMn == null) {
140 						thisMn = new DependentModuleNode(mn.getModuleName());
141 						add(thisMn);
142 					}
143 					PackageNode thisPn = thisMn.getPackage(pn.getPackagename());
144 					if (thisPn == null) {
145 						thisPn = new DependentPackageNode(pn.getPackagename());
146 						thisMn.add(thisPn);
147 					}
148 					thisPn.add(cn);
149 				}
150 			}
151 		}
152 	}
153 }