package org.argeo.slc.autoui.launcher; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Properties; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.felix.framework.Felix; import org.apache.felix.framework.cache.BundleCache; import org.apache.felix.main.AutoActivator; import org.argeo.slc.autoui.AutoUiActivator; import org.argeo.slc.autoui.DetachedExecutionServer; import org.argeo.slc.autoui.DetachedStep; import org.argeo.slc.autoui.DetachedStepRequest; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class Main { private final static Log log = LogFactory.getLog(Main.class); public static void main(String[] args) { try { // Load properties Properties config = prepareConfig(); // Start UI (in main class loader) startUi(config); //Thread.sleep(10000); // Start OSGi system Felix felix = startSystem(config); // Automate //automateUi(felix.getBundleContext()); // felix.stop(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } protected static Properties prepareConfig() throws Exception { final File cachedir = createTemporaryCacheDir(); // Load config Properties config = new Properties(); InputStream in = null; ; try { in = Main.class .getResourceAsStream("/org/argeo/slc/autoui/launcher/felix.properties"); config.load(in); } finally { if (in != null) in.close(); } // Perform variable substitution for system properties. for (Enumeration e = config.propertyNames(); e.hasMoreElements();) { String name = (String) e.nextElement(); config.setProperty(name, org.apache.felix.main.Main.substVars( config.getProperty(name), name, null, config)); } config.put(BundleCache.CACHE_PROFILE_DIR_PROP, cachedir .getAbsolutePath()); return config; } protected static File createTemporaryCacheDir() throws IOException { // Create a temporary bundle cache directory and // make sure to clean it up on exit. final File cachedir = File.createTempFile("argeo.slc.autoui", null); cachedir.delete(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { deleteFileOrDir(cachedir); } }); return cachedir; } public static Felix startSystem(Properties config) throws Exception { // Create list to hold custom framework activators. List list = new ArrayList(); // Add activator to process auto-start/install properties. list.add(new AutoActivator(config)); // Add our own activator. list.add(new AutoUiActivator()); // Now create an instance of the framework. Felix felix = new Felix(config, list); felix.start(); return felix; } public static void startUi(Properties config) throws Exception { String className = config.getProperty("argeo.scl.autoui.uiclass"); String[] uiArgs = readArgumentsFromLine(config.getProperty( "argeo.slc.autoui.uiargs", "")); // Launch main method using reflection Class clss = Class.forName(className); Class[] mainArgsClasses = new Class[] { uiArgs.getClass() }; Object[] mainArgs = { uiArgs }; Method mainMethod = clss.getMethod("main", mainArgsClasses); mainMethod.invoke(null, mainArgs); } protected static void automateUi(BundleContext bundleContext) throws Exception { // Retrieve service and execute it ServiceReference ref = bundleContext .getServiceReference(DetachedExecutionServer.class.getName()); Object service = bundleContext.getService(ref); log.debug("service.class=" + service.getClass()); DetachedExecutionServer app = (DetachedExecutionServer) service; DetachedStepRequest request = new DetachedStepRequest(); request.setStepRef("jemmyTest"); app.executeStep(request); } /* UTILITIES */ /** * Transform a line into an array of arguments, taking "" as single * arguments. (nested \" are not supported) */ private static String[] readArgumentsFromLine(String lineOrig) { String line = lineOrig.trim();// remove trailing spaces // System.out.println("line=" + line); List args = new Vector(); StringBuffer curr = new StringBuffer(""); boolean inQuote = false; char[] arr = line.toCharArray(); for (int i = 0; i < arr.length; i++) { char c = arr[i]; switch (c) { case '\"': inQuote = !inQuote; break; case ' ': if (!inQuote) {// otherwise, no break: goes to default if (curr.length() > 0) { args.add(curr.toString()); curr = new StringBuffer(""); } break; } default: curr.append(c); break; } } // Add last arg if (curr.length() > 0) { args.add(curr.toString()); curr = null; } String[] res = new String[args.size()]; for (int i = 0; i < args.size(); i++) { res[i] = args.get(i).toString(); // System.out.println("res[i]=" + res[i]); } return res; } private static void deleteFileOrDir(File file) { if (file.isDirectory()) { File[] childs = file.listFiles(); for (int i = 0; i < childs.length; i++) { deleteFileOrDir(childs[i]); } } file.delete(); } }