1 19 20 package org.netbeans.modules.j2ee.clientproject.ui.wizards; 21 22 import java.io.BufferedReader ; 23 import java.io.File ; 24 import java.io.IOException ; 25 import java.io.InputStreamReader ; 26 import java.io.Reader ; 27 import java.util.ArrayList ; 28 import java.util.Arrays ; 29 import java.util.Collection ; 30 import java.util.Enumeration ; 31 import java.util.List ; 32 import java.util.StringTokenizer ; 33 import org.netbeans.modules.j2ee.clientproject.AppClientProvider; 34 import org.openide.ErrorManager; 35 import org.openide.filesystems.FileObject; 36 import org.openide.filesystems.FileStateInvalidException; 37 import org.openide.filesystems.FileUtil; 38 import org.openide.util.Enumerations; 39 40 final class FileSearchUtility { 41 42 43 private FileSearchUtility() { 44 } 45 46 54 static Enumeration getChildrenToDepth(final FileObject root, final int depth, final boolean onlyWritables) { 55 class WithChildren implements Enumerations.Processor { 56 private final int rootDepth; 57 public WithChildren(final int rootDepth) { 58 this.rootDepth = rootDepth; 59 } 60 @SuppressWarnings ("unchecked") 61 public Object process(final Object obj, final Collection toAdd) { 62 FileObject fo = (FileObject)obj; 63 if (!onlyWritables || (onlyWritables && fo.canWrite())) { 64 if (fo.isFolder() && (getDepth(fo) - rootDepth) < depth) { 65 toAdd.addAll(Arrays.asList(fo.getChildren())); 66 } 67 } 68 return fo; 69 } 70 } 71 72 return Enumerations.queue( 73 Enumerations.array(root.getChildren()), 74 new WithChildren(getDepth(root)) 75 ); 76 } 77 78 static FileObject[] guessJavaRoots(final FileObject dir) { 79 List <FileObject> foundRoots = new ArrayList <FileObject>(); 80 if (null == dir) 81 return null; 82 Enumeration ch = FileSearchUtility.getChildrenToDepth(dir, 10, true); try { 84 while (ch.hasMoreElements () && foundRoots.isEmpty()) { 86 FileObject f = (FileObject) ch.nextElement (); 87 if (f.getExt().equals("java") && !f.isFolder()) { String pckg = guessPackageName(f); 89 String pkgPath = f.getParent().getPath(); 90 if (pckg != null && pkgPath.endsWith(pckg.replace('.', '/'))) { 91 String rootName = pkgPath.substring(0, pkgPath.length() - pckg.length()); 92 FileObject fr = f.getFileSystem().findResource(rootName); 93 if (!foundRoots.contains(fr)) { 94 foundRoots.add(fr); 95 } 96 } 97 } 98 } 99 } catch (FileStateInvalidException fsie) { 100 ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, fsie); 101 } 102 if (foundRoots.size() == 0) { 103 return null; 104 } else { 105 FileObject[] resultArr = new FileObject[foundRoots.size()]; 106 for (int i = 0; i < foundRoots.size(); i++) { 107 resultArr[i] = foundRoots.get(i); 108 } 109 return resultArr; 110 } 111 } 112 113 static FileObject guessConfigFilesPath(final FileObject dir) { 114 if (null == dir) 115 return null; 116 Enumeration ch = FileSearchUtility.getChildrenToDepth(dir, 3, true); try { 118 while (ch.hasMoreElements()) { 119 FileObject f = (FileObject) ch.nextElement(); 120 if (f.getNameExt().equals(AppClientProvider.FILE_DD)) { 121 String rootName = f.getParent().getPath(); 122 return f.getFileSystem().findResource(rootName); 123 } 124 } 125 } catch (FileStateInvalidException fsie) { 126 ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, fsie); 127 } 128 return null; 129 } 130 131 132 static File [] guessJavaRootsAsFiles(final FileObject dir) { 133 FileObject[] rootsFOs = guessJavaRoots(dir); 134 if (rootsFOs == null) { 135 return new File [0]; 136 } 137 File [] resultArr = new File [rootsFOs.length]; 138 for (int i = 0; i < resultArr.length; i++) { 139 resultArr[i] = FileUtil.toFile(rootsFOs[i]); 140 } 141 return resultArr; 142 } 143 144 private static String guessPackageName(final FileObject f) { 145 Reader r = null; 146 try { 147 r = new BufferedReader (new InputStreamReader (f.getInputStream(), "utf-8")); StringBuffer sb = new StringBuffer (); 149 final char[] buffer = new char[4096]; 150 int len; 151 152 for (;;) { 153 len = r.read(buffer); 154 if (len == -1) { break; } 155 sb.append(buffer, 0, len); 156 } 157 int idx = sb.indexOf("package"); if (idx >= 0) { 159 int idx2 = sb.indexOf(";", idx); if (idx2 >= 0) { 161 return sb.substring(idx + "package".length(), idx2).trim(); } 163 } 164 } catch (IOException ioe) { 165 ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ioe); 166 } finally { 167 try { 168 if (r != null) { 169 r.close(); 170 } 171 } catch (IOException ioe) { 172 } 174 } 175 return ""; 177 } 178 179 static FileObject guessLibrariesFolder(final FileObject dir) { 180 if (dir != null) { 181 FileObject lib = dir.getFileObject("lib"); if (lib != null) { 183 return lib; 184 } 185 } 186 Enumeration ch = FileSearchUtility.getChildrenToDepth(dir, 3, true); 187 while (ch.hasMoreElements()) { 188 FileObject f = (FileObject) ch.nextElement(); 189 if (f.getExt().equals("jar")) { return f.getParent(); 191 } 192 } 193 return null; 194 } 195 196 private static int getDepth(final FileObject fo) { 197 String path = FileUtil.toFile(fo).getAbsolutePath(); 198 StringTokenizer toker = new StringTokenizer (path, File.separator); 199 return toker.countTokens(); 200 } 201 } 202 | Popular Tags |