FELIX-1266: maven build for gogo

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@789948 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/gogo/gogo-launcher/pom.xml b/gogo/gogo-launcher/pom.xml
new file mode 100644
index 0000000..273e922
--- /dev/null
+++ b/gogo/gogo-launcher/pom.xml
@@ -0,0 +1,99 @@
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.apache.felix.gogo</groupId>
+        <artifactId>gogo</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>bundle</packaging>
+    <name>Apache Felix Gogo Shell Launcher</name>
+    <artifactId>org.apache.felix.gogo.launcher</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix.gogo</groupId>
+            <artifactId>org.apache.felix.gogo.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.0.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.osgi.service.command; version=1.0.0,
+                            org.osgi.service.threadio; version=1.0.0,
+                            org.apache.felix.gogo.commands; version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            org.osgi.service.component*; resolution:=optional,
+                            org.osgi.service.log*; resolution:=optional,
+                            org.osgi.service.packageadmin*; resolution:=optional,
+                            org.osgi.service.startlevel*; resolution:=optional,
+                            *
+                        </Import-Package>
+                        <Private-Package>org.apache.felix.gogo.*</Private-Package>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
+                        <Bundle-Activator>org.apache.felix.gogo.runtime.Activator</Bundle-Activator>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>rat-maven-plugin</artifactId>
+                <configuration>
+                    <excludeSubProjects>false</excludeSubProjects>
+                    <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
+                    <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
+                    <excludes>
+                        <param>doc/*</param>
+                        <param>maven-eclipse.xml</param>
+                        <param>.checkstyle</param>
+                        <param>.externalToolBuilders/*</param>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/gogo/gogo-launcher/src/main/java/org/apache/felix/gogo/launcher/Launcher.java b/gogo/gogo-launcher/src/main/java/org/apache/felix/gogo/launcher/Launcher.java
new file mode 100644
index 0000000..af44cd1
--- /dev/null
+++ b/gogo/gogo-launcher/src/main/java/org/apache/felix/gogo/launcher/Launcher.java
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ */
+package org.apache.felix.gogo.launcher;
+
+import org.apache.felix.gogo.runtime.osgi.OSGiShell;
+import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
+import org.apache.felix.gogo.console.stdio.Console;
+import org.osgi.framework.Bundle;
+import org.osgi.service.command.CommandProcessor;
+import org.osgi.service.command.CommandSession;
+
+import java.io.*;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.*;
+
+public class Launcher
+{
+    static List<URL> classpath = new ArrayList<URL>();
+    static File cwd = new File("").getAbsoluteFile();
+
+    public static void main(String args[]) throws Exception
+    {
+        StringBuffer sb = new StringBuffer();
+        String framework = null;
+        PrintStream out = System.out;
+        InputStream in = System.in;
+        boolean console = false;
+
+        for (int i = 0; i < args.length; i++)
+        {
+            String arg = args[i];
+            if (arg.equals("-f"))
+            {
+                framework = args[++i];
+            }
+            else
+            {
+                if (arg.equals("-cp") || arg.equals("-classpath"))
+                {
+                    classpath(args[++i]);
+                }
+                else
+                {
+                    if (arg.equals("-console"))
+                    {
+                        console = true;
+                    }
+                    else
+                    {
+                        if (arg.equals("-i"))
+                        {
+                            in = new FileInputStream(args[++i]);
+                        }
+                        else
+                        {
+                            if (arg.equals("-o"))
+                            {
+                                out = new PrintStream(new FileOutputStream(args[++i]));
+                            }
+                            else
+                            {
+                                sb.append(' ');
+                                sb.append(arg);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (framework == null)
+        {
+            System.err.println("No framework set");
+            System.exit(1);
+        }
+
+        ThreadIOImpl threadio = new ThreadIOImpl();
+        threadio.start();
+        URL[] urls = classpath.toArray(new URL[classpath.size()]);
+        URLClassLoader urlcl = new URLClassLoader(urls, Launcher.class.getClassLoader());
+        Class<?> fw = urlcl.loadClass(framework);
+
+        Constructor<?> c = fw.getConstructor(Map.class, List.class);
+        Properties p = new Properties(System.getProperties());
+        p.setProperty("felix.cache.profile", "default");
+        p.setProperty("felix.embedded.execution", "true");
+        Bundle bundle = (Bundle) c.newInstance(p, null);
+
+        OSGiShell shell = new OSGiShell();
+        shell.setThreadio(threadio);
+        shell.setBundle(bundle);
+        shell.start();
+
+
+        CommandSession session = shell.createSession(in, out, System.err);
+        session.put("shell", shell);
+        session.put("threadio", threadio);
+
+        session.execute(sb);
+        out.flush();
+
+        if (bundle.getState() == Bundle.ACTIVE)
+        {
+            bundle.getBundleContext().registerService(CommandProcessor.class.getName(), shell, null);
+        }
+        if (console)
+        {
+            Console cons = new Console();
+            cons.setSession(session);
+            cons.run();
+        }
+    }
+
+
+    private static void classpath(String string) throws MalformedURLException
+    {
+        StringTokenizer st = new StringTokenizer(string, File.pathSeparator);
+        while (st.hasMoreTokens())
+        {
+            String part = st.nextToken();
+            if (part.equals("."))
+            {
+                classpath.add(cwd.toURL());
+            }
+
+            File f = new File(part);
+            if (!f.isAbsolute())
+            {
+                f = new File(cwd, part);
+            }
+            if (f.exists())
+            {
+                classpath.add(f.toURL());
+            }
+            else
+            {
+                System.err.println("Can not find " + part);
+            }
+        }
+    }
+}