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;
18 
19 import com.tonicsystems.jarjar.util.*;
20 import java.io.*;
21 import java.util.*;
22 
23 public class Main {
24 
25   private static final String LINE_SEPARATOR = System.getProperty("line.separator");
26   private static final String HELP;
27 
28   static {
29     try {
30       HELP = readIntoString(Main.class.getResourceAsStream("help.txt"));
31     } catch (IOException e) {
32       throw new RuntimeIOException(e);
33     }
34   }
35 
readIntoString(InputStream in)36   private static String readIntoString(InputStream in) throws IOException {
37       StringBuilder sb = new StringBuilder();
38       BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8"));
39       String line = null;
40       while ((line = r.readLine()) != null)
41           sb.append(line).append(LINE_SEPARATOR);
42       return sb.toString();
43   }
44 
45   private boolean verbose;
46   private List patterns;
47   private int level = DepHandler.LEVEL_CLASS;
48 
main(String[] args)49   public static void main(String[] args) throws Exception {
50     MainUtil.runMain(new Main(), args, "help");
51   }
52 
help()53   public void help() {
54     System.err.print(HELP);
55   }
56 
strings(String cp)57   public void strings(String cp) throws IOException {
58     if (cp == null) {
59       throw new IllegalArgumentException("cp is required");
60     }
61     new StringDumper().run(cp, new PrintWriter(System.out));
62   }
63 
64   // TODO: make level an enum
find(String level, String cp1, String cp2)65   public void find(String level, String cp1, String cp2) throws IOException {
66     if (level == null || cp1 == null) {
67       throw new IllegalArgumentException("level and cp1 are required");
68     }
69     if (cp2 == null) {
70       cp2 = cp1;
71     }
72     int levelFlag;
73     if ("class".equals(level)) {
74       levelFlag = DepHandler.LEVEL_CLASS;
75     } else if ("jar".equals(level)) {
76       levelFlag = DepHandler.LEVEL_JAR;
77     } else {
78       throw new IllegalArgumentException("unknown level " + level);
79     }
80     PrintWriter w = new PrintWriter(System.out);
81     DepHandler handler = new TextDepHandler(w, levelFlag);
82     new DepFind().run(cp1, cp2, handler);
83     w.flush();
84   }
85 
process(File rulesFile, File inJar, File outJar)86   public void process(File rulesFile, File inJar, File outJar) throws IOException {
87     if (rulesFile == null || inJar == null || outJar == null) {
88       throw new IllegalArgumentException("rulesFile, inJar, and outJar are required");
89     }
90     List<PatternElement> rules = RulesFileParser.parse(rulesFile);
91     boolean verbose = Boolean.getBoolean("verbose");
92     boolean skipManifest = Boolean.getBoolean("skipManifest");
93     MainProcessor proc = new MainProcessor(rules, verbose, skipManifest);
94     StandaloneJarProcessor.run(inJar, outJar, proc);
95     proc.strip(outJar);
96   }
97 }
98