1 package org.kite9.framework.model;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.Map;
7 import java.util.Set;
8 import java.util.TreeSet;
9
10
11 public class ProjectModelImpl implements ProjectModel {
12
13 private Map<MemberHandle, Set<MemberHandle>> calls = new HashMap<MemberHandle, Set<MemberHandle>>(100);
14 private Map<MemberHandle, Set<MemberHandle>> calledBy = new HashMap<MemberHandle, Set<MemberHandle>>(100);
15 private Map<String, Set<String>> annotatedClasses = new HashMap<String, Set<String>>(100);
16 private Map<String, Set<MemberHandle>> annotatedMembers = new HashMap<String, Set<MemberHandle>>(100);
17 private Map<String, Set<String>> subclasses = new HashMap<String, Set<String>>(100);
18 private Map<String, Set<String>> dependsOn = new HashMap<String, Set<String>>(100);
19 private Map<String, Set<String>> dependedOn = new HashMap<String, Set<String>>(100);
20
21 private Map<String, Set<String>> packageContents = new HashMap<String, Set<String>>(100);
22 private Set<String> classes = new HashSet<String>(100);
23
24 public Set<MemberHandle> getCalls(MemberHandle m) {
25 return checkGet(calls.get(m));
26 }
27
28 public Set<MemberHandle> getCalledBy(MemberHandle m) {
29 return checkGet(calledBy.get(m));
30 }
31
32 public Set<String> getClassesWithAnnotation(String annotationName) {
33 return checkGet(annotatedClasses.get(annotationName));
34 }
35
36 public Set<MemberHandle> getMembersWithAnnotation(String annotationName) {
37 return checkGet(annotatedMembers.get(annotationName));
38 }
39
40 public Set<String> getSubclasses(String className) {
41 return checkGet(subclasses.get(className));
42 }
43
44 public void addSubclass(String superName, String name) {
45 checkAdd(superName, name, subclasses);
46 }
47
48 private <X> Set<X> checkGet(Set<X> in) {
49 if (in==null) {
50 return Collections.emptySet();
51 }
52
53 return in;
54 }
55
56 private <A, B> void checkAdd(A keyName, B value, Map<A, Set<B>> theMap) {
57 Set<B> item = theMap.get(keyName);
58 if (item == null) {
59 item = new TreeSet<B>();
60 theMap.put(keyName, item);
61 }
62 item.add(value);
63 }
64
65 public void addClassAnnotation(String desc, String className) {
66 checkAdd(desc, className, annotatedClasses);
67 }
68
69 public void addMemberAnnotation(String desc, MemberHandle mh) {
70 checkAdd(desc, mh, annotatedMembers);
71 }
72
73 public void addCalls(MemberHandle desc, MemberHandle mh) {
74 checkAdd(desc, mh, calls);
75 checkAdd(mh, desc, calledBy);
76 }
77
78 public void addDependency(String from, String on) {
79 checkAdd(from, on, dependsOn);
80 checkAdd(on, from, dependedOn);
81 }
82
83 public void addPackageClass(String packageName, String cl) {
84 checkAdd(packageName, cl, packageContents);
85 }
86
87 public void addClass(String name) {
88 classes.add(name);
89 }
90
91 public Set<String> getClassesInPackage(String packageName) {
92 return checkGet(packageContents.get(packageName));
93 }
94
95 public boolean withinModel(String className) {
96 return classes.contains(className);
97 }
98
99 public int getClassCount() {
100 return classes.size();
101 }
102
103 public Set<String> getDependedOn(String className) {
104 return checkGet(dependedOn.get(className));
105 }
106
107 public Set<String> getDependsOn(String className) {
108 return checkGet(dependsOn.get(className));
109 }
110 }