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(); + } + } +}