##### Coverage Report - org.apache.any23.cli.ToolRunner

Classes in this File | Line Coverage | Branch Coverage | Complexity
ToolRunner |
0% | 0/51
0% | 0/22
| 3.6;3.6
ToolRunner$Description |
N/A | N/A
N/A | N/A
| 3.6;3.6
ToolRunner$Skip |
N/A | N/A
N/A | N/A
| 3.6;3.6

1 |  |
     /*
2 |  |
      * Licensed to the Apache Software Foundation (ASF) under one or more
3 |  |
      * contributor license agreements.  See the NOTICE file distributed with
4 |  |
      * this work for additional information regarding copyright ownership.
5 |  |
      * The ASF licenses this file to You under the Apache License, Version 2.0
6 |  |
      * (the "License"); you may not use this file except in compliance with
7 |  |
      * the License.  You may obtain a copy of the License at
8 |  |
      *
9 |  |
      *  http://www.apache.org/licenses/LICENSE-2.0
10 |  |
      *
11 |  |
      * Unless required by applicable law or agreed to in writing, software
12 |  |
      * distributed under the License is distributed on an "AS IS" BASIS,
13 |  |
      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 |  |
      * See the License for the specific language governing permissions and
15 |  |
      * limitations under the License.
16 |  |
      */
17 |  |
18 |  |
     package org.apache.any23.cli;
19 |  |
20 |  |
     import org.apache.any23.plugin.Any23PluginManager;
21 |  |
22 |  |
     import java.io.File;
23 |  |
     import java.io.IOException;
24 |  |
     import java.lang.annotation.ElementType;
25 |  |
     import java.lang.annotation.Retention;
26 |  |
     import java.lang.annotation.RetentionPolicy;
27 |  |
     import java.lang.annotation.Target;
28 |  |
29 |  |
     /**
30 |  |
      * This class is the main class responsible to provide a uniform command-line
31 |  |
      * access points to all the others tools like {@link Rover}.
32 |  |
      *
33 |  |
      * @see ExtractorDocumentation
34 |  |
      * @see Rover
35 |  |
      */
36 |  |
     @ToolRunner.Skip
37 | 0 |
     public class ToolRunner {
38 |  |
39 | 0 |
         public static final File HOME_PLUGIN_DIR = new File(
40 |  |
                 new File(System.getProperty("user.home")),
41 |  |
                 ".any23/plugins"
42 |  |
         );
43 |  |
44 | 0 |
         private static final String USAGE = String.format(
45 |  |
                 "Usage: %s <utility> [options...]",
46 |  |
                 ToolRunner.class.getSimpleName()
47 |  |
         );
48 |  |
49 |  |
         public static void main(String[] args) throws IOException {
50 |  |
             //Generate automatically the cli.
51 | 0 |
             final Class<Tool>[] tools = getToolsInClasspath();
52 |  |
             try {
53 | 0 |
                 if (args.length < 1) {
54 | 0 |
                     usage(null, tools);
55 |  |
                 }
56 |  |
57 | 0 |
                 final String toolName = args[0];
58 | 0 |
                 Class<Tool> targetTool = null;
59 | 0 |
                 for(Class<Tool> tool : tools) {
60 | 0 |
                     if(tool.getSimpleName().equals(toolName)) {
61 | 0 |
                         targetTool = tool;
62 | 0 |
                         break;
63 |  |
                     }
64 |  |
                 }
65 | 0 |
                 if(targetTool == null) {
66 | 0 |
                     usage( String.format("[%s] is not a valid tool name.", toolName), tools);
67 | 0 |
                     throw new IllegalStateException();
68 |  |
                 }
69 |  |
70 | 0 |
                 String[] mainArgs = new String[args.length - 1];
71 | 0 |
                 System.arraycopy(args, 1, mainArgs, 0, mainArgs.length);
72 | 0 |
                 final Tool targetToolInstance = targetTool.newInstance();
73 | 0 |
                 targetToolInstance.run(mainArgs);
74 | 0 |
             } catch (Throwable e) {
75 | 0 |
                 e.printStackTrace();
76 | 0 |
                 Throwable cause = e.getCause();
77 | 0 |
                 if(cause != null) cause.printStackTrace();
78 | 0 |
                 usage(e.toString(), null);
79 | 0 |
             }
80 | 0 |
         }
81 |  |
82 |  |
         public static Class<Tool>[] getToolsInClasspath() throws IOException {
83 | 0 |
             final Any23PluginManager pluginManager =  Any23PluginManager.getInstance();
84 | 0 |
             if(HOME_PLUGIN_DIR.exists()) {
85 | 0 |
                 pluginManager.loadJARDir(HOME_PLUGIN_DIR);
86 |  |
             }
87 | 0 |
             return pluginManager.getTools();
88 |  |
         }
89 |  |
90 |  |
         private static String padLeft(String s, int n) {
91 | 0 |
             return String.format("%1$#" + n + "s", s);
92 |  |
         }
93 |  |
94 |  |
         private static String getUtilitiesMessage(Class<Tool>[] toolClasses) {
95 | 0 |
             StringBuffer sb = new StringBuffer();
96 | 0 |
             sb.append(" where <utility> is one of:\n");
97 |  |
             Description description;
98 |  |
             String utilityName;
99 |  |
             int padding;
100 | 0 |
             for (Class<Tool> toolClass :  toolClasses) {
101 | 0 |
                 utilityName = toolClass.getSimpleName();
102 | 0 |
                 sb.append("\t").append(utilityName);
103 | 0 |
                 description = toolClass.getAnnotation(Description.class);
104 | 0 |
                 padding = 100 - utilityName.length();
105 | 0 |
                 if (description != null) {
106 | 0 |
                     sb.append( padLeft( description.value(), padding >= 0 ? padding : 0) );
107 |  |
                 }
108 | 0 |
                 sb.append('\n');
109 |  |
             }
110 | 0 |
             return sb.toString();
111 |  |
         }
112 |  |
113 |  |
         private static void usage(String msg, Class<Tool>[] utilities) {
114 | 0 |
             if(msg != null) {
115 | 0 |
                 System.err.println("*** ERROR: " + msg);
116 | 0 |
                 System.err.println();
117 |  |
             }
118 | 0 |
             System.err.println(USAGE);
119 | 0 |
             if(utilities != null) {
120 | 0 |
                 System.err.println( getUtilitiesMessage(utilities) );
121 |  |
             }
122 | 0 |
             System.exit(1);
123 | 0 |
         }
124 |  |
125 |  |
         @Retention(RetentionPolicy.RUNTIME)
126 |  |
         @Target(ElementType.TYPE)
127 |  |
         public @interface Skip {}
128 |  |
129 | 0 |
         @Retention(RetentionPolicy.RUNTIME)
130 |  |
         @Target(ElementType.TYPE)
131 |  |
         public @interface Description { String value();  }
132 |  |
133 |  |
     }
134 |  |