MainProcessor.java revision ab61347a2cb3254688c42c993278cefd43e5d99d
125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/** 225b3c049e70834cf33790a28643ab058b507b35cBen Cheng * Copyright 2007 Google Inc. 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng * 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 525b3c049e70834cf33790a28643ab058b507b35cBen Cheng * you may not use this file except in compliance with the License. 625b3c049e70834cf33790a28643ab058b507b35cBen Cheng * You may obtain a copy of the License at 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng * 825b3c049e70834cf33790a28643ab058b507b35cBen Cheng * http://www.apache.org/licenses/LICENSE-2.0 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng * 1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng * Unless required by applicable law or agreed to in writing, software 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng * distributed under the License is distributed on an "AS IS" BASIS, 1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng * See the License for the specific language governing permissions and 1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng * limitations under the License. 1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng */ 1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1725b3c049e70834cf33790a28643ab058b507b35cBen Chengpackage com.tonicsystems.jarjar; 1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1925b3c049e70834cf33790a28643ab058b507b35cBen Chengimport com.tonicsystems.jarjar.util.*; 2025b3c049e70834cf33790a28643ab058b507b35cBen Chengimport java.io.File; 2125b3c049e70834cf33790a28643ab058b507b35cBen Chengimport java.io.IOException; 2225b3c049e70834cf33790a28643ab058b507b35cBen Chengimport java.util.*; 2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2425b3c049e70834cf33790a28643ab058b507b35cBen Chengclass MainProcessor implements JarProcessor 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng{ 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng private final boolean verbose; 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng private final JarProcessorChain chain; 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng private final KeepProcessor kp; 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng private final Map<String, String> renames = new HashMap<String, String>(); 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng public MainProcessor(List<PatternElement> patterns, boolean verbose, boolean skipManifest) { 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng this.verbose = verbose; 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng List<Zap> zapList = new ArrayList<Zap>(); 3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng List<Rule> ruleList = new ArrayList<Rule>(); 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng List<Keep> keepList = new ArrayList<Keep>(); 3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng for (PatternElement pattern : patterns) { 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (pattern instanceof Zap) { 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng zapList.add((Zap) pattern); 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } else if (pattern instanceof Rule) { 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng ruleList.add((Rule) pattern); 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng } else if (pattern instanceof Keep) { 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng keepList.add((Keep) pattern); 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng PackageRemapper pr = new PackageRemapper(ruleList, verbose); 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng kp = keepList.isEmpty() ? null : new KeepProcessor(keepList); 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng List<JarProcessor> processors = new ArrayList<JarProcessor>(); 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (skipManifest) 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng processors.add(ManifestProcessor.getInstance()); 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (kp != null) 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng processors.add(kp); 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng processors.add(new ZapProcessor(zapList)); 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng processors.add(new JarTransformerChain(new RemappingClassTransformer[]{ new RemappingClassTransformer(pr) })); 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng processors.add(new ResourceProcessor(pr)); 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng chain = new JarProcessorChain(processors.toArray(new JarProcessor[processors.size()])); 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng public void strip(File file) throws IOException { 6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (kp == null) 6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng return; 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng Set<String> excludes = getExcludes(); 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (!excludes.isEmpty()) 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng StandaloneJarProcessor.run(file, file, new ExcludeProcessor(excludes, verbose)); 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng /** 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng * Returns the <code>.class</code> files to delete. As well the root-parameter as the rename ones 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng * are taken in consideration, so that the concerned files are not listed in the result. 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng * 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng * @return the paths of the files in the jar-archive, including the <code>.class</code> suffix 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng */ 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng private Set<String> getExcludes() { 7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng Set<String> result = new HashSet<String>(); 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng for (String exclude : kp.getExcludes()) { 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng String name = exclude + ".class"; 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng String renamed = renames.get(name); 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng result.add((renamed != null) ? renamed : name); 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng return result; 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng /** 8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng * 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng * @param struct 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng * @return <code>true</code> if the entry is to include in the output jar 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng * @throws IOException 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng */ 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng public boolean process(EntryStruct struct) throws IOException { 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng String name = struct.name; 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng boolean keepIt = chain.process(struct); 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (keepIt) { 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (!name.equals(struct.name)) { 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (kp != null) 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng renames.put(name, struct.name); 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (verbose) 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng System.err.println("Renamed " + name + " -> " + struct.name); 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng } else { 10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (verbose) 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng System.err.println("Removed " + name); 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng return keepIt; 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng} 10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng