1ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba/** 2ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Copyright 2007 Google Inc. 3ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 4ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Licensed under the Apache License, Version 2.0 (the "License"); 5ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * you may not use this file except in compliance with the License. 6ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * You may obtain a copy of the License at 7ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 8ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * http://www.apache.org/licenses/LICENSE-2.0 9ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 10ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Unless required by applicable law or agreed to in writing, software 11ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * distributed under the License is distributed on an "AS IS" BASIS, 12ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * See the License for the specific language governing permissions and 14ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * limitations under the License. 15ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba */ 16ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 17ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibapackage com.tonicsystems.jarjar; 18ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 19ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport com.tonicsystems.jarjar.util.*; 20ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport java.io.File; 21ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport java.io.IOException; 22ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaimport java.util.*; 23ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 24ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosibaclass MainProcessor implements JarProcessor 25ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba{ 26ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private final boolean verbose; 27ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private final JarProcessorChain chain; 28ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private final KeepProcessor kp; 29ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private final Map<String, String> renames = new HashMap<String, String>(); 30ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 31ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba public MainProcessor(List<PatternElement> patterns, boolean verbose, boolean skipManifest) { 32ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba this.verbose = verbose; 33ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba List<Zap> zapList = new ArrayList<Zap>(); 34ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba List<Rule> ruleList = new ArrayList<Rule>(); 35ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba List<Keep> keepList = new ArrayList<Keep>(); 36ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba for (PatternElement pattern : patterns) { 37ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (pattern instanceof Zap) { 38ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba zapList.add((Zap) pattern); 39ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else if (pattern instanceof Rule) { 40ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba ruleList.add((Rule) pattern); 41ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else if (pattern instanceof Keep) { 42ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba keepList.add((Keep) pattern); 43ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 44ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 45ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 46ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba PackageRemapper pr = new PackageRemapper(ruleList, verbose); 47ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba kp = keepList.isEmpty() ? null : new KeepProcessor(keepList); 48ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 49ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba List<JarProcessor> processors = new ArrayList<JarProcessor>(); 50ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (skipManifest) 51ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba processors.add(ManifestProcessor.getInstance()); 52ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (kp != null) 53ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba processors.add(kp); 54ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba processors.add(new ZapProcessor(zapList)); 55ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba processors.add(new JarTransformerChain(new RemappingClassTransformer[]{ new RemappingClassTransformer(pr) })); 56ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba processors.add(new ResourceProcessor(pr)); 57ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba chain = new JarProcessorChain(processors.toArray(new JarProcessor[processors.size()])); 58ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 59ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 60ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba public void strip(File file) throws IOException { 61ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (kp == null) 62ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return; 63ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba Set<String> excludes = getExcludes(); 64ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (!excludes.isEmpty()) 65ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba StandaloneJarProcessor.run(file, file, new ExcludeProcessor(excludes, verbose)); 66ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 67ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 68ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba /** 69ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * Returns the <code>.class</code> files to delete. As well the root-parameter as the rename ones 70ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * are taken in consideration, so that the concerned files are not listed in the result. 71ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 72ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * @return the paths of the files in the jar-archive, including the <code>.class</code> suffix 73ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba */ 74ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba private Set<String> getExcludes() { 75ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba Set<String> result = new HashSet<String>(); 76ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba for (String exclude : kp.getExcludes()) { 77ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String name = exclude + ".class"; 78ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String renamed = renames.get(name); 79ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba result.add((renamed != null) ? renamed : name); 80ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 81ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return result; 82ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 83ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba 84ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba /** 85ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * 86ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * @param struct 87ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * @return <code>true</code> if the entry is to include in the output jar 88ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba * @throws IOException 89ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba */ 90ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba public boolean process(EntryStruct struct) throws IOException { 91ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba String name = struct.name; 92ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba boolean keepIt = chain.process(struct); 93ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (keepIt) { 94ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (!name.equals(struct.name)) { 95ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (kp != null) 96ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba renames.put(name, struct.name); 97ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (verbose) 98ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba System.err.println("Renamed " + name + " -> " + struct.name); 99ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 100ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } else { 101ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba if (verbose) 102ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba System.err.println("Removed " + name); 103ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 104ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba return keepIt; 105ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba } 106ab61347a2cb3254688c42c993278cefd43e5d99dMarcin Kosiba} 107