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