View Javadoc

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 			// It's a type variable or primitive
133 			return false;
134 		}
135 		
136 		if (javaType.isDefaultPackage()) {
137 			// Cannot import types from the default package
138 			return false;
139 		}
140 		
141 		// Must be a class, so it's legal if there isn't an existing registration that conflicts
142 		for (JavaType candidate : registeredImports) {
143 			if (candidate.getSimpleTypeName().equals(javaType.getSimpleTypeName())) {
144 				// conflict detected
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 			// Primitives and type variables do not need to be used in fully-qualified form
157 			return false;
158 		}
159 
160 		if (registeredImports.contains(javaType)) {
161 			// Already know about this one
162 			return false;
163 		}
164 		
165 		if (compilationUnitPackage.equals(javaType.getPackage())) {
166 			// No need for an explicit registration, given it's in the same package
167 			return false;
168 		}
169 		
170 		// To get this far, it must need a fully-qualified name
171 		return true;
172 	}
173 	
174 	public boolean isFullyQualifiedFormRequiredAfterAutoImport(JavaType javaType) {
175 		Assert.notNull(javaType, "Java type required");
176 		
177 		// Try to add import if possible
178 		if (isAdditionLegal(javaType)) {
179 			addImport(javaType);
180 		}
181 		
182 		// Indicate whether we can use in a simple or need a fully-qualified form
183 		return isFullyQualifiedFormRequired(javaType);
184 	}
185 
186 	/**
187 	 * Determines whether the presented simple type name is part of java.lang or not.
188 	 *  
189 	 * @param simpleTypeName the simple type name (required)
190 	 * @return whether the type is declared as part of java.lang
191 	 */
192 	public static boolean isPartOfJavaLang(String simpleTypeName) {
193 		Assert.hasText(simpleTypeName, "Simple type name required");
194 		return javaLangSimpleTypeNames.contains(simpleTypeName);
195 	}
196 
197 }