1 19 20 package org.netbeans.modules.refactoring.java; 21 22 import java.awt.Color ; 23 import java.io.File ; 24 import java.io.IOException ; 25 import java.net.URISyntaxException ; 26 import java.net.URL ; 27 import java.util.ArrayList ; 28 import java.util.Collection ; 29 import java.util.EnumSet ; 30 import java.util.Set ; 31 import java.util.StringTokenizer ; 32 import javax.lang.model.element.Element; 33 import javax.lang.model.element.ExecutableElement; 34 import javax.lang.model.element.TypeElement; 35 import javax.lang.model.type.DeclaredType; 36 import javax.lang.model.type.TypeKind; 37 import javax.lang.model.type.TypeMirror; 38 import javax.lang.model.util.ElementFilter; 39 import javax.swing.text.AttributeSet ; 40 import javax.swing.text.StyleConstants ; 41 import org.netbeans.api.editor.mimelookup.MimeLookup; 42 import org.netbeans.api.editor.mimelookup.MimePath; 43 import org.netbeans.api.editor.settings.FontColorSettings; 44 import org.netbeans.api.java.classpath.ClassPath; 45 import org.netbeans.api.java.classpath.GlobalPathRegistry; 46 import org.netbeans.api.java.lexer.JavaTokenId; 47 import org.netbeans.api.java.project.JavaProjectConstants; 48 import org.netbeans.api.java.source.ClassIndex; 49 import org.netbeans.api.java.source.CompilationInfo; 50 import org.netbeans.api.java.source.ClasspathInfo; 51 import org.netbeans.api.java.source.ElementHandle; 52 import org.netbeans.api.java.source.SourceUtils; 53 import org.netbeans.api.lexer.Token; 54 import org.netbeans.api.lexer.TokenHierarchy; 55 import org.netbeans.api.lexer.TokenSequence; 56 import org.netbeans.api.project.FileOwnerQuery; 57 import org.netbeans.api.project.Project; 58 import org.netbeans.api.project.ProjectUtils; 59 import org.netbeans.api.project.SourceGroup; 60 import org.netbeans.api.project.ui.OpenProjects; 61 import org.openide.filesystems.FileObject; 62 import org.openide.filesystems.FileUtil; 63 import org.openide.util.Lookup; 64 import org.openide.filesystems.FileUtil; 65 import org.openide.filesystems.URLMapper; 66 import org.openide.util.Utilities; 67 68 72 public class RetoucheUtils { 73 74 private static final String JAVA_MIME_TYPE = "text/x-java"; 75 76 public static String htmlize(String input) { 77 String temp = org.openide.util.Utilities.replaceString(input, "<", "<"); temp = org.openide.util.Utilities.replaceString(temp, ">", ">"); return temp; 80 } 81 82 public static Collection <ExecutableElement> getOverridenMethods(ExecutableElement e, CompilationInfo info) { 83 return getOverridenMethods(e, SourceUtils.getEnclosingTypeElement(e), info); 84 } 85 86 private static Collection <ExecutableElement> getOverridenMethods(ExecutableElement e, TypeElement parent, CompilationInfo info) { 87 ArrayList <ExecutableElement> result = new ArrayList <ExecutableElement>(); 88 89 TypeMirror sup = parent.getSuperclass(); 90 if (sup.getKind() == TypeKind.DECLARED) { 91 TypeElement next = (TypeElement) ((DeclaredType)sup).asElement(); 92 ExecutableElement overriden = getMethod(e, next, info); 93 result.addAll(getOverridenMethods(e,next, info)); 94 if (overriden!=null) { 95 result.add(overriden); 96 } 97 } 98 for (TypeMirror tm:parent.getInterfaces()) { 99 TypeElement next = (TypeElement) ((DeclaredType)tm).asElement(); 100 ExecutableElement overriden2 = getMethod(e, next, info); 101 result.addAll(getOverridenMethods(e,next, info)); 102 if (overriden2!=null) { 103 result.add(overriden2); 104 } 105 } 106 return result; 107 } 108 109 private static ExecutableElement getMethod(ExecutableElement method, TypeElement type, CompilationInfo info) { 110 for (ExecutableElement met: ElementFilter.methodsIn(type.getEnclosedElements())){ 111 if (info.getElements().overrides(method, met, type)) { 112 return met; 113 } 114 } 115 return null; 116 } 117 118 public static Collection <ExecutableElement> getOverridingMethods(ExecutableElement e, CompilationInfo info) { 119 Collection <ExecutableElement> result = new ArrayList (); 120 TypeElement parentType = (TypeElement) e.getEnclosingElement(); 121 Set <ElementHandle<TypeElement>> subTypes = info.getClasspathInfo().getClassIndex().getElements(ElementHandle.create(parentType), EnumSet.of(ClassIndex.SearchKind.IMPLEMENTORS),EnumSet.of(ClassIndex.SearchScope.SOURCE)); 123 for (ElementHandle<TypeElement> subTypeHandle: subTypes){ 124 TypeElement type = subTypeHandle.resolve(info); 125 for (ExecutableElement method: ElementFilter.methodsIn(type.getEnclosedElements())) { 126 if (info.getElements().overrides(method, e, type)) { 127 result.add(method); 128 } 129 } 130 } 131 return result; 132 } 133 134 public static boolean isJavaFile(FileObject f) { 135 return JAVA_MIME_TYPE.equals(f.getMIMEType()); } 137 138 public static String getHtml(String text) { 139 StringBuffer buf = new StringBuffer (); 140 TokenHierarchy tokenH = TokenHierarchy.create(text, JavaTokenId.language()); 141 Lookup lookup = MimeLookup.getLookup(MimePath.get(JAVA_MIME_TYPE)); 142 FontColorSettings settings = lookup.lookup(FontColorSettings.class); 143 TokenSequence tok = tokenH.tokenSequence(); 144 while (tok.moveNext()) { 145 Token<JavaTokenId> token = (Token) tok.token(); 146 String category = token.id().primaryCategory(); 147 if (category == null) { 148 category = "whitespace"; } 150 AttributeSet set = settings.getTokenFontColors(category); 151 buf.append(color(token.text().toString(), set)); 152 } 153 return buf.toString(); 154 } 155 156 private static String color(String string, AttributeSet set) { 157 if (set==null) 158 return string; 159 if (string.trim().length() == 0) { 160 return Utilities.replaceString(Utilities.replaceString(string, " ", " "), "\n", "<br>"); } 162 StringBuffer buf = new StringBuffer (string); 163 if (StyleConstants.isBold(set)) { 164 buf.insert(0,"<b>"); buf.append("</b>"); } 167 if (StyleConstants.isItalic(set)) { 168 buf.insert(0,"<i>"); buf.append("</i>"); } 171 if (StyleConstants.isStrikeThrough(set)) { 172 buf.insert(0,"<s>"); 173 buf.append("</s>"); 174 } 175 buf.insert(0,"<font color=" + getHTMLColor(StyleConstants.getForeground(set)) + ">"); buf.append("</font>"); return buf.toString(); 178 } 179 180 private static String getHTMLColor(Color c) { 181 String colorR = "0" + Integer.toHexString(c.getRed()); colorR = colorR.substring(colorR.length() - 2); 183 String colorG = "0" + Integer.toHexString(c.getGreen()); colorG = colorG.substring(colorG.length() - 2); 185 String colorB = "0" + Integer.toHexString(c.getBlue()); colorB = colorB.substring(colorB.length() - 2); 187 String html_color = "#" + colorR + colorG + colorB; return html_color; 189 } 190 191 public static boolean isElementInOpenProject(FileObject f) { 192 Project p = FileOwnerQuery.getOwner(f); 193 Project[] opened = OpenProjects.getDefault().getOpenProjects(); 194 for (int i = 0; i<opened.length; i++) { 195 if (p==opened[i]) 196 return true; 197 } 198 return false; 199 } 200 public static boolean isFromLibrary(Element element, ClasspathInfo info) { 201 SourceUtils.getFile(element, info); 202 return FileUtil.getArchiveFile(SourceUtils.getFile(element, info))!=null; 203 } 204 205 public static boolean isValidPackageName(String name) { 206 StringTokenizer tokenizer = new StringTokenizer (name, "."); while (tokenizer.hasMoreTokens()) { 208 if (!Utilities.isJavaIdentifier(tokenizer.nextToken())) { 209 return false; 210 } 211 } 212 return true; 213 } 214 215 public static boolean isFileInOpenProject(FileObject file) { 216 assert file != null; 217 Project p = FileOwnerQuery.getOwner(file); 218 Project[] opened = OpenProjects.getDefault().getOpenProjects(); 219 for (int i = 0; i<opened.length; i++) { 220 if (p==opened[i]) 221 return true; 222 } 223 return false; 224 } 225 226 public static boolean isOnSourceClasspath(FileObject fo) { 227 Project p = FileOwnerQuery.getOwner(fo); 228 if (p==null) return false; 229 Project[] opened = OpenProjects.getDefault().getOpenProjects(); 230 for (int i = 0; i<opened.length; i++) { 231 if (p==opened[i]) { 232 SourceGroup[] gr = ProjectUtils.getSources(p).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); 233 for (int j = 0; j < gr.length; j++) { 234 if (fo==gr[j].getRootFolder()) return true; 235 if (FileUtil.isParentOf(gr[j].getRootFolder(), fo)) 236 return true; 237 } 238 return false; 239 } 240 } 241 return false; 242 } 243 244 public static boolean isClasspathRoot(FileObject fo) { 245 return fo.equals(ClassPath.getClassPath(fo, ClassPath.SOURCE).findOwnerRoot(fo)); 246 } 247 248 public static boolean isRefactorable(FileObject file) { 249 return isJavaFile(file) && isFileInOpenProject(file) && isOnSourceClasspath(file); 250 } 251 252 public static String getPackageName(FileObject folder) { 253 assert folder.isFolder() : "argument must be folder"; 254 return ClassPath.getClassPath( 255 folder, ClassPath.SOURCE) 256 .getResourceName(folder, '.', false); 257 } 258 259 public static String getPackageName(URL url) { 260 FileObject result = URLMapper.findFileObject(url); 261 if (result != null) 262 return getPackageName(result); 263 264 File f = new File (url.getPath()); 265 266 do { 267 FileObject fo = FileUtil.toFileObject(f); 268 if (fo != null) { 269 return getPackageName(fo); 270 } 271 f = f.getParentFile(); 272 } while (f!=null); 273 throw new IllegalArgumentException ("Cannot create package name for url " + url); 274 } 275 276 281 public static FileObject getOrCreateFolder(URL url) throws IOException { 282 try { 283 FileObject result = URLMapper.findFileObject(url); 284 if (result != null) 285 return result; 286 File f = new File (url.toURI()); 287 288 result = FileUtil.createFolder(f); 289 return result; 290 } catch (URISyntaxException ex) { 291 throw (IOException ) new IOException ().initCause(ex); 292 } 293 } 294 295 296 } 297 | Popular Tags |