You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2014/02/18 09:28:25 UTC

[1/6] git commit: [KARAF-2763] Define simple injection annotations

Repository: karaf
Updated Branches:
  refs/heads/master 14429c940 -> 2bd28679e


[KARAF-2763] Define simple injection annotations

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

Branch: refs/heads/master
Commit: 5acee1776d59c791c68d59fc786fe858cfd8eb56
Parents: 14429c9
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 09:15:58 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 09:15:58 2014 +0100

----------------------------------------------------------------------
 shell/console/pom.xml                           |  1 +
 .../org/apache/karaf/shell/inject/Destroy.java  | 29 ++++++++++++++++++++
 .../org/apache/karaf/shell/inject/Init.java     | 29 ++++++++++++++++++++
 .../apache/karaf/shell/inject/Reference.java    | 29 ++++++++++++++++++++
 .../org/apache/karaf/shell/inject/Service.java  | 29 ++++++++++++++++++++
 5 files changed, 117 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/5acee177/shell/console/pom.xml
----------------------------------------------------------------------
diff --git a/shell/console/pom.xml b/shell/console/pom.xml
index 2a44b8b..9a04677 100644
--- a/shell/console/pom.xml
+++ b/shell/console/pom.xml
@@ -149,6 +149,7 @@
                             org.apache.karaf.shell.console.commands;version=2.3.0,
                         	org.apache.karaf.shell.console.completer;version=${project.version},
                             org.apache.karaf.shell.console.completer;version=2.3.0,
+                            org.apache.karaf.shell.inject;version=${project.version},
                         	org.apache.karaf.shell.util;version=${project.version},
                             org.apache.karaf.shell.util;version=2.3.0,
                             org.apache.felix.gogo*;version=${felix.gogo.version},

http://git-wip-us.apache.org/repos/asf/karaf/blob/5acee177/shell/console/src/main/java/org/apache/karaf/shell/inject/Destroy.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/Destroy.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/Destroy.java
new file mode 100644
index 0000000..4df9fe3
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/Destroy.java
@@ -0,0 +1,29 @@
+/*
+ * 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.inject;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface Destroy {
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/5acee177/shell/console/src/main/java/org/apache/karaf/shell/inject/Init.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/Init.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/Init.java
new file mode 100644
index 0000000..154b883
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/Init.java
@@ -0,0 +1,29 @@
+/*
+ * 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.inject;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface Init {
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/5acee177/shell/console/src/main/java/org/apache/karaf/shell/inject/Reference.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/Reference.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/Reference.java
new file mode 100644
index 0000000..b74d609
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/Reference.java
@@ -0,0 +1,29 @@
+/*
+ * 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.inject;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Reference {
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/5acee177/shell/console/src/main/java/org/apache/karaf/shell/inject/Service.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/Service.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/Service.java
new file mode 100644
index 0000000..ff3f3a3
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/Service.java
@@ -0,0 +1,29 @@
+/*
+ * 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.inject;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface Service {
+}


[5/6] git commit: [KARAF-2763] Leverage blueprint support for bundle, config, http, instance, jdbc, mms, jndi, car, log, orb, package, region, service, system, web and wrapper commands

Posted by gn...@apache.org.
[KARAF-2763] Leverage blueprint support for bundle, config, http, instance, jdbc, mms, jndi, car, log, orb, package, region, service, system, web and wrapper commands

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

Branch: refs/heads/master
Commit: e4f7bc4ad48e378bb25c1829b21f422a33fedeab
Parents: 582bf1d
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 09:24:21 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 09:24:21 2014 +0100

----------------------------------------------------------------------
 .../karaf/bundle/command/BundleCommand.java     |   2 +
 .../karaf/bundle/command/BundlesCommand.java    |   6 +-
 .../karaf/bundle/command/Capabilities.java      |   2 +
 .../apache/karaf/bundle/command/Classes.java    |   2 +
 .../org/apache/karaf/bundle/command/Diag.java   |   2 +
 .../karaf/bundle/command/DynamicImport.java     |   2 +
 .../apache/karaf/bundle/command/FindClass.java  |   2 +
 .../apache/karaf/bundle/command/Headers.java    |   2 +
 .../org/apache/karaf/bundle/command/Info.java   |   2 +
 .../apache/karaf/bundle/command/Install.java    |   2 +
 .../bundle/command/ListBundleServices.java      |   2 +
 .../karaf/bundle/command/ListBundles.java       |   4 +
 .../apache/karaf/bundle/command/LoadTest.java   |   2 +
 .../apache/karaf/bundle/command/Refresh.java    |   2 +
 .../karaf/bundle/command/Requirements.java      |   2 +
 .../apache/karaf/bundle/command/Resolve.java    |   2 +
 .../apache/karaf/bundle/command/Restart.java    |   2 +
 .../karaf/bundle/command/ShowBundleTree.java    |   2 +
 .../org/apache/karaf/bundle/command/Start.java  |   2 +
 .../apache/karaf/bundle/command/StartLevel.java |   2 +
 .../org/apache/karaf/bundle/command/Stop.java   |   2 +
 .../apache/karaf/bundle/command/Uninstall.java  |   2 +
 .../org/apache/karaf/bundle/command/Update.java |   2 +
 .../org/apache/karaf/bundle/command/Watch.java  |   7 +-
 .../OSGI-INF/blueprint/shell-bundles.xml        | 116 +------------------
 .../karaf/config/command/CancelCommand.java     |   2 +
 .../config/command/ConfigCommandSupport.java    |   4 +
 .../karaf/config/command/DeleteCommand.java     |   2 +
 .../karaf/config/command/EditCommand.java       |   2 +
 .../karaf/config/command/ListCommand.java       |   2 +
 .../karaf/config/command/PropAppendCommand.java |   2 +
 .../karaf/config/command/PropDelCommand.java    |   2 +
 .../karaf/config/command/PropListCommand.java   |   2 +
 .../karaf/config/command/PropSetCommand.java    |   2 +
 .../karaf/config/command/UpdateCommand.java     |   2 +
 .../completers/ConfigurationCompleter.java      |   8 +-
 .../ConfigurationPropertyCompleter.java         |   6 +-
 .../OSGI-INF/blueprint/shell-config.xml         |  62 +---------
 .../karaf/http/command/ServletListCommand.java  |  11 +-
 .../resources/OSGI-INF/blueprint/blueprint.xml  |  11 +-
 .../instance/command/ChangeOptsCommand.java     |   2 +
 .../command/ChangeRmiRegistryPortCommand.java   |   2 +
 .../command/ChangeRmiServerPortCommand.java     |   2 +
 .../instance/command/ChangeSshPortCommand.java  |   2 +
 .../karaf/instance/command/CloneCommand.java    |   2 +
 .../karaf/instance/command/ConnectCommand.java  |   2 +
 .../karaf/instance/command/CreateCommand.java   |   2 +
 .../karaf/instance/command/DestroyCommand.java  |   2 +
 .../command/InstanceCommandSupport.java         |   2 +
 .../karaf/instance/command/ListCommand.java     |   2 +
 .../karaf/instance/command/RenameCommand.java   |   2 +
 .../karaf/instance/command/StartCommand.java    |   2 +
 .../karaf/instance/command/StatusCommand.java   |   2 +
 .../karaf/instance/command/StopCommand.java     |   2 +
 .../command/completers/InstanceCompleter.java   |   4 +
 .../OSGI-INF/blueprint/instance-command.xml     |  80 +------------
 .../org/apache/karaf/itests/RegionTest.java     |   2 +-
 .../karaf/jdbc/command/CreateCommand.java       |   2 +
 .../karaf/jdbc/command/DataSourcesCommand.java  |   2 +
 .../karaf/jdbc/command/DeleteCommand.java       |   2 +
 .../karaf/jdbc/command/ExecuteCommand.java      |   2 +
 .../apache/karaf/jdbc/command/InfoCommand.java  |   2 +
 .../karaf/jdbc/command/JdbcCommandSupport.java  |   2 +
 .../apache/karaf/jdbc/command/QueryCommand.java |   2 +
 .../karaf/jdbc/command/TablesCommand.java       |   2 +
 .../DataSourcesFileNameCompleter.java           |   4 +
 .../completers/DataSourcesNameCompleter.java    |   4 +
 .../OSGI-INF/blueprint/jdbc-command.xml         |  51 +-------
 .../apache/karaf/jms/command/BrowseCommand.java |   2 +
 .../jms/command/ConnectionFactoriesCommand.java |   2 +
 .../karaf/jms/command/ConsumeCommand.java       |   2 +
 .../apache/karaf/jms/command/CountCommand.java  |   2 +
 .../apache/karaf/jms/command/CreateCommand.java |   2 +
 .../apache/karaf/jms/command/DeleteCommand.java |   2 +
 .../apache/karaf/jms/command/InfoCommand.java   |   2 +
 .../karaf/jms/command/JmsCommandSupport.java    |   2 +
 .../apache/karaf/jms/command/MoveCommand.java   |   2 +
 .../apache/karaf/jms/command/QueuesCommand.java |   2 +
 .../apache/karaf/jms/command/SendCommand.java   |   2 +
 .../apache/karaf/jms/command/TopicsCommand.java |   2 +
 .../ConnectionFactoriesFileNameCompleter.java   |   4 +
 .../ConnectionFactoriesNameCompleter.java       |   4 +
 .../OSGI-INF/blueprint/jms-command.xml          |  71 +-----------
 .../apache/karaf/jndi/command/AliasCommand.java |   2 +
 .../apache/karaf/jndi/command/BindCommand.java  |   2 +
 .../karaf/jndi/command/ContextsCommand.java     |   2 +
 .../karaf/jndi/command/CreateCommand.java       |   2 +
 .../karaf/jndi/command/DeleteCommand.java       |   2 +
 .../karaf/jndi/command/JndiCommandSupport.java  |   2 +
 .../apache/karaf/jndi/command/NamesCommand.java |   2 +
 .../karaf/jndi/command/UnbindCommand.java       |   2 +
 .../command/completers/ContextsCompleter.java   |   4 +
 .../jndi/command/completers/NamesCompleter.java |   4 +
 .../command/completers/ServicesIdCompleter.java |   4 +
 .../OSGI-INF/blueprint/jndi-command.xml         |  56 +--------
 .../karaf/kar/command/CreateKarCommand.java     |   2 +
 .../karaf/kar/command/InstallKarCommand.java    |   2 +
 .../karaf/kar/command/KarCommandSupport.java    |   2 +
 .../karaf/kar/command/ListKarCommand.java       |   2 +
 .../karaf/kar/command/UninstallKarCommand.java  |   2 +
 .../kar/command/completers/KarCompleter.java    |   6 +-
 .../OSGI-INF/blueprint/kar-command.xml          |  31 +----
 .../org/apache/karaf/log/command/ClearLog.java  |   2 +
 .../karaf/log/command/DisplayException.java     |   2 +
 .../apache/karaf/log/command/DisplayLog.java    |   4 +
 .../apache/karaf/log/command/GetLogLevel.java   |   2 +
 .../karaf/log/command/LogCommandSupport.java    |   3 +
 .../org/apache/karaf/log/command/LogEntry.java  |  11 +-
 .../org/apache/karaf/log/command/LogTail.java   |   2 +
 .../apache/karaf/log/command/SetLogLevel.java   |   2 +
 .../resources/OSGI-INF/blueprint/shell-log.xml  |  45 +------
 .../apache/karaf/obr/command/AddUrlCommand.java |   2 +
 .../apache/karaf/obr/command/DeployCommand.java |   2 +
 .../apache/karaf/obr/command/FindCommand.java   |   2 +
 .../apache/karaf/obr/command/InfoCommand.java   |   2 +
 .../apache/karaf/obr/command/ListCommand.java   |  17 +--
 .../karaf/obr/command/ListUrlCommand.java       |   2 +
 .../karaf/obr/command/ObrCommandSupport.java    |  25 ++--
 .../karaf/obr/command/RefreshUrlCommand.java    |   2 +
 .../karaf/obr/command/RemoveUrlCommand.java     |   2 +
 .../karaf/obr/command/ResolveCommand.java       |   2 +
 .../apache/karaf/obr/command/SourceCommand.java |   2 +
 .../apache/karaf/obr/command/StartCommand.java  |   2 +
 .../resources/OSGI-INF/blueprint/blueprint.xml  |  43 +------
 .../karaf/obr/command/ListCommandTest.java      |   2 +-
 .../apache/karaf/packages/command/Exports.java  |  11 +-
 .../apache/karaf/packages/command/Imports.java  |   7 +-
 .../OSGI-INF/blueprint/shell-bundles.xml        |  18 +--
 .../karaf/region/commands/AddBundleCommand.java |   2 +
 .../karaf/region/commands/AddFilterCommand.java |   2 +
 .../karaf/region/commands/AddRegionCommand.java |   2 +
 .../karaf/region/commands/InfoCommand.java      |   2 +
 .../OSGI-INF/blueprint/region-commands.xml      |  24 +---
 .../karaf/service/command/ListServices.java     |   2 +
 .../service/command/ObjectClassCompleter.java   |  17 +--
 .../org/apache/karaf/service/command/Wait.java  |   2 +
 .../OSGI-INF/blueprint/shell-services.xml       |  14 +--
 .../system/commands/AbstractSystemAction.java   |   5 +-
 .../karaf/system/commands/FrameworkOptions.java |   2 +
 .../org/apache/karaf/system/commands/Name.java  |   2 +
 .../apache/karaf/system/commands/Shutdown.java  |   2 +
 .../karaf/system/commands/StartLevel.java       |  10 +-
 .../karaf/system/commands/SystemProperty.java   |   8 +-
 .../apache/karaf/system/commands/Version.java   |   2 +
 .../OSGI-INF/blueprint/system-commands.xml      |  37 +-----
 .../org/apache/karaf/web/commands/List.java     |   6 +-
 .../org/apache/karaf/web/commands/Start.java    |   4 +
 .../org/apache/karaf/web/commands/Stop.java     |   6 +-
 .../OSGI-INF/blueprint/web-commands.xml         |  21 +---
 .../apache/karaf/wrapper/commands/Install.java  |   4 +
 .../OSGI-INF/blueprint/wrapper-commands.xml     |  11 +-
 151 files changed, 389 insertions(+), 732 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundleCommand.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundleCommand.java
index 78a4f2a..9aa6c89 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundleCommand.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundleCommand.java
@@ -19,6 +19,7 @@ package org.apache.karaf.bundle.command;
 import org.apache.karaf.bundle.core.BundleService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 
@@ -32,6 +33,7 @@ public abstract class BundleCommand extends OsgiCommandSupport {
 
     boolean defaultAllBundles = true;
 
+    @Reference
     BundleService bundleService;
 
     public BundleCommand(boolean defaultAllBundles) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundlesCommand.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundlesCommand.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundlesCommand.java
index 1adee6c..6a421fe 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundlesCommand.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/BundlesCommand.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.apache.karaf.bundle.core.BundleService;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 
@@ -31,6 +32,7 @@ public abstract class BundlesCommand extends OsgiCommandSupport {
     
     boolean defaultAllBundles = true;
 
+    @Reference
     BundleService bundleService;
     
     public BundlesCommand(boolean defaultAllBundles) {
@@ -61,8 +63,8 @@ public abstract class BundlesCommand extends OsgiCommandSupport {
       
     protected abstract void doExecute(List<Bundle> bundles) throws Exception;
 
-    public void setBundleService(BundleService bundleSelector) {
-        this.bundleService = bundleSelector;
+    public void setBundleService(BundleService bundleService) {
+        this.bundleService = bundleService;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Capabilities.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Capabilities.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Capabilities.java
index 2ec9c31..4d8c694 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Capabilities.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Capabilities.java
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
@@ -33,6 +34,7 @@ import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
 @Command(scope = "bundle", name = "capabilities", description = "Displays OSGi capabilities of a given bundles.")
+@Service
 public class Capabilities extends BundlesCommand {
     public static final String NONSTANDARD_SERVICE_NAMESPACE = "service";
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Classes.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Classes.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Classes.java
index 40bd0a4..3a9dc03 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Classes.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Classes.java
@@ -18,6 +18,7 @@ package org.apache.karaf.bundle.command;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.wiring.BundleWiring;
 
@@ -25,6 +26,7 @@ import java.util.Collection;
 import java.util.List;
 
 @Command(scope = "bundle", name = "classes", description = "Displays a list of classes contained in the bundle")
+@Service
 public class Classes extends BundlesCommand {
 
     @Option(name = "-a", aliases={"--display-all-files"}, description="List all classes and files in the bundle", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Diag.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Diag.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Diag.java
index a1d4ee7..0a70d72 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Diag.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Diag.java
@@ -21,10 +21,12 @@ import java.util.List;
 import org.apache.karaf.bundle.core.BundleInfo;
 import org.apache.karaf.bundle.core.BundleState;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "diag", description = "Displays diagnostic information why a bundle is not Active")
+@Service
 public class Diag extends BundlesCommand {
 
     public Diag() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/DynamicImport.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/DynamicImport.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/DynamicImport.java
index eb5d27c..e2e4759 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/DynamicImport.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/DynamicImport.java
@@ -18,6 +18,7 @@ package org.apache.karaf.bundle.command;
 
 import org.apache.karaf.bundle.core.BundleService;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 /**
@@ -25,6 +26,7 @@ import org.osgi.framework.Bundle;
  * wired imports.
  */
 @Command(scope = "bundle", name = "dynamic-import", description = "Enables/disables dynamic-import for a given bundle.")
+@Service
 public class DynamicImport extends BundleCommand {
 
     public DynamicImport() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/FindClass.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/FindClass.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/FindClass.java
index 82047e8..afafd54 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/FindClass.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/FindClass.java
@@ -20,6 +20,7 @@ package org.apache.karaf.bundle.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.framework.Bundle;
@@ -28,6 +29,7 @@ import java.util.Collection;
 import java.util.List;
 
 @Command(scope = "bundle", name = "find-class", description = "Locates a specified class in any deployed bundle")
+@Service
 public class FindClass extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "className", description = "Class name or partial class name to be found", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Headers.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Headers.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Headers.java
index 6b1b90c..a173a90 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Headers.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Headers.java
@@ -35,6 +35,7 @@ import org.apache.felix.utils.version.VersionRange;
 import org.apache.felix.utils.version.VersionTable;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.fusesource.jansi.Ansi;
 import org.osgi.framework.Bundle;
@@ -44,6 +45,7 @@ import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.framework.wiring.BundleWiring;
 
 @Command(scope = "bundle", name = "headers", description = "Displays OSGi headers of a given bundles.")
+@Service
 public class Headers extends BundlesCommand {
 
     protected final static String BUNDLE_PREFIX = "Bundle-";

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Info.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Info.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Info.java
index 8d7c109..904c9d6 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Info.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Info.java
@@ -26,10 +26,12 @@ import org.apache.karaf.bundle.command.wikidoc.AnsiPrintingWikiVisitor;
 import org.apache.karaf.bundle.command.wikidoc.WikiParser;
 import org.apache.karaf.bundle.command.wikidoc.WikiVisitor;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "info", description = "Displays detailed information of a given bundles.")
+@Service
 public class Info extends BundlesCommand {
 
     public Info() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Install.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Install.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Install.java
index 06aeb08..15604cc 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Install.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Install.java
@@ -24,9 +24,11 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.MultiException;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "install", description = "Installs one or more bundles.")
+@Service
 public class Install extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "urls", description = "Bundle URLs separated by whitespaces", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundleServices.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundleServices.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundleServices.java
index f9c234f..b813c52 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundleServices.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundleServices.java
@@ -22,12 +22,14 @@ import org.apache.felix.service.command.Function;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 @Command(scope = "bundle", name = "services", description = "Lists OSGi services per Bundle")
+@Service
 public class ListBundleServices extends BundlesCommand {
 
     @Option(name = "-a", aliases = {}, description = "Shows all services. (By default Karaf commands are hidden)", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundles.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundles.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundles.java
index db3ffa6..1cc87ef 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundles.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ListBundles.java
@@ -22,11 +22,14 @@ import org.apache.karaf.bundle.core.BundleState;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.startlevel.FrameworkStartLevel;
 
 @Command(scope = "bundle", name = "list", description = "Lists all installed bundles.")
+@Service
 public class ListBundles extends OsgiCommandSupport {
 
     @Option(name = "-l", aliases = {}, description = "Show the locations", required = false, multiValued = false)
@@ -44,6 +47,7 @@ public class ListBundles extends OsgiCommandSupport {
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
 
+    @Reference
     private BundleService bundleService;
 
     public void setBundleService(BundleService bundleService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/LoadTest.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
index fe36d52..6c8d6c3 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/LoadTest.java
@@ -29,6 +29,7 @@ import org.apache.felix.service.command.CommandSession;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkEvent;
@@ -36,6 +37,7 @@ import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.wiring.FrameworkWiring;
 
 @Command(scope = "bundle", name = "load-test", description = "Load test bundle lifecycle")
+@Service
 public class LoadTest extends OsgiCommandSupport {
 
     @Option(name = "--threads", description = "number of concurrent threads")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Refresh.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Refresh.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Refresh.java
index 4e00b14..bfd0c2d 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Refresh.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Refresh.java
@@ -19,10 +19,12 @@ package org.apache.karaf.bundle.command;
 import java.util.List;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.wiring.FrameworkWiring;
 
 @Command(scope = "bundle", name = "refresh", description = "Refresh bundles.")
+@Service
 public class Refresh extends BundlesCommandWithConfirmation {
     
     public Refresh() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Requirements.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Requirements.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Requirements.java
index cd7ed88..3fdc004 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Requirements.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Requirements.java
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
@@ -34,6 +35,7 @@ import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
 @Command(scope = "bundle", name = "requirements", description = "Displays OSGi requirements of a given bundles.")
+@Service
 public class Requirements extends BundlesCommand {
 
     public static final String NONSTANDARD_SERVICE_NAMESPACE = "service";

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Resolve.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Resolve.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Resolve.java
index afa8998..d72cfce 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Resolve.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Resolve.java
@@ -19,10 +19,12 @@ package org.apache.karaf.bundle.command;
 import java.util.List;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.wiring.FrameworkWiring;
 
 @Command(scope = "bundle", name = "resolve", description = "Resolve bundles.")
+@Service
 public class Resolve extends BundlesCommand {
 
     public Resolve() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Restart.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Restart.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Restart.java
index e71d901..16d9b02 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Restart.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Restart.java
@@ -21,9 +21,11 @@ import java.util.List;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.MultiException;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "restart", description = "Restarts bundles.")
+@Service
 public class Restart extends BundlesCommandWithConfirmation {
     
     public Restart() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ShowBundleTree.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ShowBundleTree.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ShowBundleTree.java
index eb5795d..1e44a4d 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/ShowBundleTree.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/ShowBundleTree.java
@@ -32,6 +32,7 @@ import org.apache.felix.utils.version.VersionTable;
 import org.apache.karaf.bundle.command.bundletree.Node;
 import org.apache.karaf.bundle.command.bundletree.Tree;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.wiring.BundleCapability;
@@ -47,6 +48,7 @@ import org.slf4j.LoggerFactory;
  * a given bundle.
  */
 @Command(scope = "bundle", name = "tree-show", description = "Shows the tree of bundles based on the wiring information.")
+@Service
 public class ShowBundleTree extends BundleCommand {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ShowBundleTree.class);

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Start.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Start.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Start.java
index e6bab9e..c3f1882 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Start.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Start.java
@@ -17,9 +17,11 @@
 package org.apache.karaf.bundle.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "start", description = "Starts bundles.")
+@Service
 public class Start extends BundlesCommandWithConfirmation {
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/StartLevel.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/StartLevel.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/StartLevel.java
index 4097f98..117f21a 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/StartLevel.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/StartLevel.java
@@ -19,10 +19,12 @@ package org.apache.karaf.bundle.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import jline.console.ConsoleReader;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.startlevel.BundleStartLevel;
 
 @Command(scope = "bundle", name = "start-level", description = "Gets or sets the start level of a bundle.")
+@Service
 public class StartLevel extends BundleCommandWithConfirmation {
 
     @Argument(index = 1, name = "startLevel", description = "The bundle's new start level", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Stop.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Stop.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Stop.java
index 6fed683..c5408bc 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Stop.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Stop.java
@@ -18,9 +18,11 @@ package org.apache.karaf.bundle.command;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "stop", description = "Stop bundles.")
+@Service
 public class Stop extends BundlesCommandWithConfirmation {
     
 	@Option(name = "-t", aliases={"--transient"}, description="Keep the bundle as auto-start", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Uninstall.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Uninstall.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Uninstall.java
index 1578e59..04f15f2 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Uninstall.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Uninstall.java
@@ -17,9 +17,11 @@
 package org.apache.karaf.bundle.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "uninstall", description = "Uninstall bundles.")
+@Service
 public class Uninstall extends BundlesCommandWithConfirmation {
     
     public Uninstall() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Update.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Update.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Update.java
index f882388..b19bed7 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Update.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Update.java
@@ -21,9 +21,11 @@ import java.net.URL;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "bundle", name = "update", description = "Update bundle.")
+@Service
 public class Update extends BundleCommandWithConfirmation {
 
     @Argument(index = 1, name = "location", description = "The bundles update location", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Watch.java
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Watch.java b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Watch.java
index 20ca504..715455b 100644
--- a/bundle/command/src/main/java/org/apache/karaf/bundle/command/Watch.java
+++ b/bundle/command/src/main/java/org/apache/karaf/bundle/command/Watch.java
@@ -23,11 +23,15 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 
 @Command(scope = "bundle", name = "watch", description = "Watches and updates bundles", detailedDescription = "Watches the local maven repo for changes in snapshot jars and redploys changed jars")
-public class Watch extends AbstractAction {
+@Service
+public class Watch extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "urls", description = "The bundle IDs or URLs", required = false, multiValued = true)
     List<String> urls;
@@ -47,6 +51,7 @@ public class Watch extends AbstractAction {
     @Option(name = "--list", description = "Displays the watch list", required = false, multiValued = false)
     protected boolean list;
 
+    @Reference
     private BundleWatcher bundleWatcher;
 
     public void setBundleWatcher(BundleWatcher bundleWatcher) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/bundle/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
----------------------------------------------------------------------
diff --git a/bundle/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml b/bundle/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
index bed5c0f..327becd 100644
--- a/bundle/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
+++ b/bundle/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
@@ -19,119 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
 
-    <reference id="bundleService" interface="org.apache.karaf.bundle.core.BundleService" />
-    <reference id="bundleWatcher" interface="org.apache.karaf.bundle.core.BundleWatcher"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.bundle.command.*" />
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.bundle.command.StartLevel">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Classes">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.FindClass">
-                <property name="bundleContext" ref="blueprintBundleContext" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Headers">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Info">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Diag">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Install">
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.ListBundles">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.ListBundleServices">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Refresh">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Update">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Resolve">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Restart">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Start">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Stop">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Uninstall">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Capabilities">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Requirements">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.ShowBundleTree">
-                <property name="bundleService" ref="bundleService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.DynamicImport">
-                <property name="bundleService" ref="bundleService"/>
-                <property name="bundleContext" ref="blueprintBundleContext" />
-            </action> 
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.Watch" >
-                <property name="bundleWatcher" ref="bundleWatcher"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.bundle.command.LoadTest" >
-            </action>
-        </command>
-    </command-bundle>
-    
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/CancelCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/CancelCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/CancelCommand.java
index a62a39e..d3274dd 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/CancelCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/CancelCommand.java
@@ -17,8 +17,10 @@
 package org.apache.karaf.config.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "cancel", description = "Cancels the changes to the configuration being edited.")
+@Service
 public class CancelCommand extends ConfigCommandSupport {
 
     protected Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/ConfigCommandSupport.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/ConfigCommandSupport.java b/config/command/src/main/java/org/apache/karaf/config/command/ConfigCommandSupport.java
index bfd0c12..9111b53 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/ConfigCommandSupport.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/ConfigCommandSupport.java
@@ -19,6 +19,7 @@ package org.apache.karaf.config.command;
 import java.util.Dictionary;
 
 import org.apache.karaf.config.core.ConfigRepository;
+import org.apache.karaf.shell.inject.Reference;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 
 /**
@@ -28,9 +29,12 @@ import org.apache.karaf.shell.console.OsgiCommandSupport;
  * calling another method to actually process the command.
  */
 public abstract class ConfigCommandSupport extends OsgiCommandSupport {
+
     public static final String PROPERTY_CONFIG_PID = "ConfigCommand.PID";
     public static final String PROPERTY_CONFIG_PROPS = "ConfigCommand.Props";
     public static final String PROPERTY_FACTORY = "ConfigCommand.Factory";
+
+    @Reference
     protected ConfigRepository configRepository;
 
     @SuppressWarnings("rawtypes")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/DeleteCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/DeleteCommand.java
index 7e8b3d2..506ce48 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/DeleteCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/DeleteCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "delete", description = "Delete a configuration.")
+@Service
 public class DeleteCommand extends ConfigCommandSupport {
 
     @Argument(index = 0, name = "pid", description = "PID of the configuration", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/EditCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/EditCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/EditCommand.java
index 3f494c7..aeaede3 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/EditCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/EditCommand.java
@@ -23,9 +23,11 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.service.cm.Configuration;
 
 @Command(scope = "config", name = "edit", description = "Creates or edits a configuration.", detailedDescription="classpath:edit.txt")
+@Service
 public class EditCommand extends ConfigCommandSupport {
 
     @Argument(index = 0, name = "pid", description = "PID of the configuration or of the factory if --factory is given. Pid can also be specified as ldap query", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/ListCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/ListCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/ListCommand.java
index c6c7d57..8589e72 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/ListCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/ListCommand.java
@@ -21,9 +21,11 @@ import java.util.Enumeration;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.service.cm.Configuration;
 
 @Command(scope = "config", name = "list", description = "Lists existing configurations.")
+@Service
 public class ListCommand extends ConfigCommandSupport {
 
     @Argument(index = 0, name = "query", description = "Query in LDAP syntax. Example: \"(service.pid=org.apache.karaf.log)\"", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/PropAppendCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/PropAppendCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/PropAppendCommand.java
index 9c04638..6d13e13 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/PropAppendCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/PropAppendCommand.java
@@ -22,8 +22,10 @@ import org.apache.karaf.config.command.completers.ConfigurationPropertyCompleter
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "property-append", description = "Appends the given value to an existing property or creates the property with the specified name and value.")
+@Service
 public class PropAppendCommand extends ConfigPropertyCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the property", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/PropDelCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/PropDelCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/PropDelCommand.java
index 3ad82a5..3280454 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/PropDelCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/PropDelCommand.java
@@ -20,8 +20,10 @@ import java.util.Dictionary;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "property-delete", description = "Deletes a property from the configuration being edited.")
+@Service
 public class PropDelCommand extends ConfigPropertyCommandSupport {
 
     @Argument(index = 0, name = "property", description = "The name of the property to delete", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/PropListCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/PropListCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/PropListCommand.java
index ec0b654..d0b208b 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/PropListCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/PropListCommand.java
@@ -19,8 +19,10 @@ package org.apache.karaf.config.command;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "property-list", description = "Lists properties from the currently edited configuration.")
+@Service
 public class PropListCommand extends ConfigPropertyCommandSupport {
 
     @SuppressWarnings("rawtypes")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/PropSetCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/PropSetCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/PropSetCommand.java
index 30135d8..16e58b9 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/PropSetCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/PropSetCommand.java
@@ -22,8 +22,10 @@ import org.apache.karaf.config.command.completers.ConfigurationPropertyCompleter
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "property-set", description = "Sets a property in the currently edited configuration.")
+@Service
 public class PropSetCommand extends ConfigPropertyCommandSupport {
 
     @Argument(index = 0, name = "property", description = "The name of the property to set", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/UpdateCommand.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/UpdateCommand.java b/config/command/src/main/java/org/apache/karaf/config/command/UpdateCommand.java
index 2c5a547..ae48722 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/UpdateCommand.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/UpdateCommand.java
@@ -19,8 +19,10 @@ package org.apache.karaf.config.command;
 import java.util.Dictionary;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "config", name = "update", description = "Saves and propagates changes from the configuration being edited.")
+@Service
 public class UpdateCommand extends ConfigCommandSupport {
 
     @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationCompleter.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationCompleter.java b/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationCompleter.java
index 7fcbef5..3122ca2 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationCompleter.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationCompleter.java
@@ -23,6 +23,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.karaf.shell.inject.Init;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
 import org.apache.karaf.shell.console.Completer;
 import org.osgi.service.cm.Configuration;
@@ -31,21 +34,24 @@ import org.osgi.service.cm.ConfigurationEvent;
 import org.osgi.service.cm.ConfigurationListener;
 
 /**
- * {@link jline.Completor} for Configuration Admin configurations.
+ * {@link Completer} for Configuration Admin configurations.
  *
  * Displays a list of existing config instance configurations for completion.
  *
  */
+@Service
 public class ConfigurationCompleter implements Completer, ConfigurationListener {
 
     private final StringsCompleter delegate = new StringsCompleter();
 
+    @Reference
     private ConfigurationAdmin admin;
 
     public void setAdmin(ConfigurationAdmin admin) {
         this.admin = admin;
     }
 
+    @Init
     public void init() {
         Configuration[] configs;
         try {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationPropertyCompleter.java
----------------------------------------------------------------------
diff --git a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationPropertyCompleter.java b/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationPropertyCompleter.java
index d182e02..2d98098 100644
--- a/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationPropertyCompleter.java
+++ b/config/command/src/main/java/org/apache/karaf/config/command/completers/ConfigurationPropertyCompleter.java
@@ -29,6 +29,8 @@ import java.util.Set;
 
 import org.apache.felix.service.command.CommandSession;
 import org.apache.karaf.config.command.ConfigCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.console.CommandSessionHolder;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.ArgumentCompleter;
@@ -38,11 +40,12 @@ import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
 
 /**
- * {@link jline.Completor} for Configuration Admin properties.
+ * {@link Completer} for Configuration Admin properties.
  *
  * Displays a list of existing properties based on the current configuration being edited.
  *
  */
+@Service
 public class ConfigurationPropertyCompleter implements Completer {
 
     private final StringsCompleter delegate = new StringsCompleter();
@@ -50,6 +53,7 @@ public class ConfigurationPropertyCompleter implements Completer {
     private static final String OPTION = "-p";
     private static final String ALIAS = "--pid";
 
+    @Reference
     private ConfigurationAdmin configAdmin;
 
     @SuppressWarnings("rawtypes")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/config/command/src/main/resources/OSGI-INF/blueprint/shell-config.xml
----------------------------------------------------------------------
diff --git a/config/command/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/config/command/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index def3594..4e91d25 100644
--- a/config/command/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/config/command/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -22,65 +22,7 @@
            xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
            default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.config.command.CancelCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.DeleteCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.EditCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.ListCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.PropDelCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.PropListCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.PropSetCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.PropAppendCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.config.command.UpdateCommand">
-                <property name="configRepository" ref="configRepo"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="configCompleter" class="org.apache.karaf.config.command.completers.ConfigurationCompleter" init-method="init">
-        <property name="admin" ref="configAdmin"/>
-    </bean>
-    <service ref="configCompleter" auto-export="all-classes" />
-
-    <bean id="configPropertyCompleter" class="org.apache.karaf.config.command.completers.ConfigurationPropertyCompleter">
-        <property name="configAdmin" ref="configAdmin"/>
-    </bean>
-    <service ref="configPropertyCompleter" auto-export="all-classes" />
-
-    <reference id="configRepo" interface="org.apache.karaf.config.core.ConfigRepository" />
-    <reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" />
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.config.command.*" />
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/http/command/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
----------------------------------------------------------------------
diff --git a/http/command/src/main/java/org/apache/karaf/http/command/ServletListCommand.java b/http/command/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
index 0579aff..6fe7313 100644
--- a/http/command/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
+++ b/http/command/src/main/java/org/apache/karaf/http/command/ServletListCommand.java
@@ -23,21 +23,21 @@ import org.apache.karaf.http.core.ServletService;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Col;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "http", name = "list", description = "Lists details for servlets.")
+@Service
 public class ServletListCommand extends OsgiCommandSupport {
 
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
 
+    @Reference
     private ServletService servletService;
     
-    public ServletListCommand(ServletService servletService) {
-        this.servletService = servletService;
-    }
-
     @Override
     protected Object doExecute() throws Exception {
         ShellTable table = new ShellTable();
@@ -56,4 +56,7 @@ public class ServletListCommand extends OsgiCommandSupport {
         return null;
     }
 
+    public void setServletService(ServletService servletService) {
+        this.servletService = servletService;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/http/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/http/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/http/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 7127f3c..4c9f164 100644
--- a/http/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/http/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -19,14 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <reference id="servletService" interface="org.apache.karaf.http.core.ServletService" />
+	<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.http.command.*" />
 
-	<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.http.command.ServletListCommand">
-            	<argument ref="servletService" />
-            </action>
-        </command>
-    </command-bundle>
-    
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeOptsCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeOptsCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeOptsCommand.java
index 3db7cec..e2faee1 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeOptsCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeOptsCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "opts-change", description = "Changes the Java options of an existing container instance.")
+@Service
 public class ChangeOptsCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description="The name of the container instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiRegistryPortCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiRegistryPortCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiRegistryPortCommand.java
index d889fa2..148bc93 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiRegistryPortCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiRegistryPortCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "rmi-registry-port-change", description = "Changes the RMI registry port (used by management layer) of an existing container instance.")
+@Service
 public class ChangeRmiRegistryPortCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiServerPortCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiServerPortCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiServerPortCommand.java
index 1bef267..3b6fdc4 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiServerPortCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeRmiServerPortCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "rmi-server-port-change", description = "Changes the RMI server port (used by management layer) of an existing instance.")
+@Service
 public class ChangeRmiServerPortCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeSshPortCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeSshPortCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeSshPortCommand.java
index 9977971..01df8ae 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeSshPortCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ChangeSshPortCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "ssh-port-change", description = "Changes the secure shell port of an existing container instance.")
+@Service
 public class ChangeSshPortCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description="The name of the container instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/CloneCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/CloneCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/CloneCommand.java
index 5e6b2b4..e5626e0 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/CloneCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/CloneCommand.java
@@ -22,11 +22,13 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.instance.core.InstanceSettings;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Clone an existing instance.
  */
 @Command(scope = "instance", name = "clone", description = "Clones an existing container instance.")
+@Service
 public class CloneCommand extends InstanceCommandSupport {
 
     @Option(name = "-s", aliases = {"--ssh-port"}, description = "Port number for remote secure shell connection", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ConnectCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ConnectCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ConnectCommand.java
index 6c909e9..294c348 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ConnectCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ConnectCommand.java
@@ -25,8 +25,10 @@ import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "connect", description = "Connects to an existing container instance.")
+@Service
 public class ConnectCommand extends InstanceCommandSupport {
 
     @Option(name="-u", aliases={"--username"}, description="Remote user name", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/CreateCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/CreateCommand.java
index a3c8595..af3aebd 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/CreateCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/CreateCommand.java
@@ -25,11 +25,13 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.instance.core.InstanceSettings;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Creates a new instance.
  */
 @Command(scope = "instance", name = "create", description = "Creates a new container instance.")
+@Service
 public class CreateCommand extends InstanceCommandSupport
 {
     @Option(name = "-s", aliases = {"--ssh-port"}, description = "Port number for remote secure shell connection", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/DestroyCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/DestroyCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/DestroyCommand.java
index 3e41be0..dbb1659 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/DestroyCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/DestroyCommand.java
@@ -20,11 +20,13 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Destroy an existing instance.
  */
 @Command(scope = "instance", name = "destroy", description = "Destroys an existing container instance.")
+@Service
 public class DestroyCommand extends InstanceCommandSupport
 {
     @Argument(index = 0, name = "name", description= "The name of the container instance to destroy", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/InstanceCommandSupport.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/InstanceCommandSupport.java b/instance/command/src/main/java/org/apache/karaf/instance/command/InstanceCommandSupport.java
index 6c1d3fb..b320b3c 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/InstanceCommandSupport.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/InstanceCommandSupport.java
@@ -19,9 +19,11 @@ package org.apache.karaf.instance.command;
 import org.apache.karaf.instance.core.Instance;
 import org.apache.karaf.instance.core.InstanceService;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class InstanceCommandSupport extends OsgiCommandSupport {
 
+    @Reference
     private InstanceService instanceService;
 
     public InstanceService getInstanceService() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/ListCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/ListCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/ListCommand.java
index fe33ab5..b15f8b1 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/ListCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/ListCommand.java
@@ -19,9 +19,11 @@ package org.apache.karaf.instance.command;
 import org.apache.karaf.instance.core.Instance;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "instance", name = "list", description = "Lists all existing container instances.")
+@Service
 public class ListCommand extends InstanceCommandSupport {
 
     @Option(name = "-l", aliases = { "--location" }, description = "Displays the location of the container instances", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/RenameCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/RenameCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/RenameCommand.java
index 5b57774..872d954 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/RenameCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/RenameCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "rename", description = "Rename an existing container instance.")
+@Service
 public class RenameCommand extends InstanceCommandSupport {
 
     @Option(name = "-v", aliases = {"--verbose"}, description = "Display actions performed by the command (disabled by default)", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/StartCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/StartCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/StartCommand.java
index 1f3c13b..9b6e464 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/StartCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/StartCommand.java
@@ -22,8 +22,10 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.instance.core.Instance;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "start", description = "Start an existing container instance.")
+@Service
 public class StartCommand extends InstanceCommandSupport {
                       
     @Option(name = "-d", aliases = { "--debug"}, description = "Start the instance in debug mode", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/StatusCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/StatusCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/StatusCommand.java
index fce8d5f..760dffb 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/StatusCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/StatusCommand.java
@@ -22,8 +22,10 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "status", description = "Check the current status of an instance.")
+@Service
 public class StatusCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/StopCommand.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/StopCommand.java b/instance/command/src/main/java/org/apache/karaf/instance/command/StopCommand.java
index ad4cce5..4d540b2 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/StopCommand.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/StopCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.instance.command.completers.InstanceCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "instance", name = "stop", description = "Stop an existing container instance.")
+@Service
 public class StopCommand extends InstanceCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/java/org/apache/karaf/instance/command/completers/InstanceCompleter.java
----------------------------------------------------------------------
diff --git a/instance/command/src/main/java/org/apache/karaf/instance/command/completers/InstanceCompleter.java b/instance/command/src/main/java/org/apache/karaf/instance/command/completers/InstanceCompleter.java
index 1170ebf..5d8cc71 100644
--- a/instance/command/src/main/java/org/apache/karaf/instance/command/completers/InstanceCompleter.java
+++ b/instance/command/src/main/java/org/apache/karaf/instance/command/completers/InstanceCompleter.java
@@ -22,13 +22,17 @@ import org.apache.karaf.instance.core.Instance;
 import org.apache.karaf.instance.core.InstanceService;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
 import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Displays a list of configured server instances for the instance commands.
  *
  */
+@Service
 public class InstanceCompleter implements Completer {
 
+    @Reference
     private InstanceService instanceService;
 
     public void setInstanceService(InstanceService instanceService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/instance/command/src/main/resources/OSGI-INF/blueprint/instance-command.xml
----------------------------------------------------------------------
diff --git a/instance/command/src/main/resources/OSGI-INF/blueprint/instance-command.xml b/instance/command/src/main/resources/OSGI-INF/blueprint/instance-command.xml
index 1db1a0e..4bb3520 100644
--- a/instance/command/src/main/resources/OSGI-INF/blueprint/instance-command.xml
+++ b/instance/command/src/main/resources/OSGI-INF/blueprint/instance-command.xml
@@ -20,83 +20,7 @@
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.instance.command.CreateCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ConnectCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ListCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.StartCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.StopCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.DestroyCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.RenameCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.CloneCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ChangeSshPortCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ChangeRmiRegistryPortCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ChangeRmiServerPortCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.ChangeOptsCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.instance.command.StatusCommand">
-                <property name="instanceService" ref="instanceService" />
-            </action>
-        </command>
-    </command-bundle>
-
-    <!-- Services -->
-
-    <reference id="instanceService" interface="org.apache.karaf.instance.core.InstanceService" />
-
-    <!-- Completers -->
-
-    <bean id="instanceCompleter" class="org.apache.karaf.instance.command.completers.InstanceCompleter">
-        <property name="instanceService" ref="instanceService" />
-    </bean>
-    <service ref="instanceCompleter" auto-export="all-classes"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.instance.command.*" />
 
 </blueprint>


[3/6] [KARAF-2763] Leverage blueprint support for bundle, config, http, instance, jdbc, mms, jndi, car, log, orb, package, region, service, system, web and wrapper commands

Posted by gn...@apache.org.
http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/obr/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/obr/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index dd974f2..941d890 100644
--- a/obr/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/obr/command/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -19,46 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <reference id="repoAdmin"
-        interface="org.apache.felix.bundlerepository.RepositoryAdmin"
-        availability="optional" />
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.obr.command.AddUrlCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.DeployCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.FindCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.InfoCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.ListCommand">
-                <property name="repoAdmin" ref="repoAdmin" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.ListUrlCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.RefreshUrlCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.RemoveUrlCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.ResolveCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.SourceCommand" />
-        </command>
-        <command>
-            <action class="org.apache.karaf.obr.command.StartCommand" />
-        </command>
-    </command-bundle>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.obr.command.*" />
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/test/java/org/apache/karaf/obr/command/ListCommandTest.java
----------------------------------------------------------------------
diff --git a/obr/command/src/test/java/org/apache/karaf/obr/command/ListCommandTest.java b/obr/command/src/test/java/org/apache/karaf/obr/command/ListCommandTest.java
index 18b5f87..46b5e38 100644
--- a/obr/command/src/test/java/org/apache/karaf/obr/command/ListCommandTest.java
+++ b/obr/command/src/test/java/org/apache/karaf/obr/command/ListCommandTest.java
@@ -34,7 +34,7 @@ public class ListCommandTest {
 		IMocksControl control = EasyMock.createControl();
 		RepositoryAdmin repoAdmin = control.createMock(RepositoryAdmin.class);
 		ListCommand command = new ListCommand();
-		command.setRepoAdmin(repoAdmin);
+		command.setRepositoryAdmin(repoAdmin);
 		
 		Resource[] resources = new Resource[] {
 			createResource("My bundle", "my.bundle", "1.0.0"),

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/package/command/src/main/java/org/apache/karaf/packages/command/Exports.java
----------------------------------------------------------------------
diff --git a/package/command/src/main/java/org/apache/karaf/packages/command/Exports.java b/package/command/src/main/java/org/apache/karaf/packages/command/Exports.java
index ccacc31..72d1af2 100644
--- a/package/command/src/main/java/org/apache/karaf/packages/command/Exports.java
+++ b/package/command/src/main/java/org/apache/karaf/packages/command/Exports.java
@@ -27,6 +27,8 @@ import org.apache.karaf.packages.core.PackageVersion;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Col;
 import org.apache.karaf.shell.table.ShellTable;
 import org.osgi.framework.Bundle;
@@ -35,18 +37,19 @@ import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRevision;
 
 @Command(scope = "package", name = "exports", description = "Lists exported packages and the bundles that export them")
+@Service
 public class Exports extends OsgiCommandSupport {
 
-    private PackageService packageService;
-    
     @Option(name = "-d", description = "Only show packages that are exported by more than one bundle", required = false, multiValued = false)
     private boolean onlyDuplicates;
 
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
 
-    public Exports(PackageService packageService) {
-        super();
+    @Reference
+    private PackageService packageService;
+
+    public void setPackageService(PackageService packageService) {
         this.packageService = packageService;
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/package/command/src/main/java/org/apache/karaf/packages/command/Imports.java
----------------------------------------------------------------------
diff --git a/package/command/src/main/java/org/apache/karaf/packages/command/Imports.java b/package/command/src/main/java/org/apache/karaf/packages/command/Imports.java
index 0944412..e5ea17a 100644
--- a/package/command/src/main/java/org/apache/karaf/packages/command/Imports.java
+++ b/package/command/src/main/java/org/apache/karaf/packages/command/Imports.java
@@ -23,11 +23,14 @@ import org.apache.karaf.packages.core.PackageService;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Col;
 import org.apache.karaf.shell.table.ShellTable;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "package", name = "imports", description = "Lists imported packages and the bundles that import them")
+@Service
 public class Imports extends OsgiCommandSupport {
     
     @Option(name = "-p", description = "Only show package instead of full filter", required = false, multiValued = false)
@@ -36,10 +39,10 @@ public class Imports extends OsgiCommandSupport {
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
 
+    @Reference
     private PackageService packageService;
 
-    public Imports(PackageService packageService) {
-        super();
+    public void setPackageService(PackageService packageService) {
         this.packageService = packageService;
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/package/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
----------------------------------------------------------------------
diff --git a/package/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml b/package/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
index 8f24296..e66dd06 100644
--- a/package/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
+++ b/package/command/src/main/resources/OSGI-INF/blueprint/shell-bundles.xml
@@ -19,21 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        
-        <command>
-            <action class="org.apache.karaf.packages.command.Exports">
-                <argument ref="packageService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.packages.command.Imports">
-                <argument ref="packageService"/>
-            </action>
-        </command>
-
-    </command-bundle>
-    
-    <reference id="packageService" interface="org.apache.karaf.packages.core.PackageService" />
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.packages.command.*" />
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/region/command/src/main/java/org/apache/karaf/region/commands/AddBundleCommand.java
----------------------------------------------------------------------
diff --git a/region/command/src/main/java/org/apache/karaf/region/commands/AddBundleCommand.java b/region/command/src/main/java/org/apache/karaf/region/commands/AddBundleCommand.java
index 23d0253..ed7c28f 100644
--- a/region/command/src/main/java/org/apache/karaf/region/commands/AddBundleCommand.java
+++ b/region/command/src/main/java/org/apache/karaf/region/commands/AddBundleCommand.java
@@ -20,11 +20,13 @@ import java.util.List;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "region", name = "bundle-add", description = "Adds a list of known bundles by id to a specified region.")
+@Service
 public class AddBundleCommand extends RegionCommandSupport {
 
     @Argument(index = 0, name = "region", description = "Region to add the bundles to", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/region/command/src/main/java/org/apache/karaf/region/commands/AddFilterCommand.java
----------------------------------------------------------------------
diff --git a/region/command/src/main/java/org/apache/karaf/region/commands/AddFilterCommand.java b/region/command/src/main/java/org/apache/karaf/region/commands/AddFilterCommand.java
index 192dacb..bbe35b6 100644
--- a/region/command/src/main/java/org/apache/karaf/region/commands/AddFilterCommand.java
+++ b/region/command/src/main/java/org/apache/karaf/region/commands/AddFilterCommand.java
@@ -24,6 +24,7 @@ import org.apache.aries.util.VersionRange;
 import org.apache.aries.util.manifest.ManifestHeaderProcessor;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.eclipse.equinox.region.RegionFilter;
@@ -33,6 +34,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 
 @Command(scope = "region", name = "filter-add", description = "Adds a filter between two regions.")
+@Service
 public class AddFilterCommand extends RegionCommandSupport {
 
     @Argument(index = 0, name = "from", description = "The from region.", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/region/command/src/main/java/org/apache/karaf/region/commands/AddRegionCommand.java
----------------------------------------------------------------------
diff --git a/region/command/src/main/java/org/apache/karaf/region/commands/AddRegionCommand.java b/region/command/src/main/java/org/apache/karaf/region/commands/AddRegionCommand.java
index e3857cf..0daeea3 100644
--- a/region/command/src/main/java/org/apache/karaf/region/commands/AddRegionCommand.java
+++ b/region/command/src/main/java/org/apache/karaf/region/commands/AddRegionCommand.java
@@ -20,9 +20,11 @@ import java.util.List;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.eclipse.equinox.region.RegionDigraph;
 
 @Command(scope = "region", name = "region-add", description = "Adds a list of regions to the region digraph service.")
+@Service
 public class AddRegionCommand extends RegionCommandSupport {
 
     @Argument(index = 0, name = "name", description = "Regions to add to the region digraph service separated by whitespaces.", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/region/command/src/main/java/org/apache/karaf/region/commands/InfoCommand.java
----------------------------------------------------------------------
diff --git a/region/command/src/main/java/org/apache/karaf/region/commands/InfoCommand.java b/region/command/src/main/java/org/apache/karaf/region/commands/InfoCommand.java
index 73979f9..0843538 100644
--- a/region/command/src/main/java/org/apache/karaf/region/commands/InfoCommand.java
+++ b/region/command/src/main/java/org/apache/karaf/region/commands/InfoCommand.java
@@ -23,12 +23,14 @@ import java.util.Map;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.eclipse.equinox.region.RegionFilter;
 import org.osgi.framework.Bundle;
 
 @Command(scope = "region", name = "info", description = "Prints information about region digraph.")
+@Service
 public class InfoCommand extends RegionCommandSupport {
 
     @Option(name = "-v", aliases = "--verbose", required = false, description = "Show all info.")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/region/command/src/main/resources/OSGI-INF/blueprint/region-commands.xml
----------------------------------------------------------------------
diff --git a/region/command/src/main/resources/OSGI-INF/blueprint/region-commands.xml b/region/command/src/main/resources/OSGI-INF/blueprint/region-commands.xml
index 18da1a2..e769ff2 100644
--- a/region/command/src/main/resources/OSGI-INF/blueprint/region-commands.xml
+++ b/region/command/src/main/resources/OSGI-INF/blueprint/region-commands.xml
@@ -19,28 +19,8 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
     default-activation="lazy">
-    <reference id="regionDigraph"
-        interface="org.eclipse.equinox.region.RegionDigraph"
-        availability="mandatory" />
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
-        <command name="region/addBundle">
-            <action class="org.apache.karaf.region.commands.AddBundleCommand" />
-        </command>
-        <command name="region/addFilter">
-            <action class="org.apache.karaf.region.commands.AddFilterCommand" />
-        </command>
-        <command name="region/addRegion">
-            <action class="org.apache.karaf.region.commands.AddRegionCommand" />
-        </command>
-        <command name="region/info">
-            <action class="org.apache.karaf.region.commands.InfoCommand" />
-        </command>
-        <!--<command name="region/list">-->
-            <!--<action class="org.apache.karaf.shell.region.ListCommand">-->
-                <!--<property name="repoAdmin" ref="repoAdmin" />-->
-            <!--</action>-->
-        <!--</command>-->
-    </command-bundle>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.region.commands.*" />
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/service/command/src/main/java/org/apache/karaf/service/command/ListServices.java
----------------------------------------------------------------------
diff --git a/service/command/src/main/java/org/apache/karaf/service/command/ListServices.java b/service/command/src/main/java/org/apache/karaf/service/command/ListServices.java
index 9b8f389..0b12db1 100644
--- a/service/command/src/main/java/org/apache/karaf/service/command/ListServices.java
+++ b/service/command/src/main/java/org/apache/karaf/service/command/ListServices.java
@@ -29,6 +29,7 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.util.ShellUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -36,6 +37,7 @@ import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 @Command(scope = "service", name = "list", description = "Lists OSGi services.")
+@Service
 public class ListServices extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "objectClass", description = "Name of service objectClass to filter for", required = false,

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/service/command/src/main/java/org/apache/karaf/service/command/ObjectClassCompleter.java
----------------------------------------------------------------------
diff --git a/service/command/src/main/java/org/apache/karaf/service/command/ObjectClassCompleter.java b/service/command/src/main/java/org/apache/karaf/service/command/ObjectClassCompleter.java
index d12675e..9533215 100644
--- a/service/command/src/main/java/org/apache/karaf/service/command/ObjectClassCompleter.java
+++ b/service/command/src/main/java/org/apache/karaf/service/command/ObjectClassCompleter.java
@@ -19,18 +19,21 @@
 
 package org.apache.karaf.service.command;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.BundleContext;
 
+@Service
 public class ObjectClassCompleter implements Completer {
 
-    private final StringsCompleter delegate = new StringsCompleter();
-
+    @Reference
     private BundleContext context;
 
     public void setContext(BundleContext context) {
@@ -39,16 +42,14 @@ public class ObjectClassCompleter implements Completer {
 
     @SuppressWarnings("rawtypes")
     public int complete(final String buffer, final int cursor, final List candidates) {
-        delegate.getStrings().clear();
         Map<String, Integer> serviceNamesMap = ListServices.getServiceNamesMap(context);
         Set<String> serviceNames = serviceNamesMap.keySet();
+        List<String> strings = new ArrayList<String>();
         for (String name : serviceNames) {
-            delegate.getStrings().add(ObjectClassMatcher.getShortName(name));
+            strings.add(ObjectClassMatcher.getShortName(name));
         }
-        delegate.getStrings().addAll(serviceNames);
-        return delegate.complete(buffer, cursor, candidates);
+        strings.addAll(serviceNames);
+        return new StringsCompleter(strings).complete(buffer, cursor, candidates);
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/service/command/src/main/java/org/apache/karaf/service/command/Wait.java
----------------------------------------------------------------------
diff --git a/service/command/src/main/java/org/apache/karaf/service/command/Wait.java b/service/command/src/main/java/org/apache/karaf/service/command/Wait.java
index e647d11..fb9794f 100644
--- a/service/command/src/main/java/org/apache/karaf/service/command/Wait.java
+++ b/service/command/src/main/java/org/apache/karaf/service/command/Wait.java
@@ -22,6 +22,7 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
@@ -32,6 +33,7 @@ import org.osgi.util.tracker.ServiceTracker;
  * Command that can be used to wait for an OSGi service.
  */
 @Command(scope = "service", name = "wait", description = "Wait for a given OSGi service.")
+@Service
 public class Wait extends OsgiCommandSupport {
 
     @Option(name = "-e", aliases = { "--exception" }, description = "throw an exception if the service is not found after the timeout")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/service/command/src/main/resources/OSGI-INF/blueprint/shell-services.xml
----------------------------------------------------------------------
diff --git a/service/command/src/main/resources/OSGI-INF/blueprint/shell-services.xml b/service/command/src/main/resources/OSGI-INF/blueprint/shell-services.xml
index 8bc4308..80d4fbe 100644
--- a/service/command/src/main/resources/OSGI-INF/blueprint/shell-services.xml
+++ b/service/command/src/main/resources/OSGI-INF/blueprint/shell-services.xml
@@ -20,17 +20,7 @@
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.service.command.ListServices"/>
-        </command>
-        <command>
-            <action class="org.apache.karaf.service.command.Wait"/>
-        </command>
-    </command-bundle>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.service.command.*" />
 
-    <bean id="objectClassCompleter" class="org.apache.karaf.service.command.ObjectClassCompleter">
-        <property name="context" ref="blueprintBundleContext"/>
-    </bean>
-    <service ref="objectClassCompleter" auto-export="all-classes"/>
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/AbstractSystemAction.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/AbstractSystemAction.java b/system/command/src/main/java/org/apache/karaf/system/commands/AbstractSystemAction.java
index 6c89e53..0ffdae9 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/AbstractSystemAction.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/AbstractSystemAction.java
@@ -17,10 +17,13 @@
 package org.apache.karaf.system.commands;
 
 import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 import org.apache.karaf.system.SystemService;
 
-public abstract class AbstractSystemAction extends AbstractAction {
+public abstract class AbstractSystemAction extends OsgiCommandSupport {
 
+    @Reference
     protected SystemService systemService;
 
     public void setSystemService(SystemService systemService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/FrameworkOptions.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/FrameworkOptions.java b/system/command/src/main/java/org/apache/karaf/system/commands/FrameworkOptions.java
index 1a403cc..13f7d42 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/FrameworkOptions.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/FrameworkOptions.java
@@ -19,12 +19,14 @@ package org.apache.karaf.system.commands;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.system.FrameworkType;
 
 /**
  * Command for enabling/disabling debug logging on the OSGi framework
  */
 @Command(scope = "system", name = "framework", description = "OSGi Framework options.")
+@Service
 public class FrameworkOptions extends AbstractSystemAction {
 
     @Option(name = "-debug", aliases={"--enable-debug"}, description="Enable debug for the OSGi framework", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/Name.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/Name.java b/system/command/src/main/java/org/apache/karaf/system/commands/Name.java
index eaffce7..6e6eb41 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/Name.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/Name.java
@@ -18,11 +18,13 @@ package org.apache.karaf.system.commands;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Command to shut down Karaf container.
  */
 @Command(scope = "system", name = "name", description = "Show or change Karaf instance name.")
+@Service
 public class Name extends AbstractSystemAction {
 
     @Argument(name = "name", index = 0, description = "New name for the instance", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/Shutdown.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/Shutdown.java b/system/command/src/main/java/org/apache/karaf/system/commands/Shutdown.java
index 1d167d9..a95b9d0 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/Shutdown.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/Shutdown.java
@@ -20,12 +20,14 @@ import jline.console.ConsoleReader;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.system.SystemService;
 
 /**
  * Command to shut down Karaf container.
  */
 @Command(scope = "system", name = "shutdown", description = "Shutdown Karaf.")
+@Service
 public class Shutdown extends AbstractSystemAction {
 
     @Option(name = "-f", aliases = "--force", description = "Force the shutdown without confirmation message.", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/StartLevel.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/StartLevel.java b/system/command/src/main/java/org/apache/karaf/system/commands/StartLevel.java
index 86a5aaf..1d7dfdf 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/StartLevel.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/StartLevel.java
@@ -19,23 +19,19 @@ package org.apache.karaf.system.commands;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.system.SystemService;
 
 /**
  * Get/set the system start level.
  */
 @Command(scope = "system", name = "start-level", description = "Gets or sets the system start level.")
-public class StartLevel extends OsgiCommandSupport {
+@Service
+public class StartLevel extends AbstractSystemAction {
 
     @Argument(index = 0, name = "level", description = "The new system start level to set", required = false, multiValued = false)
     Integer level;
 
-    private SystemService systemService;
-
-    public void setSystemService(SystemService systemService) {
-        this.systemService = systemService;
-    }
-
     protected Object doExecute() throws Exception {
         if (level == null) {
             System.out.println("Level " + systemService.getStartLevel());

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/SystemProperty.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/SystemProperty.java b/system/command/src/main/java/org/apache/karaf/system/commands/SystemProperty.java
index e1cf3f4..b03d40f 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/SystemProperty.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/SystemProperty.java
@@ -19,6 +19,7 @@ package org.apache.karaf.system.commands;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 
@@ -31,6 +32,7 @@ import java.util.*;
  * Command that allow access to system properties easily.
  */
 @Command(scope = "system", name = "property", description = "Get or set a system property.")
+@Service
 public class SystemProperty extends AbstractSystemAction {
 
     @Option(name = "-p", aliases = {"--persistent"}, description = "Persist the new value to the etc/system.properties file")
@@ -48,12 +50,6 @@ public class SystemProperty extends AbstractSystemAction {
     @Argument(index = 1, name = "value", required = false, description = "New value for the system property")
     String value;
 
-    private BundleContext bundleContext;
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
     @Override
     protected Object doExecute() throws Exception {
         if (key == null && value == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/java/org/apache/karaf/system/commands/Version.java
----------------------------------------------------------------------
diff --git a/system/command/src/main/java/org/apache/karaf/system/commands/Version.java b/system/command/src/main/java/org/apache/karaf/system/commands/Version.java
index c331e72..4dd0d2c 100644
--- a/system/command/src/main/java/org/apache/karaf/system/commands/Version.java
+++ b/system/command/src/main/java/org/apache/karaf/system/commands/Version.java
@@ -17,8 +17,10 @@
 package org.apache.karaf.system.commands;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "system", name = "version", description = "Display the instance version")
+@Service
 public class Version extends AbstractSystemAction {
 
     protected Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/system/command/src/main/resources/OSGI-INF/blueprint/system-commands.xml
----------------------------------------------------------------------
diff --git a/system/command/src/main/resources/OSGI-INF/blueprint/system-commands.xml b/system/command/src/main/resources/OSGI-INF/blueprint/system-commands.xml
index 6ce751a..6c9f328 100644
--- a/system/command/src/main/resources/OSGI-INF/blueprint/system-commands.xml
+++ b/system/command/src/main/resources/OSGI-INF/blueprint/system-commands.xml
@@ -19,40 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.system.commands.Shutdown">
-                <property name="systemService" ref="systemService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.system.commands.StartLevel">
-                <property name="systemService" ref="systemService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.system.commands.Name">
-                <property name="systemService" ref="systemService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.system.commands.Version">
-                <property name="systemService" ref="systemService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.system.commands.FrameworkOptions" >
-                <property name="systemService" ref="systemService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.system.commands.SystemProperty" >
-                <property name="systemService" ref="systemService"/>
-                <property name="bundleContext" ref="blueprintBundleContext"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <reference id="systemService" interface="org.apache.karaf.system.SystemService"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.system.commands.*" />
 
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/web/command/src/main/java/org/apache/karaf/web/commands/List.java
----------------------------------------------------------------------
diff --git a/web/command/src/main/java/org/apache/karaf/web/commands/List.java b/web/command/src/main/java/org/apache/karaf/web/commands/List.java
index 523d13c..c2508ad 100644
--- a/web/command/src/main/java/org/apache/karaf/web/commands/List.java
+++ b/web/command/src/main/java/org/apache/karaf/web/commands/List.java
@@ -19,6 +19,8 @@ package org.apache.karaf.web.commands;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Col;
 import org.apache.karaf.shell.table.ShellTable;
 import org.apache.karaf.web.WebBundle;
@@ -26,11 +28,13 @@ import org.apache.karaf.web.WebContainerService;
 
 
 @Command(scope = "web", name = "list", description = "Lists details for war bundles.")
+@Service
 public class List extends OsgiCommandSupport {
 
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
-    
+
+    @Reference
     private WebContainerService webContainerService;
     
     public void setWebContainerService(WebContainerService webContainerService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/web/command/src/main/java/org/apache/karaf/web/commands/Start.java
----------------------------------------------------------------------
diff --git a/web/command/src/main/java/org/apache/karaf/web/commands/Start.java b/web/command/src/main/java/org/apache/karaf/web/commands/Start.java
index ba62062..f87846e 100644
--- a/web/command/src/main/java/org/apache/karaf/web/commands/Start.java
+++ b/web/command/src/main/java/org/apache/karaf/web/commands/Start.java
@@ -19,14 +19,18 @@ package org.apache.karaf.web.commands;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.web.WebContainerService;
 
 @Command(scope = "web", name = "start", description = "Start the web context of given bundles.")
+@Service
 public class Start extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "ids", description = "The list of bundle IDs separated by whitespaces", required = true, multiValued = true)
     java.util.List<Long> ids;
 
+    @Reference
     private WebContainerService webContainerService;
 
     public void setWebContainerService(WebContainerService webContainerService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/web/command/src/main/java/org/apache/karaf/web/commands/Stop.java
----------------------------------------------------------------------
diff --git a/web/command/src/main/java/org/apache/karaf/web/commands/Stop.java b/web/command/src/main/java/org/apache/karaf/web/commands/Stop.java
index 8a68bf2..bff6180 100644
--- a/web/command/src/main/java/org/apache/karaf/web/commands/Stop.java
+++ b/web/command/src/main/java/org/apache/karaf/web/commands/Stop.java
@@ -19,6 +19,8 @@ package org.apache.karaf.web.commands;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.web.WebContainerService;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -26,15 +28,15 @@ import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 @Command(scope = "web", name = "stop", description = "Stop the web context of given bundles.")
+@Service
 public class Stop extends OsgiCommandSupport {
 
     @Argument(index = 0, name = "ids", description = "The list of bundle IDs separated by whitespaces", required = true, multiValued = true)
     java.util.List<Long> ids;
 
+    @Reference
     private WebContainerService webContainerService;
     
-    
-
     public void setWebContainerService(WebContainerService webContainerService) {
         this.webContainerService = webContainerService;
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/web/command/src/main/resources/OSGI-INF/blueprint/web-commands.xml
----------------------------------------------------------------------
diff --git a/web/command/src/main/resources/OSGI-INF/blueprint/web-commands.xml b/web/command/src/main/resources/OSGI-INF/blueprint/web-commands.xml
index e1e5d3f..b00ac40 100644
--- a/web/command/src/main/resources/OSGI-INF/blueprint/web-commands.xml
+++ b/web/command/src/main/resources/OSGI-INF/blueprint/web-commands.xml
@@ -19,24 +19,7 @@
 -->        
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.web.commands.List">
-                <property name="webContainerService" ref="webContainerService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.web.commands.Start">
-                <property name="webContainerService" ref="webContainerService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.web.commands.Stop">
-                <property name="webContainerService" ref="webContainerService"/>
-            </action>
-        </command>
-    </command-bundle>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.web.commands.*" />
 
-    <reference id="webContainerService" interface="org.apache.karaf.web.WebContainerService"/>
-    
 </blueprint>        
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/wrapper/command/src/main/java/org/apache/karaf/wrapper/commands/Install.java
----------------------------------------------------------------------
diff --git a/wrapper/command/src/main/java/org/apache/karaf/wrapper/commands/Install.java b/wrapper/command/src/main/java/org/apache/karaf/wrapper/commands/Install.java
index a7fffac..14c921a 100644
--- a/wrapper/command/src/main/java/org/apache/karaf/wrapper/commands/Install.java
+++ b/wrapper/command/src/main/java/org/apache/karaf/wrapper/commands/Install.java
@@ -21,6 +21,8 @@ import java.io.File;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.wrapper.WrapperService;
 import org.apache.karaf.wrapper.internal.WrapperServiceImpl;
 import org.fusesource.jansi.Ansi;
@@ -29,6 +31,7 @@ import org.fusesource.jansi.Ansi;
  * Installs the Karaf instance as a service in your operating system.
  */
 @Command(scope = "wrapper", name = "install", description = "Install the container as a system service in the OS.")
+@Service
 public class Install extends AbstractAction {
 
 	@Option(name = "-n", aliases = { "--name" }, description = "The service name that will be used when installing the service. (Default: karaf)", required = false, multiValued = false)
@@ -43,6 +46,7 @@ public class Install extends AbstractAction {
 	@Option(name = "-s", aliases = { "--start-type" }, description = "Mode in which the service is installed. AUTO_START or DEMAND_START (Default: AUTO_START)", required = false, multiValued = false)
 	private String startType = "AUTO_START";
 
+    @Reference
 	private WrapperService wrapperService = new WrapperServiceImpl();
 
 	public void setWrapperService(WrapperService wrapperService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/wrapper/command/src/main/resources/OSGI-INF/blueprint/wrapper-commands.xml
----------------------------------------------------------------------
diff --git a/wrapper/command/src/main/resources/OSGI-INF/blueprint/wrapper-commands.xml b/wrapper/command/src/main/resources/OSGI-INF/blueprint/wrapper-commands.xml
index 7f4e9a8..f29e8a0 100644
--- a/wrapper/command/src/main/resources/OSGI-INF/blueprint/wrapper-commands.xml
+++ b/wrapper/command/src/main/resources/OSGI-INF/blueprint/wrapper-commands.xml
@@ -20,14 +20,7 @@
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
         default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.wrapper.commands.Install">
-                <property name="wrapperService" ref="wrapperService"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <reference id="wrapperService" interface="org.apache.karaf.wrapper.WrapperService"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.wrapper.commands.*" />
 
 </blueprint>
\ No newline at end of file


[6/6] git commit: [KARAF-2763] Provide a standalone extender to support the new annotations

Posted by gn...@apache.org.
[KARAF-2763] Provide a standalone extender to support the new annotations

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

Branch: refs/heads/master
Commit: 2bd28679e01f3800a2d686fcc214c850f0a3c2c5
Parents: e4f7bc4
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 09:24:43 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 09:24:43 2014 +0100

----------------------------------------------------------------------
 shell/console/pom.xml                           |   9 +
 .../shell/inject/impl/InjectionExtender.java    | 100 ++++++
 .../shell/inject/impl/InjectionExtension.java   | 350 +++++++++++++++++++
 .../shell/inject/impl/MultiServiceTracker.java  |  89 +++++
 .../karaf/shell/inject/impl/Satisfiable.java    |  30 ++
 .../shell/inject/impl/SingleServiceTracker.java | 160 +++++++++
 .../OSGI-INF/blueprint/karaf-console.xml        |   7 +
 7 files changed, 745 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/pom.xml
----------------------------------------------------------------------
diff --git a/shell/console/pom.xml b/shell/console/pom.xml
index 9a04677..0e39177 100644
--- a/shell/console/pom.xml
+++ b/shell/console/pom.xml
@@ -82,6 +82,11 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.sshd</groupId>
             <artifactId>sshd-core</artifactId>
         </dependency>
@@ -129,6 +134,7 @@
                     <instructions>
                         <Import-Package>
                             !org.apache.felix.gogo.runtime.*,
+                            !org.apache.karaf.shell.inject.impl,
                             org.osgi.service.event;resolution:=optional,
                             org.apache.karaf.branding;resolution:=optional,
                             org.apache.sshd.agent*;resolution:=optional,
@@ -159,6 +165,9 @@
                         <Private-Package>
                         	org.apache.karaf.shell.console.impl*,
                             org.apache.karaf.shell.security.impl*,
+                            org.apache.karaf.shell.inject.impl*,
+                            org.apache.felix.utils.extender,
+                            org.apache.felix.utils.manifest
                         </Private-Package>
                         <Main-Class>
                             org.apache.karaf.shell.console.impl.Main

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtender.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtender.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtender.java
new file mode 100644
index 0000000..6177390
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtender.java
@@ -0,0 +1,100 @@
+/*
+ * 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.inject.impl;
+
+import org.apache.felix.utils.extender.AbstractExtender;
+import org.apache.felix.utils.extender.Extension;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Bundle extender scanning for command classes.
+ */
+public class InjectionExtender extends AbstractExtender {
+
+    public static final String KARAF_COMMANDS = "Karaf-Injection";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(InjectionExtender.class);
+
+    //
+    // Adapt BundleActivator to make it blueprint friendly
+    //
+
+    private BundleContext bundleContext;
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void init() throws Exception {
+        start(bundleContext);
+    }
+
+    public void destroy() throws Exception {
+        stop(bundleContext);
+    }
+
+    //
+    // Extender implementation
+    //
+
+    @Override
+    protected Extension doCreateExtension(Bundle bundle) throws Exception {
+        if (bundle.getHeaders().get(KARAF_COMMANDS) != null) {
+            return new InjectionExtension(bundle);
+        }
+        return null;
+    }
+
+    @Override
+    protected void debug(Bundle bundle, String msg) {
+        StringBuilder buf = new StringBuilder();
+        if ( bundle != null )
+        {
+            buf.append( bundle.getSymbolicName() );
+            buf.append( " (" );
+            buf.append( bundle.getBundleId() );
+            buf.append( "): " );
+        }
+        buf.append(msg);
+        LOGGER.debug(buf.toString());
+    }
+
+    @Override
+    protected void warn(Bundle bundle, String msg, Throwable t) {
+        StringBuilder buf = new StringBuilder();
+        if ( bundle != null )
+        {
+            buf.append( bundle.getSymbolicName() );
+            buf.append( " (" );
+            buf.append( bundle.getBundleId() );
+            buf.append( "): " );
+        }
+        buf.append(msg);
+        LOGGER.warn(buf.toString(), t);
+    }
+
+    @Override
+    protected void error(String msg, Throwable t) {
+        LOGGER.error(msg, t);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtension.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtension.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtension.java
new file mode 100644
index 0000000..fd807a3
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/InjectionExtension.java
@@ -0,0 +1,350 @@
+/*
+ * 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.inject.impl;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.Function;
+import org.apache.felix.utils.extender.Extension;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Parser;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.CommandWithAction;
+import org.apache.karaf.shell.inject.Destroy;
+import org.apache.karaf.shell.inject.Init;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
+import org.apache.karaf.shell.commands.basic.AbstractCommand;
+import org.apache.karaf.shell.console.BundleContextAware;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.wiring.BundleWiring;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Commands extension
+ */
+public class InjectionExtension implements Extension, Satisfiable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(InjectionExtension.class);
+
+    private final Bundle bundle;
+    private final CountDownLatch started;
+    private final MultiServiceTracker tracker;
+    private final List<Satisfiable> satisfiables = new ArrayList<Satisfiable>();
+
+
+    public InjectionExtension(Bundle bundle) {
+        this.bundle = bundle;
+        this.started = new CountDownLatch(1);
+        this.tracker = new MultiServiceTracker(bundle.getBundleContext(), this);
+    }
+
+    @Override
+    public void found() {
+        for (Satisfiable s : satisfiables) {
+            s.found();
+        }
+    }
+
+    @Override
+    public void updated() {
+        for (Satisfiable s : satisfiables) {
+            s.updated();
+        }
+    }
+
+    @Override
+    public void lost() {
+        for (Satisfiable s : satisfiables) {
+            s.lost();
+        }
+    }
+
+    public void start() throws Exception {
+        try {
+            String header = bundle.getHeaders().get(InjectionExtender.KARAF_COMMANDS);
+            Clause[] clauses = Parser.parseHeader(header);
+            BundleWiring wiring = bundle.adapt(BundleWiring.class);
+            for (Clause clause : clauses) {
+                String name = clause.getName();
+                int options = BundleWiring.LISTRESOURCES_LOCAL;
+                name = name.replace('.', '/');
+                if (name.endsWith("*")) {
+                    options |= BundleWiring.LISTRESOURCES_RECURSE;
+                    name = name.substring(0, name.length() - 1);
+                }
+                if (!name.startsWith("/")) {
+                    name = "/" + name;
+                }
+                if (name.endsWith("/")) {
+                    name = name.substring(0, name.length() - 1);
+                }
+                Collection<String> classes = wiring.listResources(name, "*.class", options);
+                for (String className : classes) {
+                    className = className.replace('/', '.').replace(".class", "");
+                    inspectClass(bundle.loadClass(className));
+                }
+            }
+            tracker.open();
+        } finally {
+            started.countDown();
+        }
+    }
+
+    public void destroy() {
+        try {
+            started.await(5000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            LOGGER.warn("The wait for bundle being started before destruction has been interrupted.", e);
+        }
+        tracker.close();
+    }
+
+    private void inspectClass(final Class<?> clazz) throws Exception {
+        Service reg = clazz.getAnnotation(Service.class);
+        if (reg == null) {
+            return;
+        }
+        if (Action.class.isAssignableFrom(clazz)) {
+            final Command cmd = clazz.getAnnotation(Command.class);
+            if (cmd == null) {
+                throw new IllegalArgumentException("Command " + clazz.getName() + " is not annotated with @Command");
+            }
+            // Create trackers
+            for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
+                for (Field field : cl.getDeclaredFields()) {
+                    if (field.getAnnotation(Reference.class) != null) {
+                        if (field.getType() != BundleContext.class) {
+                            tracker.track(field.getType());
+                        }
+                    }
+                }
+            }
+            satisfiables.add(new AutoRegisterCommand((Class<? extends Action>) clazz));
+        }
+        if (Completer.class.isAssignableFrom(clazz)) {
+            // Create trackers
+            for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
+                for (Field field : cl.getDeclaredFields()) {
+                    if (field.getAnnotation(Reference.class) != null) {
+                        if (field.getType() != BundleContext.class) {
+                            tracker.track(field.getType());
+                        }
+                    }
+                }
+            }
+            satisfiables.add(new AutoRegisterService(clazz));
+        }
+    }
+
+    public class AutoRegisterService implements Satisfiable {
+
+        private final Class<?> clazz;
+        private Object service;
+        private ServiceRegistration registration;
+
+        public AutoRegisterService(Class<?> clazz) {
+            this.clazz = clazz;
+        }
+
+        @Override
+        public void found() {
+            try {
+                // Create completer
+                service = clazz.newInstance();
+                Set<String> classes = new HashSet<String>();
+                // Inject services
+                for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
+                    classes.add(cl.getName());
+                    for (Class c : cl.getInterfaces()) {
+                        classes.add(c.getName());
+                    }
+                    for (Field field : cl.getDeclaredFields()) {
+                        if (field.getAnnotation(Reference.class) != null) {
+                            Object value;
+                            if (field.getType() == BundleContext.class) {
+                                value = InjectionExtension.this.bundle.getBundleContext();
+                            } else {
+                                value = InjectionExtension.this.tracker.getService(field.getType());
+                            }
+                            if (value == null) {
+                                throw new RuntimeException("No OSGi service matching " + field.getType().getName());
+                            }
+                            field.setAccessible(true);
+                            field.set(service, value);
+                        }
+                    }
+                }
+                for (Method method : clazz.getDeclaredMethods()) {
+                    Init ann = method.getAnnotation(Init.class);
+                    if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
+                        method.setAccessible(true);
+                        method.invoke(service);
+                    }
+                }
+                Hashtable<String, String> props = new Hashtable<String, String>();
+                registration = bundle.getBundleContext().registerService(classes.toArray(new String[classes.size()]), service, props);
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to creation service " + clazz.getName(), e);
+            }
+        }
+
+        @Override
+        public void updated() {
+            lost();
+            found();
+        }
+
+        @Override
+        public void lost() {
+            if (registration != null) {
+                for (Method method : clazz.getDeclaredMethods()) {
+                    Destroy ann = method.getAnnotation(Destroy.class);
+                    if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
+                        method.setAccessible(true);
+                        try {
+                            method.invoke(service);
+                        } catch (Exception e) {
+                            LOGGER.warn("Error destroying service", e);
+                        }
+                    }
+                }
+                registration.unregister();
+                registration = null;
+            }
+        }
+
+    }
+
+    public class AutoRegisterCommand extends AbstractCommand implements Satisfiable, CompletableFunction {
+
+        private final Class<? extends Action> actionClass;
+        private ServiceRegistration registration;
+
+        public AutoRegisterCommand(Class<? extends Action> actionClass) {
+            this.actionClass = actionClass;
+        }
+
+        @Override
+        public void found() {
+            // Register command
+            Command cmd = actionClass.getAnnotation(Command.class);
+            Hashtable<String, String> props = new Hashtable<String, String>();
+            props.put(CommandProcessor.COMMAND_SCOPE, cmd.scope());
+            props.put(CommandProcessor.COMMAND_FUNCTION, cmd.name());
+            String[] classes = {
+                    Function.class.getName(),
+                    CompletableFunction.class.getName(),
+                    CommandWithAction.class.getName(),
+                    AbstractCommand.class.getName()
+            };
+            registration = bundle.getBundleContext().registerService(classes, this, props);
+        }
+
+        @Override
+        public void updated() {
+
+        }
+
+        @Override
+        public void lost() {
+            if (registration != null) {
+                registration.unregister();
+                registration = null;
+            }
+        }
+
+        @Override
+        public Action createNewAction() {
+            try {
+                Action action = actionClass.newInstance();
+                // Inject services
+                for (Class<?> cl = actionClass; cl != Object.class; cl = cl.getSuperclass()) {
+                    for (Field field : cl.getDeclaredFields()) {
+                        if (field.getAnnotation(Reference.class) != null) {
+                            Object value;
+                            if (field.getType() == BundleContext.class) {
+                                value = InjectionExtension.this.bundle.getBundleContext();
+                            } else {
+                                value = InjectionExtension.this.tracker.getService(field.getType());
+                            }
+                            if (value == null) {
+                                throw new RuntimeException("No OSGi service matching " + field.getType().getName());
+                            }
+                            field.setAccessible(true);
+                            field.set(action, value);
+                        }
+                    }
+                }
+                if (action instanceof BundleContextAware) {
+                    ((BundleContextAware) action).setBundleContext(bundle.getBundleContext());
+                }
+                for (Method method : actionClass.getDeclaredMethods()) {
+                    Init ann = method.getAnnotation(Init.class);
+                    if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
+                        method.setAccessible(true);
+                        method.invoke(action);
+                    }
+                }
+                return action;
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to creation command action " + actionClass.getName(), e);
+            }
+        }
+
+        @Override
+        public void releaseAction(Action action) throws Exception {
+            for (Method method : actionClass.getDeclaredMethods()) {
+                Destroy ann = method.getAnnotation(Destroy.class);
+                if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
+                    method.setAccessible(true);
+                    method.invoke(action);
+                }
+            }
+            super.releaseAction(action);
+        }
+
+        @Override
+        public List<Completer> getCompleters() {
+            return null;
+        }
+
+        @Override
+        public Map<String, Completer> getOptionalCompleters() {
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/MultiServiceTracker.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/MultiServiceTracker.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/MultiServiceTracker.java
new file mode 100644
index 0000000..5394dca
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/MultiServiceTracker.java
@@ -0,0 +1,89 @@
+/*
+ * 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.inject.impl;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * Track multiple services by their type
+ */
+public class MultiServiceTracker {
+
+    private final BundleContext bundleContext;
+    private final Satisfiable satisfiable;
+    private final ConcurrentMap<Class, SingleServiceTracker> trackers = new ConcurrentHashMap<Class, SingleServiceTracker>();
+    private final AtomicInteger count = new AtomicInteger();
+
+    public MultiServiceTracker(BundleContext bundleContext, Satisfiable satisfiable) {
+        this.bundleContext = bundleContext;
+        this.satisfiable = satisfiable;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void track(Class service) {
+        if (trackers.get(service) == null) {
+            SingleServiceTracker tracker = new SingleServiceTracker(bundleContext, service, new Satisfiable() {
+                @Override
+                public void found() {
+                    if (count.incrementAndGet() == trackers.size()) {
+                        satisfiable.found();
+                    }
+                }
+
+                @Override
+                public void updated() {
+                    if (count.get() == trackers.size()) {
+                        satisfiable.updated();
+                    }
+                }
+
+                @Override
+                public void lost() {
+                    if (count.getAndDecrement() == trackers.size()) {
+                        satisfiable.lost();
+                    }
+                }
+
+            });
+            trackers.putIfAbsent(service, tracker);
+        }
+    }
+
+    public <T> T getService(Class<T> clazz) {
+        SingleServiceTracker tracker = trackers.get(clazz);
+        return tracker != null ? clazz.cast(tracker.getService()) : null;
+    }
+
+    public void open() {
+        for (SingleServiceTracker tracker : trackers.values()) {
+            tracker.open();
+        }
+    }
+
+    public void close() {
+        for (SingleServiceTracker tracker : trackers.values()) {
+            tracker.close();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/Satisfiable.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/Satisfiable.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/Satisfiable.java
new file mode 100644
index 0000000..ed5ceb6
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/Satisfiable.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.inject.impl;
+
+/**
+ * Interface to be called with a boolean satisfaction status.
+ */
+public interface Satisfiable {
+
+    void found();
+    void updated();
+    void lost();
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/SingleServiceTracker.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/SingleServiceTracker.java b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/SingleServiceTracker.java
new file mode 100644
index 0000000..9ecec4d
--- /dev/null
+++ b/shell/console/src/main/java/org/apache/karaf/shell/inject/impl/SingleServiceTracker.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.shell.inject.impl;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Track a single service by its type.
+ *
+ * @param <T>
+ */
+public final class SingleServiceTracker<T> {
+
+    private final BundleContext ctx;
+    private final String className;
+    private final AtomicReference<T> service = new AtomicReference<T>();
+    private final AtomicReference<ServiceReference> ref = new AtomicReference<ServiceReference>();
+    private final AtomicBoolean open = new AtomicBoolean(false);
+    private final Satisfiable serviceListener;
+    private Filter filter;
+
+    private final ServiceListener listener = new ServiceListener() {
+        public void serviceChanged(ServiceEvent event) {
+            if (open.get()) {
+                if (event.getType() == ServiceEvent.UNREGISTERING) {
+                    ServiceReference deadRef = event.getServiceReference();
+                    if (deadRef.equals(ref.get())) {
+                        findMatchingReference(deadRef);
+                    }
+                } else if (event.getType() == ServiceEvent.REGISTERED && ref.get() == null) {
+                    findMatchingReference(null);
+                }
+            }
+        }
+    };
+
+    public SingleServiceTracker(BundleContext context, Class<T> clazz, Satisfiable sl) {
+        ctx = context;
+        this.className = clazz.getName();
+        serviceListener = sl;
+    }
+
+    public T getService() {
+        return service.get();
+    }
+
+    public ServiceReference getServiceReference() {
+        return ref.get();
+    }
+
+    public void open() {
+        if (open.compareAndSet(false, true)) {
+            try {
+                String filterString = '(' + Constants.OBJECTCLASS + '=' + className + ')';
+                if (filter != null) filterString = "(&" + filterString + filter + ')';
+                ctx.addServiceListener(listener, filterString);
+                findMatchingReference(null);
+            } catch (InvalidSyntaxException e) {
+                // this can never happen. (famous last words :)
+            }
+        }
+    }
+
+    private void findMatchingReference(ServiceReference original) {
+        boolean clear = true;
+        ServiceReference ref = ctx.getServiceReference(className);
+        if (ref != null && (filter == null || filter.match(ref))) {
+            @SuppressWarnings("unchecked")
+            T service = (T) ctx.getService(ref);
+            if (service != null) {
+                clear = false;
+
+                // We do the unget out of the lock so we don't exit this class while holding a lock.
+                if (!!!update(original, ref, service)) {
+                    ctx.ungetService(ref);
+                }
+            }
+        } else if (original == null) {
+            clear = false;
+        }
+
+        if (clear) {
+            update(original, null, null);
+        }
+    }
+
+    private boolean update(ServiceReference deadRef, ServiceReference newRef, T service) {
+        boolean result = false;
+        int foundLostReplaced = -1;
+
+        // Make sure we don't try to get a lock on null
+        Object lock;
+
+        // we have to choose our lock.
+        if (newRef != null) lock = newRef;
+        else if (deadRef != null) lock = deadRef;
+        else lock = this;
+
+        // This lock is here to ensure that no two threads can set the ref and service
+        // at the same time.
+        synchronized (lock) {
+            if (open.get()) {
+                result = this.ref.compareAndSet(deadRef, newRef);
+                if (result) {
+                    this.service.set(service);
+
+                    if (deadRef == null && newRef != null) foundLostReplaced = 0;
+                    if (deadRef != null && newRef == null) foundLostReplaced = 1;
+                    if (deadRef != null && newRef != null) foundLostReplaced = 2;
+                }
+            }
+        }
+
+        if (serviceListener != null) {
+            if (foundLostReplaced == 0) serviceListener.found();
+            else if (foundLostReplaced == 1) serviceListener.lost();
+            else if (foundLostReplaced == 2) serviceListener.updated();
+        }
+
+        return result;
+    }
+
+    public void close() {
+        if (open.compareAndSet(true, false)) {
+            ctx.removeServiceListener(listener);
+
+            synchronized (this) {
+                ServiceReference deadRef = ref.getAndSet(null);
+                service.set(null);
+                if (deadRef != null) ctx.ungetService(deadRef);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2bd28679/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
----------------------------------------------------------------------
diff --git a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
index bbe0c5b..1abeb1e 100644
--- a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
+++ b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
@@ -82,4 +82,11 @@
     </bean>
     <service ref="secureCommandConfigTransformer" interface="org.osgi.service.cm.ConfigurationListener"/>
 
+    <!-- Console commands extender -->
+    <bean id="consoleExtender"
+          class="org.apache.karaf.shell.inject.impl.InjectionExtender"
+          init-method="init" destroy-method="destroy">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
 </blueprint>


[4/6] [KARAF-2763] Leverage blueprint support for bundle, config, http, instance, jdbc, mms, jndi, car, log, orb, package, region, service, system, web and wrapper commands

Posted by gn...@apache.org.
http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/itests/src/test/java/org/apache/karaf/itests/RegionTest.java
----------------------------------------------------------------------
diff --git a/itests/src/test/java/org/apache/karaf/itests/RegionTest.java b/itests/src/test/java/org/apache/karaf/itests/RegionTest.java
index 07e05fd..3d7d6b0 100644
--- a/itests/src/test/java/org/apache/karaf/itests/RegionTest.java
+++ b/itests/src/test/java/org/apache/karaf/itests/RegionTest.java
@@ -35,7 +35,7 @@ public class RegionTest extends KarafTestSupport {
 
     @Test
     public void addRegionCommand() throws Exception {
-        System.out.println(executeCommand("region:addregion itest"));
+        System.out.println(executeCommand("region:region-add itest"));
         String infoOutput = executeCommand("region:info");
         System.out.println(infoOutput);
         assertTrue("Region itest should be present", infoOutput.contains("itest"));

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/CreateCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/CreateCommand.java
index 775f9ad..fa629da 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/CreateCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/CreateCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jdbc", name = "create", description = "Create a JDBC datasource")
+@Service
 public class CreateCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JDBC datasource name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DataSourcesCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DataSourcesCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DataSourcesCommand.java
index 36df691..e314c9c 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DataSourcesCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DataSourcesCommand.java
@@ -17,12 +17,14 @@
 package org.apache.karaf.jdbc.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.List;
 import java.util.Map;
 
 @Command(scope = "jdbc", name = "datasources", description = "List the JDBC datasources")
+@Service
 public class DataSourcesCommand extends JdbcCommandSupport {
 
     public Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DeleteCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DeleteCommand.java
index 20982bb..3b6aa16 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DeleteCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/DeleteCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jdbc.command.completers.DataSourcesFileNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jdbc", name = "delete", description = "Delete a JDBC datasource")
+@Service
 public class DeleteCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JDBC datasource name (the one used at creation time)", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/ExecuteCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/ExecuteCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/ExecuteCommand.java
index 42f0a76..48bd412 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/ExecuteCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/ExecuteCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jdbc.command.completers.DataSourcesNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jdbc", name = "execute", description = "Execute a SQL command on a given JDBC datasource")
+@Service
 public class ExecuteCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "datasource", description = "The JDBC datasource", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/InfoCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/InfoCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/InfoCommand.java
index 89bca19..14df91b 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/InfoCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/InfoCommand.java
@@ -20,11 +20,13 @@ import org.apache.karaf.jdbc.command.completers.DataSourcesNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.Map;
 
 @Command(scope = "jdbc", name = "info", description = "Display details about a JDBC datasource")
+@Service
 public class InfoCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "datasource", description = "The JDBC datasource name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/JdbcCommandSupport.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/JdbcCommandSupport.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/JdbcCommandSupport.java
index 6fb8bfc..f274cfb 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/JdbcCommandSupport.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/JdbcCommandSupport.java
@@ -18,9 +18,11 @@ package org.apache.karaf.jdbc.command;
 
 import org.apache.karaf.jdbc.JdbcService;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class JdbcCommandSupport extends OsgiCommandSupport {
 
+    @Reference
     private JdbcService jdbcService;
 
     public abstract Object doExecute() throws Exception;

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/QueryCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/QueryCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/QueryCommand.java
index 7fc641a..f591cd9 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/QueryCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/QueryCommand.java
@@ -20,6 +20,7 @@ import org.apache.karaf.jdbc.command.completers.DataSourcesNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Row;
 import org.apache.karaf.shell.table.ShellTable;
 
@@ -27,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 
 @Command(scope = "jdbc", name = "query", description = "Execute a SQL query on a JDBC datasource")
+@Service
 public class QueryCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "datasource", description = "The JDBC datasource to use", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/TablesCommand.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/TablesCommand.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/TablesCommand.java
index 6256cbc..8a7acdd 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/TablesCommand.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/TablesCommand.java
@@ -20,6 +20,7 @@ import org.apache.karaf.jdbc.command.completers.DataSourcesNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.Row;
 import org.apache.karaf.shell.table.ShellTable;
 
@@ -27,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 
 @Command(scope = "jdbc", name = "tables", description = "List the tables on a given JDBC datasource")
+@Service
 public class TablesCommand extends JdbcCommandSupport {
 
     @Argument(index = 0, name = "datasource", description = "The JDBC datasource to use", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesFileNameCompleter.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesFileNameCompleter.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesFileNameCompleter.java
index b99b57a..3eb7eb6 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesFileNameCompleter.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesFileNameCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jdbc.command.completers;
 import org.apache.karaf.jdbc.JdbcService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer on the JDBC datasources file name.
  */
+@Service
 public class DataSourcesFileNameCompleter implements Completer {
 
+    @Reference
     private JdbcService jdbcService;
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesNameCompleter.java
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesNameCompleter.java b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesNameCompleter.java
index e0adb31..af4c0e3 100644
--- a/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesNameCompleter.java
+++ b/jdbc/command/src/main/java/org/apache/karaf/jdbc/command/completers/DataSourcesNameCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jdbc.command.completers;
 import org.apache.karaf.jdbc.JdbcService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer on the JDBC datasources name (JNDI or OSGi service property).
  */
+@Service
 public class DataSourcesNameCompleter implements Completer {
 
+    @Reference
     private JdbcService jdbcService;
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jdbc/command/src/main/resources/OSGI-INF/blueprint/jdbc-command.xml
----------------------------------------------------------------------
diff --git a/jdbc/command/src/main/resources/OSGI-INF/blueprint/jdbc-command.xml b/jdbc/command/src/main/resources/OSGI-INF/blueprint/jdbc-command.xml
index 2433e00..fe843fc 100644
--- a/jdbc/command/src/main/resources/OSGI-INF/blueprint/jdbc-command.xml
+++ b/jdbc/command/src/main/resources/OSGI-INF/blueprint/jdbc-command.xml
@@ -17,54 +17,7 @@
     -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <reference id="jdbcService" interface="org.apache.karaf.jdbc.JdbcService" />
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.jdbc.command.CreateCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.DeleteCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.DataSourcesCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.QueryCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.ExecuteCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.InfoCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jdbc.command.TablesCommand">
-                <property name="jdbcService" ref="jdbcService"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="dataSourcesNameCompleter" class="org.apache.karaf.jdbc.command.completers.DataSourcesNameCompleter">
-        <property name="jdbcService" ref="jdbcService" />
-    </bean>
-    <service ref="dataSourcesNameCompleter" auto-export="all-classes"/>
-
-    <bean id="dataSourcesFileNameCompleter" class="org.apache.karaf.jdbc.command.completers.DataSourcesFileNameCompleter">
-        <property name="jdbcService" ref="jdbcService" />
-    </bean>
-    <service ref="dataSourcesFileNameCompleter" auto-export="all-classes"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.jdbc.command.*" />
 
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/BrowseCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/BrowseCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/BrowseCommand.java
index c99374a..49bd545 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/BrowseCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/BrowseCommand.java
@@ -20,11 +20,13 @@ import org.apache.karaf.jms.JmsMessage;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.List;
 
 @Command(scope = "jms", name = "browse", description = "Browse a JMS queue")
+@Service
 public class BrowseCommand extends JmsConnectionCommandSupport {
 
     @Argument(index = 1, name = "queue", description = "The JMS queue to browse", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/ConnectionFactoriesCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/ConnectionFactoriesCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/ConnectionFactoriesCommand.java
index 8142449..91182e7 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/ConnectionFactoriesCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/ConnectionFactoriesCommand.java
@@ -17,11 +17,13 @@
 package org.apache.karaf.jms.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.List;
 
 @Command(scope = "jms", name = "connectionfactories", description = "List the JMS connection factories")
+@Service
 public class ConnectionFactoriesCommand extends JmsCommandSupport {
 
     public Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/ConsumeCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/ConsumeCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/ConsumeCommand.java
index 84e1d19..a1b3855 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/ConsumeCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/ConsumeCommand.java
@@ -19,8 +19,10 @@ package org.apache.karaf.jms.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jms", name = "consume", description = "Consume messages from a JMS queue.")
+@Service
 public class ConsumeCommand extends JmsConnectionCommandSupport {
 
     @Argument(index = 1, name = "queue", description = "The JMS queue where to consume messages", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/CountCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/CountCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/CountCommand.java
index 016d6cd..600477a 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/CountCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/CountCommand.java
@@ -18,9 +18,11 @@ package org.apache.karaf.jms.command;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "jms", name = "count", description = "Count the number of messages on a JMS queue.")
+@Service
 public class CountCommand extends JmsConnectionCommandSupport {
 
     @Argument(index = 1, name = "queue", description = "The JMS queue name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/CreateCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/CreateCommand.java
index dcea101..0750a57 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/CreateCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/CreateCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jms", name = "create", description = "Create a JMS connection factory.")
+@Service
 public class CreateCommand extends JmsCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JMS connection factory name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/DeleteCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/DeleteCommand.java
index 882c318..2cd701f 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/DeleteCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/DeleteCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jms.command.completers.ConnectionFactoriesFileNameComple
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jms", name = "delete", description = "Delete a JMS connection factory")
+@Service
 public class DeleteCommand extends JmsCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JMS connection factory name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/InfoCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/InfoCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/InfoCommand.java
index 8b25130..732a164 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/InfoCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/InfoCommand.java
@@ -19,9 +19,11 @@ package org.apache.karaf.jms.command;
 import java.util.Map;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "jms", name = "info", description = "Provides details about a JMS connection factory.")
+@Service
 public class InfoCommand extends JmsConnectionCommandSupport {
 
     public Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/JmsCommandSupport.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/JmsCommandSupport.java b/jms/command/src/main/java/org/apache/karaf/jms/command/JmsCommandSupport.java
index 86b99a7..e4d514c 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/JmsCommandSupport.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/JmsCommandSupport.java
@@ -18,9 +18,11 @@ package org.apache.karaf.jms.command;
 
 import org.apache.karaf.jms.JmsService;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class JmsCommandSupport extends OsgiCommandSupport {
 
+    @Reference
     private JmsService jmsService;
 
     public JmsService getJmsService() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/MoveCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/MoveCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/MoveCommand.java
index 4ab8b46..8afe253 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/MoveCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/MoveCommand.java
@@ -19,8 +19,10 @@ package org.apache.karaf.jms.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jms", name = "move", description = "Move messages from one JMS queue to another one.")
+@Service
 public class MoveCommand extends JmsConnectionCommandSupport {
 
     @Argument(index = 1, name = "source", description = "The source JMS queue", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/QueuesCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/QueuesCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/QueuesCommand.java
index 8ae4cab..105eeb2 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/QueuesCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/QueuesCommand.java
@@ -17,9 +17,11 @@
 package org.apache.karaf.jms.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "jms", name = "queues", description = "List the JMS queues.")
+@Service
 public class QueuesCommand extends JmsConnectionCommandSupport {
 
     public Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/SendCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/SendCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/SendCommand.java
index 792de7f..3af7436 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/SendCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/SendCommand.java
@@ -19,8 +19,10 @@ package org.apache.karaf.jms.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jms", name = "send", description = "Send a message to ")
+@Service
 public class SendCommand extends JmsConnectionCommandSupport {
 
     @Argument(index = 1, name = "queue", description = "The JMS queue name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/TopicsCommand.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/TopicsCommand.java b/jms/command/src/main/java/org/apache/karaf/jms/command/TopicsCommand.java
index bd27dcf..7a0b707 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/TopicsCommand.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/TopicsCommand.java
@@ -17,9 +17,11 @@
 package org.apache.karaf.jms.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "jms", name = "topics", description = "List the JMS topics.")
+@Service
 public class TopicsCommand extends JmsConnectionCommandSupport {
 
     public Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesFileNameCompleter.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesFileNameCompleter.java b/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesFileNameCompleter.java
index e5cfabf..12c42bd 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesFileNameCompleter.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesFileNameCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jms.command.completers;
 import org.apache.karaf.jms.JmsService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer on the JMS connection factory file names.
  */
+@Service
 public class ConnectionFactoriesFileNameCompleter implements Completer {
 
+    @Reference
     private JmsService jmsService;
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesNameCompleter.java
----------------------------------------------------------------------
diff --git a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesNameCompleter.java b/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesNameCompleter.java
index 2d19e76..3437c8e 100644
--- a/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesNameCompleter.java
+++ b/jms/command/src/main/java/org/apache/karaf/jms/command/completers/ConnectionFactoriesNameCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jms.command.completers;
 import org.apache.karaf.jms.JmsService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer on the JMS connection factories name.
  */
+@Service
 public class ConnectionFactoriesNameCompleter implements Completer {
 
+    @Reference
     private JmsService jmsService;
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jms/command/src/main/resources/OSGI-INF/blueprint/jms-command.xml
----------------------------------------------------------------------
diff --git a/jms/command/src/main/resources/OSGI-INF/blueprint/jms-command.xml b/jms/command/src/main/resources/OSGI-INF/blueprint/jms-command.xml
index be81647..b5a912f 100644
--- a/jms/command/src/main/resources/OSGI-INF/blueprint/jms-command.xml
+++ b/jms/command/src/main/resources/OSGI-INF/blueprint/jms-command.xml
@@ -17,74 +17,7 @@
     -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <reference id="jmsService" interface="org.apache.karaf.jms.JmsService"/>
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.jms.command.BrowseCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.ConnectionFactoriesCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.ConsumeCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.CountCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.CreateCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.DeleteCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.InfoCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.MoveCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.QueuesCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.SendCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jms.command.TopicsCommand">
-                <property name="jmsService" ref="jmsService"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="connectionFactoriesNameCompleter" class="org.apache.karaf.jms.command.completers.ConnectionFactoriesNameCompleter">
-        <property name="jmsService" ref="jmsService"/>
-    </bean>
-    <service ref="connectionFactoriesNameCompleter" auto-export="all-classes"/>
-
-    <bean id="connectionFactoriesFileNameCompleter" class="org.apache.karaf.jms.command.completers.ConnectionFactoriesFileNameCompleter">
-        <property name="jmsService" ref="jmsService"/>
-    </bean>
-    <service ref="connectionFactoriesFileNameCompleter" auto-export="all-classes"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.jms.command.*" />
 
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/AliasCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/AliasCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/AliasCommand.java
index 86a126e..3733858 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/AliasCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/AliasCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.jndi.command.completers.NamesCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jndi", name = "alias", description = "Create a JNDI alias on a given name.")
+@Service
 public class AliasCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JNDI name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/BindCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/BindCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/BindCommand.java
index a0560d3..5192853 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/BindCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/BindCommand.java
@@ -21,8 +21,10 @@ import org.apache.karaf.jndi.command.completers.ServicesIdCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jndi", name = "bind", description = "Bind an OSGi service in the JNDI context")
+@Service
 public class BindCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "service", description = "The ID of the OSGi service to bind", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/ContextsCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/ContextsCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/ContextsCommand.java
index b50f3c3..34def8f 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/ContextsCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/ContextsCommand.java
@@ -20,11 +20,13 @@ import org.apache.karaf.jndi.command.completers.ContextsCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.List;
 
 @Command(scope = "jndi", name = "contexts", description = "List the JNDI sub-contexts.")
+@Service
 public class ContextsCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "context", description = "The base JNDI context", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/CreateCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/CreateCommand.java
index dfaa108..d8627a3 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/CreateCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/CreateCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jndi.command.completers.ContextsCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jndi",  name = "create", description = "Create a new JNDI sub-context.")
+@Service
 public class CreateCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "context", description = "The JNDI sub-context name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/DeleteCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/DeleteCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/DeleteCommand.java
index 0370859..7e8a631 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/DeleteCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/DeleteCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jndi.command.completers.ContextsCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jndi", name = "delete", description = "Delete a JNDI sub-context.")
+@Service
 public class DeleteCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "context", description = "The JNDI sub-context name", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/JndiCommandSupport.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/JndiCommandSupport.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/JndiCommandSupport.java
index 0e46be3..e3e4e48 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/JndiCommandSupport.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/JndiCommandSupport.java
@@ -18,9 +18,11 @@ package org.apache.karaf.jndi.command;
 
 import org.apache.karaf.jndi.JndiService;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class JndiCommandSupport extends OsgiCommandSupport {
 
+    @Reference
     private JndiService jndiService;
 
     public JndiService getJndiService() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/NamesCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/NamesCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/NamesCommand.java
index 661dbbf..c893843 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/NamesCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/NamesCommand.java
@@ -20,11 +20,13 @@ import org.apache.karaf.jndi.command.completers.ContextsCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.Map;
 
 @Command(scope = "jndi", name = "names", description = "List the JNDI names.")
+@Service
 public class NamesCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "context", description = "The JNDI context to display the names", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/UnbindCommand.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/UnbindCommand.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/UnbindCommand.java
index 10b9740..058a822 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/UnbindCommand.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/UnbindCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.jndi.command.completers.NamesCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "jndi", name = "unbind", description = "Unbind a JNDI name.")
+@Service
 public class UnbindCommand extends JndiCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The JNDI name to unbind", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ContextsCompleter.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ContextsCompleter.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ContextsCompleter.java
index 88705c0..deab19b 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ContextsCompleter.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ContextsCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jndi.command.completers;
 import org.apache.karaf.jndi.JndiService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completers on the JNDI contexts.
  */
+@Service
 public class ContextsCompleter implements Completer {
 
+    @Reference
     private JndiService jndiService;
 
     public int complete(String buffer, int cursor, List candidates) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/NamesCompleter.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/NamesCompleter.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/NamesCompleter.java
index 33aef6b..618977a 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/NamesCompleter.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/NamesCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.jndi.command.completers;
 import org.apache.karaf.jndi.JndiService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer to the JNDI names.
  */
+@Service
 public class NamesCompleter implements Completer {
 
+    @Reference
     private JndiService jndiService;
 
     public int complete(String buffer, int cursor, List candidates) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ServicesIdCompleter.java
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ServicesIdCompleter.java b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ServicesIdCompleter.java
index e1673cd..c56490b 100644
--- a/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ServicesIdCompleter.java
+++ b/jndi/command/src/main/java/org/apache/karaf/jndi/command/completers/ServicesIdCompleter.java
@@ -18,6 +18,8 @@ package org.apache.karaf.jndi.command.completers;
 
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -28,8 +30,10 @@ import java.util.List;
 /**
  * Completer on the OSGi services ID.
  */
+@Service
 public class ServicesIdCompleter implements Completer {
 
+    @Reference
     private BundleContext bundleContext;
 
     public int complete(String buffer, int cursor, List candidates) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/jndi/command/src/main/resources/OSGI-INF/blueprint/jndi-command.xml
----------------------------------------------------------------------
diff --git a/jndi/command/src/main/resources/OSGI-INF/blueprint/jndi-command.xml b/jndi/command/src/main/resources/OSGI-INF/blueprint/jndi-command.xml
index d9b9f14..f59750b 100644
--- a/jndi/command/src/main/resources/OSGI-INF/blueprint/jndi-command.xml
+++ b/jndi/command/src/main/resources/OSGI-INF/blueprint/jndi-command.xml
@@ -17,59 +17,7 @@
     -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <reference id="jndiService" interface="org.apache.karaf.jndi.JndiService" />
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.jndi.command.AliasCommand">
-                <property name="jndiService" ref="jndiService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.ContextsCommand">
-                <property name="jndiService" ref="jndiService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.NamesCommand">
-                <property name="jndiService" ref="jndiService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.CreateCommand">
-                <property name="jndiService" ref="jndiService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.DeleteCommand">
-                <property name="jndiService" ref="jndiService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.BindCommand">
-                <property name="jndiService" ref="jndiService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.jndi.command.UnbindCommand">
-                <property name="jndiService" ref="jndiService" />
-            </action>
-        </command>
-    </command-bundle>
-
-    <bean id="namesCompleter" class="org.apache.karaf.jndi.command.completers.NamesCompleter">
-        <property name="jndiService" ref="jndiService" />
-    </bean>
-    <service ref="namesCompleter" auto-export="all-classes"/>
-
-    <bean id="contextsCompleter" class="org.apache.karaf.jndi.command.completers.ContextsCompleter">
-        <property name="jndiService" ref="jndiService" />
-    </bean>
-    <service ref="contextsCompleter" auto-export="all-classes"/>
-
-    <bean id="servicesIdCompleter" class="org.apache.karaf.jndi.command.completers.ServicesIdCompleter">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-    </bean>
-    <service ref="servicesIdCompleter" auto-export="all-classes"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.jndi.command.*" />
 
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/CreateKarCommand.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/CreateKarCommand.java b/kar/command/src/main/java/org/apache/karaf/kar/command/CreateKarCommand.java
index 96c99c7..dbc34a6 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/CreateKarCommand.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/CreateKarCommand.java
@@ -22,8 +22,10 @@ import org.apache.karaf.features.command.completers.InstalledRepoNameCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "kar", name = "create", description = "Create a kar file for a list of feature repos")
+@Service
 public class CreateKarCommand extends KarCommandSupport {
     
     @Argument(index = 0, name = "repoName", description = "Repository name. The kar will contain all features of the named repository by default", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java b/kar/command/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java
index 8deff2f..1053e74 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java
@@ -18,10 +18,12 @@ package org.apache.karaf.kar.command;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 import java.net.URI;
 
 @Command(scope = "kar", name = "install", description = "Installs a KAR file.")
+@Service
 public class InstallKarCommand extends KarCommandSupport {
     
     @Argument(index = 0, name = "url", description = "The URL of the KAR file to install.", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/KarCommandSupport.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/KarCommandSupport.java b/kar/command/src/main/java/org/apache/karaf/kar/command/KarCommandSupport.java
index 16c250a..3af6622 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/KarCommandSupport.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/KarCommandSupport.java
@@ -18,9 +18,11 @@ package org.apache.karaf.kar.command;
 
 import org.apache.karaf.kar.KarService;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class KarCommandSupport extends OsgiCommandSupport {
 
+    @Reference
     private KarService karService;
     
     public KarService getKarService() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/ListKarCommand.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/ListKarCommand.java b/kar/command/src/main/java/org/apache/karaf/kar/command/ListKarCommand.java
index 1a8902a..e1b59bb 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/ListKarCommand.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/ListKarCommand.java
@@ -18,9 +18,11 @@ package org.apache.karaf.kar.command;
 
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "kar", name = "list", description = "List the installed KAR files.")
+@Service
 public class ListKarCommand extends KarCommandSupport {
 
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java b/kar/command/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java
index a02efb5..ce5664d 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java
@@ -20,8 +20,10 @@ import org.apache.karaf.kar.command.completers.KarCompleter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "kar", name = "uninstall", description = "Uninstall a KAR file.")
+@Service
 public class UninstallKarCommand extends KarCommandSupport {
 
     @Argument(index = 0, name = "name", description = "The name of the KAR file to uninstall.", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/java/org/apache/karaf/kar/command/completers/KarCompleter.java
----------------------------------------------------------------------
diff --git a/kar/command/src/main/java/org/apache/karaf/kar/command/completers/KarCompleter.java b/kar/command/src/main/java/org/apache/karaf/kar/command/completers/KarCompleter.java
index e7e556a..460a21b 100644
--- a/kar/command/src/main/java/org/apache/karaf/kar/command/completers/KarCompleter.java
+++ b/kar/command/src/main/java/org/apache/karaf/kar/command/completers/KarCompleter.java
@@ -19,14 +19,18 @@ package org.apache.karaf.kar.command.completers;
 import org.apache.karaf.kar.KarService;
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 /**
  * Completer on all installed KAR files.
  */
+@Service
 public class KarCompleter implements Completer {
-    
+
+    @Reference
     private KarService karService;
     
     public int complete(String buffer, int cursor, @SuppressWarnings("rawtypes") List candidates) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/kar/command/src/main/resources/OSGI-INF/blueprint/kar-command.xml
----------------------------------------------------------------------
diff --git a/kar/command/src/main/resources/OSGI-INF/blueprint/kar-command.xml b/kar/command/src/main/resources/OSGI-INF/blueprint/kar-command.xml
index 17acba1..53d56d7 100644
--- a/kar/command/src/main/resources/OSGI-INF/blueprint/kar-command.xml
+++ b/kar/command/src/main/resources/OSGI-INF/blueprint/kar-command.xml
@@ -17,34 +17,7 @@
     -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.kar.command.ListKarCommand">
-                <property name="karService" ref="karService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.kar.command.InstallKarCommand">
-                <property name="karService" ref="karService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.kar.command.UninstallKarCommand">
-                <property name="karService" ref="karService"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.kar.command.CreateKarCommand">
-                <property name="karService" ref="karService"/>
-            </action>
-        </command>
-    </command-bundle>
-
-    <reference id="karService" interface="org.apache.karaf.kar.KarService"/>
-
-    <bean id="karCompleter" class="org.apache.karaf.kar.command.completers.KarCompleter">
-        <property name="karService" ref="karService"/>
-    </bean>
-    <service ref="karCompleter" auto-export="all-classes"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.kar.command.*" />
 
 </blueprint>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java b/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
index 24454cb..8733568 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/ClearLog.java
@@ -17,11 +17,13 @@
 package org.apache.karaf.log.command;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Clear the last log entries.
  */
 @Command(scope = "log", name = "clear", description = "Clear log entries.")
+@Service
 public class ClearLog extends LogCommandSupport {
    
     protected Object doExecute() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java b/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
index 2cbf406..d8cb4b5 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/DisplayException.java
@@ -18,9 +18,11 @@ package org.apache.karaf.log.command;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 @Command(scope = "log", name = "exception-display", description = "Displays the last occurred exception from the log.")
+@Service
 public class DisplayException extends LogCommandSupport {
 
     @Argument(index = 0, name = "logger", description = "The name of the logger. This can be ROOT, ALL, or the name of a logger specified in the org.ops4j.pax.logger.cfg file.", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java b/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
index 1a5a845..f17e775 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/DisplayLog.java
@@ -22,12 +22,15 @@ import org.apache.karaf.log.core.LogEventFormatter;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 /**
  * Displays the last log entries
  */
 @Command(scope = "log", name = "display", description = "Displays log entries.")
+@Service
 public class DisplayLog extends LogCommandSupport {
 
     @Option(name = "-n", aliases = {}, description="Number of entries to display", required = false, multiValued = false)
@@ -42,6 +45,7 @@ public class DisplayLog extends LogCommandSupport {
     @Argument(index = 0, name = "logger", description = "The name of the logger. This can be ROOT, ALL, or the name of a logger specified in the org.ops4j.pax.logger.cfg file.", required = false, multiValued = false)
     String logger;
 
+    @Reference
     protected LogEventFormatter formatter;
     
     public void setFormatter(LogEventFormatter formatter) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java b/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
index 4b32913..290fffb 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/GetLogLevel.java
@@ -19,6 +19,7 @@ package org.apache.karaf.log.command;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 import java.util.Enumeration;
@@ -29,6 +30,7 @@ import java.util.Map;
  * Get the log level
  */
 @Command(scope = "log", name = "get", description = "Shows the currently set log level.")
+@Service
 public class GetLogLevel extends LogCommandSupport {
 
     @Argument(index = 0, name = "logger", description = "The name of the logger, ALL or ROOT (default)", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/LogCommandSupport.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/LogCommandSupport.java b/log/command/src/main/java/org/apache/karaf/log/command/LogCommandSupport.java
index 8a8f979..9ce0f8c 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/LogCommandSupport.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/LogCommandSupport.java
@@ -18,8 +18,11 @@ package org.apache.karaf.log.command;
 
 import org.apache.karaf.log.core.LogService;
 import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.inject.Reference;
 
 public abstract class LogCommandSupport extends AbstractAction {
+
+    @Reference
     protected LogService logService;
 
     public void setLogService(LogService logService) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/LogEntry.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/LogEntry.java b/log/command/src/main/java/org/apache/karaf/log/command/LogEntry.java
index 4bb53d0..d2c1786 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/LogEntry.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/LogEntry.java
@@ -22,12 +22,15 @@ import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.AbstractAction;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.osgi.service.log.LogService;
 
 import java.util.HashMap;
 import java.util.Map;
 
 @Command(scope = "log", name = "log", description = "Log a message.")
+@Service
 public class LogEntry extends AbstractAction {
 
     @Argument(index = 0, name = "message", description = "The message to log", required = true, multiValued = false)
@@ -37,13 +40,12 @@ public class LogEntry extends AbstractAction {
     @Completer(value = StringsCompleter.class, values = { "DEBUG", "INFO", "WARNING", "ERROR" })
     private String level = "INFO";
 
+    @Reference
     private LogService logService;
 
     private final Map<String,Integer> mappings = new HashMap<String,Integer>();
 
-    public LogEntry(LogService logService) {
-        this.logService = logService;
-
+    public LogEntry() {
         mappings.put("ERROR",1);
         mappings.put("WARNING",2);
         mappings.put("INFO",3);
@@ -65,4 +67,7 @@ public class LogEntry extends AbstractAction {
         return level;
     }
 
+    public void setLogService(LogService logService) {
+        this.logService = logService;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java b/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
index 93ae14a..a79b8a9 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
@@ -21,10 +21,12 @@ import java.io.PrintStream;
 import java.util.concurrent.*;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 @Command(scope = "log", name = "tail", description = "Continuously display log entries. Use ctrl-c to quit this command")
+@Service
 public class LogTail extends DisplayLog {
 
     private ExecutorService executorService = Executors.newSingleThreadExecutor();

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
----------------------------------------------------------------------
diff --git a/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java b/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
index ae41b7d..4bdf5d8 100644
--- a/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
+++ b/log/command/src/main/java/org/apache/karaf/log/command/SetLogLevel.java
@@ -20,11 +20,13 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Service;
 
 /**
  * Set the log level for a given logger
  */
 @Command(scope = "log", name = "set", description = "Sets the log level.")
+@Service
 public class SetLogLevel extends LogCommandSupport {
     
     @Argument(index = 0, name = "level", description = "The log level to set (TRACE, DEBUG, INFO, WARN, ERROR) or DEFAULT to unset", required = true, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
----------------------------------------------------------------------
diff --git a/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
index 0b94658..d074489 100644
--- a/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
+++ b/log/command/src/main/resources/OSGI-INF/blueprint/shell-log.xml
@@ -21,48 +21,7 @@
            xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
            default-activation="lazy">
 
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.apache.karaf.log.command.DisplayLog">
-                <property name="logService" ref="logService" />
-                <property name="formatter" ref="formatter"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.DisplayException">
-                <property name="logService" ref="logService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.ClearLog">
-                <property name="logService" ref="logService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.GetLogLevel">
-                <property name="logService" ref="logService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.SetLogLevel" >
-                <property name="logService" ref="logService" />
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.LogTail">
-                <property name="logService" ref="logService" />
-                <property name="formatter" ref="formatter"/>
-            </action>
-        </command>
-        <command>
-            <action class="org.apache.karaf.log.command.LogEntry">
-                <argument ref="osgiLogService" />
-            </action>
-        </command>
-    </command-bundle>
-
-    <reference id="formatter" interface="org.apache.karaf.log.core.LogEventFormatter"/>
-    <reference id="logService" interface="org.apache.karaf.log.core.LogService"/>
-    <reference id="osgiLogService" interface="org.osgi.service.log.LogService"/>
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+                    scan="org.apache.karaf.log.command.*" />
 
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/AddUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/AddUrlCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/AddUrlCommand.java
index 112a2fc..416639f 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/AddUrlCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/AddUrlCommand.java
@@ -21,8 +21,10 @@ import java.util.List;
 import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "url-add", description = "Adds a list of repository URLs to the OBR service.")
+@Service
 public class AddUrlCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "urls", description = "Repository URLs to add to the OBR service separated by whitespaces", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/DeployCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/DeployCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/DeployCommand.java
index a008004..48e42d6 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/DeployCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/DeployCommand.java
@@ -22,8 +22,10 @@ import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "deploy", description = "Deploys a list of bundles using OBR service.")
+@Service
 public class DeployCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "bundles", description = "List of bundle names to deploy (separated by whitespaces)", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/FindCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/FindCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/FindCommand.java
index c442285..cfa4c53 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/FindCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/FindCommand.java
@@ -22,6 +22,7 @@ import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resource;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 import java.io.PrintStream;
 import java.lang.reflect.Array;
@@ -30,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 
 @Command(scope = "obr", name = "find", description = "Find OBR bundles for a given filter.")
+@Service
 public class FindCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "requirements", description = "Requirement", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/InfoCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/InfoCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/InfoCommand.java
index d91830a..e2efa16 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/InfoCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/InfoCommand.java
@@ -28,8 +28,10 @@ import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resource;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "info", description = "Prints information about OBR bundles.")
+@Service
 public class InfoCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "bundles", description = "Specify bundles to query for information (separated by whitespaces)", required = true, multiValued = true)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/ListCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/ListCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/ListCommand.java
index ca17ba2..71df53f 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/ListCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/ListCommand.java
@@ -25,10 +25,13 @@ import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.felix.service.command.CommandSession;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "obr", name = "list", description = "Lists OBR bundles, optionally providing the given packages.")
-public class ListCommand implements Action {
+@Service
+public class ListCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "packages", description = "A list of packages separated by whitespaces.", required = false, multiValued = true)
     List<String> packages;
@@ -36,14 +39,8 @@ public class ListCommand implements Action {
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)
     boolean noFormat;
 
-    RepositoryAdmin repoAdmin;
-
-    public void setRepoAdmin(RepositoryAdmin repoAdmin) {
-        this.repoAdmin = repoAdmin;
-    }
-
     @Override
-    public Object execute(CommandSession session) throws Exception {
+    void doExecute(RepositoryAdmin admin) throws Exception {
         StringBuilder substr = new StringBuilder();
 
         if (packages != null) {
@@ -59,7 +56,7 @@ public class ListCommand implements Action {
         } else {
             query = "(|(presentationname=*" + substr + "*)(symbolicname=*" + substr + "*))";
         }
-        Resource[] resources = repoAdmin.discoverResources(query);
+        Resource[] resources = admin.discoverResources(query);
         int maxPName = 4;
         int maxSName = 13;
         int maxVersion = 7;
@@ -82,8 +79,6 @@ public class ListCommand implements Action {
         }
 
         table.print(System.out, !noFormat);
-
-        return null;
     }
 
     private String emptyIfNull(Object st) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/ListUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/ListUrlCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/ListUrlCommand.java
index 07767ce..e03477b 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/ListUrlCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/ListUrlCommand.java
@@ -20,9 +20,11 @@ import org.apache.felix.bundlerepository.Repository;
 import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 import org.apache.karaf.shell.table.ShellTable;
 
 @Command(scope = "obr", name = "url-list", description = "Displays the repository URLs currently associated with the OBR service.")
+@Service
 public class ListUrlCommand extends ObrCommandSupport {
 
     @Option(name = "--no-format", description = "Disable table rendered output", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/ObrCommandSupport.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/ObrCommandSupport.java b/obr/command/src/main/java/org/apache/karaf/obr/command/ObrCommandSupport.java
index 0a9d0fe..9b70875 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/ObrCommandSupport.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/ObrCommandSupport.java
@@ -33,6 +33,7 @@ import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resolver;
 import org.apache.felix.bundlerepository.Resource;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.inject.Reference;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -42,23 +43,15 @@ public abstract class ObrCommandSupport extends OsgiCommandSupport {
 
     protected static final char VERSION_DELIM = ',';
 
-    protected Object doExecute() throws Exception {
-        ServiceReference<RepositoryAdmin> ref = getBundleContext().getServiceReference(RepositoryAdmin.class);
-        if (ref == null) {
-            System.out.println("RepositoryAdmin service is unavailable.");
-            return null;
-        }
-        try {
-            RepositoryAdmin admin = getBundleContext().getService(ref);
-            if (admin == null) {
-                System.out.println("RepositoryAdmin service is unavailable.");
-                return null;
-            }
+    @Reference
+    private RepositoryAdmin repositoryAdmin;
 
-            doExecute(admin);
-        } finally {
-            getBundleContext().ungetService(ref);
-        }
+    public void setRepositoryAdmin(RepositoryAdmin repositoryAdmin) {
+        this.repositoryAdmin = repositoryAdmin;
+    }
+
+    protected Object doExecute() throws Exception {
+        doExecute(repositoryAdmin);
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/RefreshUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/RefreshUrlCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/RefreshUrlCommand.java
index ce8607a..9610b97 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/RefreshUrlCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/RefreshUrlCommand.java
@@ -23,8 +23,10 @@ import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "url-refresh", description = "Reloads the repositories to obtain a fresh list of bundles.")
+@Service
 public class RefreshUrlCommand extends ObrCommandSupport {
 
     @Option(name = "-i", aliases = { "--index" }, description = "Use index to identify URL", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/RemoveUrlCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/RemoveUrlCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/RemoveUrlCommand.java
index 771d3d6..dd183d1 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/RemoveUrlCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/RemoveUrlCommand.java
@@ -23,8 +23,10 @@ import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "url-remove", description = "Removes a list of repository URLs from the OBR service.")
+@Service
 public class RemoveUrlCommand extends ObrCommandSupport {
 
     @Option(name = "-i", aliases = { "--index" }, description = "Use index to identify URL", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/ResolveCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/ResolveCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/ResolveCommand.java
index 30ef4ca..edbf11f 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/ResolveCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/ResolveCommand.java
@@ -29,8 +29,10 @@ import org.apache.felix.bundlerepository.Resource;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "resolve", description = "Shows the resolution output for a given set of requirements.")
+@Service
 public class ResolveCommand extends ObrCommandSupport {
 
     @Option(name = "-w", aliases = "--why", description = "Display the reason of the inclusion of the resource")

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/SourceCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/SourceCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/SourceCommand.java
index 307cbad..8c2eb89 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/SourceCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/SourceCommand.java
@@ -25,8 +25,10 @@ import org.apache.karaf.obr.command.util.FileUtil;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 @Command(scope = "obr", name = "source", description = "Downloads the sources for an OBR bundle.")
+@Service
 public class SourceCommand extends ObrCommandSupport {
 
     @Option(name = "-x", aliases = {}, description = "Extract the archive", required = false, multiValued = false)

http://git-wip-us.apache.org/repos/asf/karaf/blob/e4f7bc4a/obr/command/src/main/java/org/apache/karaf/obr/command/StartCommand.java
----------------------------------------------------------------------
diff --git a/obr/command/src/main/java/org/apache/karaf/obr/command/StartCommand.java b/obr/command/src/main/java/org/apache/karaf/obr/command/StartCommand.java
index ec631d6..9947986 100644
--- a/obr/command/src/main/java/org/apache/karaf/obr/command/StartCommand.java
+++ b/obr/command/src/main/java/org/apache/karaf/obr/command/StartCommand.java
@@ -20,10 +20,12 @@ import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.inject.Service;
 
 import java.util.List;
 
 @Command(scope = "obr", name = "start", description = "Deploys and starts a list of bundles using OBR.")
+@Service
 public class StartCommand extends ObrCommandSupport {
 
     @Argument(index = 0, name = "bundles", description = "List of bundles to deploy (separated by whitespaces)", required = true, multiValued = true)


[2/6] git commit: [KARAF-2763] Enhance blueprint namespace to support the injection annotations

Posted by gn...@apache.org.
[KARAF-2763] Enhance blueprint namespace to support the injection annotations

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

Branch: refs/heads/master
Commit: 582bf1d88c52528a9222984091a6075b5ddeb9b1
Parents: 5acee17
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 09:18:19 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 09:23:30 2014 +0100

----------------------------------------------------------------------
 .../console/commands/NamespaceHandler.java      | 286 +++++++++++++++----
 .../blueprint/shell-namespacehandler.xml        |   6 +
 .../console/commands/karaf-shell-1.2.0.xsd      | 225 +++++++++++++++
 3 files changed, 467 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/582bf1d8/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
----------------------------------------------------------------------
diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java b/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
index 8330872..b700957 100644
--- a/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
+++ b/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
@@ -18,22 +18,36 @@
  */
 package org.apache.karaf.shell.console.commands;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
 import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.PassThroughMetadata;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
 import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
 import org.apache.aries.blueprint.mutable.MutableIdRefMetadata;
 import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
 import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableReferenceMetadata;
 import org.apache.aries.blueprint.mutable.MutableServiceMetadata;
 import org.apache.aries.blueprint.mutable.MutableValueMetadata;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.SubShellAction;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Destroy;
+import org.apache.karaf.shell.inject.Init;
+import org.apache.karaf.shell.inject.Reference;
+import org.apache.karaf.shell.inject.Service;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.osgi.service.blueprint.reflect.BeanArgument;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
@@ -44,9 +58,12 @@ import org.osgi.service.blueprint.reflect.MapMetadata;
 import org.osgi.service.blueprint.reflect.Metadata;
 import org.osgi.service.blueprint.reflect.NullMetadata;
 import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
 import org.osgi.service.blueprint.reflect.ServiceMetadata;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
@@ -57,6 +74,7 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
     public static final String ACTION = "action";
     public static final String ACTION_ID = "actionId";
     public static final String COMMAND_BUNDLE = "command-bundle";
+    public static final String SCAN = "scan";
     public static final String NAME = "name";
     public static final String COMMAND = "command";
     public static final String COMPLETERS = "completers";
@@ -71,6 +89,7 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
 
     public static final String SHELL_NAMESPACE_1_0_0 = "http://karaf.apache.org/xmlns/shell/v1.0.0";
     public static final String SHELL_NAMESPACE_1_1_0 = "http://karaf.apache.org/xmlns/shell/v1.1.0";
+    public static final String SHELL_NAMESPACE_1_2_0 = "http://karaf.apache.org/xmlns/shell/v1.2.0";
 
     private int nameCounter = 0;
 
@@ -79,8 +98,10 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
             return getClass().getResource("karaf-shell-1.0.0.xsd");
         } else if(SHELL_NAMESPACE_1_1_0.equals(namespace)) {
             return getClass().getResource("karaf-shell-1.1.0.xsd");
+        } else if(SHELL_NAMESPACE_1_2_0.equals(namespace)) {
+            return getClass().getResource("karaf-shell-1.2.0.xsd");
         }
-        return getClass().getResource("karaf-shell-1.1.0.xsd");
+        return getClass().getResource("karaf-shell-1.2.0.xsd");
     }
 
 	public Set<Class> getManagedClasses() {
@@ -95,6 +116,14 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
 
     public Metadata parse(Element element, ParserContext context) {
         if (nodeNameEquals(element, COMMAND_BUNDLE)) {
+            NamedNodeMap attrs = element.getAttributes();
+            for (int i = 0; i < attrs.getLength(); i++) {
+                Node child = attrs.item(i);
+                if (child instanceof Attr) {
+                    Attr childAttr = (Attr) child;
+                    parseChildAttr(childAttr, context);
+                }
+            }
             NodeList children = element.getChildNodes();
             for (int i = 0; i < children.getLength(); i++) {
                 Node child  = children.item(i);
@@ -110,6 +139,167 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
         }
     }
 
+    private void parseChildAttr(Attr attr, ParserContext context) {
+        if (nodeNameEquals(attr, SCAN)) {
+            scan(attr, context);
+        }
+    }
+
+    private void scan(Attr attr, ParserContext context) {
+        try {
+            Bundle bundle = getBundle(context);
+            BundleWiring wiring = bundle.adapt(BundleWiring.class);
+            for (String pkg : attr.getValue().split(" ")) {
+                String name = pkg;
+                int options = BundleWiring.LISTRESOURCES_LOCAL;
+                name = name.replace('.', '/');
+                if (name.endsWith("*")) {
+                    options |= BundleWiring.LISTRESOURCES_RECURSE;
+                    name = name.substring(0, name.length() - 1);
+                }
+                if (!name.startsWith("/")) {
+                    name = "/" + name;
+                }
+                if (name.endsWith("/")) {
+                    name = name.substring(0, name.length() - 1);
+                }
+                Collection<String> classes = wiring.listResources(name, "*.class", options);
+                for (String className : classes) {
+                    className = className.replace('/', '.').replace(".class", "");
+                    inspectClass(context, bundle.loadClass(className));
+                }
+            }
+        } catch (ComponentDefinitionException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new ComponentDefinitionException("Unable to scan commands", e);
+        }
+    }
+
+    private void inspectClass(ParserContext context, Class<?> clazz) throws Exception {
+        Service reg = clazz.getAnnotation(Service.class);
+        if (reg == null) {
+            return;
+        }
+        if (Action.class.isAssignableFrom(clazz)) {
+            final Command cmd = clazz.getAnnotation(Command.class);
+            if (cmd == null) {
+                throw new IllegalArgumentException("Command " + clazz.getName() + " is not annotated with @Command");
+            }
+            String scope = cmd.scope();
+            String function = cmd.name();
+            // Create action
+            MutableBeanMetadata action = context.createMetadata(MutableBeanMetadata.class);
+            action.setId(getName());
+            action.setActivation(MutableBeanMetadata.ACTIVATION_LAZY);
+            action.setScope(MutableBeanMetadata.SCOPE_PROTOTYPE);
+            action.setRuntimeClass(clazz);
+            for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
+                for (Field field : cl.getDeclaredFields()) {
+                    if (field.getAnnotation(Reference.class) != null) {
+                        if (field.getType() == BundleContext.class) {
+                            action.addProperty(field.getName(), createRef(context, "blueprintBundleContext"));
+                        } else {
+                            action.addProperty(field.getName(), createRef(context, createServiceRef(context, field.getType()).getId()));
+                        }
+                    }
+                }
+                for (Method method : cl.getDeclaredMethods()) {
+                    if (method.getAnnotation(Init.class) != null) {
+                        if (action.getInitMethod() == null) {
+                            action.setInitMethod(method.getName());
+                        }
+                    }
+                    if (method.getAnnotation(Destroy.class) != null) {
+                        if (action.getDestroyMethod() == null) {
+                            action.setDestroyMethod(method.getName());
+                        }
+                    }
+                }
+            }
+            context.getComponentDefinitionRegistry().registerComponentDefinition(action);
+            // Create command
+            MutableBeanMetadata command = context.createMetadata(MutableBeanMetadata.class);
+            command.setRuntimeClass(BlueprintCommand.class);
+            command.addProperty(BLUEPRINT_CONTAINER, createRef(context, BLUEPRINT_CONTAINER));
+            command.addProperty(BLUEPRINT_CONVERTER, createRef(context, BLUEPRINT_CONVERTER));
+            command.addProperty(ACTION_ID, createIdRef(context, action.getId()));
+            // Create command service
+            MutableServiceMetadata commandService = context.createMetadata(MutableServiceMetadata.class);
+            commandService.setActivation(MutableServiceMetadata.ACTIVATION_LAZY);
+            commandService.setId(getName());
+            commandService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
+            commandService.setServiceComponent(command);
+            commandService.addServiceProperty(createStringValue(context, "osgi.command.scope"),
+                    createStringValue(context, scope));
+            commandService.addServiceProperty(createStringValue(context, "osgi.command.function"),
+                    createStringValue(context, function));
+            context.getComponentDefinitionRegistry().registerComponentDefinition(commandService);
+
+            // create the sub-shell action
+            createSubShell(context, scope);
+        }
+        if (Completer.class.isAssignableFrom(clazz)) {
+            MutableBeanMetadata completer = context.createMetadata(MutableBeanMetadata.class);
+            completer.setId(getName());
+            completer.setActivation(MutableBeanMetadata.ACTIVATION_LAZY);
+            completer.setScope(MutableBeanMetadata.SCOPE_SINGLETON);
+            completer.setRuntimeClass(clazz);
+            // Create completer
+            for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
+                for (Field field : cl.getDeclaredFields()) {
+                    if (field.getType() == BundleContext.class) {
+                        completer.addProperty(field.getName(), createRef(context, "blueprintBundleContext"));
+                    } else {
+                        completer.addProperty(field.getName(), createRef(context, createServiceRef(context, field.getType()).getId()));
+                    }
+                }
+                for (Method method : cl.getDeclaredMethods()) {
+                    if (method.getAnnotation(Init.class) != null) {
+                        if (completer.getInitMethod() == null) {
+                            completer.setInitMethod(method.getName());
+                        }
+                    }
+                    if (method.getAnnotation(Destroy.class) != null) {
+                        if (completer.getDestroyMethod() == null) {
+                            completer.setDestroyMethod(method.getName());
+                        }
+                    }
+                }
+            }
+            context.getComponentDefinitionRegistry().registerComponentDefinition(completer);
+            // Create completer service
+            MutableServiceMetadata completerService = context.createMetadata(MutableServiceMetadata.class);
+            completerService.setActivation(MutableServiceMetadata.ACTIVATION_LAZY);
+            completerService.setId(getName());
+            completerService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
+            completerService.setServiceComponent(createRef(context, completer.getId()));
+            context.getComponentDefinitionRegistry().registerComponentDefinition(completerService);
+        }
+    }
+
+    private ComponentMetadata createServiceRef(ParserContext context, Class<?> cls) {
+        String id = ".serviceref." + cls.getName();
+        ComponentMetadata metadata = context.getComponentDefinitionRegistry().getComponentDefinition(id);
+        if (metadata == null) {
+            MutableReferenceMetadata m = context.createMetadata(MutableReferenceMetadata.class);
+            m.setRuntimeInterface(cls);
+            m.setInterface(cls.getName());
+            m.setActivation(ReferenceMetadata.ACTIVATION_EAGER);
+            m.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
+            m.setId(id);
+            context.getComponentDefinitionRegistry().registerComponentDefinition(m);
+            return m;
+        } else {
+            return metadata;
+        }
+    }
+
+    private Bundle getBundle(ParserContext context) {
+        PassThroughMetadata ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintBundle");
+        return (Bundle) ptm.getObject();
+    }
+
     private void parseChildElement(Element element, ParserContext context) {
         if (nodeNameEquals(element, COMMAND)) {
             parseCommand(element, context);
@@ -160,11 +350,11 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
         commandService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
         commandService.setServiceComponent(command);
 
-        String scope = null;
+        String scope;
+        String function;
         if (SHELL_NAMESPACE_1_0_0.equals(element.getNamespaceURI())) {
             String location = element.getAttribute(NAME);
             location = location.replace('/', ':');
-            String function;
             if (location.lastIndexOf(':') >= 0) {
                 scope = location.substring(0, location.lastIndexOf(':'));
                 function = location.substring(location.lastIndexOf(':') + 1);
@@ -172,59 +362,55 @@ public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHan
                 scope = "";
                 function = location;
             }
-            commandService.addServiceProperty(createStringValue(context, "osgi.command.scope"),
-                                              createStringValue(context, scope));
-            commandService.addServiceProperty(createStringValue(context, "osgi.command.function"),
-                                              createStringValue(context, function));
         } else {
-            commandService.addServiceProperty(createStringValue(context, "osgi.command.scope"),
-                                              getInvocationValue(context, "getScope", action.getClassName()));
-            commandService.addServiceProperty(createStringValue(context, "osgi.command.function"),
-                                              getInvocationValue(context, "getName", action.getClassName()));
+            try {
+                Class actionClass = getBundle(context).loadClass(action.getClassName());
+                scope = getScope(actionClass);
+                function = getName(actionClass);
+            } catch (Throwable e) {
+                throw new ComponentDefinitionException("Unable to introspect action " + action.getClassName(), e);
+            }
         }
-        
+        commandService.addServiceProperty(createStringValue(context, "osgi.command.scope"),
+                createStringValue(context, scope));
+        commandService.addServiceProperty(createStringValue(context, "osgi.command.function"),
+                createStringValue(context, function));
+
         context.getComponentDefinitionRegistry().registerComponentDefinition(commandService);
 
+        // create the sub-shell action
+        createSubShell(context, scope);
+    }
+
+    private void createSubShell(ParserContext context, String scope) {
         String subShellName = ".subshell." + scope;
-        if (!context.getComponentDefinitionRegistry().containsComponentDefinition(subShellName)) {
-            // create the sub-shell action
-            MutableBeanMetadata subShellAction = context.createMetadata(MutableBeanMetadata.class);
-            subShellAction.setRuntimeClass(SubShellAction.class);
-            subShellAction.setActivation(MutableBeanMetadata.ACTIVATION_LAZY);
-            subShellAction.setScope(MutableBeanMetadata.SCOPE_PROTOTYPE);
-            subShellAction.setId(getName());
-            if (scope != null && !scope.isEmpty()) {
-                // it's shell 1.0.0 schema, scope is contained in the descriptor itself
-                subShellAction.addProperty("subShell", createStringValue(context, scope));
-            } else {
-                // it's shell 1.1.0 schema, we inject the scope from the command
-                subShellAction.addProperty("subShell", getInvocationValue(context, "getScope", action.getClassName()));
-            }
-            context.getComponentDefinitionRegistry().registerComponentDefinition(subShellAction);
-            // generate the sub-shell command
-            MutableBeanMetadata subShellCommand = context.createMetadata(MutableBeanMetadata.class);
-            subShellCommand.setId(getName());
-            subShellCommand.setRuntimeClass(BlueprintCommand.class);
-            subShellCommand.addProperty(BLUEPRINT_CONTAINER, createRef(context, BLUEPRINT_CONTAINER));
-            subShellCommand.addProperty(BLUEPRINT_CONVERTER, createRef(context, BLUEPRINT_CONVERTER));
-            subShellCommand.addProperty(ACTION_ID, createIdRef(context, subShellAction.getId()));
-            context.getComponentDefinitionRegistry().registerComponentDefinition(subShellCommand);
-            // generate the sub-shell OSGi service
-            MutableServiceMetadata subShellCommandService = context.createMetadata(MutableServiceMetadata.class);
-            subShellCommandService.setActivation(MutableServiceMetadata.ACTIVATION_LAZY);
-            subShellCommandService.setId(subShellName);
-            subShellCommandService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
-            subShellCommandService.setServiceComponent(subShellCommand);
-            subShellCommandService.addServiceProperty(createStringValue(context, "osgi.command.scope"), createStringValue(context, "*"));
-            if (scope != null && !scope.isEmpty()) {
-                // it's shell 1.0.0 schema, scope is contained in the descriptor itself
-                subShellCommandService.addServiceProperty(createStringValue(context, "osgi.command.function"), createStringValue(context, scope));
-            } else {
-                // it's shell 1.1.0 schema, we inject the scope from the command
-                subShellCommandService.addServiceProperty(createStringValue(context, "osgi.command.function"), getInvocationValue(context, "getScope", action.getClassName()));
-            }
-            context.getComponentDefinitionRegistry().registerComponentDefinition(subShellCommandService);
+        if (context.getComponentDefinitionRegistry().containsComponentDefinition(subShellName)) {
+            return;
         }
+        MutableBeanMetadata subShellAction = context.createMetadata(MutableBeanMetadata.class);
+        subShellAction.setRuntimeClass(SubShellAction.class);
+        subShellAction.setActivation(MutableBeanMetadata.ACTIVATION_LAZY);
+        subShellAction.setScope(MutableBeanMetadata.SCOPE_PROTOTYPE);
+        subShellAction.setId(getName());
+        subShellAction.addProperty("subShell", createStringValue(context, scope));
+        context.getComponentDefinitionRegistry().registerComponentDefinition(subShellAction);
+        // generate the sub-shell command
+        MutableBeanMetadata subShellCommand = context.createMetadata(MutableBeanMetadata.class);
+        subShellCommand.setId(getName());
+        subShellCommand.setRuntimeClass(BlueprintCommand.class);
+        subShellCommand.addProperty(BLUEPRINT_CONTAINER, createRef(context, BLUEPRINT_CONTAINER));
+        subShellCommand.addProperty(BLUEPRINT_CONVERTER, createRef(context, BLUEPRINT_CONVERTER));
+        subShellCommand.addProperty(ACTION_ID, createIdRef(context, subShellAction.getId()));
+        context.getComponentDefinitionRegistry().registerComponentDefinition(subShellCommand);
+        // generate the sub-shell OSGi service
+        MutableServiceMetadata subShellCommandService = context.createMetadata(MutableServiceMetadata.class);
+        subShellCommandService.setActivation(MutableServiceMetadata.ACTIVATION_LAZY);
+        subShellCommandService.setId(subShellName);
+        subShellCommandService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
+        subShellCommandService.setServiceComponent(subShellCommand);
+        subShellCommandService.addServiceProperty(createStringValue(context, "osgi.command.scope"), createStringValue(context, "*"));
+        subShellCommandService.addServiceProperty(createStringValue(context, "osgi.command.function"), createStringValue(context, scope));
+        context.getComponentDefinitionRegistry().registerComponentDefinition(subShellCommandService);
     }
 
     private MutableBeanMetadata getInvocationValue(ParserContext context, String method, String className) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/582bf1d8/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
----------------------------------------------------------------------
diff --git a/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml b/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
index be1dd92..b2b5566 100644
--- a/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
+++ b/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
@@ -33,4 +33,10 @@
         </service-properties>
     </service>
 
+    <service ref="namespaceHandler" interface="org.apache.aries.blueprint.NamespaceHandler">
+        <service-properties>
+            <entry key="osgi.service.blueprint.namespace" value="http://karaf.apache.org/xmlns/shell/v1.2.0" />
+        </service-properties>
+    </service>
+
 </blueprint>

http://git-wip-us.apache.org/repos/asf/karaf/blob/582bf1d8/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.2.0.xsd
----------------------------------------------------------------------
diff --git a/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.2.0.xsd b/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.2.0.xsd
new file mode 100644
index 0000000..afc00f4
--- /dev/null
+++ b/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.2.0.xsd
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+
+<!-- $Rev: 699828 $ $Date: 2008-09-28 16:35:27 +0200 (Sun, 28 Sep 2008) $ -->
+
+<xsd:schema xmlns="http://karaf.apache.org/xmlns/shell/v1.2.0"
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+        targetNamespace="http://karaf.apache.org/xmlns/shell/v1.2.0"
+        elementFormDefault="qualified"
+        attributeFormDefault="unqualified">
+
+    <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xsd:annotation>
+        <xsd:documentation>
+            Defines the configuration elements for Apache Karaf commands support.
+        </xsd:documentation>
+    </xsd:annotation>
+
+    <xsd:element name="command-bundle">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command bundle.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:element ref="command" minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+            <xsd:attribute name="scan" type="Tscan"/>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:simpleType name="Tscan">
+        <xsd:restriction>
+            <xsd:simpleType>
+                <xsd:list itemType="Tpackage" />
+            </xsd:simpleType>
+            <xsd:minLength value="1" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:simpleType name="Tpackage">
+        <xsd:restriction base="xsd:string">
+            <xsd:pattern value="\*|[a-z]+(\.[a-z]+)+(\.\*)?" />
+        </xsd:restriction>
+    </xsd:simpleType>
+
+    <xsd:element name="command">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <!--
+                NOTE: Not using an xsd:choice here, as I can't seem to figure out how to get it to properly
+                      validate the min/max of the containted elements.  W/o the xsd:choice the validation
+                      works, though have to define elements in order :-(
+                -->
+                <xsd:element ref="action" minOccurs="1" maxOccurs="1"/>
+                <xsd:element ref="documenter" minOccurs="0" maxOccurs="1"/>
+                <xsd:choice minOccurs="0" maxOccurs="1">
+                    <xsd:element ref="completer"/>
+                    <xsd:element ref="completers"/>
+                </xsd:choice>
+                <xsd:element ref="optional-completers" minOccurs="0" maxOccurs="1"/>
+                <xsd:element ref="message-source" minOccurs="0" maxOccurs="1"/>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:group name="commandComponentElements">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid elements for command components.  This is based on beans:beanElements,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:sequence>
+			<xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="argument" type="bp:Targument"/>
+                <xsd:element name="property" type="bp:Tproperty"/>
+				<!--
+				NOTE: This seems to cause schema validation problems... not really sure why
+				<xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
+				-->
+			</xsd:choice>
+		</xsd:sequence>
+	</xsd:group>
+
+    <xsd:attributeGroup name="commandComponentAttributes">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid attributes for command components.  This is based on beans:beanAttributes,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:attribute name="class" type="xsd:string"/>
+		<xsd:attribute name="depends-on" type="xsd:string"/>
+		<xsd:attribute name="init-method" type="xsd:string"/>
+		<xsd:attribute name="factory-method" type="xsd:string"/>
+		<xsd:attribute name="factory-bean" type="xsd:string"/>
+		<xsd:anyAttribute namespace="##other" processContents="lax"/>
+	</xsd:attributeGroup>
+
+    <xsd:complexType name="commandComponent" abstract="true">
+        <xsd:annotation>
+            <xsd:documentation>
+                Support for command component elements, which are all basically just beans.
+            </xsd:documentation>
+        </xsd:annotation>
+        <xsd:group ref="commandComponentElements"/>
+        <xsd:attributeGroup ref="commandComponentAttributes"/>
+    </xsd:complexType>
+
+    <xsd:element name="action">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command action.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="documenter">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command documenter.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completer">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command completer.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completers">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a configurable command completer with a set of completers.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:choice minOccurs="1" maxOccurs="unbounded">
+                    <xsd:element name="bean" type="bp:Tbean"/>
+                    <xsd:element name="ref" type="bp:Tref"/>
+                    <xsd:element name="null" type="bp:Tnull"/>
+                </xsd:choice>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+        <xsd:element name="optional-completers">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a configurable command completer with a set of completers.
+                    These completers are used for option value completion.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+			<xsd:extension base="bp:TtypedCollection">
+				<xsd:sequence>
+					<xsd:element name="entry" type="bp:TmapEntry" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xsd:sequence>
+				<xsd:attribute name="key-type" type="bp:Ttype" />
+			</xsd:extension>
+		</xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="message-source">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command message source.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+</xsd:schema>