Author: sebb Date: Tue Jan 6 15:21:50 2015 New Revision: 1649830 URL: http://svn.apache.org/r1649830 Log: Enable alias mechanism to work from the classpath Better output when class not found
Modified: commons/proper/net/trunk/src/main/java/examples/Main.java Modified: commons/proper/net/trunk/src/main/java/examples/Main.java URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/examples/Main.java?rev=1649830&r1=1649829&r2=1649830&view=diff ============================================================================== --- commons/proper/net/trunk/src/main/java/examples/Main.java (original) +++ commons/proper/net/trunk/src/main/java/examples/Main.java Tue Jan 6 15:21:50 2015 @@ -18,6 +18,7 @@ package examples; +import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.CodeSource; @@ -37,19 +38,19 @@ public class Main { * * @param args the first argument is used to name the class; remaining arguments * are passed to the target class. + * @param sourcefile * @throws Exception * @throws Exception */ public static void main(String[] args) throws Throwable { - if (args.length==0) { - System.out.println("Usage: java -jar commons-net-examples-m.n.jar <exampleClass> <exampleClass parameters>"); - } CodeSource codeSource = Main.class.getProtectionDomain().getCodeSource(); Map<String, String> map = new HashMap<String, String>(); + final boolean noArgsProvided = args.length == 0; if ( codeSource != null) { final String sourceFile = codeSource.getLocation().getFile(); if (sourceFile.endsWith(".jar")) { - if (args.length==0) { + if (noArgsProvided) { + System.out.println("Usage: java -jar commons-net-examples-m.n.jar <exampleClass> <exampleClass parameters>"); System.out.println("\nClasses found in the jar:"); } JarFile jf = new JarFile(sourceFile); @@ -57,28 +58,26 @@ public class Main { while (e.hasMoreElements()) { JarEntry je = e.nextElement(); String name = je.getName(); - if (!name.endsWith(".class") - || name.contains("$") // subclasses - // TODO use reflection to eliminate non-mail classes? - || name.equals("examples/nntp/NNTPUtils.class") // no main class - || name.equals("examples/util/IOUtil.class") // no main class - || name.equals("examples/mail/IMAPUtils.class") // no main class - || name.equals("examples/Main.class")) { // ourself - continue; - } - name = name.replace(".class", ""); - int lastSep = name.lastIndexOf('/'); - String alias = name.substring(lastSep+1); - if (args.length==0) { - System.out.printf("%-25s %s%n",alias,name); - } - map.put(alias, name); + processFileName(name, map, noArgsProvided); } jf.close(); + } else { + if (noArgsProvided) { + System.out.println("Usage: mvn -q exec:java -Dexec.arguments=<exampleClass>,<exampleClass parameters>"); + System.out.println("\nClasses found in the jar:"); + } + File examples = new File(sourceFile, "examples"); + if (examples.exists()) { + scanForClasses(sourceFile.length(), examples, map, noArgsProvided); + } + } + } else { + if (noArgsProvided) { + System.out.println("Usage: java -jar commons-net-examples-m.n.jar <exampleClass> <exampleClass parameters>"); } } - if (args.length==0) { + if (noArgsProvided) { return; } @@ -88,19 +87,56 @@ public class Main { fullName = shortName; } fullName = fullName.replace('/', '.'); - Class<?> clazz = Class.forName(fullName); - Method m = clazz.getDeclaredMethod("main", new Class[]{args.getClass()}); - String[] args2 = new String[args.length-1]; - System.arraycopy(args, 1, args2, 0, args2.length); try { - m.invoke(null, (Object)args2); - } catch (InvocationTargetException ite) { - Throwable cause = ite.getCause(); - if (cause != null) { - throw cause; + Class<?> clazz = Class.forName(fullName); + Method m = clazz.getDeclaredMethod("main", new Class[]{args.getClass()}); + String[] args2 = new String[args.length-1]; + System.arraycopy(args, 1, args2, 0, args2.length); + try { + m.invoke(null, (Object)args2); + } catch (InvocationTargetException ite) { + Throwable cause = ite.getCause(); + if (cause != null) { + throw cause; + } else { + throw ite; + } + } + } catch (ClassNotFoundException e) { + System.out.println(e); + } + } + + private static void scanForClasses(int rootLength, File current, Map<String, String> map, boolean printAlias) { + for(File file : current.listFiles()) { + if (file.isDirectory()) { + scanForClasses(rootLength, file, map, printAlias); } else { - throw ite; + + processFileName(file.getPath().substring(rootLength), map, printAlias); + } } + + } + + private static void processFileName(String name, Map<String, String> map, boolean printAlias) { + if (!name.endsWith(".class") + || name.contains("$") // subclasses + // TODO use reflection to eliminate non-main classes? + // however that would entail loading the class. + || name.equals("examples/nntp/NNTPUtils.class") // no main class + || name.equals("examples/util/IOUtil.class") // no main class + || name.equals("examples/mail/IMAPUtils.class") // no main class + || name.equals("examples/Main.class")) { // ourself + return; + } + name = name.replace(".class", ""); + final int lastSep = name.lastIndexOf('/'); + final String alias = name.substring(lastSep+1); + if (printAlias) { + System.out.printf("%-25s %s%n",alias,name); + } + map.put(alias, name); } }