KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > yworks > yguard > Conversion


1 /**
2  * YGuard -- an obfuscation library for Java(TM) classfiles.
3  *
4  * Copyright (c) 2002 yWorks GmbH (yguard@yworks.com)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  * The author may be contacted at yguard@yworks.com
21  *
22  * Java and all Java-based marks are trademarks or registered
23  * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
24  */

25 package com.yworks.yguard;
26
27 import com.yworks.yguard.obf.ClassTree;
28 import java.util.StringTokenizer JavaDoc;
29
30 /**
31  *
32  * @author muellese
33  */

34 public class Conversion
35 {
36   
37   /** Creates a new instance of Conversion */
38   protected Conversion(){}
39
40   public static String JavaDoc toJavaClass(String JavaDoc className){
41       if (className.endsWith(".class")){
42         className = className.substring(0, className.length()- 6);
43       }
44       return className.replace('/','.');
45   }
46  
47
48   public static String JavaDoc toJavaType(String JavaDoc type){
49       StringBuffer JavaDoc nat = new StringBuffer JavaDoc(30);
50       int arraydim = 0;
51       while (type.charAt(arraydim)=='[') arraydim++;
52       type = type.substring(arraydim);
53       switch (type.charAt(0)){
54         default:
55           throw new IllegalArgumentException JavaDoc("unknown native type:"+type);
56         case 'B':
57           nat.append("byte");
58           break;
59         case 'C':
60           nat.append("char");
61           break;
62         case 'D':
63           nat.append("double");
64           break;
65         case 'F':
66           nat.append("float");
67           break;
68         case 'I':
69           nat.append("int");
70           break;
71         case 'J':
72           nat.append("long");
73           break;
74         case 'S':
75           nat.append("short");
76           break;
77         case 'Z':
78           nat.append("boolean");
79           break;
80         case 'V':
81           nat.append("void");
82           break;
83         case 'L':
84           String JavaDoc className = type.substring(1, type.length()-1);
85           if (className.indexOf('<') >= 0){
86             String JavaDoc parameters = type.substring(className.indexOf('<') + 2, className.lastIndexOf('>') - 1);
87             className = className.substring(0, className.indexOf('<') );
88             nat.append(className.replace('/','.'));
89             nat.append('<');
90             nat.append(toJavaParameters(parameters));
91             nat.append('>');
92           } else {
93             nat.append(className.replace('/','.'));
94           }
95           break;
96       }
97       for (int i = 0; i < arraydim; i++){
98           nat.append("[]");
99       }
100       return nat.toString();
101   }
102   
103     /** Mapping for signatures (used for generics in 1.5).
104      * @see com.yworks.yguard.obf.classfile.NameMapper#mapSignature */

105     public static String JavaDoc mapSignature(String JavaDoc signature){
106       return new ClassTree().mapSignature(signature);
107     }
108
109   
110   public static String JavaDoc toJavaParameters(String JavaDoc parameters){
111     StringBuffer JavaDoc nat = new StringBuffer JavaDoc(30);
112     switch (parameters.charAt(0)){
113         default:
114           throw new IllegalArgumentException JavaDoc("unknown native type:"+parameters.charAt(0));
115         case '+':
116           nat.append("? extends ").append(toJavaParameters(parameters.substring(1)));
117           break;
118         case '-':
119           nat.append("? super ").append(toJavaParameters(parameters.substring(1)));
120           break;
121         case '*':
122           nat.append("*");
123           if (parameters.length() > 1){
124             nat.append(", ").append(toJavaParameters(parameters.substring(1)));
125           }
126           break;
127         case 'B':
128           nat.append("byte");
129           break;
130         case 'C':
131           nat.append("char");
132           break;
133         case 'D':
134           nat.append("double");
135           break;
136         case 'F':
137           nat.append("float");
138           break;
139         case 'I':
140           nat.append("int");
141           break;
142         case 'J':
143           nat.append("long");
144           break;
145         case 'S':
146           nat.append("short");
147           break;
148         case 'Z':
149           nat.append("boolean");
150           break;
151         case 'V':
152           nat.append("void");
153           break;
154         case 'L':
155           int len = parameters.indexOf('<');
156           if (len >= 0){
157             len = Math.min(len, parameters.indexOf(';'));
158           }
159           break;
160         case 'T':
161           int index = parameters.indexOf(';');
162           nat.append(parameters.substring(1, index));
163           if (parameters.length() > index){
164             nat.append(", ");
165             nat.append(parameters.substring(index));
166           }
167           break;
168     }
169     return nat.toString();
170   }
171   
172   public static String JavaDoc toJavaMethod(String JavaDoc name, String JavaDoc signature){
173     String JavaDoc argsonly = signature.substring(signature.indexOf('(')+1);
174     String JavaDoc ret = signature.substring(signature.indexOf(')')+1);
175     ret = toJavaType(ret);
176     StringBuffer JavaDoc args = new StringBuffer JavaDoc();
177     args.append('(');
178     if (argsonly.indexOf(')')>0){
179       argsonly = argsonly.substring(0,argsonly.indexOf(')'));
180       toJavaArguments(argsonly, args);
181     }
182     args.append(')');
183     return ret+" "+name+args.toString();
184   }
185
186   public static String JavaDoc toJavaArguments(String JavaDoc args){
187     StringBuffer JavaDoc b= new StringBuffer JavaDoc(args.length() + 32);
188     toJavaArguments(args, b);
189     return b.toString();
190   }
191
192   private static void toJavaArguments(String JavaDoc argsonly, StringBuffer JavaDoc args) {
193     int argcount = 0;
194     int pos = 0;
195     StringBuffer JavaDoc arg = new StringBuffer JavaDoc(20);
196     while (pos < argsonly.length()){
197       while (argsonly.charAt(pos) == '['){
198         arg.append('[');
199         pos++;
200       }
201       if (argsonly.charAt(pos) == 'L'){
202         while (argsonly.charAt(pos) != ';'){
203           arg.append(argsonly.charAt(pos));
204           pos++;
205         }
206         arg.append(';');
207         if (argcount > 0){
208           args.append(',');
209           args.append(' ');
210         }
211         args.append(toJavaType(arg.toString()));
212         argcount++;
213         arg.setLength(0);
214         pos++;
215       } else {
216         arg.append(argsonly.charAt(pos));
217         if (argcount > 0){
218           args.append(',');
219           args.append(' ');
220         }
221         args.append(toJavaType(arg.toString()));
222         argcount++;
223         arg.setLength(0);
224         pos++;
225       }
226     }
227   }
228 }
229
Popular Tags