View Javadoc

1   /**
2    * Copyright 2007 Google Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.tonicsystems.jarjar.util;
18  
19  import java.io.*;
20  import org.objectweb.asm.ClassReader;
21  import org.objectweb.asm.ClassVisitor;
22  import org.objectweb.asm.ClassWriter;
23  
24  abstract public class JarTransformer implements JarProcessor
25  {
26      public boolean process(EntryStruct struct) throws IOException {
27          if (struct.name.endsWith(".class")) {
28              ClassReader reader;
29              try {
30                  reader = new ClassReader(struct.data);
31              } catch (Exception e) {
32                  return true; // TODO?
33              }
34              GetNameClassWriter w = new GetNameClassWriter(ClassWriter.COMPUTE_MAXS);
35              reader.accept(transform(w), ClassReader.EXPAND_FRAMES);
36              struct.data = w.toByteArray();
37              struct.name = pathFromName(w.getClassName());
38          }
39          return true;
40      }
41  
42      abstract protected ClassVisitor transform(ClassVisitor v);
43  
44      private static String pathFromName(String className) {
45          return className.replace('.', '/') + ".class";
46      }
47  }