1 package org.springframework.roo.model;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Set;
8
9 import org.springframework.roo.support.util.Assert;
10
11 public class ImportRegistrationResolverImpl implements ImportRegistrationResolver {
12
13 private static final List<String> javaLangSimpleTypeNames = new ArrayList<String>();
14 private Set<JavaType> registeredImports = new HashSet<JavaType>();
15 private JavaPackage compilationUnitPackage;
16
17 static {
18 javaLangSimpleTypeNames.add("Appendable");
19 javaLangSimpleTypeNames.add("CharSequence");
20 javaLangSimpleTypeNames.add("Cloneable");
21 javaLangSimpleTypeNames.add("Comparable");
22 javaLangSimpleTypeNames.add("Iterable");
23 javaLangSimpleTypeNames.add("Readable");
24 javaLangSimpleTypeNames.add("Runnable");
25 javaLangSimpleTypeNames.add("Boolean");
26 javaLangSimpleTypeNames.add("Byte");
27 javaLangSimpleTypeNames.add("Character");
28 javaLangSimpleTypeNames.add("Class");
29 javaLangSimpleTypeNames.add("ClassLoader");
30 javaLangSimpleTypeNames.add("Compiler");
31 javaLangSimpleTypeNames.add("Double");
32 javaLangSimpleTypeNames.add("Enum");
33 javaLangSimpleTypeNames.add("Float");
34 javaLangSimpleTypeNames.add("InheritableThreadLocal");
35 javaLangSimpleTypeNames.add("Integer");
36 javaLangSimpleTypeNames.add("Long");
37 javaLangSimpleTypeNames.add("Math");
38 javaLangSimpleTypeNames.add("Number");
39 javaLangSimpleTypeNames.add("Object");
40 javaLangSimpleTypeNames.add("Package");
41 javaLangSimpleTypeNames.add("Process");
42 javaLangSimpleTypeNames.add("ProcessBuilder");
43 javaLangSimpleTypeNames.add("Runtime");
44 javaLangSimpleTypeNames.add("RuntimePermission");
45 javaLangSimpleTypeNames.add("SecurityManager");
46 javaLangSimpleTypeNames.add("Short");
47 javaLangSimpleTypeNames.add("StackTraceElement");
48 javaLangSimpleTypeNames.add("StrictMath");
49 javaLangSimpleTypeNames.add("String");
50 javaLangSimpleTypeNames.add("StringBuffer");
51 javaLangSimpleTypeNames.add("StringBuilder");
52 javaLangSimpleTypeNames.add("System");
53 javaLangSimpleTypeNames.add("Thread");
54 javaLangSimpleTypeNames.add("ThreadGroup");
55 javaLangSimpleTypeNames.add("ThreadLocal");
56 javaLangSimpleTypeNames.add("Throwable");
57 javaLangSimpleTypeNames.add("Void");
58 javaLangSimpleTypeNames.add("ArithmeticException");
59 javaLangSimpleTypeNames.add("ArrayIndexOutOfBoundsException");
60 javaLangSimpleTypeNames.add("ArrayStoreException");
61 javaLangSimpleTypeNames.add("ClassCastException");
62 javaLangSimpleTypeNames.add("ClassNotFoundException");
63 javaLangSimpleTypeNames.add("CloneNotSupportedException");
64 javaLangSimpleTypeNames.add("EnumConstantNotPresentException");
65 javaLangSimpleTypeNames.add("Exception");
66 javaLangSimpleTypeNames.add("IllegalAccessException");
67 javaLangSimpleTypeNames.add("IllegalArgumentException");
68 javaLangSimpleTypeNames.add("IllegalMonitorStateException");
69 javaLangSimpleTypeNames.add("IllegalStateException");
70 javaLangSimpleTypeNames.add("IllegalThreadStateException");
71 javaLangSimpleTypeNames.add("IndexOutOfBoundsException");
72 javaLangSimpleTypeNames.add("InstantiationException");
73 javaLangSimpleTypeNames.add("InterruptedException");
74 javaLangSimpleTypeNames.add("NegativeArraySizeException");
75 javaLangSimpleTypeNames.add("NoSuchFieldException");
76 javaLangSimpleTypeNames.add("NoSuchMethodException");
77 javaLangSimpleTypeNames.add("NullPointerException");
78 javaLangSimpleTypeNames.add("NumberFormatException");
79 javaLangSimpleTypeNames.add("RuntimeException");
80 javaLangSimpleTypeNames.add("SecurityException");
81 javaLangSimpleTypeNames.add("StringIndexOutOfBoundsException");
82 javaLangSimpleTypeNames.add("TypeNotPresentException");
83 javaLangSimpleTypeNames.add("UnsupportedOperationException");
84 javaLangSimpleTypeNames.add("AbstractMethodError");
85 javaLangSimpleTypeNames.add("AssertionError");
86 javaLangSimpleTypeNames.add("ClassCircularityError");
87 javaLangSimpleTypeNames.add("ClassFormatError");
88 javaLangSimpleTypeNames.add("Error");
89 javaLangSimpleTypeNames.add("ExceptionInInitializerError");
90 javaLangSimpleTypeNames.add("IllegalAccessError");
91 javaLangSimpleTypeNames.add("IncompatibleClassChangeError");
92 javaLangSimpleTypeNames.add("InstantiationError");
93 javaLangSimpleTypeNames.add("InternalError");
94 javaLangSimpleTypeNames.add("LinkageError");
95 javaLangSimpleTypeNames.add("NoClassDefFoundError");
96 javaLangSimpleTypeNames.add("NoSuchFieldError");
97 javaLangSimpleTypeNames.add("NoSuchMethodError");
98 javaLangSimpleTypeNames.add("OutOfMemoryError");
99 javaLangSimpleTypeNames.add("StackOverflowError");
100 javaLangSimpleTypeNames.add("ThreadDeath");
101 javaLangSimpleTypeNames.add("UnknownError");
102 javaLangSimpleTypeNames.add("UnsatisfiedLinkError");
103 javaLangSimpleTypeNames.add("UnsupportedClassVersionError");
104 javaLangSimpleTypeNames.add("VerifyError");
105 javaLangSimpleTypeNames.add("VirtualMachineError");
106 }
107
108
109
110 public ImportRegistrationResolverImpl(JavaPackage compilationUnitPackage) {
111 Assert.notNull(compilationUnitPackage, "Compilation unit package required");
112 this.compilationUnitPackage = compilationUnitPackage;
113 }
114
115 public void addImport(JavaType javaType) {
116 Assert.notNull(javaType, "Java type required");
117 registeredImports.add(javaType);
118 }
119
120 public JavaPackage getCompilationUnitPackage() {
121 return compilationUnitPackage;
122 }
123
124 public Set<JavaType> getRegisteredImports() {
125 return Collections.unmodifiableSet(registeredImports);
126 }
127
128 public boolean isAdditionLegal(JavaType javaType) {
129 Assert.notNull(javaType, "Java type required");
130
131 if (javaType.getDataType() != DataType.TYPE) {
132
133 return false;
134 }
135
136 if (javaType.isDefaultPackage()) {
137
138 return false;
139 }
140
141
142 for (JavaType candidate : registeredImports) {
143 if (candidate.getSimpleTypeName().equals(javaType.getSimpleTypeName())) {
144
145 return false;
146 }
147 }
148
149 return true;
150 }
151
152 public boolean isFullyQualifiedFormRequired(JavaType javaType) {
153 Assert.notNull(javaType, "Java type required");
154
155 if (javaType.getDataType() == DataType.PRIMITIVE || javaType.getDataType() == DataType.VARIABLE) {
156
157 return false;
158 }
159
160 if (registeredImports.contains(javaType)) {
161
162 return false;
163 }
164
165 if (compilationUnitPackage.equals(javaType.getPackage())) {
166
167 return false;
168 }
169
170
171 return true;
172 }
173
174 public boolean isFullyQualifiedFormRequiredAfterAutoImport(JavaType javaType) {
175 Assert.notNull(javaType, "Java type required");
176
177
178 if (isAdditionLegal(javaType)) {
179 addImport(javaType);
180 }
181
182
183 return isFullyQualifiedFormRequired(javaType);
184 }
185
186
187
188
189
190
191
192 public static boolean isPartOfJavaLang(String simpleTypeName) {
193 Assert.hasText(simpleTypeName, "Simple type name required");
194 return javaLangSimpleTypeNames.contains(simpleTypeName);
195 }
196
197 }