You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2014/02/21 14:19:20 UTC

git commit: KARAF-2772 Moving some util classes and test to simplify separation

Repository: karaf
Updated Branches:
  refs/heads/master 2154f29d6 -> 6e253c938


KARAF-2772 Moving some util classes and test to simplify separation


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/6e253c93
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/6e253c93
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/6e253c93

Branch: refs/heads/master
Commit: 6e253c9384df432dafb901df26ed2dd592edbfa4
Parents: 2154f29
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Feb 21 14:19:10 2014 +0100
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Fri Feb 21 14:19:10 2014 +0100

----------------------------------------------------------------------
 .../karaf/shell/commands/ansi/SimpleAnsi.java   |  30 ++++
 .../karaf/shell/util/CommandSessionUtil.java    |  28 ---
 .../karaf/shell/util/IndentFormatter.java       |  58 ------
 .../org/apache/karaf/shell/util/SimpleAnsi.java |  30 ----
 .../apache/karaf/shell/commands/Context.java    |  67 -------
 .../karaf/shell/commands/SimpleSubShell.java    |  38 ----
 .../karaf/shell/commands/TestCommands.java      | 178 -------------------
 .../karaf/shell/commands/basic/Context.java     |  67 +++++++
 .../shell/commands/basic/SimpleSubShell.java    |  38 ++++
 .../shell/commands/basic/TestCommands.java      | 178 +++++++++++++++++++
 .../shell/commands/meta/TestFormatting.java     |  36 ++++
 .../shell/console/ExampleSubclassMain.java      | 104 -----------
 .../shell/console/impl/ExampleSubclassMain.java | 104 +++++++++++
 .../apache/karaf/shell/util/TestFormatting.java |  36 ----
 14 files changed, 453 insertions(+), 539 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/main/java/org/apache/karaf/shell/commands/ansi/SimpleAnsi.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/commands/ansi/SimpleAnsi.java b/shell/console/src/main/java/org/apache/karaf/shell/commands/ansi/SimpleAnsi.java
new file mode 100644
index 0000000..b4dc23b
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/commands/ansi/SimpleAnsi.java
@@ -0,0 +1,30 @@
+/*
+ * 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.karaf.shell.util;
+
+import org.fusesource.jansi.Ansi;
+import org.fusesource.jansi.Ansi.Color;
+
+public class SimpleAnsi {
+    public static String COLOR_RED = Ansi.ansi().fg(Color.RED).toString();
+    public static String COLOR_DEFAULT = Ansi.ansi().fg(Color.DEFAULT).toString();
+    
+    public static String INTENSITY_BOLD = Ansi.ansi().bold().toString();
+    public static String INTENSITY_NORMAL = Ansi.ansi().boldOff().toString();
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/main/java/org/apache/karaf/shell/util/CommandSessionUtil.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/util/CommandSessionUtil.java b/shell/console/src/main/java/org/apache/karaf/shell/util/CommandSessionUtil.java
deleted file mode 100644
index cd3d5c6..0000000
--- a/shell/console/src/main/java/org/apache/karaf/shell/util/CommandSessionUtil.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.karaf.shell.util;
-
-import org.apache.felix.service.command.CommandSession;
-
-public class CommandSessionUtil {
-    public static int getWidth(CommandSession session) {
-        Object cols = session.get("#COLUMNS");
-        return  (cols != null && cols instanceof Integer) ? (Integer)cols : 80;
-    }
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/main/java/org/apache/karaf/shell/util/IndentFormatter.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/util/IndentFormatter.java b/shell/console/src/main/java/org/apache/karaf/shell/util/IndentFormatter.java
deleted file mode 100644
index 792cadc..0000000
--- a/shell/console/src/main/java/org/apache/karaf/shell/util/IndentFormatter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.karaf.shell.util;
-
-import java.io.PrintStream;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class IndentFormatter {
-
-    public static void printFormatted(String prefix, String str, int termWidth, PrintStream out, boolean prefixFirstLine) {
-        int pfxLen = prefix.length();
-        int maxwidth = termWidth - pfxLen;
-        Pattern wrap = Pattern.compile("(\\S\\S{" + maxwidth + ",}|.{1," + maxwidth + "})(\\s+|$)");
-        int cur = 0;
-        while (cur >= 0) {
-            int lst = str.indexOf('\n', cur);
-            String s = (lst >= 0) ? str.substring(cur, lst) : str.substring(cur);
-            if (s.length() == 0) {
-                out.println();
-            } else {
-                Matcher m = wrap.matcher(s);
-                while (m.find()) {
-                    if (cur > 0 || prefixFirstLine) {
-                        out.print(prefix);
-                    }
-                    out.println(m.group());
-                }
-            }
-            if (lst >= 0) {
-                cur = lst + 1;
-            } else {
-                break;
-            }
-        }
-    }
-
-    public static void printFormatted(String prefix, String str, int termWidth, PrintStream out) {
-        printFormatted(prefix, str, termWidth, out, true);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/main/java/org/apache/karaf/shell/util/SimpleAnsi.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/util/SimpleAnsi.java b/shell/console/src/main/java/org/apache/karaf/shell/util/SimpleAnsi.java
deleted file mode 100644
index b4dc23b..0000000
--- a/shell/console/src/main/java/org/apache/karaf/shell/util/SimpleAnsi.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.karaf.shell.util;
-
-import org.fusesource.jansi.Ansi;
-import org.fusesource.jansi.Ansi.Color;
-
-public class SimpleAnsi {
-    public static String COLOR_RED = Ansi.ansi().fg(Color.RED).toString();
-    public static String COLOR_DEFAULT = Ansi.ansi().fg(Color.DEFAULT).toString();
-    
-    public static String INTENSITY_BOLD = Ansi.ansi().bold().toString();
-    public static String INTENSITY_NORMAL = Ansi.ansi().boldOff().toString();
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/Context.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/Context.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/Context.java
deleted file mode 100644
index 7737c11..0000000
--- a/shell/console/src/test/java/org/apache/karaf/shell/commands/Context.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.karaf.shell.commands;
-
-import org.apache.felix.gogo.runtime.CommandProcessorImpl;
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
-import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
-import org.apache.felix.service.command.CommandSession;
-
-public class Context extends CommandProcessorImpl
-{
-    public static final String EMPTY = "";
-    CommandSessionImpl session;
-    static ThreadIOImpl threadio;
-
-    static
-    {
-        threadio = new ThreadIOImpl();
-        threadio.start();
-    }
-
-    public Context()
-    {
-        super(threadio);
-        addCommand("shell", this, "addCommand");
-        addCommand("shell", this, "removeCommand");
-        addCommand("shell", this, "eval");
-        session = (CommandSessionImpl) createSession(System.in, System.out, System.err);
-    }
-
-
-    public Object execute(CharSequence source) throws Exception
-    {
-        return session.execute(source);
-    }
-
-    public void set(String name, Object value)
-    {
-        session.put(name, value);
-    }
-
-    public Object get(String name)
-    {
-        return session.get(name);
-    }
-
-    public CommandSession getSession() {
-        return session;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/SimpleSubShell.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/SimpleSubShell.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/SimpleSubShell.java
deleted file mode 100644
index 59fe9a2..0000000
--- a/shell/console/src/test/java/org/apache/karaf/shell/commands/SimpleSubShell.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- *
- * 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.karaf.shell.commands;
-
-import org.apache.karaf.shell.commands.basic.SimpleCommand;
-import org.apache.karaf.shell.console.SubShellAction;
-
-public class SimpleSubShell extends SimpleCommand {
-
-    private final String subshell;
-
-    public SimpleSubShell(String subshell) {
-        super(SubShellAction.class);
-        this.subshell = subshell;
-    }
-
-    @Override
-    public Action createNewAction() {
-        SubShellAction action = (SubShellAction) super.createNewAction();
-        action.setSubShell(subshell);
-        return action;
-    }
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/TestCommands.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/TestCommands.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/TestCommands.java
deleted file mode 100644
index 7ad5b75..0000000
--- a/shell/console/src/test/java/org/apache/karaf/shell/commands/TestCommands.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * 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.karaf.shell.commands;
-
-import java.util.List;
-import java.util.Arrays;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-import junit.framework.TestCase;
-import org.apache.karaf.shell.commands.basic.SimpleCommand;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.ExitAction;
-
-public class TestCommands extends TestCase {
-
-    public void testSubShellScope() throws Exception {
-        Context c = new Context();
-        c.set("SCOPE", "*");
-        c.addCommand("*", new SimpleSubShell("foo"), "foo");
-        c.addCommand("*", new SimpleCommand(ExitAction.class), "exit");
-
-        String scope = (String) c.get("SCOPE");
-        c.execute("foo");
-        assertEquals("foo:" + scope, c.get("SCOPE"));
-        c.execute("exit");
-        assertEquals(scope, c.get("SCOPE"));
-    }
-
-    public void testPrompt() throws Exception {
-        Context c = new Context();
-        c.addCommand("echo", this);
-        c.set("USER", "test");
-        c.set("APPLICATION", "karaf");
-        //c.set("SCOPE", "");
-        Object p = c.execute("echo \"@|bold ${USER}|@${APPLICATION}:@|bold ${SCOPE}|> \"");
-        System.out.println("Prompt: " + p);
-    }
-
-    public void testCommand() throws Exception {
-        Context c = new Context();
-        c.addCommand("*", this, "capture");
-        c.addCommand("*", new SimpleCommand(MyAction.class), "my-action");
-
-        // Test help
-        Object help = c.execute("my-action --help | capture");
-        assertTrue(help instanceof String);
-        assertTrue(((String) help).indexOf("My Action") >= 0);
-        assertTrue(((String) help).indexOf("First option") >= 0);
-        assertTrue(((String) help).indexOf("Bundle ids") >= 0);
-
-        // Test required argument
-        try {
-            c.execute("my-action");
-            fail("Action should have thrown an exception because of a missing argument");
-        } catch (CommandException e) {
-            // ignore
-        }
-
-        // Test required argument
-        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
-
-        // Test required argument
-        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
-
-        // Test required argument
-        assertEquals(Arrays.asList(3, 5), c.execute("my-action 3 5"));
-
-        // Test option
-        assertEquals(Arrays.asList(4), c.execute("my-action -i 3"));
-
-        // Test option alias
-        assertEquals(Arrays.asList(4), c.execute("my-action --increment 3"));
-    }
-
-    public void testCommandTwoArguments() throws Exception {
-        Context c = new Context();
-        c.addCommand("*", new SimpleCommand(MyActionTwoArguments.class), "my-action-two-arguments");
-
-        // test required arguments
-        try {
-            c.execute("my-action-two-arguments");
-            fail("Action should have thrown an exception because of a missing argument");
-        } catch (CommandException e) {
-            assertEquals("Argument one is required", e.getMessage());
-        }
-
-        try {
-            c.execute("my-action-two-arguments 1");
-            fail("Action should have thrown an exception because of a missing argument");
-        } catch (CommandException e) {
-            assertEquals("Argument two is required", e.getMessage());
-        }
-
-        c.execute("my-action-two-arguments 1 2");
-    }
-
-    public String capture() throws IOException {
-        StringWriter sw = new StringWriter();
-        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
-        String s = rdr.readLine();
-        while (s != null) {
-            sw.write(s);
-            s = rdr.readLine();
-        }
-        return sw.toString();
-    }
-
-    public CharSequence echo(Object args[]) {
-        if (args == null) {
-            return "";
-        }
-
-        StringBuilder sb = new StringBuilder();
-        String del = "";
-        for (Object arg : args) {
-            sb.append(del);
-            if (arg != null) {
-                sb.append(arg);
-                del = " ";
-            }
-        }
-        return sb;
-    }
-
-    @Command(scope = "test", name = "my-action", description = "My Action")
-    public static class MyAction implements Action {
-
-        @Option(name = "-i", aliases = {"--increment"}, description = "First option")
-        private boolean increment;
-
-        @Argument(name = "ids", description = "Bundle ids", required = true, multiValued = true)
-        private List<Integer> ids;
-
-        public Object execute(CommandSession session) throws Exception {
-            if (increment) {
-                for (int i = 0; i < ids.size(); i++) {
-                    ids.set(i, ids.get(i) + 1);
-                }
-            }
-            return ids;
-        }
-    }
-
-    @Command(scope = "test", name = "my-action-two-arguments", description = "My Action with two arguments")
-    public static class MyActionTwoArguments implements Action {
-
-        @Argument(index = 0, name = "one", description = "one description", required = true, multiValued = false)
-        private String one;
-
-        @Argument(index = 1, name = "two", description = "two description", required = true, multiValued = false)
-        private String two;
-
-        public Object execute(CommandSession session) throws Exception {
-            return null;
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/Context.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/Context.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/Context.java
new file mode 100644
index 0000000..7737c11
--- /dev/null
+++ b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/Context.java
@@ -0,0 +1,67 @@
+/*
+ * 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.karaf.shell.commands;
+
+import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.felix.gogo.runtime.CommandSessionImpl;
+import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
+import org.apache.felix.service.command.CommandSession;
+
+public class Context extends CommandProcessorImpl
+{
+    public static final String EMPTY = "";
+    CommandSessionImpl session;
+    static ThreadIOImpl threadio;
+
+    static
+    {
+        threadio = new ThreadIOImpl();
+        threadio.start();
+    }
+
+    public Context()
+    {
+        super(threadio);
+        addCommand("shell", this, "addCommand");
+        addCommand("shell", this, "removeCommand");
+        addCommand("shell", this, "eval");
+        session = (CommandSessionImpl) createSession(System.in, System.out, System.err);
+    }
+
+
+    public Object execute(CharSequence source) throws Exception
+    {
+        return session.execute(source);
+    }
+
+    public void set(String name, Object value)
+    {
+        session.put(name, value);
+    }
+
+    public Object get(String name)
+    {
+        return session.get(name);
+    }
+
+    public CommandSession getSession() {
+        return session;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/SimpleSubShell.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/SimpleSubShell.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/SimpleSubShell.java
new file mode 100644
index 0000000..59fe9a2
--- /dev/null
+++ b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/SimpleSubShell.java
@@ -0,0 +1,38 @@
+/**
+ *
+ * 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.karaf.shell.commands;
+
+import org.apache.karaf.shell.commands.basic.SimpleCommand;
+import org.apache.karaf.shell.console.SubShellAction;
+
+public class SimpleSubShell extends SimpleCommand {
+
+    private final String subshell;
+
+    public SimpleSubShell(String subshell) {
+        super(SubShellAction.class);
+        this.subshell = subshell;
+    }
+
+    @Override
+    public Action createNewAction() {
+        SubShellAction action = (SubShellAction) super.createNewAction();
+        action.setSubShell(subshell);
+        return action;
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/TestCommands.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/TestCommands.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/TestCommands.java
new file mode 100644
index 0000000..7ad5b75
--- /dev/null
+++ b/shell/console/src/test/java/org/apache/karaf/shell/commands/basic/TestCommands.java
@@ -0,0 +1,178 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.util.List;
+import java.util.Arrays;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+import junit.framework.TestCase;
+import org.apache.karaf.shell.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.ExitAction;
+
+public class TestCommands extends TestCase {
+
+    public void testSubShellScope() throws Exception {
+        Context c = new Context();
+        c.set("SCOPE", "*");
+        c.addCommand("*", new SimpleSubShell("foo"), "foo");
+        c.addCommand("*", new SimpleCommand(ExitAction.class), "exit");
+
+        String scope = (String) c.get("SCOPE");
+        c.execute("foo");
+        assertEquals("foo:" + scope, c.get("SCOPE"));
+        c.execute("exit");
+        assertEquals(scope, c.get("SCOPE"));
+    }
+
+    public void testPrompt() throws Exception {
+        Context c = new Context();
+        c.addCommand("echo", this);
+        c.set("USER", "test");
+        c.set("APPLICATION", "karaf");
+        //c.set("SCOPE", "");
+        Object p = c.execute("echo \"@|bold ${USER}|@${APPLICATION}:@|bold ${SCOPE}|> \"");
+        System.out.println("Prompt: " + p);
+    }
+
+    public void testCommand() throws Exception {
+        Context c = new Context();
+        c.addCommand("*", this, "capture");
+        c.addCommand("*", new SimpleCommand(MyAction.class), "my-action");
+
+        // Test help
+        Object help = c.execute("my-action --help | capture");
+        assertTrue(help instanceof String);
+        assertTrue(((String) help).indexOf("My Action") >= 0);
+        assertTrue(((String) help).indexOf("First option") >= 0);
+        assertTrue(((String) help).indexOf("Bundle ids") >= 0);
+
+        // Test required argument
+        try {
+            c.execute("my-action");
+            fail("Action should have thrown an exception because of a missing argument");
+        } catch (CommandException e) {
+            // ignore
+        }
+
+        // Test required argument
+        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
+
+        // Test required argument
+        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
+
+        // Test required argument
+        assertEquals(Arrays.asList(3, 5), c.execute("my-action 3 5"));
+
+        // Test option
+        assertEquals(Arrays.asList(4), c.execute("my-action -i 3"));
+
+        // Test option alias
+        assertEquals(Arrays.asList(4), c.execute("my-action --increment 3"));
+    }
+
+    public void testCommandTwoArguments() throws Exception {
+        Context c = new Context();
+        c.addCommand("*", new SimpleCommand(MyActionTwoArguments.class), "my-action-two-arguments");
+
+        // test required arguments
+        try {
+            c.execute("my-action-two-arguments");
+            fail("Action should have thrown an exception because of a missing argument");
+        } catch (CommandException e) {
+            assertEquals("Argument one is required", e.getMessage());
+        }
+
+        try {
+            c.execute("my-action-two-arguments 1");
+            fail("Action should have thrown an exception because of a missing argument");
+        } catch (CommandException e) {
+            assertEquals("Argument two is required", e.getMessage());
+        }
+
+        c.execute("my-action-two-arguments 1 2");
+    }
+
+    public String capture() throws IOException {
+        StringWriter sw = new StringWriter();
+        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
+        String s = rdr.readLine();
+        while (s != null) {
+            sw.write(s);
+            s = rdr.readLine();
+        }
+        return sw.toString();
+    }
+
+    public CharSequence echo(Object args[]) {
+        if (args == null) {
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+        String del = "";
+        for (Object arg : args) {
+            sb.append(del);
+            if (arg != null) {
+                sb.append(arg);
+                del = " ";
+            }
+        }
+        return sb;
+    }
+
+    @Command(scope = "test", name = "my-action", description = "My Action")
+    public static class MyAction implements Action {
+
+        @Option(name = "-i", aliases = {"--increment"}, description = "First option")
+        private boolean increment;
+
+        @Argument(name = "ids", description = "Bundle ids", required = true, multiValued = true)
+        private List<Integer> ids;
+
+        public Object execute(CommandSession session) throws Exception {
+            if (increment) {
+                for (int i = 0; i < ids.size(); i++) {
+                    ids.set(i, ids.get(i) + 1);
+                }
+            }
+            return ids;
+        }
+    }
+
+    @Command(scope = "test", name = "my-action-two-arguments", description = "My Action with two arguments")
+    public static class MyActionTwoArguments implements Action {
+
+        @Argument(index = 0, name = "one", description = "one description", required = true, multiValued = false)
+        private String one;
+
+        @Argument(index = 1, name = "two", description = "two description", required = true, multiValued = false)
+        private String two;
+
+        public Object execute(CommandSession session) throws Exception {
+            return null;
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/commands/meta/TestFormatting.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/commands/meta/TestFormatting.java b/shell/console/src/test/java/org/apache/karaf/shell/commands/meta/TestFormatting.java
new file mode 100644
index 0000000..d709e9c
--- /dev/null
+++ b/shell/console/src/test/java/org/apache/karaf/shell/commands/meta/TestFormatting.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.shell.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.shell.util.IndentFormatter;
+
+public class TestFormatting extends TestCase {
+    
+    public void testFormat() throws Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        IndentFormatter.printFormatted("  ",
+                "  This is a test with a long paragraph\n\n  with an indented paragraph\nAnd another one\n", 20, new PrintStream(baos, true));
+        System.err.println(baos.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java b/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
deleted file mode 100644
index 8229d08..0000000
--- a/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * 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.karaf.shell.console;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import jline.Terminal;
-import org.apache.felix.gogo.runtime.CommandProcessorImpl;
-import org.apache.felix.service.threadio.ThreadIO;
-import org.apache.karaf.shell.console.impl.Main;
-import org.apache.karaf.shell.console.impl.jline.ConsoleImpl;
-
-import java.util.Properties;
-
-/**
- * This class is mostly here so that folks can see an example of how you can extend the Karaf Main shell.  Also
- * lets Karaf developers see how changes the Main class can affect the interface comparability
- * with sub classes.
- */
-public class ExampleSubclassMain extends Main  {
-
-    public static void main(String args[]) throws Exception {
-        ExampleSubclassMain main = new ExampleSubclassMain();
-        main.run(args);
-    }
-
-    public void ExampleSubclassMain() {
-        // Sets the name of the shell and the current user.
-        setApplication("example");
-        setUser("unknown");
-    }
-
-    @Override
-    protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
-        return new ConsoleImpl(commandProcessor, threadIO, in, out, err, terminal, null, null, null) {
-
-            /**
-             * If you don't overwrite, then karaf will use the welcome message found in the
-             * following resource files:
-             * <ul>
-             *   <li>org/apache/karaf/shell/console/branding.properties</li>
-             *   <li>org/apache/karaf/branding/branding.properties</li>
-             * <ul>
-             */
-            @Override
-            protected void welcome(Properties brandingProps) {
-                session.getConsole().println("===============================================");
-                session.getConsole().println(" Example Shell ");
-                session.getConsole().println("===============================================");
-            }
-
-            /**
-             * If you don't overwrite then Karaf builds a prompt based on the current app and user.
-             * @return
-             */
-            @Override
-            protected String getPrompt() {
-                return "example>";
-            }
-
-            /**
-             * If you don't overwrite, then karaf automatically adds session properties
-             * found in the following resource files:
-             * <ul>
-             *   <li>org/apache/karaf/shell/console/branding.properties</li>
-             *   <li>org/apache/karaf/branding/branding.properties</li>
-             * <ul>
-             */
-            @Override
-            protected void setSessionProperties(Properties brandingProps) {
-                // we won't add any session properties.
-            }
-
-        };
-    }
-
-    /**
-     * if you don't override, then Karaf will discover the commands listed in the
-     * "META-INF/services/org/apache/karaf/shell/commands" resource file.
-     *
-     * @return
-     */
-    @Override
-    public String getDiscoveryResource() {
-        return "META-INF/services/org/example/commands.index";
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/console/impl/ExampleSubclassMain.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/console/impl/ExampleSubclassMain.java b/shell/console/src/test/java/org/apache/karaf/shell/console/impl/ExampleSubclassMain.java
new file mode 100644
index 0000000..8229d08
--- /dev/null
+++ b/shell/console/src/test/java/org/apache/karaf/shell/console/impl/ExampleSubclassMain.java
@@ -0,0 +1,104 @@
+/**
+ * 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.karaf.shell.console;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import jline.Terminal;
+import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.felix.service.threadio.ThreadIO;
+import org.apache.karaf.shell.console.impl.Main;
+import org.apache.karaf.shell.console.impl.jline.ConsoleImpl;
+
+import java.util.Properties;
+
+/**
+ * This class is mostly here so that folks can see an example of how you can extend the Karaf Main shell.  Also
+ * lets Karaf developers see how changes the Main class can affect the interface comparability
+ * with sub classes.
+ */
+public class ExampleSubclassMain extends Main  {
+
+    public static void main(String args[]) throws Exception {
+        ExampleSubclassMain main = new ExampleSubclassMain();
+        main.run(args);
+    }
+
+    public void ExampleSubclassMain() {
+        // Sets the name of the shell and the current user.
+        setApplication("example");
+        setUser("unknown");
+    }
+
+    @Override
+    protected ConsoleImpl createConsole(CommandProcessorImpl commandProcessor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
+        return new ConsoleImpl(commandProcessor, threadIO, in, out, err, terminal, null, null, null) {
+
+            /**
+             * If you don't overwrite, then karaf will use the welcome message found in the
+             * following resource files:
+             * <ul>
+             *   <li>org/apache/karaf/shell/console/branding.properties</li>
+             *   <li>org/apache/karaf/branding/branding.properties</li>
+             * <ul>
+             */
+            @Override
+            protected void welcome(Properties brandingProps) {
+                session.getConsole().println("===============================================");
+                session.getConsole().println(" Example Shell ");
+                session.getConsole().println("===============================================");
+            }
+
+            /**
+             * If you don't overwrite then Karaf builds a prompt based on the current app and user.
+             * @return
+             */
+            @Override
+            protected String getPrompt() {
+                return "example>";
+            }
+
+            /**
+             * If you don't overwrite, then karaf automatically adds session properties
+             * found in the following resource files:
+             * <ul>
+             *   <li>org/apache/karaf/shell/console/branding.properties</li>
+             *   <li>org/apache/karaf/branding/branding.properties</li>
+             * <ul>
+             */
+            @Override
+            protected void setSessionProperties(Properties brandingProps) {
+                // we won't add any session properties.
+            }
+
+        };
+    }
+
+    /**
+     * if you don't override, then Karaf will discover the commands listed in the
+     * "META-INF/services/org/apache/karaf/shell/commands" resource file.
+     *
+     * @return
+     */
+    @Override
+    public String getDiscoveryResource() {
+        return "META-INF/services/org/example/commands.index";
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/6e253c93/shell/console/src/test/java/org/apache/karaf/shell/util/TestFormatting.java
----------------------------------------------------------------------
diff --git a/shell/console/src/test/java/org/apache/karaf/shell/util/TestFormatting.java b/shell/console/src/test/java/org/apache/karaf/shell/util/TestFormatting.java
deleted file mode 100644
index d709e9c..0000000
--- a/shell/console/src/test/java/org/apache/karaf/shell/util/TestFormatting.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.karaf.shell.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-import junit.framework.TestCase;
-
-import org.apache.karaf.shell.util.IndentFormatter;
-
-public class TestFormatting extends TestCase {
-    
-    public void testFormat() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        IndentFormatter.printFormatted("  ",
-                "  This is a test with a long paragraph\n\n  with an indented paragraph\nAnd another one\n", 20, new PrintStream(baos, true));
-        System.err.println(baos.toString());
-    }
-}