Revision: 5611
          http://jnode.svn.sourceforge.net/jnode/?rev=5611&view=rev
Author:   lsantha
Date:     2009-07-17 06:43:50 +0000 (Fri, 17 Jul 2009)

Log Message:
-----------
Prototype for new 'java' command.

Added Paths:
-----------
    trunk/core/src/test/org/jnode/test/core/IsolatedJavaTest.java

Added: trunk/core/src/test/org/jnode/test/core/IsolatedJavaTest.java
===================================================================
--- trunk/core/src/test/org/jnode/test/core/IsolatedJavaTest.java               
                (rev 0)
+++ trunk/core/src/test/org/jnode/test/core/IsolatedJavaTest.java       
2009-07-17 06:43:50 UTC (rev 5611)
@@ -0,0 +1,227 @@
+package org.jnode.test.core;
+
+import javax.isolate.Isolate;
+import javax.isolate.IsolateStartupException;
+import javax.isolate.Link;
+import javax.isolate.LinkMessage;
+import javax.isolate.IsolateStatus;
+import java.lang.reflect.Field;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes;
+import org.jnode.vm.isolate.VmIsolate;
+
+/**
+ * Prototype for new isolates based "java" command.
+ */
+public class IsolatedJavaTest {
+    private List<URL> classPath = new ArrayList<URL>();
+    private Properties properties;
+    private String mainClass;
+    private String[] classArgs;
+
+    public void run(String[] args) {
+        for (int i = 0; i < args.length; i++) {
+            String arg = args[i];
+            if ("-cp".equals(arg) || "-classpath".equals(arg)) {
+                if (arg.length() > i + 1) {
+                    parseClasspath(args[i + 1]);
+                    i++;
+                } else {
+                    //error
+                }
+            } else if (arg.startsWith("-D")) {
+                parseSystemProperty(arg);
+            } else if (arg.startsWith("-jar")) {
+                if (arg.length() > i + 1) {
+                    parseJarAndArgs(args, i);
+                    break;
+                } else {
+                    //error
+                }
+            } else if (
+                "-d32".equals(arg) ||
+                    "-d64".equals(arg) ||
+                    "-client".equals(arg) ||
+                    "-server".equals(arg) ||
+                    "-hotspot".equals(arg) ||
+                    arg.startsWith("-verbose") ||
+                    arg.startsWith("-version") ||
+                    "-showversion".equals(arg) ||
+                    "-jre-restrict-search".equals(arg) ||
+                    "-jre-no-restrict-search".equals(arg) ||
+                    "-help".equals(arg) ||
+                    "-?".equals(arg) ||
+                    "-X".equals(arg) ||
+                    arg.startsWith("-X") ||
+                    arg.startsWith("-ea") ||
+                    arg.startsWith("-enableassertions") ||
+                    arg.startsWith("-da") ||
+                    arg.startsWith("-disableassertions") ||
+                    "-esa".equals(arg) ||
+                    "-enablesystemassertions".equals(arg) ||
+                    "-dsa".equals(arg) ||
+                    "-disablesystemassertions".equals(arg) ||
+                    arg.startsWith("-agentlib") ||
+                    arg.startsWith("-agentpath") ||
+                    arg.startsWith("-javaagent") ||
+                    arg.startsWith("-splash") ||
+                    false
+                ) {
+                //ignore
+            } else if (arg.startsWith("-")) {
+                //error invalid option
+            } else {
+                parseClassNameAndArgs(args, i);
+                break;
+            }
+        }
+
+        if (mainClass == null) {
+            //print usage
+            return;
+        }
+
+        if (classArgs == null)
+            classArgs = new String[0];
+        Isolate newIsolate;
+        if (properties != null && properties.size() > 0) {
+            newIsolate = new Isolate(properties, mainClass, classArgs);
+        } else {
+            newIsolate = new Isolate(mainClass, classArgs);
+        }
+
+        try {
+            classPath.add(0, new File(".").toURI().toURL());
+            Field field = newIsolate.getClass().getDeclaredField("impl");
+            field.setAccessible(true);
+            VmIsolate vmi = (VmIsolate) field.get(newIsolate);
+            vmi.setClasspath(classPath.toArray(new URL[classPath.size()]));
+        } catch (Exception x) {
+            x.printStackTrace();
+            return;
+        }
+
+        try {
+            Link link = newIsolate.newStatusLink();
+            newIsolate.start();
+            //wait for exit
+            for (; ;) {
+                LinkMessage msg = link.receive();
+                if (msg.containsStatus() && 
IsolateStatus.State.EXITED.equals(msg.extractStatus().getState()))
+                    break;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void parseJarAndArgs(String[] args, int i) {
+        try {
+            if (args.length > i + 1) {
+                File jar = new File(args[i + 1]).getCanonicalFile();
+                JarFile jf = new JarFile(jar);
+                Manifest mani = jf.getManifest();
+                mainClass = 
mani.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS);
+                parseClassArgs(args, i + 1);
+                jf.close();
+                classPath.add(new URL("jar:" + jar.toURI().toURL() + "!/"));
+            } else {
+                //error
+            }
+        } catch (Exception x) {
+            x.printStackTrace();
+        }
+    }
+
+    private void parseClassNameAndArgs(String[] args, int i) {
+        mainClass = args[i];
+        parseClassArgs(args, i);
+    }
+
+    private void parseClassArgs(String[] args, int i) {
+        if (args.length > i + 1) {
+            classArgs = new String[args.length - i - 1];
+            System.arraycopy(args, i + 1, classArgs, 0, classArgs.length);
+        }
+    }
+
+    private void parseSystemProperty(String arg) {
+        String s = arg.substring(2);
+        int ep = s.indexOf('=');
+        if (ep > -1) {
+            String name = s.substring(0, ep).trim();
+            if (name.length() > 0) {
+                String value = s.substring(ep + 1).trim();
+                if (value.length() > 0) {
+                    if (properties == null) {
+                        properties = new Properties();
+                    }
+                    properties.setProperty(name, value);
+                } else {
+                    //error invalid property value
+                }
+            } else {
+                //error invalid property name
+            }
+        } else {
+            //error invalid property setting
+        }
+    }
+
+    private void parseClasspath(String arg) {
+        String[] pes = arg.split("\\:");
+        for (int i = 0; i < pes.length; i++) {
+            String pe = pes[i];
+            if (pe == null) continue;
+            pe = pe.trim();
+            if (pe.length() == 0) continue;
+
+            //add url support
+
+            File file = new File(pe);
+            if (!file.exists()) {
+                System.out.println("dropping invalid classpath entry: " + pe);
+                //ignore it
+                continue;
+            }
+
+            if (file.isDirectory()) {
+                try {
+                    classPath.add(file.getCanonicalFile().toURI().toURL());
+                } catch (IOException ioe) {
+                    System.out.println("dropping invalid classpath entry: " + 
pe);
+                    ioe.printStackTrace();
+                }
+            } else if (file.isFile()) {
+                if (pe.endsWith(".jar") || pe.endsWith(".zip")) {
+                    try {
+                        classPath.add(new URL("jar:" + file.toURI().toURL() + 
"!/"));
+                    } catch (MalformedURLException x) {
+                        System.out.println("dropping invalid classpath entry: 
" + pe);
+                        x.printStackTrace();
+                    }
+                } else {
+                    System.out.println("dropping invalid classpath entry: " + 
pe);
+                    //ignore it
+                }
+            } else {
+                System.out.println("dropping invalid classpath entry: " + pe);
+                //ignore it
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        new IsolatedJavaTest().run(args);
+    }
+}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to