You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/01/03 18:19:56 UTC

svn commit: r608566 - in /servicemix/smx4/nmr/trunk: jbi/ jbi/commands/ jbi/commands/src/ jbi/commands/src/main/ jbi/commands/src/main/java/ jbi/commands/src/main/java/org/ jbi/commands/src/main/java/org/apache/ jbi/commands/src/main/java/org/apache/se...

Author: gnodet
Date: Thu Jan  3 09:19:53 2008
New Revision: 608566

URL: http://svn.apache.org/viewvc?rev=608566&view=rev
Log:
Add commands for NMR and JBI (mainly placeholders right now)

Added:
    servicemix/smx4/nmr/trunk/jbi/commands/   (with props)
    servicemix/smx4/nmr/trunk/jbi/commands/pom.xml
    servicemix/smx4/nmr/trunk/jbi/commands/src/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiCommandSupport.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiLifeCycleCommandSupport.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ListCommand.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StartCommand.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StopCommand.java
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/
    servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/servicemix-jbi-commands.xml
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractBundleWatcher.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
    servicemix/smx4/nmr/trunk/nmr/commands/   (with props)
    servicemix/smx4/nmr/trunk/nmr/commands/pom.xml
    servicemix/smx4/nmr/trunk/nmr/commands/src/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/NmrCommandSupport.java
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/
    servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/servicemix-nmr-commands.xml
Modified:
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/SharedLibrary.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java
    servicemix/smx4/nmr/trunk/jbi/pom.xml
    servicemix/smx4/nmr/trunk/nmr/pom.xml

Propchange: servicemix/smx4/nmr/trunk/jbi/commands/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Jan  3 09:19:53 2008
@@ -0,0 +1,7 @@
+target
+*.iml
+*.ipr
+*.iws
+.classpath
+.project
+.settings

Added: servicemix/smx4/nmr/trunk/jbi/commands/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/pom.xml?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/pom.xml (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/pom.xml Thu Jan  3 09:19:53 2008
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.servicemix.jbi</groupId>
+        <artifactId>jbi</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.servicemix.jbi</groupId>
+    <artifactId>org.apache.servicemix.jbi.commands</artifactId>
+    <packaging>bundle</packaging>
+    <name>ServiceMix JBI Commands</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.servicemix.jbi</groupId>
+            <artifactId>org.apache.servicemix.jbi.deployer</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.runtime.gshell</groupId>
+            <artifactId>org.apache.servicemix.runtime.gshell.core</artifactId>
+            <version>${smx.runtime.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${pom.artifactId}*</Export-Package>
+                        <DynamicImport-Package>*</DynamicImport-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiCommandSupport.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiCommandSupport.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiCommandSupport.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiCommandSupport.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.geronimo.gshell.support.OsgiCommandSupport;
+import org.apache.servicemix.jbi.deployer.Component;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.apache.servicemix.jbi.deployer.SharedLibrary;
+import org.apache.servicemix.jbi.deployer.impl.Deployer;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Base class for JBI related commands
+ */
+public abstract class JbiCommandSupport extends OsgiCommandSupport {
+
+    protected List<ServiceReference> usedReferences;
+
+    protected List<SharedLibrary> getSharedLibraries() throws Exception {
+        return getAllServices(SharedLibrary.class, null);
+    }
+
+    protected List<Component> getComponents() throws Exception {
+        return getAllServices(Component.class, null);
+    }
+
+    protected List<ServiceAssembly> getServiceAssemblies() throws Exception {
+        return getAllServices(ServiceAssembly.class, null);
+    }
+
+    protected Component getComponent(String name) throws Exception {
+        List<Component> components = getAllServices(Component.class, "(" + Deployer.NAME + "=" + name + ")");
+        if (components != null && components.size() == 1) {
+            return components.get(0);
+        }
+        return null;
+    }
+
+    protected ServiceAssembly getServiceAssembly(String name) throws Exception {
+        List<ServiceAssembly> assemblies = getAllServices(ServiceAssembly.class, "(" + Deployer.NAME + "=" + name + ")");
+        if (assemblies != null && assemblies.size() == 1) {
+            return assemblies.get(0);
+        }
+        return null;
+    }
+
+    public Object doExecute(final Object... args) throws Exception {
+        try {
+            return super.doExecute(args);
+        } finally {
+            ungetServices();
+        }
+    }
+
+    protected <T> List<T> getAllServices(Class<T> clazz, String filter) throws Exception {
+        ServiceReference[] references = getBundleContext().getAllServiceReferences(clazz.getName(), filter);
+        if (references == null) {
+            return null;
+        }
+        List<T> services = new ArrayList<T>();
+        for (ServiceReference ref : references) {
+            T t = getService(clazz, ref);
+            services.add(t);
+        }
+        return services;
+    }
+
+    protected <T> T getService(Class<T> clazz, ServiceReference reference) {
+        T t = (T) getBundleContext().getService(reference);
+        if (t != null) {
+            if (usedReferences == null) {
+                usedReferences = new ArrayList<ServiceReference>();
+            }
+            usedReferences.add(reference);
+        }
+        return t;
+    }
+
+    protected void ungetServices() {
+        if (usedReferences != null) {
+            for (ServiceReference ref : usedReferences) {
+                getBundleContext().ungetService(ref);
+            }
+        }
+    }
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiLifeCycleCommandSupport.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiLifeCycleCommandSupport.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiLifeCycleCommandSupport.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/JbiLifeCycleCommandSupport.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,73 @@
+/*
+ * 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.servicemix.jbi.commands;
+
+import java.util.List;
+
+import javax.jbi.management.LifeCycleMBean;
+
+import org.apache.geronimo.gshell.clp.Argument;
+import org.apache.geronimo.gshell.clp.Option;
+import org.apache.servicemix.jbi.deployer.Component;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+
+/**
+ * JBI artifact lifecycle command
+ */
+public abstract class JbiLifeCycleCommandSupport extends JbiCommandSupport {
+
+    @Option(name = "-c", aliases = "--component", description = "a component")
+    boolean isComponent;
+
+    @Option(name = "-a", aliases = "--service-assembly", description = "a service assembly")
+    boolean isAssembly;
+
+    @Argument(required = true, multiValued = true)
+    List<String> artifacts;
+
+    protected Object doExecute() throws Exception {
+        if (isComponent && isAssembly) {
+            throw new IllegalArgumentException("Can not specify options -c and -a at the same time!");
+        }
+        for (String artifact : artifacts) {
+            try {
+                if ((!isComponent && !isAssembly) || isComponent) {
+                    Component component = getComponent(artifact);
+                    if (component != null) {
+                        handle(component);
+                        continue;
+                    }
+                }
+                if ((!isComponent && !isAssembly) || isAssembly) {
+                    ServiceAssembly assembly = getServiceAssembly(artifact);
+                    if (assembly != null) {
+                        handle(assembly);
+                        continue;
+                    }
+                }
+                io.out.println("Artifact " + artifact + " not found");
+            }
+            catch (Exception e) {
+                io.out.println("Error processing " + artifact + ": " + e);
+            }
+        }
+        return null;
+    }
+
+    protected abstract void handle(LifeCycleMBean artifact) throws Exception;
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ListCommand.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ListCommand.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ListCommand.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ListCommand.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,61 @@
+/*
+ * 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.servicemix.jbi.commands;
+
+import java.util.List;
+
+import org.apache.servicemix.jbi.deployer.Component;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.apache.servicemix.jbi.deployer.SharedLibrary;
+
+/**
+ * List JBI artifacts
+ */
+@org.apache.geronimo.gshell.command.annotation.CommandComponent(id = "jbi:list", description = "List deployed JBI artifacts")
+public class ListCommand extends JbiCommandSupport {
+
+    protected Object doExecute() throws Exception {
+        List<SharedLibrary> libraries = getSharedLibraries();
+        if (libraries != null && !libraries.isEmpty()) {
+            io.out.println("Shared Libraries");
+            io.out.println("----------------");
+            for (SharedLibrary library : libraries) {
+                io.out.println(library.getName() + " - " + library.getVersion() + " - " + library.getDescription());
+            }
+            io.out.println();
+        }
+
+        List<Component> components = getComponents();
+        if (components != null && !components.isEmpty()) {
+            io.out.println("Components");
+            io.out.println("----------");
+            for (Component component : components) {
+                io.out.println(component.getName() + " - " + component.getCurrentState() + " - " + component.getDescription());
+            }
+        }
+
+        List<ServiceAssembly> assemblies = getServiceAssemblies();
+        if (assemblies != null && !assemblies.isEmpty()) {
+            io.out.println("Service Assemblies");
+            io.out.println("------------------");
+            for (ServiceAssembly assembly : assemblies) {
+                io.out.println(assembly.getName() + " - " + assembly.getCurrentState() + " - " + assembly.getDescription());
+            }
+        }
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,31 @@
+/*
+ * 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.servicemix.jbi.commands;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
+
+/**
+ * Shutdown a JBI artifact
+ */
+@org.apache.geronimo.gshell.command.annotation.CommandComponent(id = "jbi:shutdown", description = "Shutdown a JBI artifact")
+public class ShutdownCommand extends JbiLifeCycleCommandSupport {
+
+    protected void handle(LifeCycleMBean artifact) throws JBIException {
+        artifact.shutDown();
+    }
+}
\ No newline at end of file

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StartCommand.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StartCommand.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StartCommand.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StartCommand.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,31 @@
+/*
+ * 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.servicemix.jbi.commands;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
+
+/**
+ * Start a JBI artifact
+ */
+@org.apache.geronimo.gshell.command.annotation.CommandComponent(id = "jbi:start", description = "Start a JBI artifact")
+public class StartCommand extends JbiLifeCycleCommandSupport {
+
+    protected void handle(LifeCycleMBean artifact) throws JBIException {
+        artifact.start();
+    }
+}

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StopCommand.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StopCommand.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StopCommand.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/StopCommand.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,31 @@
+/*
+ * 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.servicemix.jbi.commands;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
+
+/**
+ * Stop a JBI artifact
+ */
+@org.apache.geronimo.gshell.command.annotation.CommandComponent(id = "jbi:stop", description = "Stop a JBI artifact")
+public class StopCommand extends JbiLifeCycleCommandSupport {
+
+    protected void handle(LifeCycleMBean artifact) throws JBIException {
+        artifact.stop();
+    }
+}
\ No newline at end of file

Added: servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/servicemix-jbi-commands.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/servicemix-jbi-commands.xml?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/servicemix-jbi-commands.xml (added)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/resources/META-INF/spring/servicemix-jbi-commands.xml Thu Jan  3 09:19:53 2008
@@ -0,0 +1,66 @@
+<?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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:osgi="http://www.springframework.org/schema/osgi"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+  http://www.springframework.org/schema/beans
+  http://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/util
+  http://www.springframework.org/schema/util/spring-util.xsd
+  http://www.springframework.org/schema/osgi
+  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+    <bean id="list" class="org.apache.servicemix.jbi.commands.ListCommand" />
+
+    <bean id="start" class="org.apache.servicemix.jbi.commands.StartCommand" />
+
+    <bean id="stop" class="org.apache.servicemix.jbi.commands.StopCommand" />
+
+    <bean id="shutdown" class="org.apache.servicemix.jbi.commands.ShutdownCommand" />
+
+    <osgi:service ref="list" interface="org.apache.geronimo.gshell.command.Command">
+      <osgi:service-properties>
+        <entry key="shell" value="jbi"/>
+        <entry key="alias" value="ls"/>
+      </osgi:service-properties>
+    </osgi:service>
+
+    <osgi:service ref="start" interface="org.apache.geronimo.gshell.command.Command">
+      <osgi:service-properties>
+        <entry key="shell" value="jbi"/>
+      </osgi:service-properties>
+    </osgi:service>
+
+    <osgi:service ref="stop" interface="org.apache.geronimo.gshell.command.Command">
+      <osgi:service-properties>
+        <entry key="shell" value="jbi"/>
+      </osgi:service-properties>
+    </osgi:service>
+
+    <osgi:service ref="shutdown" interface="org.apache.geronimo.gshell.command.Command">
+      <osgi:service-properties>
+        <entry key="shell" value="jbi"/>
+      </osgi:service-properties>
+    </osgi:service>
+
+
+</beans>
\ No newline at end of file

Added: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,26 @@
+package org.apache.servicemix.jbi.deployer;
+
+import javax.jbi.management.ComponentLifeCycleMBean;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: gnodet
+ * Date: Jan 3, 2008
+ * Time: 3:44:17 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface Component extends ComponentLifeCycleMBean {
+
+    /**
+     * Retrieves the name of this service assembly
+     * @return the name
+     */
+    String getName();
+
+    /**
+     * Retrieves the description of this service assembly
+     * @return the description
+     */
+    String getDescription();
+
+}

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java Thu Jan  3 09:19:53 2008
@@ -17,12 +17,13 @@
 package org.apache.servicemix.jbi.deployer;
 
 import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
 
 /**
  * This interface represents a JBI Service Assembly and will be registered
  * in the OSGi registry
  */
-public interface ServiceAssembly {
+public interface ServiceAssembly extends LifeCycleMBean {
 
     /**
      * Retrieves the name of this service assembly
@@ -41,13 +42,5 @@
      * @return
      */
     ServiceUnit[] getServiceUnits();
-
-	void init() throws JBIException;
-
-	void start() throws JBIException;
-
-	void stop() throws JBIException;
-
-	void shutdown() throws JBIException;
 
 }

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/SharedLibrary.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/SharedLibrary.java?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/SharedLibrary.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/SharedLibrary.java Thu Jan  3 09:19:53 2008
@@ -44,6 +44,6 @@
      * Create a classloader for this shared library
      * @return a new classloader
      */
-    ClassLoader createClassLoader();
+    //ClassLoader createClassLoader();
     
 }

Added: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractBundleWatcher.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractBundleWatcher.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractBundleWatcher.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractBundleWatcher.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,97 @@
+/*
+ * 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.servicemix.jbi.deployer.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.SynchronousBundleListener;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.osgi.context.BundleContextAware;
+
+/**
+ */
+public abstract class AbstractBundleWatcher implements BundleContextAware, InitializingBean, DisposableBean {
+
+    private BundleContext bundleContext;
+    private SynchronousBundleListener bundleListener;
+    private List<Bundle> bundles = new ArrayList<Bundle>();
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void afterPropertiesSet() throws Exception {
+        bundleContext.addBundleListener(bundleListener = new SynchronousBundleListener() {
+            public void bundleChanged(BundleEvent event) {
+                switch (event.getType()) {
+                    case BundleEvent.STARTED:
+                        onBundleStarted(event.getBundle());
+                        break;
+                    case BundleEvent.STOPPED:
+                        onBundleStopped(event.getBundle());
+                        break;
+                }
+            }
+        });
+        Bundle[] bundles = bundleContext.getBundles();
+        if (bundles != null) {
+            for (Bundle bundle : bundles) {
+                onBundleStarted(bundle);
+            }
+        }
+    }
+
+    public void destroy() throws Exception {
+        bundleContext.removeBundleListener(bundleListener);
+        for (Bundle bundle : bundles.toArray(new Bundle[bundles.size()])) {
+            if (bundle.getState() == Bundle.ACTIVE) {
+                onBundleStopped(bundle);
+            }
+        }
+    }
+
+    private void onBundleStarted(Bundle bundle) {
+        if (match(bundle)) {
+            register(bundle);
+            bundles.add(bundle);
+        }
+    }
+
+    private void onBundleStopped(Bundle bundle) {
+        if (bundles.remove(bundle)) {
+            unregister(bundle);
+        }
+    }
+
+    protected boolean match(Bundle bundle) {
+        return true;
+    }
+
+    protected abstract void register(Bundle bundle);
+
+    protected abstract void unregister(Bundle bundle);
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,170 @@
+/*
+ * 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.servicemix.jbi.deployer.impl;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.servicedesc.ServiceEndpoint;
+import javax.jbi.component.ComponentLifeCycle;
+import javax.jbi.component.ServiceUnitManager;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.management.LifeCycleMBean;
+import javax.management.ObjectName;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+
+import org.apache.servicemix.jbi.deployer.Component;
+import org.apache.servicemix.jbi.deployer.descriptor.ComponentDesc;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: gnodet
+ * Date: Jan 3, 2008
+ * Time: 5:15:57 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ComponentImpl implements Component {
+
+    protected enum State {
+        Unknown,
+        Initialized,
+        Started,
+        Stopped,
+        Shutdown,
+    }
+
+    private ComponentDesc componentDesc;
+    private javax.jbi.component.Component component;
+
+    private State state = State.Unknown;
+
+    public ComponentImpl(ComponentDesc componentDesc, javax.jbi.component.Component component) {
+        this.componentDesc = componentDesc;
+        this.component = component;
+    }
+
+    public String getName() {
+        return componentDesc.getIdentification().getName();
+    }
+
+    public String getDescription() {
+        return componentDesc.getIdentification().getDescription();
+    }
+
+    public ObjectName getExtensionMBeanName() throws JBIException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public javax.jbi.component.Component getComponent() {
+        return component;
+    }
+
+    public void start() throws JBIException {
+        component.getLifeCycle().start();
+        state = State.Started;
+    }
+
+    public void stop() throws JBIException {
+        if (state == State.Started) {
+            component.getLifeCycle().stop();
+            state = State.Stopped;
+        }
+    }
+
+    public void shutDown() throws JBIException {
+        if (state == State.Started) {
+            stop();
+        }
+        if (state == State.Stopped) {
+            component.getLifeCycle().shutDown();
+            state = State.Shutdown;
+        }
+    }
+
+    public String getCurrentState() {
+        switch (state) {
+            case Started:
+                return LifeCycleMBean.STARTED;
+            case Stopped:
+                return LifeCycleMBean.STOPPED;
+            case Initialized:
+            case Shutdown:
+                return LifeCycleMBean.SHUTDOWN;
+            default:
+                return LifeCycleMBean.UNKNOWN;
+        }
+    }
+
+    protected class ComponentWrapper implements javax.jbi.component.Component, ComponentLifeCycle {
+        private javax.jbi.component.Component component;
+        private ComponentLifeCycle lifeCycle;
+
+        public ComponentWrapper(javax.jbi.component.Component component) {
+            this.component = component;
+        }
+
+        public ComponentLifeCycle getLifeCycle() {
+            if (lifeCycle == null) {
+                lifeCycle = component.getLifeCycle();
+            }
+            return this;
+        }
+
+        public ServiceUnitManager getServiceUnitManager() {
+            return component.getServiceUnitManager();
+        }
+
+        public Document getServiceDescription(ServiceEndpoint endpoint) {
+            return component.getServiceDescription(endpoint);
+        }
+
+        public boolean isExchangeWithConsumerOkay(ServiceEndpoint endpoint, MessageExchange exchange) {
+            return component.isExchangeWithConsumerOkay(endpoint, exchange);
+        }
+
+        public boolean isExchangeWithProviderOkay(ServiceEndpoint endpoint, MessageExchange exchange) {
+            return component.isExchangeWithProviderOkay(endpoint, exchange);
+        }
+
+        public ServiceEndpoint resolveEndpointReference(DocumentFragment epr) {
+            return component.resolveEndpointReference(epr);
+        }
+
+        public ObjectName getExtensionMBeanName() {
+            return lifeCycle.getExtensionMBeanName();
+        }
+
+        public void init(ComponentContext context) throws JBIException {
+            lifeCycle.init(context);
+            state = State.Initialized;
+        }
+
+        public void shutDown() throws JBIException {
+            lifeCycle.shutDown();
+        }
+
+        public void start() throws JBIException {
+            lifeCycle.start();
+        }
+
+        public void stop() throws JBIException {
+            lifeCycle.stop();
+        }
+    }
+
+}

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java Thu Jan  3 09:19:53 2008
@@ -27,10 +27,10 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.jbi.JBIException;
-import javax.jbi.component.Component;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.deployer.Component;
 import org.apache.servicemix.jbi.deployer.ServiceAssembly;
 import org.apache.servicemix.jbi.deployer.SharedLibrary;
 import org.apache.servicemix.jbi.deployer.descriptor.ComponentDesc;
@@ -43,12 +43,8 @@
 import org.apache.xbean.classloader.MultiParentClassLoader;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.BundleListener;
 import org.osgi.framework.ServiceReference;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.osgi.context.BundleContextAware;
+import org.osgi.framework.ServiceRegistration;
 import org.springframework.osgi.util.BundleDelegatingClassLoader;
 import org.springframework.osgi.util.OsgiServiceReferenceUtils;
 import org.springframework.osgi.util.OsgiServiceUtils;
@@ -58,7 +54,7 @@
  * Deployer for JBI artifacts
  *
  */
-public class Deployer implements BundleListener, BundleContextAware, InitializingBean, DisposableBean {
+public class Deployer extends AbstractBundleWatcher {
 
     public static final String NAME = "NAME";
     public static final String TYPE = "TYPE";
@@ -67,83 +63,77 @@
 
     private static final String JBI_DESCRIPTOR = "META-INF/jbi.xml";
 
-    private BundleContext context;
+    private Map<String, SharedLibraryImpl> sharedLibraries;
 
-    private Map<String, SharedLibrary> sharedLibraries;
+    private Map<String, ServiceAssemblyImpl> serviceAssemblies;
 
-    private Map<String, ServiceAssembly> serviceAssemblies;
+    private Map<Bundle, List<ServiceRegistration>> services;
 
     private File jbiRootDir;
 
     public Deployer() throws JBIException{
-        sharedLibraries = new ConcurrentHashMap<String, SharedLibrary>();
-        serviceAssemblies = new ConcurrentHashMap<String, ServiceAssembly>();
+        sharedLibraries = new ConcurrentHashMap<String, SharedLibraryImpl>();
+        serviceAssemblies = new ConcurrentHashMap<String, ServiceAssemblyImpl>();
+        services = new ConcurrentHashMap<Bundle, List<ServiceRegistration>>();
         // TODO: control that using properties
         jbiRootDir = new File(System.getProperty("servicemix.base"), "jbi");
         jbiRootDir.mkdirs();
     }
 
-    public void setBundleContext(BundleContext context) {
-        this.context = context;
-    }
-
-    public void afterPropertiesSet() throws Exception {
-        this.context.addBundleListener(this);
-        for (Bundle bundle : this.context.getBundles()) {
-            checkInstalledBundle(bundle);
+    @Override
+    protected boolean match(Bundle bundle) {
+        LOGGER.debug("Checking bundle: '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "'");
+        URL url = bundle.getResource(JBI_DESCRIPTOR);
+        if (url == null) {
+            LOGGER.debug("Bundle '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "' does not contain any JBI descriptor.");
+            return false;
         }
+        return true;
     }
 
-    public void destroy() throws Exception {
-        this.context.removeBundleListener(this);
-    }
-
-    public void bundleChanged(BundleEvent event) {
-            if (event.getType() == BundleEvent.INSTALLED) {
-                checkInstalledBundle(event.getBundle());
-            } else if (event.getType() == BundleEvent.UNINSTALLED) {
-            	//TODO: uninstall the bundle.
-            }
-    }
-
-    private void checkInstalledBundle(Bundle bundle) {
+    @Override
+    protected void register(Bundle bundle) {
         try {
-            LOGGER.debug("Checking bundle: '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "'");
             URL url = bundle.getResource(JBI_DESCRIPTOR);
-            if (url == null) {
-                LOGGER.debug("Bundle '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "' does not contain any JBI descriptor.");
-                return;
-            }
             Descriptor descriptor = DescriptorFactory.buildDescriptor(url);
             DescriptorFactory.checkDescriptor(descriptor);
             if (descriptor.getComponent() != null) {
                 installComponent(descriptor.getComponent(), bundle);
             } else if (descriptor.getServiceAssembly() != null) {
                 deployServiceAssembly(descriptor.getServiceAssembly(), bundle);
-            } else if (descriptor.getSharedLibrary() != null) {
-                installSharedLibrary(descriptor.getSharedLibrary(), bundle);
             } else {
-                // WARN: unhandled JBI artifact
+                installSharedLibrary(descriptor.getSharedLibrary(), bundle);
             }
         } catch (Exception e) {
             LOGGER.error("Error handling bundle event", e);
         }
     }
 
+    @Override
+    protected void unregister(Bundle bundle) {
+        List<ServiceRegistration> registrations = services.remove(bundle);
+        for (ServiceRegistration reg : registrations) {
+            reg.unregister();
+        }
+    }
+
     protected void installComponent(ComponentDesc componentDesc, Bundle bundle) throws Exception {
         LOGGER.debug("Bundle '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "' is a JBI component");
         // Create component class loader
         ClassLoader classLoader = createComponentClassLoader(componentDesc, bundle);
+        Thread.currentThread().setContextClassLoader(classLoader);
         // Instanciate component
         Class clazz = classLoader.loadClass(componentDesc.getComponentClassName());
-        Component component = (Component) clazz.newInstance();
+        javax.jbi.component.Component innerComponent = (javax.jbi.component.Component) clazz.newInstance();
+        ComponentImpl component = new ComponentImpl(componentDesc, innerComponent);
         // populate props from the component meta-data
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put(NAME, componentDesc.getIdentification().getName());
         props.put(TYPE, componentDesc.getType());
         // register the component in the OSGi registry
         LOGGER.debug("Registering JBI component");
-        bundle.getBundleContext().registerService(Component.class.getName(), component, props);
+        registerService(bundle, Component.class.getName(), component, props);
+        registerService(bundle, javax.jbi.component.Component.class.getName(), component.getComponent(), props);
     }
 
     protected void deployServiceAssembly(ServiceAssemblyDesc serviceAssembyDesc, Bundle bundle) throws Exception {
@@ -164,7 +154,7 @@
             FileUtil.unpackArchive(zipUrl, suRootDir);
             // Find component
             String componentName = sud.getTarget().getComponentName();
-            Component component = getComponent(componentName);
+            javax.jbi.component.Component component = getComponent(componentName);
             // Create service unit object
             ServiceUnitImpl su = new ServiceUnitImpl(sud, suRootDir, component);
             su.deploy();
@@ -179,7 +169,7 @@
         props.put(NAME, serviceAssembyDesc.getIdentification().getName());
         // register the service assembly in the OSGi registry
         LOGGER.debug("Registering JBI service assembly");
-        bundle.getBundleContext().registerService(ServiceAssembly.class.getName(), sa, props);
+        registerService(bundle, ServiceAssembly.class.getName(), sa, props);
     }
 
     protected void installSharedLibrary(SharedLibraryDesc sharedLibraryDesc, Bundle bundle) {
@@ -190,13 +180,25 @@
         // populate props from the library meta-data
         props.put(NAME, sharedLibraryDesc.getIdentification().getName());
         LOGGER.debug("Registering JBI Shared Library");
-        bundle.getBundleContext().registerService(SharedLibrary.class.getName(), sl, props);
+        registerService(bundle, SharedLibrary.class.getName(), sl, props);
+    }
+
+    protected void registerService(Bundle bundle, String clazz, Object service, Dictionary props) {
+        BundleContext context = bundle.getBundleContext() != null ? bundle.getBundleContext() : getBundleContext();
+        ServiceRegistration reg = context.registerService(clazz, service, props);
+        List<ServiceRegistration> registrations = services.get(bundle);
+        if (registrations == null) {
+            registrations = new ArrayList<ServiceRegistration>();
+            services.put(bundle, registrations);
+        }
+        registrations.add(reg);
     }
 
-    protected Component getComponent(String name) {
-        String filter = "(" + NAME + "=" + name + ")"; 
-        ServiceReference reference = OsgiServiceReferenceUtils.getServiceReference(context, Component.class.getName(), filter);
-        return (Component) OsgiServiceUtils.getService(context, reference);
+    protected javax.jbi.component.Component getComponent(String name) {
+        String filter = "(" + NAME + "=" + name + ")";
+        BundleContext context = getBundleContext();
+        ServiceReference reference = OsgiServiceReferenceUtils.getServiceReference(context, javax.jbi.component.Component.class.getName(), filter);
+        return (javax.jbi.component.Component) OsgiServiceUtils.getService(context, reference);
     }
 
     protected ClassLoader createComponentClassLoader(ComponentDesc component, Bundle bundle) {
@@ -233,7 +235,7 @@
     }
 
     protected ClassLoader getSharedLibraryClassLoader(SharedLibraryList sharedLibraryList) {
-        SharedLibrary sl = sharedLibraries.get(sharedLibraryList.getName());
+        SharedLibraryImpl sl = sharedLibraries.get(sharedLibraryList.getName());
         if (sl != null) {
             return sl.createClassLoader();
         } else {

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java Thu Jan  3 09:19:53 2008
@@ -20,13 +20,13 @@
 import java.util.List;
 
 import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.jbi.deployer.ServiceAssembly;
 import org.apache.servicemix.jbi.deployer.ServiceUnit;
 import org.apache.servicemix.jbi.deployer.descriptor.ServiceAssemblyDesc;
-import org.osgi.framework.BundleContext;
 
 /**
  * ServiceAssembly object
@@ -66,11 +66,25 @@
 		return serviceUnits.toArray(new ServiceUnit[serviceUnits.size()]);
 	}
 
-	public void init() throws JBIException {
+    public String getCurrentState() {
+        switch (state) {
+            case Started:
+                return LifeCycleMBean.STARTED;
+            case Stopped:
+                return LifeCycleMBean.STOPPED;
+            case Initialized:
+            case Shutdown:
+                return LifeCycleMBean.SHUTDOWN;
+            default:
+                return LifeCycleMBean.UNKNOWN;
+        }
+    }
+
+    public void init() throws JBIException {
         transition(State.Initialized);
 	}
 
-	public void shutdown() throws JBIException {
+	public void shutDown() throws JBIException {
         transition(State.Shutdown);
 	}
 

Modified: servicemix/smx4/nmr/trunk/jbi/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/pom.xml?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/pom.xml Thu Jan  3 09:19:53 2008
@@ -40,6 +40,7 @@
         <module>deployer</module>
         <module>osgi</module>
         <module>offline</module>
+        <module>commands</module>
         <module>itests</module>
     </modules>
 

Propchange: servicemix/smx4/nmr/trunk/nmr/commands/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Jan  3 09:19:53 2008
@@ -0,0 +1,7 @@
+target
+*.iml
+*.ipr
+*.iws
+.classpath
+.project
+.settings

Added: servicemix/smx4/nmr/trunk/nmr/commands/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/commands/pom.xml?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/commands/pom.xml (added)
+++ servicemix/smx4/nmr/trunk/nmr/commands/pom.xml Thu Jan  3 09:19:53 2008
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.servicemix.nmr</groupId>
+        <artifactId>nmr</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.servicemix.nmr</groupId>
+    <artifactId>org.apache.servicemix.nmr.commands</artifactId>
+    <packaging>bundle</packaging>
+    <name>ServiceMix NMR Commands</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.servicemix.nmr</groupId>
+            <artifactId>org.apache.servicemix.nmr.core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.runtime.gshell</groupId>
+            <artifactId>org.apache.servicemix.runtime.gshell.core</artifactId>
+            <version>${smx.runtime.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${pom.artifactId}</Export-Package>
+                        <DynamicImport-Package>*</DynamicImport-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/NmrCommandSupport.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/NmrCommandSupport.java?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/NmrCommandSupport.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/commands/src/main/java/org/apache/servicemix/nmr/commands/NmrCommandSupport.java Thu Jan  3 09:19:53 2008
@@ -0,0 +1,25 @@
+/*
+ * 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.servicemix.nmr.commands;
+
+import org.apache.geronimo.gshell.support.OsgiCommandSupport;
+
+/**
+ * Base class for NMR related commands
+ */
+public abstract class NmrCommandSupport extends OsgiCommandSupport {
+}

Added: servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/servicemix-nmr-commands.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/servicemix-nmr-commands.xml?rev=608566&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/servicemix-nmr-commands.xml (added)
+++ servicemix/smx4/nmr/trunk/nmr/commands/src/main/resources/META-INF/spring/servicemix-nmr-commands.xml Thu Jan  3 09:19:53 2008
@@ -0,0 +1,33 @@
+<?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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:osgi="http://www.springframework.org/schema/osgi"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+  http://www.springframework.org/schema/beans
+  http://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/util
+  http://www.springframework.org/schema/util/spring-util.xsd
+  http://www.springframework.org/schema/osgi
+  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+
+</beans>                                                                                                                                                                                                   
\ No newline at end of file

Modified: servicemix/smx4/nmr/trunk/nmr/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/pom.xml?rev=608566&r1=608565&r2=608566&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/nmr/pom.xml Thu Jan  3 09:19:53 2008
@@ -38,6 +38,7 @@
         <module>core</module>
         <module>spring</module>
         <module>osgi</module>
+        <module>commands</module>
     </modules>
 
 </project>