From e47813570ce31e53771067e2542875e604b6f2f0 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 14 Apr 1999 20:22:27 +0000 Subject: [PATCH] wildcard matching git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@603 379699f6-c40d-0410-875b-85095c16579e --- jode/jode/obfuscator/ClassBundle.java | 7 +- jode/jode/obfuscator/ClassIdentifier.java | 31 ++- jode/jode/obfuscator/PackageIdentifier.java | 234 +++++++++++++++----- 3 files changed, 210 insertions(+), 62 deletions(-) diff --git a/jode/jode/obfuscator/ClassBundle.java b/jode/jode/obfuscator/ClassBundle.java index d8d53e1..804022d 100644 --- a/jode/jode/obfuscator/ClassBundle.java +++ b/jode/jode/obfuscator/ClassBundle.java @@ -74,8 +74,8 @@ public class ClassBundle { return ident.getIdentifier(ref.getName(), ref.getType()); } - public void loadClasses(String packageOrClass) { - basePackage.loadClasses(packageOrClass); + public void loadClasses(String wildcard) { + basePackage.loadMatchingClasses(new WildCard(wildcard)); } public void reachableIdentifier(String fqn, boolean isVirtual) { @@ -88,7 +88,8 @@ public class ClassBundle { basePackage.applyPreserveRule(preserveRule); Enumeration enum = fullqualifiednames.elements(); while (enum.hasMoreElements()) { - basePackage.preserveIdentifier((String) enum.nextElement()); + basePackage.preserveMatchingIdentifier + (new WildCard((String) enum.nextElement())); } analyze(); } diff --git a/jode/jode/obfuscator/ClassIdentifier.java b/jode/jode/obfuscator/ClassIdentifier.java index c6a8e0f..2c341cd 100644 --- a/jode/jode/obfuscator/ClassIdentifier.java +++ b/jode/jode/obfuscator/ClassIdentifier.java @@ -57,11 +57,25 @@ public class ClassIdentifier extends Identifier { } } + public void preserveMatchingIdentifier(WildCard wildcard) { + System.err.println("preserve "+getFullName()+"; "+wildcard); + String fullName = getFullName() + "."; + for (int i=0; i< identifiers.length; i++) { + if (wildcard.matches(fullName + identifiers[i].getName()) + || wildcard.matches(fullName + identifiers[i].getName() + + "." +identifiers[i].getType())) { + System.err.println("preserving "+identifiers[i]); + setPreserved(); + identifiers[i].setPreserved(); + identifiers[i].setReachable(); + } + } + } + public void preserveIdentifier(String name, String typeSig) { for (int i=0; i< identifiers.length; i++) { - if (WildCard.matches(name, identifiers[i].getName()) - && (typeSig == null - || WildCard.matches(typeSig, identifiers[i].getType()))) + if (name.equals(identifiers[i].getName()) + && typeSig.equals(identifiers[i].getType())) identifiers[i].setPreserved(); } } @@ -79,10 +93,8 @@ public class ClassIdentifier extends Identifier { boolean isVirtual) { // if (!isVirtual || (info.getModifiers() & Modifier.ABSTRACT) == 0) { for (int i=0; i< identifiers.length; i++) { - if (WildCard.matches(name, identifiers[i].getName()) - && (typeSig == null - || WildCard.matches(typeSig, - identifiers[i].getType()))) + if (name.equals(identifiers[i].getName()) + && typeSig.equals(identifiers[i].getType())) identifiers[i].setReachable(); } // } @@ -401,7 +413,10 @@ public class ClassIdentifier extends Identifier { * @return the full qualified name, excluding trailing dot. */ public String getFullName() { - return pack.getFullName() + getName(); + if (pack.parent == null) + return getName(); + else + return pack.getFullName() + "." + getName(); } /** diff --git a/jode/jode/obfuscator/PackageIdentifier.java b/jode/jode/obfuscator/PackageIdentifier.java index c51ea3c..bff2a5c 100644 --- a/jode/jode/obfuscator/PackageIdentifier.java +++ b/jode/jode/obfuscator/PackageIdentifier.java @@ -43,14 +43,20 @@ public class PackageIdentifier extends Identifier { this.bundle = bundle; this.parent = parent; this.name = name; - this.loadOnDemand = loadOnDemand; this.loadedClasses = new Hashtable(); - if (loadOnDemand && !Obfuscator.shouldStrip) { + if (loadOnDemand) + setLoadOnDemand(); + } + + public void setLoadOnDemand() { + if (loadOnDemand) + return; + loadOnDemand = true; + if (!Obfuscator.shouldStrip) { // Load all classes and packages now, so they don't get stripped Vector v = new Vector(); Enumeration enum = - ClassInfo.getClassesAndPackages(parent.getFullName() - +getName()); + ClassInfo.getClassesAndPackages(getFullName()); while (enum.hasMoreElements()) { //insert sorted and remove double elements; String subclazz = (String)enum.nextElement(); @@ -70,7 +76,10 @@ public class PackageIdentifier extends Identifier { enum = v.elements(); while (enum.hasMoreElements()) { String subclazz = (String) enum.nextElement(); - String fullname = getFullName() + subclazz; + String fullname = getFullName(); + fullname = (fullname.length() > 0) + ? fullname + "."+ subclazz + : subclazz; if (ClassInfo.isPackage(fullname)) { Identifier ident = new PackageIdentifier (bundle, this, subclazz, true); @@ -111,12 +120,15 @@ public class PackageIdentifier extends Identifier { if (index == -1) { Identifier ident = (Identifier) loadedClasses.get(name); if (ident == null) { - String fullname = getFullName() + name; + String fullname = getFullName(); + fullname = (fullname.length() > 0) + ? fullname + "."+ name + : name; if (ClassInfo.isPackage(fullname)) { ident = new PackageIdentifier(bundle, this, name, true); loadedClasses.put(name, ident); } else if (!ClassInfo.exists(fullname)) { - System.err.println("Warning: Can't find class "+fullname); + Obfuscator.err.println("Warning: Can't find class "+fullname); } else { ident = new ClassIdentifier(bundle, this, name, ClassInfo.forName(fullname)); @@ -144,20 +156,91 @@ public class PackageIdentifier extends Identifier { } } - public Identifier loadClasses(String packageOrClass) { - int index = packageOrClass.indexOf('.'); - if (index == -1) { - return loadClass(packageOrClass); + public void loadMatchingClasses(WildCard wildcard) { + String component = wildcard.getNextComponent(getFullName()); + if (component != null) { + Identifier ident = (Identifier) loadedClasses.get(component); + if (ident == null) { + String fullname = getFullName(); + fullname = (fullname.length() > 0) + ? fullname + "."+ name + : name; + if (ClassInfo.isPackage(fullname)) { + ident = new PackageIdentifier(bundle, this, + component, loadOnDemand); + loadedClasses.put(component, ident); + } else if (!ClassInfo.exists(fullname)) { + Obfuscator.err.println("Warning: Can't find class "+fullname); + } else if (wildcard.matches(fullname)) { + if (Obfuscator.verboseLevel > 1) + Obfuscator.err.println("loading Class " +fullname); + ident = new ClassIdentifier(bundle, this, name, + ClassInfo.forName(fullname)); + loadedClasses.put(name, ident); + ((ClassIdentifier) ident).initClass(); + if (bundle.preserveRule != -1) + ident.applyPreserveRule(bundle.preserveRule); + } + } + if (ident instanceof PackageIdentifier) { + if (wildcard.matches(ident.getFullName())) { + if (Obfuscator.verboseLevel > 0) + Obfuscator.err.println("loading Package " +ident.getFullName()); + ((PackageIdentifier) ident).setLoadOnDemand(); + } + + if (wildcard.startsWith(ident.getFullName()+".")) + ((PackageIdentifier) ident).loadMatchingClasses(wildcard); + } } else { - String subpack = packageOrClass.substring(0, index); - PackageIdentifier pack = (PackageIdentifier) - loadedClasses.get(subpack); - if (pack == null) { - pack = new PackageIdentifier(bundle, this, - subpack, loadOnDemand); - loadedClasses.put(subpack, pack); + String fullname = getFullName(); + if (fullname.length() > 0) + fullname += "."; + /* Load all matching classes and packages */ + Enumeration enum = + ClassInfo.getClassesAndPackages(getFullName()); + while (enum.hasMoreElements()) { + String subclazz = (String)enum.nextElement(); + if (loadedClasses.contains(subclazz)) + continue; + String subFull = fullname + subclazz; + + if (wildcard.matches(subFull)) { + if (ClassInfo.isPackage(subFull)) { + if (Obfuscator.verboseLevel > 0) + Obfuscator.err.println("loading Package " +subFull); + Identifier ident = new PackageIdentifier + (bundle, this, subclazz, true); + loadedClasses.put(subclazz, ident); + } else { + if (Obfuscator.verboseLevel > 1) + Obfuscator.err.println("loading Class " +subFull); + ClassIdentifier ident = new ClassIdentifier + (bundle, this, + subclazz, ClassInfo.forName(subFull)); + loadedClasses.put(subclazz, ident); + ((ClassIdentifier) ident).initClass(); + if (bundle.preserveRule != -1) + ident.applyPreserveRule(bundle.preserveRule); + } + } else if (ClassInfo.isPackage(subFull) + && wildcard.startsWith(subFull + ".")) { + Identifier ident = new PackageIdentifier + (bundle, this, subclazz, loadOnDemand); + loadedClasses.put(subclazz, ident); + } + } + enum = loadedClasses.elements(); + while (enum.hasMoreElements()) { + Identifier ident = (Identifier) enum.nextElement(); + if (ident instanceof PackageIdentifier) { + if (wildcard.matches(ident.getFullName())) + ((PackageIdentifier) ident).setLoadOnDemand(); + + if (wildcard.startsWith(ident.getFullName()+".")) + ((PackageIdentifier) ident).loadMatchingClasses(wildcard); + } } - return pack.loadClasses(packageOrClass.substring(index+1)); } } @@ -196,45 +279,94 @@ public class PackageIdentifier extends Identifier { } } - public void preserveIdentifier(String fqn) { - int index = fqn.indexOf('.'); - String component = index == -1 ? fqn : fqn.substring(0, index); - Identifier ident = getIdentifier(component); - if (ident == null) - return; - ident.setReachable(); - ident.setPreserved(); - if (index == -1) - return; - - if (ident instanceof PackageIdentifier) - ((PackageIdentifier) ident).preserveIdentifier - (fqn.substring(index+1)); - else { - String method = fqn.substring(index+1); - index = method.indexOf('.'); - if (index == -1) { - ((ClassIdentifier) ident).reachableIdentifier - (method, null, false); - ((ClassIdentifier) ident).preserveIdentifier - (method, null); - } else { - ((ClassIdentifier) ident).reachableIdentifier - (method.substring(0, index), method.substring(index+1), - false); - ((ClassIdentifier) ident).preserveIdentifier - (method.substring(0, index), method.substring(index+1)); + public void preserveMatchingIdentifier(WildCard wildcard) { + String component = wildcard.getNextComponent(getFullName()); + if (component != null) { + Identifier ident = (Identifier) loadedClasses.get(component); + if (ident == null && loadOnDemand) { + String fullname = getFullName(); + fullname = (fullname.length() > 0) + ? fullname + "."+ component + : component; + if (ClassInfo.isPackage(fullname)) { + ident = new PackageIdentifier(bundle, this, + component, loadOnDemand); + loadedClasses.put(component, ident); + } else if (!ClassInfo.exists(fullname)) { + Obfuscator.err.println("Warning: Can't find class "+fullname); + } else { + ident = new ClassIdentifier(bundle, this, name, + ClassInfo.forName(fullname)); + loadedClasses.put(name, ident); + ((ClassIdentifier) ident).initClass(); + if (bundle.preserveRule != -1) + ident.applyPreserveRule(bundle.preserveRule); + } + } + if (wildcard.startsWith(ident.getFullName()+".")) { + if (ident instanceof PackageIdentifier) + ((PackageIdentifier) ident) + .preserveMatchingIdentifier(wildcard); + else + ((ClassIdentifier) ident) + .preserveMatchingIdentifier(wildcard); + } + } else { + String fullname = getFullName(); + if (fullname.length() > 0) + fullname += "."; + if (loadOnDemand) { + /* Load all matching classes and packages */ + Enumeration enum = + ClassInfo.getClassesAndPackages(getFullName()); + while (enum.hasMoreElements()) { + String subclazz = (String)enum.nextElement(); + if (loadedClasses.contains(subclazz)) + continue; + String subFull = fullname + subclazz; + + if (wildcard.startsWith(subFull + ".")) { + if (ClassInfo.isPackage(subFull)) { + Identifier ident = new PackageIdentifier + (bundle, this, subclazz, true); + loadedClasses.put(subclazz, ident); + } else { + ClassIdentifier ident = new ClassIdentifier + (bundle, this, + subclazz, ClassInfo.forName(subFull)); + loadedClasses.put(subclazz, ident); + ((ClassIdentifier) ident).initClass(); + if (bundle.preserveRule != -1) + ident.applyPreserveRule(bundle.preserveRule); + } + } + } + } + Enumeration enum = loadedClasses.elements(); + while (enum.hasMoreElements()) { + Identifier ident = (Identifier) enum.nextElement(); + if (wildcard.startsWith(ident.getFullName()+".")) { + if (ident instanceof PackageIdentifier) + ((PackageIdentifier) ident) + .preserveMatchingIdentifier(wildcard); + else + ((ClassIdentifier) ident) + .preserveMatchingIdentifier(wildcard); + } } } } /** - * @return the full qualified name, including trailing dot. + * @return the full qualified name. */ public String getFullName() { - if (parent != null) - return parent.getFullName() + getName() + "."; - else + if (parent != null) { + if (parent.getFullName().length() > 0) + return parent.getFullName() + "." + getName(); + else + return getName(); + } else return ""; }