You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2009/09/08 20:37:14 UTC

svn commit: r812616 - in /felix/trunk/karaf: assembly/src/main/descriptors/ assembly/src/main/distribution/unix-shell/bin/ assembly/src/main/filtered-resources/bin/ gshell/gshell-admin/ gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/ad...

Author: gnodet
Date: Tue Sep  8 18:37:13 2009
New Revision: 812616

URL: http://svn.apache.org/viewvc?rev=812616&view=rev
Log:
FELIX-1547: OS shell level admin commands for Karaf

Added:
    felix/trunk/karaf/assembly/src/main/filtered-resources/bin/
    felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin   (contents, props changed)
      - copied, changed from r812566, felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf
    felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin.bat
    felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/
    felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/Execute.java
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start
      - copied, changed from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start.bat
      - copied, changed from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop
      - copied, changed from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop.bat
      - copied, changed from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat
    felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/
    felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/
    felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/
    felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/ExecuteTest.java
Removed:
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf
    felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat
Modified:
    felix/trunk/karaf/assembly/src/main/descriptors/unix-bin.xml
    felix/trunk/karaf/assembly/src/main/descriptors/windows-bin.xml
    felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf
    felix/trunk/karaf/gshell/gshell-admin/pom.xml
    felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/AdminServiceImpl.java
    felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/InstanceImpl.java

Modified: felix/trunk/karaf/assembly/src/main/descriptors/unix-bin.xml
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/assembly/src/main/descriptors/unix-bin.xml?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/assembly/src/main/descriptors/unix-bin.xml (original)
+++ felix/trunk/karaf/assembly/src/main/descriptors/unix-bin.xml Tue Sep  8 18:37:13 2009
@@ -45,6 +45,15 @@
             <lineEnding>unix</lineEnding>
         </fileSet>        
         <fileSet>
+            <directory>target/classes/bin</directory>
+            <outputDirectory>/bin/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0755</fileMode>
+            <includes>
+                <include>admin</include>
+            </includes>
+        </fileSet>
+        <fileSet>
             <directory>target/classes/etc</directory>
             <outputDirectory>/etc/</outputDirectory>
             <lineEnding>unix</lineEnding>

Modified: felix/trunk/karaf/assembly/src/main/descriptors/windows-bin.xml
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/assembly/src/main/descriptors/windows-bin.xml?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/assembly/src/main/descriptors/windows-bin.xml (original)
+++ felix/trunk/karaf/assembly/src/main/descriptors/windows-bin.xml Tue Sep  8 18:37:13 2009
@@ -46,6 +46,14 @@
           <lineEnding>dos</lineEnding>
       </fileSet>        
       <fileSet>
+          <directory>target/classes/bin</directory>
+          <outputDirectory>/bin/</outputDirectory>
+          <lineEnding>dos</lineEnding>
+          <includes>
+              <include>admin.bat</include>
+          </includes>
+      </fileSet>
+      <fileSet>
           <directory>target/classes/etc</directory>
           <outputDirectory>/etc/</outputDirectory>
           <lineEnding>dos</lineEnding>

Modified: felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf (original)
+++ felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf Tue Sep  8 18:37:13 2009
@@ -285,12 +285,12 @@
         KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
         CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
     fi
-    exec $JAVA $JAVA_OPTS -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.main.Bootstrap $*
+    exec $JAVA $JAVA_OPTS -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.main.Bootstrap "$@"
 }
 
 main() {
     init
-    run $@
+    run "$@"
 }
 
-main $@
+main "$@"

Copied: felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin (from r812566, felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf)
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin?p2=felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin&p1=felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf&r1=812566&r2=812616&rev=812616&view=diff
==============================================================================
--- felix/trunk/karaf/assembly/src/main/distribution/unix-shell/bin/karaf (original)
+++ felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin Tue Sep  8 18:37:13 2009
@@ -15,7 +15,6 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 #
-# $Id: karaf 979 2005-11-30 22:50:55Z bsnyder $
 #
 
 DIRNAME=`dirname $0`
@@ -201,7 +200,7 @@
 }
 
 setupDefaults() {
-    DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
+    DEFAULT_JAVA_OPTS="-Dstorage.file=${KARAF_HOME}/etc/instances.properties -Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
 
     #Set the JVM_VENDOR specific JVM flags
     if [ "$JVM_VENDOR" = "SUN" ]; then
@@ -265,32 +264,21 @@
 }
 
 run() {
-    OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
-    case "$1" in
-        'console')
-            shift
-            ;;
-        'server')
-            OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
-            shift
-            ;;
-        'client')
-            OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
-            shift
-            ;;
-    esac
 
     if $cygwin; then
         KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
         KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
         CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
     fi
-    exec $JAVA $JAVA_OPTS -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.main.Bootstrap $*
+
+    CLASSPATH=${KARAF_HOME}/system/org/apache/felix/karaf/gshell/org.apache.felix.karaf.gshell.admin/${project.version}/org.apache.felix.karaf.gshell.admin-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/karaf/gshell/org.apache.felix.karaf.gshell.console/${project.version}/org.apache.felix.karaf.gshell.console-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/gogo/org.apache.felix.gogo.runtime/${felix.gogo.version}/org.apache.felix.gogo.runtime-${felix.gogo.version}.jar:${KARAF_HOME}/system/org/apache/geronimo/blueprint-bundle/${geronimo.blueprint.version}/blueprint-bundle-${geronimo.blueprint.version}.jar:${KARAF_HOME}/system/org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar:${KARAF_HOME}/system/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
+
+    exec $JAVA $JAVA_OPTS -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.gshell.admin.main.Execute "$@"
 }
 
 main() {
     init
-    run $@
+    run "$@"
 }
 
-main $@
+main "$@"

Propchange: felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin
------------------------------------------------------------------------------
    svn:eol-style = native

Added: felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin.bat
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin.bat?rev=812616&view=auto
==============================================================================
--- felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin.bat (added)
+++ felix/trunk/karaf/assembly/src/main/filtered-resources/bin/admin.bat Tue Sep  8 18:37:13 2009
@@ -0,0 +1,97 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    the License.  You may obtain a copy of the License at
+rem
+rem       http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem    Unless required by applicable law or agreed to in writing, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+rem 
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: %KARAF_HOME%
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: %KARAF_BASE%
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set KARAF_BASE=%KARAF_HOME%
+)
+
+set DEFAULT_JAVA_OPTS=-Dstorage.file="%KARAF_HOME%\etc\instances.properties"
+set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
+
+rem Support for loading native libraries
+set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    set JAVA=java
+    if "%JAVA_HOME%" == "" call :warn JAVA_HOME not set; results may vary
+    if not "%JAVA_HOME%" == "" set JAVA=%JAVA_HOME%\bin\java
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+:Check_JAVA_END
+
+if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
+
+if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
+    rem Use the defaults if JAVA_DEBUG_OPTS was not set
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+    
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
+:KARAF_DEBUG_END
+
+set CLASSPATH=%KARAF_HOME%\system\org\apache\felix\karaf\gshell\org.apache.felix.karaf.gshell.admin\${project.version}\org.apache.felix.karaf.gshell.admin-${project.version}.jar;%KARAF_HOME%\system\org\apache\felix\karaf\gshell\org.apache.felix.karaf.gshell.console\${project.version}\org.apache.felix.karaf.gshell.console-${project.version}.jar;%KARAF_HOME%\system\org\apache\felix\gogo\org.apache.felix.gogo.runtime\${felix.gogo.version}\org.apache.felix.gogo.runtime-${felix.gogo.version}.jar;%KARAF_HOME%\system\org\apache\geronimo\blueprint-bundle\${geronimo.blueprint.version}\blueprint-bundle-${geronimo.blueprint.version}.jar;%KARAF_HOME%\system\org\ops4j\pax\logging\pax-logging-api\${pax.logging.version}\pax-logging-api-${pax.logging.version}.jar;%KARAF_HOME%\system\org\apache\felix\org.apache.felix.framework\${felix.framework.version}\org.apache.felix.framework-${felix.framework.version}.jar
+
+:EXECUTE
+    if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8
+    if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8    
+    rem Execute the Java Virtual Machine
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file=%KARAF_BASE%\etc\java.util.logging.properties org.apache.felix.karaf.gshell.admin.main.Execute %ARGS%
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+

Modified: felix/trunk/karaf/gshell/gshell-admin/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/pom.xml?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/pom.xml (original)
+++ felix/trunk/karaf/gshell/gshell-admin/pom.xml Tue Sep  8 18:37:13 2009
@@ -56,10 +56,23 @@
         </dependency>
 
         <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.servicemix.bundles</groupId>
             <artifactId>org.apache.servicemix.bundles.junit</artifactId>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

Modified: felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/AdminServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/AdminServiceImpl.java?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/AdminServiceImpl.java (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/AdminServiceImpl.java Tue Sep  8 18:37:13 2009
@@ -148,10 +148,13 @@
         copyFilteredResourceToDir(serviceMixBase, "etc/system.properties", props);
         copyFilteredResourceToDir(serviceMixBase, "etc/org.apache.felix.karaf.shell.cfg", props);
         if( System.getProperty("os.name").startsWith("Win") ) {
-            copyFilteredResourceToDir(serviceMixBase, "bin/karaf.bat", props);
+            copyFilteredResourceToDir(serviceMixBase, "bin/start.bat", props);
+            copyFilteredResourceToDir(serviceMixBase, "bin/stop.bat", props);
         } else {
-            copyFilteredResourceToDir(serviceMixBase, "bin/karaf", props);
-            chmod(new File(serviceMixBase, "bin/karaf"), "a+x");
+            copyFilteredResourceToDir(serviceMixBase, "bin/start", props);
+            copyFilteredResourceToDir(serviceMixBase, "bin/stop", props);
+            chmod(new File(serviceMixBase, "bin/start"), "a+x");
+            chmod(new File(serviceMixBase, "bin/stop"), "a+x");
         }
         Instance instance = new InstanceImpl(this, name, serviceMixBase.toString());
         instances.put(name, instance);
@@ -188,7 +191,7 @@
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("/org/apache/felix/karaf/gshell/admin/" + resource);
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/gshell/admin/" + resource);
             try {
                 if( text ) {
                     // Read it line at a time so that we can use the platform line ending when we write it out.
@@ -228,7 +231,7 @@
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("/org/apache/felix/karaf/gshell/admin/" + resource);
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/gshell/admin/" + resource);
             try {
                 // Read it line at a time so that we can use the platform line ending when we write it out.
                 PrintStream out = new PrintStream(new FileOutputStream(outFile));

Modified: felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/InstanceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/InstanceImpl.java?rev=812616&r1=812615&r2=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/InstanceImpl.java (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/internal/InstanceImpl.java Tue Sep  8 18:37:13 2009
@@ -147,7 +147,7 @@
                 + " -Dkaraf.startRemoteShell=true"
                 + " -classpath " + classpath.toString()
                 + " org.apache.felix.karaf.main.Bootstrap";
-        LOG.debug("Starting instance with command: " + command);
+        LOG.debug("Starting instance " + name + " with command: " + command);
         this.process = ProcessBuilderFactory.newInstance().newBuilder()
                         .directory(new File(location))
                         .command(command)

Added: felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/Execute.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/Execute.java?rev=812616&view=auto
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/Execute.java (added)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/java/org/apache/felix/karaf/gshell/admin/main/Execute.java Tue Sep  8 18:37:13 2009
@@ -0,0 +1,127 @@
+/*
+ * 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.karaf.gshell.admin.main;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.karaf.gshell.admin.internal.AdminServiceImpl;
+import org.apache.felix.karaf.gshell.admin.internal.commands.AdminCommandSupport;
+import org.apache.felix.karaf.gshell.admin.internal.commands.CreateCommand;
+import org.apache.felix.karaf.gshell.admin.internal.commands.DestroyCommand;
+import org.apache.felix.karaf.gshell.admin.internal.commands.ListCommand;
+import org.apache.felix.karaf.gshell.admin.internal.commands.StartCommand;
+import org.apache.felix.karaf.gshell.admin.internal.commands.StopCommand;
+import org.apache.felix.karaf.gshell.admin.internal.commands.ChangePortCommand;
+import org.fusesource.jansi.AnsiConsole;
+
+public class Execute {
+    static Class<? extends Action> x = CreateCommand.class;
+    private static final Class<?> [] COMMAND_CLASSES = new Class[] {
+        CreateCommand.class,
+        StartCommand.class,
+        StopCommand.class,
+        DestroyCommand.class,  
+        ListCommand.class,
+        ChangePortCommand.class};
+    private static final Map<String, Class<?>> COMMANDS = new TreeMap<String, Class<?>>();
+    static {
+        for (Class<?> c : COMMAND_CLASSES) {
+            Command ann = c.getAnnotation(Command.class);
+            if (ann == null) {
+                continue;
+            }
+            COMMANDS.put(ann.name(), c);
+        }
+    }    
+    
+    // For testing
+    static boolean exitAllowed = true;
+
+    public static void main(String[] args) throws Exception {
+        AnsiConsole.systemInstall();
+
+        if (args.length == 0) {
+            listCommands();
+            exit(0);
+        }
+        
+        Class<?> cls = COMMANDS.get(args[0]);
+        if (cls == null) {
+            System.err.println("Command not found: " + args[0]);
+            exit(-1);
+        }
+
+        String storage = System.getProperty("storage.file");
+        if (storage == null) {
+            System.err.println("System property 'storage.file' is not set. \n" +
+        		"This property needs to be set to the full path of the instance.properties file.");
+            exit(-1);
+        }
+        File storageFile = new File(storage);
+        System.setProperty("user.dir", storageFile.getParentFile().getParentFile().getCanonicalPath());
+        
+        Object command = cls.newInstance();
+        if (command instanceof AdminCommandSupport) {
+            execute((AdminCommandSupport) command, storageFile, args);            
+        } else {
+            System.err.println("Not an admin command: " + args[0]);
+            exit(-1);
+        }
+    }
+    
+    static void execute(AdminCommandSupport command, File storageFile, String[] args) throws Exception {
+        DefaultActionPreparator dap = new DefaultActionPreparator();
+        List<Object> params = new ArrayList<Object>(Arrays.asList(args));
+        params.remove(0); // this is the actual command name
+
+        if (!dap.prepare(command, null, params)) {
+            return;
+        }
+                
+        AdminServiceImpl admin = new AdminServiceImpl();
+        admin.setStorageLocation(storageFile);
+        admin.init();
+        command.setAdminService(admin);
+        command.execute(null);
+    }
+
+    private static void listCommands() {
+        System.out.println("Available commands:");
+        for (Map.Entry<String, Class<?>> entry : COMMANDS.entrySet()) {
+            Command ann = entry.getValue().getAnnotation(Command.class);
+            System.out.printf("  %s - %s\n", entry.getKey(), ann.description());
+        }
+        
+        System.out.println("Type 'command --help' for more help on the specified command.");
+    }
+
+    private static void exit(int rc) {
+        if (exitAllowed) {
+            System.exit(rc);
+        } else {
+            throw new RuntimeException("" + rc);
+        }
+    }
+}

Copied: felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start (from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf)
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start?p2=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start&p1=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf&r1=812566&r2=812616&rev=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start Tue Sep  8 18:37:13 2009
@@ -19,7 +19,6 @@
 ################################################################################
 
 KARAF_HOME=${karaf.home}
-KARAF_BASE=${karaf.base}
 
-export KARAF_BASE
-${KARAF_HOME}/bin/karaf "$*"
+${KARAF_HOME}/bin/admin start ${karaf.name} "$@"
+

Copied: felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start.bat (from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat)
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start.bat?p2=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start.bat&p1=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat&r1=812566&r2=812616&rev=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/start.bat Tue Sep  8 18:37:13 2009
@@ -18,8 +18,6 @@
 REM 
 REM =========================================================================
 
-SET KARAF_BASE=${karaf.base}
-SETLOCAL
 SET KARAF_HOME=${karaf.home}
 
-%KARAF_HOME%\bin\karaf.bat %*
+%KARAF_HOME%\bin\admin.bat start ${karaf.name}

Copied: felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop (from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf)
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop?p2=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop&p1=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf&r1=812566&r2=812616&rev=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop Tue Sep  8 18:37:13 2009
@@ -19,7 +19,6 @@
 ################################################################################
 
 KARAF_HOME=${karaf.home}
-KARAF_BASE=${karaf.base}
 
-export KARAF_BASE
-${KARAF_HOME}/bin/karaf "$*"
+${KARAF_HOME}/bin/admin stop ${karaf.name} "$@"
+

Copied: felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop.bat (from r812566, felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat)
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop.bat?p2=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop.bat&p1=felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat&r1=812566&r2=812616&rev=812616&view=diff
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/karaf.bat (original)
+++ felix/trunk/karaf/gshell/gshell-admin/src/main/resources/org/apache/felix/karaf/gshell/admin/bin/stop.bat Tue Sep  8 18:37:13 2009
@@ -18,8 +18,6 @@
 REM 
 REM =========================================================================
 
-SET KARAF_BASE=${karaf.base}
-SETLOCAL
 SET KARAF_HOME=${karaf.home}
 
-%KARAF_HOME%\bin\karaf.bat %*
+%KARAF_HOME%\bin\admin.bat stop ${karaf.name}

Added: felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/ExecuteTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/ExecuteTest.java?rev=812616&view=auto
==============================================================================
--- felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/ExecuteTest.java (added)
+++ felix/trunk/karaf/gshell/gshell-admin/src/test/java/org/apache/felix/karaf/gshell/admin/main/ExecuteTest.java Tue Sep  8 18:37:13 2009
@@ -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.karaf.gshell.admin.main;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.felix.karaf.gshell.admin.AdminService;
+import org.apache.felix.karaf.gshell.admin.internal.AdminServiceImpl;
+import org.apache.felix.karaf.gshell.admin.internal.commands.AdminCommandSupport;
+import org.easymock.IAnswer;
+import org.easymock.classextension.EasyMock;
+
+public class ExecuteTest extends TestCase {
+    private String userDir;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        Execute.exitAllowed = false;
+        userDir = System.getProperty("user.dir");
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        Execute.exitAllowed = true;
+        System.setProperty("user.dir", userDir);
+    }
+
+    public void testListCommands() throws Exception {
+        PrintStream oldOut = System.out;
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream capturedOut = new PrintStream(baos); 
+        System.setOut(capturedOut);
+
+        try {
+            Execute.main(new String [] {});            
+        } catch (RuntimeException re) {
+            assertEquals("0", re.getMessage());
+
+            String s = new String(baos.toByteArray());            
+            assertTrue(s.contains("list"));
+            assertTrue(s.contains("create"));
+            assertTrue(s.contains("destroy"));
+        } finally {
+            System.setOut(oldOut);
+        }
+    }
+    
+    public void testNonexistingCommand() throws Exception {
+        try {
+            Execute.main(new String [] {"bheuaark"});
+        } catch (RuntimeException re) {
+            assertEquals("-1", re.getMessage());
+        }
+    }
+    
+    public void testNoStorageFile() throws Exception {
+        PrintStream oldErr = System.err;
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream capturedErr = new PrintStream(baos); 
+        System.setErr(capturedErr);
+
+        try {
+            Execute.main(new String [] {"create"});            
+        } catch (RuntimeException re) {
+            assertEquals("-1", re.getMessage());
+            
+            String s = new String(baos.toByteArray());            
+            assertTrue(s.contains("storage.file"));
+            assertTrue(s.contains("instance.properties"));
+        } finally {
+            System.setErr(oldErr);
+        } 
+    }
+    
+    public void testSetDir() throws Exception {
+        Properties oldProps = (Properties) System.getProperties().clone();
+        File tempFile = File.createTempFile(getName(), ".tmp");
+        assertFalse("Precondition failed", 
+            tempFile.getParentFile().getParentFile().getCanonicalPath().equals(System.getProperty("user.dir")));
+
+        System.setProperty("storage.file", tempFile.getCanonicalPath());
+        try {
+            Execute.main(new String [] {"list"});            
+            assertTrue(tempFile.getParentFile().getParentFile().getCanonicalPath().equals(System.getProperty("user.dir")));
+        } finally {
+            System.setProperties(oldProps);
+            assertNull("Postcondition failed", System.getProperty("storage.file"));
+            tempFile.delete();
+        }        
+    }
+    
+    public void testExecute() throws Exception {
+        final File tempFile = File.createTempFile(getName(), ".properties");
+        Properties p = new Properties();
+        p.setProperty("port", "1302");
+        FileOutputStream fos = new FileOutputStream(tempFile);
+        p.store(fos, "");
+        fos.close();
+
+        final List<AdminServiceImpl> admins = new ArrayList<AdminServiceImpl>();
+        try {
+            AdminCommandSupport mockCommand = EasyMock.createStrictMock(AdminCommandSupport.class);
+            mockCommand.setAdminService((AdminService) EasyMock.anyObject());
+            EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+                public Object answer() throws Throwable {
+                    AdminServiceImpl svc = (AdminServiceImpl) EasyMock.getCurrentArguments()[0];
+                    assertEquals(tempFile, svc.getStorageLocation());
+                    admins.add(svc);
+                    return null;
+                }
+            });
+            
+            EasyMock.expect(mockCommand.execute(null)).andAnswer(new IAnswer<Object>() {
+                public Object answer() throws Throwable {
+                    // The Admin Service should be initialized at this point.
+                    // One way to find this out is by reading out the port number
+                    AdminServiceImpl admin = admins.get(0);
+                    Field field = AdminServiceImpl.class.getDeclaredField("defaultPortStart");
+                    field.setAccessible(true);
+                    assertEquals(1302, field.get(admin));
+                    return null;
+                }
+            });
+            EasyMock.replay(mockCommand);            
+            
+            Execute.execute(mockCommand, tempFile, new String [] {"test"});
+            
+            EasyMock.verify(mockCommand);
+        } finally {
+            tempFile.delete();
+        }
+    }
+}