diff options
Diffstat (limited to 'testing-client')
4 files changed, 228 insertions, 0 deletions
diff --git a/testing-client/src/org/aspectj/testing/server/TestServer.java b/testing-client/src/org/aspectj/testing/server/TestServer.java new file mode 100644 index 000000000..4e2f15388 --- /dev/null +++ b/testing-client/src/org/aspectj/testing/server/TestServer.java @@ -0,0 +1,185 @@ +/******************************************************************************* + * Copyright (c) 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster - initial implementation + *******************************************************************************/ +package org.aspectj.testing.server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; + +public class TestServer implements Runnable { + + private static final boolean debug = false; + + private boolean exitOnError = true; + private File workingDirectory; + private ClassLoader rootLoader; + private Map loaders = new HashMap(); + + private String mainClass = "UnknowClass"; + private String mainLoader = "UnknowLoader"; + + public void initialize () throws IOException { + createRootLoader(); + loadConfiguration(); + } + + private void loadConfiguration () throws IOException { + File file = new File(workingDirectory,"server.properties"); + Properties props = new Properties(); + FileInputStream in = new FileInputStream(file); + props.load(in); + in.close(); + + Enumeration enu = props.propertyNames(); + while (enu.hasMoreElements()) { + String key = (String)enu.nextElement(); + if (key.startsWith("loader.")) { + createLoader(props.getProperty(key)); + } + else if (key.equals("main")) { + StringTokenizer st = new StringTokenizer(props.getProperty(key),","); + mainClass = st.nextToken(); + mainLoader = st.nextToken(); + } + } + } + + private void createLoader (String property) throws IOException { + ClassLoader parent = rootLoader; + + StringTokenizer st = new StringTokenizer(property,","); + String name = st.nextToken(); + String classpath = st.nextToken(); + if (st.hasMoreTokens()) { + String parentName = st.nextToken(); + parent = (ClassLoader)loaders.get(parentName); + if (parent == null) error("No such loader: " + parentName); + } + + List urlList = new ArrayList(); + st = new StringTokenizer(classpath,";"); + while (st.hasMoreTokens()) { + String fileName = st.nextToken(); + File file = new File(workingDirectory,fileName).getCanonicalFile(); + if (!file.exists()) error("Missing or invalid file: " + file.getPath()); + URL url = file.toURL(); + urlList.add(url); + } + URL[] urls = new URL[urlList.size()]; + urlList.toArray(urls); + ClassLoader loader = new URLClassLoader(urls, parent); + + loaders.put(name,loader); + } + + private void createRootLoader () throws IOException { + List urlList = new ArrayList(); + + /* Sandbox */ + URL url = workingDirectory.getCanonicalFile().toURL(); + urlList.add(url); + + /* AspectJ runtime */ + URL[] urls = ((URLClassLoader)getClass().getClassLoader()).getURLs(); + for (int i = 0; i < urls.length; i++) { + url = urls[i]; + if (debug) System.err.println("? TestServer.initialize() " + url); + String file = url.getFile(); + if (file.indexOf("runtime") != -1 || file.indexOf("aspectj5rt") != -1) { + urlList.add(url); + } + } + if (debug) System.err.println("? TestServer.initialize() urlList=" + urlList); + + urls = new URL[urlList.size()]; + urlList.toArray(urls); + ClassLoader parent = getClass().getClassLoader().getParent(); + rootLoader = new URLClassLoader(urls,parent); + + } + + public void setExitOntError (boolean b) { + exitOnError = b; + } + + public void setWorkingDirectory (String name) { + workingDirectory = new File(name); + if (!workingDirectory.exists()) error("Missing or invalid working directory: " + workingDirectory.getPath()); + } + + public static void main(String[] args) throws Exception { + System.out.println("Starting ..."); + + TestServer server = new TestServer(); + server.setWorkingDirectory(args[0]); + server.initialize(); + + Thread thread = new Thread(server,"application"); + thread.start(); + thread.join(); + + System.out.println("Stopping ..."); + } + + public void run() { + System.out.println("Running " + mainClass); + runClass(mainClass,(ClassLoader)loaders.get(mainLoader)); + } + + private void runClass (String className, ClassLoader classLoader) { + try { + Class clazz = Class.forName(className,false,classLoader); + invokeMain(clazz,new String[] {}); + } + catch (ClassNotFoundException ex) { + ex.printStackTrace(); + error(ex.toString()); + } + } + + public void invokeMain (Class clazz, String[] args) + { + Class[] paramTypes = new Class[1]; + paramTypes[0] = args.getClass(); + + try { + Method method = clazz.getDeclaredMethod("main",paramTypes); + Object[] params = new Object[1]; + params[0] = args; + method.invoke(null,params); + } + catch (InvocationTargetException ex) { + Throwable th = ex.getTargetException(); + th.printStackTrace(); + error(th.toString()); + } + catch (Throwable th) { + th.printStackTrace(); + error(th.toString()); + } + } + + private void error (String message) { + System.out.println(message); + if (exitOnError) System.exit(0); + } +} diff --git a/testing-client/testdata/server.properties b/testing-client/testdata/server.properties new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing-client/testdata/server.properties diff --git a/testing-client/testsrc/org/aspectj/testing/TestingTests.java b/testing-client/testsrc/org/aspectj/testing/TestingTests.java index 781ccf995..ea5e7ee14 100644 --- a/testing-client/testsrc/org/aspectj/testing/TestingTests.java +++ b/testing-client/testsrc/org/aspectj/testing/TestingTests.java @@ -14,6 +14,8 @@ package org.aspectj.testing; +import org.aspectj.testing.server.TestServerTest; + import junit.framework.*; public class TestingTests extends TestCase { @@ -23,6 +25,7 @@ public class TestingTests extends TestCase { // for now, do not include SuiteTest because it would take 15 minutes //$JUnit-BEGIN$ suite.addTestSuite(TesterTest.class); + suite.addTestSuite(TestServerTest.class); //$JUnit-END$ return suite; } diff --git a/testing-client/testsrc/org/aspectj/testing/server/TestServerTest.java b/testing-client/testsrc/org/aspectj/testing/server/TestServerTest.java new file mode 100644 index 000000000..f0f043e67 --- /dev/null +++ b/testing-client/testsrc/org/aspectj/testing/server/TestServerTest.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster - initial implementation + *******************************************************************************/ +package org.aspectj.testing.server; + +import java.io.IOException; + +import junit.framework.TestCase; + +public class TestServerTest extends TestCase { + + private TestServer server; + + protected void setUp() throws Exception { + super.setUp(); + server = new TestServer(); + server.setExitOntError(false); + } + + public void testInitialize() { + try { + server.setWorkingDirectory("./testdata"); + server.initialize(); + } + catch (IOException ex) { + fail(ex.toString()); + } + } + + public void testSetWorkingDirectory() { + server.setWorkingDirectory("./testdata"); + } +} |