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