1 19 20 package org.netbeans.server.componentsmatch; 21 22 import java.io.BufferedReader ; 23 import java.io.IOException ; 24 import java.io.Reader ; 25 import java.util.ArrayList ; 26 import java.util.Collection ; 27 import java.util.HashMap ; 28 import java.util.List ; 29 import java.util.Map ; 30 import java.util.StringTokenizer ; 31 32 35 public final class Matcher { 36 static Matcher packageMerger; 37 38 static List <Package > allPackages; 39 40 static Matcher defaultMatcher; 41 static final String [] NB_ORG_PREFIXES = new String [] { 44 "org.openide.","org.netbeans.","org.apache.tools.ant.module.","org.openidex." 45 }; 46 47 Map <String ,Package > packages = new HashMap <String ,Package >(); 48 49 Matcher(List <Package > packages) { 50 for (Package pack : packages) { 51 this.packages.put(pack.getName(),pack); 52 } 53 } 54 55 Matcher() { 56 57 } 58 59 62 public Component match(StackTraceElement [] stes) { 63 for (StackTraceElement ste : stes) { 64 Component comp = match(ste); 65 if (comp != null) { 66 return comp; 67 } 68 } 69 return null; 70 } 71 72 private Component match(StackTraceElement ste) { 73 String className = ste.getClassName(); 74 int index = 0; 75 while ((index = className.indexOf('.',index)) != -1) { 76 if ( index + 1 < className.length()) { 77 if (Character.isUpperCase(className.charAt(index + 1))) { 78 break; 79 } 80 } 81 index++; 82 } 83 if (index != -1) { 84 String packageName = className.substring(0,index); 85 Package pack = getPackage(packageName); 86 if (pack != null) { 87 return pack.getFirstComponent(); 88 } 89 } 90 return null; 91 } 92 93 private Package getPackage(String name) { 94 Package pack = packages.get(name); 95 if (pack == null) { 96 int lastDot = name.lastIndexOf('.'); 98 if (lastDot != -1) { 99 name = name.substring(0,lastDot); 100 pack = getPackage(name); 101 } 102 } 103 if (pack == null) { 104 if (checkNetBeansOrgSubPackage(name)) { 106 pack = getPackageMerger().getPackage(name); 107 } 108 } 109 return pack; 110 } 111 112 private static Matcher getPackageMerger() { 113 if (packageMerger == null) { 114 packageMerger = new Matcher(); 115 for (Package pack : allPackages) { 116 String name = pack.getName(); 117 int index = -1; 118 while ((index = name.lastIndexOf(name)) != -1) { 119 name = name.substring(0,index); 120 if (!checkNetBeansOrgSubPackage(name)) { 121 break; 122 } 123 packageMerger.addPackage(name,pack.getComponents()); 124 } 125 } 126 } 127 return packageMerger; 128 } 129 130 private void addPackage(String name,Collection <Component> components ) { 131 Package pack = packages.get(name); 132 if (pack == null) { 133 pack = new Package (name); 134 packages.put(name,pack); 135 } 136 for (Component comp : components) { 137 pack.addComponent(comp); 138 } 139 } 140 141 private static boolean checkNetBeansOrgSubPackage(String pack) { 142 for (String prefix : NB_ORG_PREFIXES) { 143 if (pack.startsWith(prefix)) { 144 return true; 145 } 146 } 147 return false; 148 } 149 150 public static Matcher getDefault() { 151 if (defaultMatcher == null) { 152 defaultMatcher = new Matcher(); 153 for (Package pack : allPackages) { 154 defaultMatcher.addPackage(pack.getName(),pack.getComponents()); 155 } 156 } 157 return defaultMatcher; 158 } 159 160 162 public static void addGlobalPackage(Package pack) { 163 if (allPackages == null) { 164 allPackages = new ArrayList <Package >(); 165 } 166 allPackages.add(pack); 167 } 168 169 172 public static void read(Reader r) throws IOException { 173 BufferedReader reader = new BufferedReader (r); 174 String line = null; 175 if (allPackages == null )allPackages = new ArrayList <Package >(); 176 else allPackages.clear(); 177 defaultMatcher = null; 178 packageMerger = null; 179 181 182 while ((line = reader.readLine()) != null) { 183 StringTokenizer tokenizer = new StringTokenizer (line,";"); 184 String token = tokenizer.nextToken(); 185 if (token != null) { 186 String count = tokenizer.nextToken(); 187 Package pack = new Package (token); 188 while(tokenizer.hasMoreTokens()) { 189 token = tokenizer.nextToken(); 190 if (tokenizer.hasMoreTokens()) { 191 String subComponent = tokenizer.nextToken(); 192 if (tokenizer.hasMoreTokens()) { 193 count = tokenizer.nextToken(); 194 pack.addComponent(new Component(token,subComponent,Integer.parseInt(count))); 195 } 196 197 } 198 } 199 allPackages.add(pack); 200 } 201 } 202 } 203 204 } 205 | Popular Tags |