Author: sebb
Date: Thu Jan 15 23:09:20 2015
New Revision: 1652307

URL: http://svn.apache.org/r1652307
Log:
Simplify examples/Main - use predefined properties file to define aliases

Added:
    commons/proper/net/trunk/src/main/java/examples/examples.properties
    commons/proper/net/trunk/src/main/java/examples/telnet/Copy of 
TelnetClientScript.txt
    commons/proper/net/trunk/src/test/java/examples/
    commons/proper/net/trunk/src/test/java/examples/MainTest.java
Modified:
    commons/proper/net/trunk/src/changes/changes.xml
    commons/proper/net/trunk/src/main/java/examples/Main.java

Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1652307&r1=1652306&r2=1652307&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml [utf-8] (original)
+++ commons/proper/net/trunk/src/changes/changes.xml [utf-8] Thu Jan 15 
23:09:20 2015
@@ -68,6 +68,9 @@ This is mainly a bug-fix release. See fu
   IMAPExportMbox (example app) allows IMAP folders to be exported into an mbox 
file.
   This is the inverse of the IMAPImportMbox example added previously
         ">
+            <action type="update" dev="sebb">
+            examples/Main now uses a property file to define aliases instead 
of scanning class files
+            </action>
             <action issue="NET-552" type="fix" dev="sebb" due-to="Quentin 
Devriendt">
             SocketTimeoutException connecting a FTP server via an HTTP Proxy
             </action>

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=1652307&r1=1652306&r2=1652307&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/examples/Main.java (original)
+++ commons/proper/net/trunk/src/main/java/examples/Main.java Thu Jan 15 
23:09:20 2015
@@ -18,15 +18,12 @@
 
 package examples;
 
-import java.io.File;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.CodeSource;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
 
 public class Main {
 
@@ -43,46 +40,31 @@ public class Main {
      * @throws Exception
      */
     public static void main(String[] args) throws Throwable  {
-        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 (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);
-                Enumeration<JarEntry> e = jf.entries();
-                while (e.hasMoreElements()) {
-                  JarEntry je = e.nextElement();
-                  String name = je.getName();
-                  processFileName(name, map, noArgsProvided);
-                }
-                jf.close();
+        final Properties fp = new Properties();
+        fp.load(Main.class.getResourceAsStream("examples.properties"));
+        if (args.length == 0) {
+            if (Thread.currentThread().getStackTrace().length > 2) { // called 
by Maven
+                System.out.println("Usage: mvn -q exec:java  
-Dexec.arguments=<alias or exampleClass>,<exampleClass parameters> 
(comma-separated, no spaces)");
+                System.out.println("Or   : mvn -q exec:java  
-Dexec.args=\"<alias or exampleClass> <exampleClass parameters>\" (space 
separated)");
             } 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);
+                if (fromJar()) { 
+                    System.out.println("Usage: java -jar 
commons-net-examples-m.n.jar <alias or exampleClass> <exampleClass 
parameters>");                
+                } else {
+                    System.out.println("Usage: java -cp target/classes 
examples/Main <alias or exampleClass> <exampleClass parameters>");              
  
                 }
             }
-        } else {
-            if (noArgsProvided) {
-                System.out.println("Usage: java -jar 
commons-net-examples-m.n.jar <exampleClass> <exampleClass parameters>");
+            System.out.println("\nAliases and their classes:");
+            @SuppressWarnings("unchecked") // property names are Strings
+            List<String> l = (List<String>) 
Collections.list(fp.propertyNames());
+            Collections.sort(l);
+            for(String s : l) {
+                System.out.printf("%-25s %s%n",s,fp.getProperty(s));
             }
-        }
-
-        if (noArgsProvided) {
             return;
         }
 
         String shortName = args[0];
-        String fullName = map.get(shortName);
+        String fullName = fp.getProperty(shortName);
         if (fullName == null) {
             fullName = shortName;
         }
@@ -107,36 +89,11 @@ public class Main {
         }
     }
 
-    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 {
-                
-                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);
+    private static boolean fromJar() {
+        final CodeSource codeSource = 
Main.class.getProtectionDomain().getCodeSource();
+        if ( codeSource != null) {
+            return codeSource.getLocation().getFile().endsWith(".jar");
         }
-        map.put(alias, name);
+        return false; // No idea if this can happen
     }
 }

Added: commons/proper/net/trunk/src/main/java/examples/examples.properties
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/examples/examples.properties?rev=1652307&view=auto
==============================================================================
--- commons/proper/net/trunk/src/main/java/examples/examples.properties (added)
+++ commons/proper/net/trunk/src/main/java/examples/examples.properties Thu Jan 
15 23:09:20 2015
@@ -0,0 +1,51 @@
+################################################################################
+# Apache Commons Net Examples Property file
+################################################################################
+
+##   Licensed to the Apache Software Foundation (ASF) under one or more
+##   contributor license agreements.  See the NOTICE file distributed with
+##   this work for additional information regarding copyright ownership.
+##   The ASF licenses this file to You under the Apache License, Version 2.0
+##   (the "License"); you may not use this file except in compliance with
+##   the License.  You may obtain a copy of the License at
+## 
+##       http://www.apache.org/licenses/LICENSE-2.0
+## 
+##   Unless required by applicable law or agreed to in writing, software
+##   distributed under the License is distributed on an "AS IS" BASIS,
+##   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+##   See the License for the specific language governing permissions and
+##   limitations under the License.
+
+# List of aliases for example class names.
+# Note that the "/" separators are converted to "."
+
+#  alias                  full class name
+SubnetUtilsExample        examples/cidr/SubnetUtilsExample
+FTPClientExample          examples/ftp/FTPClientExample
+ServerToServerFTP         examples/ftp/ServerToServerFTP
+TFTPExample               examples/ftp/TFTPExample
+IMAPExportMbox            examples/mail/IMAPExportMbox
+IMAPImportMbox            examples/mail/IMAPImportMbox
+IMAPMail                  examples/mail/IMAPMail
+POP3Mail                  examples/mail/POP3Mail
+SMTPMail                  examples/mail/SMTPMail
+ArticleReader             examples/nntp/ArticleReader
+ExtendedNNTPOps           examples/nntp/ExtendedNNTPOps
+ListNewsgroups            examples/nntp/ListNewsgroups
+MessageThreading          examples/nntp/MessageThreading
+PostMessage               examples/nntp/PostMessage
+NTPClient                 examples/ntp/NTPClient
+SimpleNTPServer           examples/ntp/SimpleNTPServer
+TimeClient                examples/ntp/TimeClient
+TelnetClientExample       examples/telnet/TelnetClientExample
+WeatherTelnet             examples/telnet/WeatherTelnet
+chargen                   examples/unix/chargen
+daytime                   examples/unix/daytime
+echo                      examples/unix/echo
+finger                    examples/unix/finger
+fwhois                    examples/unix/fwhois
+rdate                     examples/unix/rdate
+rexec                     examples/unix/rexec
+rlogin                    examples/unix/rlogin
+rshell                    examples/unix/rshell

Added: commons/proper/net/trunk/src/main/java/examples/telnet/Copy of 
TelnetClientScript.txt
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/examples/telnet/Copy%20of%20TelnetClientScript.txt?rev=1652307&view=auto
==============================================================================
--- commons/proper/net/trunk/src/main/java/examples/telnet/Copy of 
TelnetClientScript.txt (added)
+++ commons/proper/net/trunk/src/main/java/examples/telnet/Copy of 
TelnetClientScript.txt Thu Jan 15 23:09:20 2015
@@ -0,0 +1,75 @@
+package examples.telnet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.SocketTimeoutException;
+
+import org.apache.commons.net.telnet.TelnetClient;
+
+public class TelnetClientScript {
+
+    private final InputStream in;
+    private final OutputStream out;
+    private final TelnetClient telnet = new TelnetClient();
+    TelnetClientScript(String host, int port) throws IOException {
+        telnet.connect(host, port);
+        telnet.setSoTimeout(1000);
+        this.in=telnet.getInputStream();
+        this.out=telnet.getOutputStream();
+    }
+    
+    void login() {
+        
+    }
+    void write(String command) throws IOException {
+        out.write(command.getBytes());
+        out.write('\r');
+        out.write('\n');
+    }
+    
+    void readResponse() {
+        int i;
+        try {
+            while((i=in.read()) != -1){
+                System.out.print((char) i);
+            }
+        } catch (SocketTimeoutException e) {
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+    public static void main(String [] args) throws IOException{
+        if(args.length < 1)
+        {
+            System.err.println("Usage: TelnetClientScriptExample <remote-ip> 
[<remote-port>]");
+            System.exit(1);
+        }
+
+        String remoteip = args[0];
+
+        int remoteport;
+
+        if (args.length > 1)
+        {
+            remoteport = (new Integer(args[1])).intValue();
+        }
+        else
+        {
+            remoteport = 23;
+        }
+
+        TelnetClientScript script = new TelnetClientScript(remoteip, 
remoteport);
+        
+        script.login();
+        script.write("INFORMATION");
+        script.readResponse();
+        System.out.println("--------------------");
+        
+        script.write("INFORMATION");
+        script.readResponse();
+        System.out.println("--------------------");
+    }
+
+}

Added: commons/proper/net/trunk/src/test/java/examples/MainTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/test/java/examples/MainTest.java?rev=1652307&view=auto
==============================================================================
--- commons/proper/net/trunk/src/test/java/examples/MainTest.java (added)
+++ commons/proper/net/trunk/src/test/java/examples/MainTest.java Thu Jan 15 
23:09:20 2015
@@ -0,0 +1,102 @@
+package examples;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.CodeSource;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.junit.Test;
+
+public class MainTest {
+
+    @Test
+    public void checkExamplesPropertiesIsComplete() throws Exception {
+        Properties cp = scanClasses();
+        Properties fp = new Properties();
+        fp.load(this.getClass().getResourceAsStream("examples.properties"));
+        for(String c : cp.stringPropertyNames()) {
+            String fv = fp.getProperty(c); 
+            final String cv = cp.getProperty(c);
+            if (fv == null) {
+                System.out.printf("%-25s %s - missing from 
examples.properties%n",c,cv);
+            } else if (!fv.equals(cv)) {
+                System.out.printf("%-25s %s - expected value %s %n",c,fv,cv);
+            }
+        }
+    }
+
+    private Properties scanClasses() throws IOException {
+        CodeSource codeSource = 
Main.class.getProtectionDomain().getCodeSource();
+        final String sourceFile = codeSource.getLocation().getFile();
+        Properties p = new Properties();
+        if (sourceFile.endsWith(".jar")) {
+            JarFile jf = new JarFile(sourceFile);
+            Enumeration<JarEntry> e = jf.entries();
+            while (e.hasMoreElements()) {
+              JarEntry je = e.nextElement();
+              String name = je.getName();
+              processFileName(name, p);
+            }
+            jf.close();
+        } else {
+            File examples = new File(sourceFile, "examples"); // must match 
top level examples package name
+            if (examples.exists()) {
+                scanForClasses(sourceFile.length(), examples, p);
+            } else {
+                fail("Could not find examples classes");
+            }
+        }
+        return p;
+    }
+
+    private static void scanForClasses(int rootLength, File current, 
Properties p) {
+        for(File file : current.listFiles()) {
+            if (file.isDirectory()) {
+                scanForClasses(rootLength, file, p);
+            } else {                
+                processFileName(file.getPath().substring(rootLength), p);
+            }
+        }        
+    }
+
+    private static void processFileName(String name, Properties p) {
+        if (!name.endsWith(".class")
+                || name.contains("$") // subclasses
+                || name.equals("examples/Main.class")  // the initial class, 
don't want to add that
+                || !hasMainMethod(name)
+                ) {
+            return;
+        }
+        name = name.replace(".class", "");
+        final int lastSep = name.lastIndexOf('/');
+        final String alias = name.substring(lastSep+1);
+        if (p.containsKey(alias)) {
+            System.out.printf("Duplicate alias: %-25s %s %s 
%n",alias,name,p.getProperty(alias));            
+        } else {
+            p.setProperty(alias, name);
+        }
+    }
+
+    private static boolean hasMainMethod(String name) {
+        name = name.replace(".class", "");
+        name = name.replace("/", ".");
+        try {
+            Class<?> clazz = Class.forName(name, false, 
MainTest.class.getClassLoader());
+            clazz.getMethod("main", new Class[]{String[].class});
+            return true;
+        } catch (ClassNotFoundException e) {
+            System.out.println("Cannot find " + name);
+            return false;
+        } catch (NoSuchMethodException e) {
+            return false;
+        } catch (SecurityException e) {
+            e.printStackTrace();
+        }
+        return true;
+    }
+}


Reply via email to