1 26 package com.yworks.yguard.obf; 27 28 import com.yworks.yguard.obf.classfile.Logger; 29 30 import java.io.*; 31 import java.lang.reflect.*; 32 import java.util.*; 33 34 39 abstract public class PkCl extends TreeItem 40 { 41 43 44 46 protected Hashtable cls = new Hashtable(); 47 48 49 51 52 54 public PkCl(TreeItem parent, String name) 55 { 56 super(parent, name); 57 } 58 59 60 public Cl getClass(String name) {return (Cl)cls.get(name);} 61 62 63 public Enumeration getClassEnum() {return cls.elements();} 64 65 66 public Enumeration getAllClassEnum() 67 { 68 Vector allClasses = new Vector(); 69 addAllClasses(allClasses); 70 return allClasses.elements(); 71 } 72 73 protected void addAllClasses(Vector allClasses) 74 { 75 for (Enumeration enumeration = cls.elements(); enumeration.hasMoreElements(); ) 76 { 77 Cl cl = (Cl)enumeration.nextElement(); 78 allClasses.addElement(cl); 79 cl.addAllClasses(allClasses); 80 } 81 } 82 83 84 public int getClassCount() {return cls.size();} 85 86 87 abstract public Cl addClass(String name, String superName, String [] interfaceNames, int modifiers) ; 88 89 90 91 public Cl addClass(boolean isInnerClass, String name, String superName, String [] interfaceNames, int modifiers) 92 { 93 Cl cl = getClass(name); 94 95 PlaceholderCl plClassItem = null; 97 if (cl instanceof PlaceholderCl) 98 { 99 plClassItem = (PlaceholderCl)cl; 100 cls.remove(name); 101 cl = null; 102 } 103 104 if (cl == null) 106 { 107 cl = new Cl(this, isInnerClass, name, superName, interfaceNames, modifiers); 108 cls.put(name, cl); 109 } 110 111 if (plClassItem != null) 113 { 114 for (Enumeration enumeration = plClassItem.getClassEnum(); enumeration.hasMoreElements(); ) 115 { 116 Cl innerCl = (Cl)enumeration.nextElement(); 117 innerCl.setParent(cl); 118 cl.addClass(innerCl); 119 } 120 } 121 return cl; 122 } 123 124 125 abstract public Cl addPlaceholderClass(String name) ; 126 127 128 public Cl addPlaceholderClass(boolean isInnerClass, String name) 129 { 130 Cl cl = getClass(name); 131 if (cl == null) 132 { 133 cl = new PlaceholderCl(this, isInnerClass, name); 134 cls.put(name, cl); 135 } 136 return cl; 137 } 138 139 140 public void generateNames() 141 { 142 generateNames(cls); 143 } 144 145 146 protected void generateNames(Hashtable hash) 147 { 148 Vector vec = new Vector(); 149 for (Enumeration enumeration = hash.elements(); enumeration.hasMoreElements(); ) 150 { 151 TreeItem ti = (TreeItem)enumeration.nextElement(); 152 if (ti.isFixed()) 153 { 154 vec.addElement(ti.getOutName()); 155 } 156 } 157 String [] noObfNames = new String [vec.size()]; 158 for (int i = 0; i < noObfNames.length; i++) 159 { 160 noObfNames[i] = (String )vec.elementAt(i); 161 } 162 NameMakerFactory nmf = NameMakerFactory.getInstance(); 163 for (Enumeration enumeration = hash.elements(); enumeration.hasMoreElements(); ) 164 { 165 TreeItem ti = (TreeItem)enumeration.nextElement(); 166 if (!ti.isFixed()) 167 { 168 if (ti instanceof Cl && ((Cl)ti).isInnerClass()){ 169 NameMaker innerClassNameMaker = nmf.getInnerClassNameMaker(noObfNames, getFullInName()); 170 ti.setOutName(innerClassNameMaker.nextName(null)); 171 } else if (ti instanceof Pk){ 172 NameMaker packageNameMaker = nmf.getPackageNameMaker(noObfNames, getFullInName()); 173 ti.setOutName(packageNameMaker.nextName(null)); 174 } else { 175 NameMaker classNameMaker = nmf.getClassNameMaker(noObfNames, getFullInName()); 176 boolean newNameFound = true; 177 Cl.ClassResolver resolver = Cl.getClassResolver(); 178 do { 179 ti.setOutName(classNameMaker.nextName(null)); 180 String newName = ti.getFullOutName(); 181 try{ 182 resolver.resolve(newName); 183 newNameFound = false; 184 } catch (ClassNotFoundException cnfe){ 185 newNameFound = true; 186 } 187 } while (!newNameFound); 188 } 189 } 190 } 191 } 192 } 193 194 | Popular Tags |