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/03/05 18:24:06 UTC

svn commit: r633939 [1/2] - in /servicemix/smx4/nmr/trunk: jbi/ jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ jbi/itests/src/test/java/org/apache/servicemix/jbi/ jbi/management/ jbi/management/src/ jbi/management/src/main/ jbi/man...

Author: gnodet
Date: Wed Mar  5 09:23:59 2008
New Revision: 633939

URL: http://svn.apache.org/viewvc?rev=633939&view=rev
Log:
SMX4NMR-11: Create JMX layer for managing endpoints and JBI artifacts

Added:
    servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/FrameworkUtil.java
    servicemix/smx4/nmr/trunk/jbi/management/   (with props)
    servicemix/smx4/nmr/trunk/jbi/management/pom.xml
    servicemix/smx4/nmr/trunk/jbi/management/src/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/DefaultNamingStrategy.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedComponent.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedJbiRegistry.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedServiceAssembly.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedSharedLibrary.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagementAgent.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/NamingStrategy.java
    servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/
    servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/servicemix-jbi-management.xml
    servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/FrameworkUtil.java
    servicemix/smx4/nmr/trunk/nmr/management/   (with props)
    servicemix/smx4/nmr/trunk/nmr/management/pom.xml
    servicemix/smx4/nmr/trunk/nmr/management/src/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/DefaultNamingStrategy.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagedEndpoint.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementAgent.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/NamingStrategy.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/CountStatistic.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/Statistic.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/stats/TimeStatistic.java
    servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/
    servicemix/smx4/nmr/trunk/nmr/management/src/main/resources/META-INF/spring/servicemix-nmr-management.xml
    servicemix/smx4/nmr/trunk/nmr/management/src/test/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/CountStatisticTest.java
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/StatisticTestSupport.java
    servicemix/smx4/nmr/trunk/nmr/management/src/test/java/org/apache/servicemix/nmr/management/stats/TimeStatisticTest.java
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/apache/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/apache/servicemix/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/apache/servicemix/nmr/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/apache/servicemix/nmr/osgi/
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/java/org/apache/servicemix/nmr/osgi/InternalRegistryWrapper.java
Modified:
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java
    servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java
    servicemix/smx4/nmr/trunk/jbi/osgi/pom.xml
    servicemix/smx4/nmr/trunk/jbi/osgi/src/main/java/org/apache/servicemix/jbi/osgi/RegistryWrapper.java
    servicemix/smx4/nmr/trunk/jbi/pom.xml
    servicemix/smx4/nmr/trunk/jbi/runtime/   (props changed)
    servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentContextImpl.java
    servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentRegistryImpl.java
    servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/EndpointImpl.java
    servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/event/EndpointListener.java
    servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java
    servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java
    servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java
    servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java
    servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java
    servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ServiceRegistryImpl.java
    servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/EndpointRegistryImplTest.java
    servicemix/smx4/nmr/trunk/nmr/osgi/pom.xml
    servicemix/smx4/nmr/trunk/nmr/osgi/src/main/resources/META-INF/spring/servicemix-nmr.xml
    servicemix/smx4/nmr/trunk/nmr/pom.xml

Modified: 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=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java Wed Mar  5 09:23:59 2008
@@ -92,29 +92,48 @@
     }
 
     public void start() throws JBIException {
+        start(true);
+    }
+
+    public void start(boolean saveState) throws JBIException {
         component.getLifeCycle().start();
         state = State.Started;
-        saveState();
+        if (saveState) {
+            saveState();
+        }
     }
 
     public void stop() throws JBIException {
+        stop(true);
+
+    }
+
+    public void stop(boolean saveState) throws JBIException {
         // TODO: stop deployed SAs
         if (state == State.Started) {
             component.getLifeCycle().stop();
             state = State.Stopped;
-            saveState();
+            if (saveState) {
+                saveState();
+            }
         }
     }
 
     public void shutDown() throws JBIException {
+        shutDown(true);
+    }
+
+    public void shutDown(boolean saveState) throws JBIException {
         // TODO: shutdown deployed SAs
         if (state == State.Started) {
-            stop();
+            stop(saveState);
         }
         if (state == State.Stopped) {
             component.getLifeCycle().shutDown();
             state = State.Shutdown;
-            saveState();
+            if (saveState) {
+                saveState();
+            }
         }
     }
 
@@ -139,6 +158,10 @@
             default:
                 return LifeCycleMBean.UNKNOWN;
         }
+    }
+
+    public State getState() {
+        return state;
     }
 
     protected class ComponentWrapper implements javax.jbi.component.Component, ComponentLifeCycle {

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=633939&r1=633938&r2=633939&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 Wed Mar  5 09:23:59 2008
@@ -74,6 +74,8 @@
 
     private Map<String, ServiceAssemblyImpl> serviceAssemblies;
 
+    private Map<String, ComponentImpl> components;
+
     private Map<Bundle, List<ServiceRegistration>> services;
 
     private List<Bundle> pendingBundles;
@@ -87,6 +89,7 @@
     public Deployer() throws JBIException{
         sharedLibraries = new ConcurrentHashMap<String, SharedLibraryImpl>();
         serviceAssemblies = new ConcurrentHashMap<String, ServiceAssemblyImpl>();
+        components = new ConcurrentHashMap<String, ComponentImpl>();
         services = new ConcurrentHashMap<Bundle, List<ServiceRegistration>>();
         pendingBundles = new ArrayList<Bundle>();
         // TODO: control that using properties
@@ -200,6 +203,7 @@
         Class clazz = classLoader.loadClass(componentDesc.getComponentClassName());
         javax.jbi.component.Component innerComponent = (javax.jbi.component.Component) clazz.newInstance();
         ComponentImpl component = new ComponentImpl(componentDesc, innerComponent, prefs, autoStart, this);
+        components.put(name, component);
         // populate props from the component meta-data
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put(NAME, name);
@@ -315,11 +319,21 @@
 
     protected void uninstallComponent(ComponentDesc componentDesc, Bundle bundle) throws Exception {
         String name = componentDesc.getIdentification().getName();
-        File file = new File(System.getProperty("servicemix.base"), "data/jbi/" + name);
-        FileUtil.deleteFile(file);
+        ComponentImpl component = components.remove(name);
+        if (component != null) {
+            if (component.getState() == ComponentImpl.State.Started) {
+                component.stop(false);
+            }
+            if (component.getState() == ComponentImpl.State.Stopped) {
+                component.shutDown(false);
+            }
+            File file = new File(System.getProperty("servicemix.base"), "data/jbi/" + name);
+            FileUtil.deleteFile(file);
+        }
     }
     protected void undeployServiceAssembly(ServiceAssemblyDesc serviceAssembyDesc, Bundle bundle) throws Exception {
-        ServiceAssemblyImpl sa = serviceAssemblies.remove(serviceAssembyDesc.getIdentification().getName());
+        String name = serviceAssembyDesc.getIdentification().getName();
+        ServiceAssemblyImpl sa = serviceAssemblies.remove(name);
         if (sa != null) {
             if (sa.getState() == ServiceAssemblyImpl.State.Started) {
                 sa.stop(false);

Added: servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/FrameworkUtil.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/FrameworkUtil.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/FrameworkUtil.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/FrameworkUtil.java Wed Mar  5 09:23:59 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;
+
+import org.apache.felix.framework.FilterImpl;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ */
+public class FrameworkUtil {
+
+    public static Filter createFilter(String f) throws InvalidSyntaxException {
+        return new FilterImpl(f);
+    }
+
+}

Modified: servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java Wed Mar  5 09:23:59 2008
@@ -36,6 +36,7 @@
         System.setProperty("org.apache.servicemix.filemonitor.generatedJarDir", new File(f, "data/generate-bundles").getAbsolutePath());
         System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
         System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
+        System.setProperty("org.osgi.vendor.framework", "org.apache.servicemix.jbi");
     }
 
     private Properties dependencies;

Propchange: servicemix/smx4/nmr/trunk/jbi/management/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Mar  5 09:23:59 2008
@@ -0,0 +1,7 @@
+target
+*.iml
+*.ipr
+*.iws
+.classpath
+.project
+.settings

Added: servicemix/smx4/nmr/trunk/jbi/management/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/pom.xml?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/pom.xml (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/pom.xml Wed Mar  5 09:23:59 2008
@@ -0,0 +1,71 @@
+<?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.management</artifactId>
+    <packaging>bundle</packaging>
+    <name>ServiceMix JBI Management</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.servicemix.jbi</groupId>
+            <artifactId>org.apache.servicemix.jbi.runtime</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.jbi</groupId>
+            <artifactId>org.apache.servicemix.jbi.deployer</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>${felix.osgi.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>
+                        <Import-Package>*</Import-Package>
+                        <Export-Package>${pom.artifactId}*;version=${pom.version}</Export-Package>
+                        <Spring-Context>*;publish-context:=false;create-asynchronously:=true</Spring-Context>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/DefaultNamingStrategy.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/DefaultNamingStrategy.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/DefaultNamingStrategy.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/DefaultNamingStrategy.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,70 @@
+/*
+ * 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.management;
+
+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
+
+/**
+ */
+public class DefaultNamingStrategy implements NamingStrategy {
+
+    private String jmxDomainName;
+
+    public String getJmxDomainName() {
+        return jmxDomainName;
+    }
+
+    public void setJmxDomainName(String jmxDomainName) {
+        this.jmxDomainName = jmxDomainName;
+    }
+
+    public ObjectName getObjectName(ManagedSharedLibrary sharedLibrary) throws MalformedObjectNameException {
+        return new ObjectName(jmxDomainName + ":" +
+                                    "Type=SharedLibrary," +
+                                    "Name=" + sanitize(sharedLibrary.getName()) + "," +
+                                    "Version=" + sanitize(sharedLibrary.getVersion()));
+    }
+
+    public ObjectName getObjectName(ManagedComponent component) throws MalformedObjectNameException {
+        return new ObjectName(jmxDomainName + ":" +
+                                    "Type=Component," +
+                                    "Name=" + sanitize(component.getName()) + "," +
+                                    "SubType=LifeCycle");
+    }
+
+    public ObjectName getObjectName(ManagedServiceAssembly serviceAssembly) throws MalformedObjectNameException {
+        return new ObjectName(jmxDomainName + ":" +
+                                    "Type=ServiceAssembly," +
+                                    "Name=" + sanitize(serviceAssembly.getName()));
+    }
+
+    private String sanitize(String in) {
+        String result = null;
+        if (in != null) {
+            result = in.replace(':', '_');
+            result = result.replace('/', '_');
+            result = result.replace('\\', '_');
+            result = result.replace('?', '_');
+            result = result.replace('=', '_');
+            result = result.replace(',', '_');
+        }
+        return result;
+    }
+
+}
+

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedComponent.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedComponent.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedComponent.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedComponent.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,71 @@
+/*
+ * 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.management;
+
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.ComponentLifeCycleMBean;
+import javax.management.ObjectName;
+
+import org.apache.servicemix.jbi.deployer.Component;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+/**
+ */
+@ManagedResource(description = "Managed Component", currencyTimeLimit = 15)
+public class ManagedComponent implements ComponentLifeCycleMBean {
+
+    private final Component component;
+    private final Map<String, ?> properties;
+
+    public ManagedComponent(Component component, Map<String, ?> properties) {
+        this.component = component;
+        this.properties = properties;
+    }
+
+    public String getName() {
+        return component.getName();
+    }
+
+    @ManagedAttribute
+    public ObjectName getExtensionMBeanName() throws JBIException {
+        return component.getExtensionMBeanName();
+    }
+
+    @ManagedOperation
+    public void start() throws JBIException {
+        component.start();
+    }
+
+    @ManagedOperation
+    public void stop() throws JBIException {
+        component.stop();
+    }
+
+    @ManagedOperation
+    public void shutDown() throws JBIException {
+        component.shutDown();
+    }
+
+    @ManagedAttribute
+    public String getCurrentState() {
+        return component.getCurrentState();
+    }
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedJbiRegistry.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedJbiRegistry.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedJbiRegistry.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedJbiRegistry.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,136 @@
+/*
+ * 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.management;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+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.springframework.beans.factory.InitializingBean;
+
+/**
+ */
+public class ManagedJbiRegistry implements InitializingBean {
+
+    private static final transient Log LOG = LogFactory.getLog(ManagedJbiRegistry.class);
+
+    private NamingStrategy namingStrategy;
+    private ManagementAgent managementAgent;
+    private Map<String, ManagedSharedLibrary> sharedLibraries;
+    private Map<String, ManagedComponent> components;
+    private Map<String, ManagedServiceAssembly> serviceAssemblies;
+
+    public ManagedJbiRegistry() {
+        this.sharedLibraries = new ConcurrentHashMap<String, ManagedSharedLibrary>();
+        this.components = new ConcurrentHashMap<String, ManagedComponent>();
+        this.serviceAssemblies = new ConcurrentHashMap<String, ManagedServiceAssembly>();
+    }
+
+    public NamingStrategy getNamingStrategy() {
+        return namingStrategy;
+    }
+
+    public void setNamingStrategy(NamingStrategy namingStrategy) {
+        this.namingStrategy = namingStrategy;
+    }
+
+    public ManagementAgent getManagementAgent() {
+        return managementAgent;
+    }
+
+    public void setManagementAgent(ManagementAgent managementAgent) {
+        this.managementAgent = managementAgent;
+    }
+
+    public void registerSharedLibrary(SharedLibrary sharedLibrary, Map<String, ?> properties) {
+        try {
+            LOG.info("Registering SharedLibrary: " + sharedLibrary + " with properties " + properties);
+            ManagedSharedLibrary sl = new ManagedSharedLibrary(sharedLibrary, properties);
+            sharedLibraries.put(sharedLibrary.getName() + "-" + sharedLibrary.getVersion(), sl);
+            managementAgent.register(sl, namingStrategy.getObjectName(sl));
+        } catch (Exception e) {
+            LOG.warn("Unable to register managed SharedLibrary: " + e, e);
+        }
+    }
+
+    public void unregisterSharedLibrary(SharedLibrary sharedLibrary, Map<String, ?> properties) {
+        try {
+            LOG.info("Unregistering SharedLibrary: " + sharedLibrary + " with properties " + properties);
+            ManagedSharedLibrary sl = sharedLibraries.remove(sharedLibrary.getName() + "-" + sharedLibrary.getVersion());
+            managementAgent.unregister(namingStrategy.getObjectName(sl));
+        } catch (Exception e) {
+            LOG.warn("Unable to unregister managed SharedLibrary: " + e, e);
+        }
+    }
+
+    public void registerComponent(Component component, Map<String, ?> properties) {
+        try {
+            LOG.info("Registering Component: " + component + " with properties " + properties);
+            ManagedComponent comp = new ManagedComponent(component, properties);
+            components.put(component.getName(), comp);
+            managementAgent.register(comp, namingStrategy.getObjectName(comp));
+        } catch (Exception e) {
+            LOG.warn("Unable to register managed Component: " + e, e);
+        }
+    }
+
+    public void unregisterComponent(Component component, Map<String, ?> properties) {
+        try {
+            LOG.info("Unregistering Component: " + component + " with properties " + properties);
+            ManagedComponent comp = components.remove(component.getName());
+            managementAgent.unregister(namingStrategy.getObjectName(comp));
+        } catch (Exception e) {
+            LOG.warn("Unable to unregister managed Component: " + e, e);
+        }
+    }
+
+    public void registerServiceAssembly(ServiceAssembly serviceAssembly, Map<String, ?> properties) {
+        try {
+            LOG.info("Registering ServiceAssembly: " + serviceAssembly + " with properties " + properties);
+            ManagedServiceAssembly sa = new ManagedServiceAssembly(serviceAssembly, properties);
+            serviceAssemblies.put(serviceAssembly.getName(), sa);
+            managementAgent.register(sa, namingStrategy.getObjectName(sa));
+        } catch (Exception e) {
+            LOG.warn("Unable to register ServiceAssembly: " + e, e);
+        }
+    }
+
+    public void unregisterServiceAssembly(ServiceAssembly serviceAssembly, Map<String, ?> properties) {
+        try {
+            LOG.info("Unregistering ServiceAssembly: " + serviceAssembly + " with properties " + properties);
+            ManagedServiceAssembly sa = serviceAssemblies.remove(serviceAssembly.getName());
+            managementAgent.unregister(namingStrategy.getObjectName(sa));
+        } catch (Exception e) {
+            LOG.warn("Unable to unregister managed ServiceAssembly: " + e, e);
+        }
+    }
+
+    public void afterPropertiesSet() throws Exception {
+        if (managementAgent == null) {
+            throw new IllegalArgumentException("managementAgent must not be null");
+        }
+        if (namingStrategy == null) {
+            throw new IllegalArgumentException("namingStrategy must not be null");
+        }
+
+    }
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedServiceAssembly.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedServiceAssembly.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedServiceAssembly.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedServiceAssembly.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,65 @@
+/*
+ * 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.management;
+
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.LifeCycleMBean;
+
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+/**
+ */
+@ManagedResource(description = "Managed ServiceAssembly", currencyTimeLimit = 15)
+public class ManagedServiceAssembly implements LifeCycleMBean {
+
+    private final ServiceAssembly serviceAssembly;
+    private final Map<String, ?> properties;
+
+    public ManagedServiceAssembly(ServiceAssembly serviceAssembly, Map<String, ?> properties) {
+        this.serviceAssembly = serviceAssembly;
+        this.properties = properties;
+    }
+
+    public String getName() {
+        return serviceAssembly.getName();
+    }
+
+    @ManagedOperation
+    public void start() throws JBIException {
+        serviceAssembly.start();
+    }
+
+    @ManagedOperation
+    public void stop() throws JBIException {
+        serviceAssembly.stop();
+    }
+
+    @ManagedOperation
+    public void shutDown() throws JBIException {
+        serviceAssembly.shutDown();
+    }
+
+    @ManagedAttribute
+    public String getCurrentState() {
+        return serviceAssembly.getCurrentState();
+    }
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedSharedLibrary.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedSharedLibrary.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedSharedLibrary.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagedSharedLibrary.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,48 @@
+/*
+ * 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.management;
+
+import java.util.Map;
+
+import org.apache.servicemix.jbi.deployer.SharedLibrary;
+import org.springframework.jmx.export.annotation.ManagedResource;
+
+/**
+ */
+@ManagedResource(description = "Managed SharedLibrary", currencyTimeLimit = 15)
+public class ManagedSharedLibrary {
+
+    private final SharedLibrary sharedLibrary;
+    private final Map<String, ?> properties;
+
+    public ManagedSharedLibrary(SharedLibrary sharedLibrary, Map<String, ?> properties) {
+        this.sharedLibrary = sharedLibrary;
+        this.properties = properties;
+    }
+
+    public String getId() {
+        return sharedLibrary.getName() + "-" + sharedLibrary.getVersion();
+    }
+
+    public String getName() {
+        return sharedLibrary.getName();
+    }
+
+    public String getVersion() {
+        return sharedLibrary.getVersion();
+    }
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagementAgent.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagementAgent.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagementAgent.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/ManagementAgent.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,126 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+import java.util.HashSet;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.management.JMException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.modelmbean.ModelMBeanInfo;
+import javax.management.modelmbean.RequiredModelMBean;
+import javax.management.modelmbean.InvalidTargetObjectTypeException;
+
+import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
+import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
+import org.springframework.beans.factory.DisposableBean;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ */
+public class ManagementAgent implements DisposableBean {
+
+    private static final transient Log LOG = LogFactory.getLog(ManagementAgent.class);
+
+    private MBeanServer mbeanServer;
+    private MetadataMBeanInfoAssembler assembler;
+    private Set<ObjectName> mbeans = new HashSet<ObjectName>();
+
+    public ManagementAgent() {
+        assembler = new MetadataMBeanInfoAssembler();
+        assembler.setAttributeSource(new AnnotationJmxAttributeSource());
+    }
+
+    public MBeanServer getMbeanServer() {
+        return mbeanServer;
+    }
+
+    public void setMbeanServer(MBeanServer mbeanServer) {
+        this.mbeanServer = mbeanServer;
+    }
+
+    public void destroy() throws Exception {
+        // Using the array to hold the busMBeans to avoid the
+        // CurrentModificationException
+        Object[] mBeans = mbeans.toArray();
+        int caught = 0;
+        for (Object name : mBeans) {
+            mbeans.remove((ObjectName)name);
+            try {
+                unregister((ObjectName)name);
+            } catch (JMException jmex) {
+                LOG.info("Exception unregistering MBean", jmex);
+                caught++;
+            }
+        }
+        if (caught > 0) {
+            LOG.warn("A number of " + caught
+                     + " exceptions caught while unregistering MBeans during stop operation.  "
+                     + "See INFO log for details.");
+        }
+    }
+
+    public void register(Object obj, ObjectName name) throws JMException {
+        register(obj, name, false);
+    }
+
+    public void register(Object obj, ObjectName name, boolean forceRegistration) throws JMException {
+        try {
+            registerMBeanWithServer(obj, name, forceRegistration);
+        } catch (NotCompliantMBeanException e) {
+            // If this is not a "normal" MBean, then try to deploy it using JMX
+            // annotations
+            ModelMBeanInfo mbi = assembler.getMBeanInfo(obj, name.toString());
+            RequiredModelMBean mbean = (RequiredModelMBean) mbeanServer.instantiate(RequiredModelMBean.class.getName());
+            mbean.setModelMBeanInfo(mbi);
+            try {
+                mbean.setManagedResource(obj, "ObjectReference");
+            } catch (InvalidTargetObjectTypeException itotex) {
+                throw new JMException(itotex.getMessage());
+            }
+            registerMBeanWithServer(mbean, name, forceRegistration);
+        }
+    }
+
+    public void unregister(ObjectName name) throws JMException {
+        mbeanServer.unregisterMBean(name);
+    }
+
+    private void registerMBeanWithServer(Object obj, ObjectName name, boolean forceRegistration) throws JMException {
+        ObjectInstance instance = null;
+        try {
+            instance = mbeanServer.registerMBean(obj, name);
+        } catch (InstanceAlreadyExistsException e) {
+            if (forceRegistration) {
+                mbeanServer.unregisterMBean(name);
+                instance = mbeanServer.registerMBean(obj, name);
+            } else {
+                throw e;
+            }
+        }
+
+        if (instance != null) {
+            mbeans.add(name);
+        }
+    }
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/NamingStrategy.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/NamingStrategy.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/NamingStrategy.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/java/org/apache/servicemix/jbi/management/NamingStrategy.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,32 @@
+/*
+ * 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.management;
+
+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
+
+/**
+ */
+public interface NamingStrategy {
+
+    ObjectName getObjectName(ManagedSharedLibrary sharedLibrary) throws MalformedObjectNameException;
+
+    ObjectName getObjectName(ManagedComponent component) throws MalformedObjectNameException;
+
+    ObjectName getObjectName(ManagedServiceAssembly serviceAssembly) throws MalformedObjectNameException;
+
+}

Added: servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/servicemix-jbi-management.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/servicemix-jbi-management.xml?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/servicemix-jbi-management.xml (added)
+++ servicemix/smx4/nmr/trunk/jbi/management/src/main/resources/META-INF/spring/servicemix-jbi-management.xml Wed Mar  5 09:23:59 2008
@@ -0,0 +1,72 @@
+<?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">
+
+    <!-- MBeanServer -->
+    <osgi:reference id="mbeanServer"
+                    interface="javax.management.MBeanServer"
+                    cardinality="1..1" />
+
+    <!-- Registries -->
+    <bean id="managedJbiRegistry" class="org.apache.servicemix.jbi.management.ManagedJbiRegistry">
+        <property name="namingStrategy" ref="namingStrategy" />
+        <property name="managementAgent" ref="managementAgent" />
+    </bean>
+
+    <bean id="namingStrategy" class="org.apache.servicemix.jbi.management.DefaultNamingStrategy">
+        <property name="jmxDomainName" value="org.apache.servicemix" />
+    </bean>
+
+    <bean id="managementAgent" class="org.apache.servicemix.jbi.management.ManagementAgent">
+        <property name="mbeanServer" ref="mbeanServer" />
+    </bean>
+
+    <!-- Shared Libraries -->
+    <osgi:list id="sharedLibraries"
+               interface="org.apache.servicemix.jbi.deployer.SharedLibrary"
+               cardinality="0..N">
+        <osgi:listener ref="managedJbiRegistry" bind-method="registerSharedLibrary" unbind-method="unregisterSharedLibrary" />
+    </osgi:list>
+
+    <!-- Components -->
+    <osgi:list id="components"
+               interface="org.apache.servicemix.jbi.deployer.Component"
+               cardinality="0..N">
+        <osgi:listener ref="managedJbiRegistry" bind-method="registerComponent" unbind-method="unregisterComponent" />
+    </osgi:list>
+
+    <!-- Service Assemblies -->
+    <osgi:list id="serviceAssemblies"
+               interface="org.apache.servicemix.jbi.deployer.ServiceAssembly"
+               cardinality="0..N">
+        <osgi:listener ref="managedJbiRegistry" bind-method="registerServiceAssembly" unbind-method="unregisterServiceAssembly" />
+    </osgi:list>
+
+</beans>

Modified: servicemix/smx4/nmr/trunk/jbi/osgi/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/osgi/pom.xml?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/osgi/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/osgi/pom.xml Wed Mar  5 09:23:59 2008
@@ -36,6 +36,11 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.servicemix.jbi</groupId>
+            <artifactId>org.apache.servicemix.jbi.api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.jbi</groupId>
             <artifactId>org.apache.servicemix.jbi.runtime</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -59,7 +64,18 @@
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>*</Import-Package>
+                        <Import-Package>
+                            javax.jbi.component,
+                            javax.management,
+                            javax.naming,
+                            javax.transaction,
+                            org.apache.servicemix.nmr.api,
+                            org.apache.servicemix.jbi.runtime,
+                            org.apache.servicemix.jbi.runtime.impl,
+                            org.apache.servicemix.jbi.osgi,
+                            org.osgi.service.url,
+                            *
+                        </Import-Package>
                         <Spring-Context>*;publish-context:=false;create-asynchronously:=true</Spring-Context>
                     </instructions>
                 </configuration>

Modified: servicemix/smx4/nmr/trunk/jbi/osgi/src/main/java/org/apache/servicemix/jbi/osgi/RegistryWrapper.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/osgi/src/main/java/org/apache/servicemix/jbi/osgi/RegistryWrapper.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/osgi/src/main/java/org/apache/servicemix/jbi/osgi/RegistryWrapper.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/osgi/src/main/java/org/apache/servicemix/jbi/osgi/RegistryWrapper.java Wed Mar  5 09:23:59 2008
@@ -40,6 +40,7 @@
  *
  */
 public class RegistryWrapper implements EndpointRegistry {
+
     private EndpointRegistry registry;
     private BundleContext bundleContext;
     private Map<Endpoint, ServiceRegistration> registrations = new ConcurrentHashMap();

Modified: servicemix/smx4/nmr/trunk/jbi/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/pom.xml?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/pom.xml Wed Mar  5 09:23:59 2008
@@ -39,6 +39,7 @@
         <module>runtime</module>
         <module>deployer</module>
         <module>osgi</module>
+        <module>management</module>
         <module>commands</module>
         <module>itests</module>
     </modules>

Propchange: servicemix/smx4/nmr/trunk/jbi/runtime/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Mar  5 09:23:59 2008
@@ -5,3 +5,4 @@
 .classpath
 .project
 .settings
+data

Modified: servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentContextImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentContextImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentContextImpl.java Wed Mar  5 09:23:59 2008
@@ -435,7 +435,10 @@
         return null;
     }
 
-    
+    public Component getComponent() {
+        return component;
+    }
+
 
     protected static class SimpleServiceEndpoint implements ServiceEndpoint {
 

Modified: servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentRegistryImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentRegistryImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentRegistryImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/ComponentRegistryImpl.java Wed Mar  5 09:23:59 2008
@@ -29,9 +29,7 @@
 import org.apache.servicemix.jbi.runtime.ComponentRegistry;
 import org.apache.servicemix.jbi.runtime.DocumentRepository;
 import org.apache.servicemix.jbi.runtime.Environment;
-import org.apache.servicemix.jbi.runtime.impl.ManagementContext;
 import org.apache.servicemix.nmr.api.NMR;
-import org.apache.servicemix.nmr.api.ServiceMixException;
 import org.apache.servicemix.nmr.core.ServiceRegistryImpl;
 
 /**
@@ -43,12 +41,12 @@
 
     private NMR nmr;
     private DocumentRepository documentRepository;
-    private Map<String, Component> components;
+    private Map<String, ComponentContextImpl> contexts;
     private Environment environment;
     private ManagementContext managementContext;
 
     public ComponentRegistryImpl() {
-        components = new ConcurrentHashMap<String, Component>();
+        contexts = new ConcurrentHashMap<String, ComponentContextImpl>();
     }
 
     public NMR getNmr() {
@@ -89,27 +87,20 @@
      * @param component the component to register
      * @param properties the associated metadata
      */
-    public void register(Component component, Map<String, ?> properties) {
+    @Override
+    protected void doRegister(Component component, Map<String, ?> properties) throws JBIException {
+        LOGGER.info("JBI component registered with properties: " + properties);
         ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(component.getClass().getClassLoader());
         try {
-            Thread.currentThread().setContextClassLoader(component.getClass().getClassLoader());
-            if (components.containsValue(component)) {
-                // Component is already registered
-                return;
-            }
-            if (properties == null) {
-                properties = new HashMap<String, Object>();
-            }
             String name = (String) properties.get(NAME);
-            ComponentContext context = new ComponentContextImpl(this, environment, managementContext, component, properties);
+            ComponentContextImpl context = new ComponentContextImpl(this, environment, managementContext, component, properties);
             component.getLifeCycle().init(context);
             if (name != null) {
-                components.put(name, component);
+                contexts.put(name, context);
             } else {
                 LOGGER.warn("Component has no name!");
             }
-        } catch (JBIException e) {
-            throw new ServiceMixException(e);
         } finally {
             Thread.currentThread().setContextClassLoader(cl);
         }
@@ -120,15 +111,18 @@
      *
      * @param component the component to unregister
      */
-    public void unregister(Component component, Map<String, ?> properties) {
+    @Override
+    protected void doUnregister(Component component, Map<String, ?> properties)throws JBIException {
+        LOGGER.info("JBI component unregistered with properties: " + properties);
         String name = properties != null ? (String) properties.get(NAME) : null;
         if (name != null) {
-            components.remove(name);
+            ComponentContextImpl context = contexts.remove(name);
+            context.getDeliveryChannel().close();
         }
     }
 
     public Component getComponent(String name) {
-        return components.get(name);
+        return contexts.get(name).getComponent();
     }
 
 }

Modified: servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/EndpointImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/EndpointImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/EndpointImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/runtime/src/main/java/org/apache/servicemix/jbi/runtime/impl/EndpointImpl.java Wed Mar  5 09:23:59 2008
@@ -26,11 +26,6 @@
 import java.util.Queue;
 
 /**
- * Created by IntelliJ IDEA.
- * User: gnodet
- * Date: Oct 5, 2007
- * Time: 11:08:00 AM
- * To change this template use File | Settings | File Templates.
  */
 public class EndpointImpl implements Endpoint, ServiceEndpoint {
 
@@ -50,11 +45,13 @@
     }
 
     public DocumentFragment getAsReference(QName operationName) {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        // TODO
+        return null;
     }
 
     public QName[] getInterfaces() {
-        return new QName[0];  //To change body of implemented methods use File | Settings | File Templates.
+        // TODO
+        return new QName[0];
     }
 
     public Channel getChannel() {
@@ -87,5 +84,13 @@
 
     public void setEndpointName(String endpointName) {
         this.endpointName = endpointName;
+    }
+
+    public boolean equals(Object o) {
+        return this == o;
+    }
+
+    public int hashCode() {
+        return super.hashCode();
     }
 }

Modified: servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/event/EndpointListener.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/event/EndpointListener.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/event/EndpointListener.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/event/EndpointListener.java Wed Mar  5 09:23:59 2008
@@ -17,6 +17,7 @@
 package org.apache.servicemix.nmr.api.event;
 
 import org.apache.servicemix.nmr.api.Endpoint;
+import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
 
 
 /**
@@ -31,13 +32,13 @@
      *
      * @param endpoint the registered endpoint
      */
-    void endpointRegistered(Endpoint endpoint);
+    void endpointRegistered(InternalEndpoint endpoint);
 
     /**
      * An endpoint has been unregistered
      *
      * @param endpoint the unregistered endpoint
      */
-    void endpointUnregistered(Endpoint endpoint);
+    void endpointUnregistered(InternalEndpoint endpoint);
     
 }

Modified: servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java Wed Mar  5 09:23:59 2008
@@ -19,17 +19,35 @@
 import org.apache.servicemix.nmr.api.Endpoint;
 
 /**
+ * This interface represents a wrapper around an Endpoint
+ * which is to be used internally to access the Channel.
+ *
  * @version $Revision: $
  * @since 4.0
  */
 public interface InternalEndpoint extends Endpoint {
 
     /**
+     * Retrieve the endpoint id
+     *
+     * @return the id of the endpoint
+     */
+    String getId();
+
+    /**
      * Retrieve the channel associated with this endpoint.
      * This method is usually used by {@link Flow}s to deliver
      * exchanges to this endpoint.
-     * @return
+     *
+     * @return the channel for this endpoint
      */
     InternalChannel getChannel();
+
+    /**
+     * Retrieve the inner endpoint.
+     *
+     * @return the inner endpoint
+     */
+    Endpoint getEndpoint();
 
 }

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ChannelImpl.java Wed Mar  5 09:23:59 2008
@@ -153,7 +153,8 @@
      * the NMR.
      */
     public void close() {
-        // TODO
+        Map<String,?> props = nmr.getEndpointRegistry().getProperties(endpoint);
+        nmr.getEndpointRegistry().unregister(endpoint, props);
     }
 
     /**
@@ -191,12 +192,12 @@
         if (exchange.getDestination() == null) {
             exchange.setDestination(endpoint);
         }
+        // Change role
+        exchange.setRole(exchange.getRole() == Role.Provider ? Role.Consumer : Role.Provider);
         // Call listeners
         for (ExchangeListener l : nmr.getListenerRegistry().getListeners(ExchangeListener.class)) {
             l.exchangeDelivered(exchange);
         }
-        // Change role
-        exchange.setRole(exchange.getRole() == Role.Provider ? Role.Consumer : Role.Provider);
         // Check if sendSync was used, in which case we need to unblock the other side
         // rather than delivering the exchange
         // TODO:

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java Wed Mar  5 09:23:59 2008
@@ -16,9 +16,11 @@
  */
 package org.apache.servicemix.nmr.core;
 
+import java.util.UUID;
 import java.util.concurrent.Executors;
 
 import org.apache.servicemix.nmr.api.Channel;
+import org.apache.servicemix.nmr.api.Endpoint;
 import org.apache.servicemix.nmr.api.Exchange;
 import org.apache.servicemix.nmr.api.NMR;
 import org.apache.servicemix.nmr.api.internal.InternalChannel;
@@ -38,6 +40,15 @@
     protected static class ClientEndpoint implements InternalEndpoint {
 
         private InternalChannel channel;
+        private String id = UUID.randomUUID().toString(); 
+
+        public String getId() {
+            return id;
+        }
+
+        public Endpoint getEndpoint() {
+            return this;
+        }
 
         public void setChannel(Channel channel) {
             this.channel = (InternalChannel) channel;

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java Wed Mar  5 09:23:59 2008
@@ -22,6 +22,7 @@
 import java.util.Set;
 import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
@@ -48,10 +49,10 @@
 public class EndpointRegistryImpl implements EndpointRegistry {
 
     private NMR nmr;
-    private Map<Endpoint, InternalEndpoint> endpoints = new ConcurrentHashMap<Endpoint, InternalEndpoint>();
+    private ConcurrentMap<Endpoint, InternalEndpoint> endpoints = new ConcurrentHashMap<Endpoint, InternalEndpoint>();
     private Map<InternalEndpoint, Endpoint> wrappers = new ConcurrentHashMap<InternalEndpoint, Endpoint>();
-    private ServiceRegistry<InternalEndpoint> registry = new ServiceRegistryImpl<InternalEndpoint>();
     private Map<DynamicReferenceImpl, Boolean> references = new WeakHashMap<DynamicReferenceImpl, Boolean>();
+    private ServiceRegistry<InternalEndpoint> registry;
 
     public EndpointRegistryImpl() {
     }
@@ -68,10 +69,21 @@
         this.nmr = nmr;
     }
 
+    public ServiceRegistry<InternalEndpoint> getRegistry() {
+        return registry;
+    }
+
+    public void setRegistry(ServiceRegistry<InternalEndpoint> registry) {
+        this.registry = registry;
+    }
+
     public void init() {
         if (nmr == null) {
             throw new NullPointerException("nmr must be not null");
         }
+        if (registry == null) {
+            registry = new ServiceRegistryImpl<InternalEndpoint>();
+        }
     }
 
     /**
@@ -85,18 +97,19 @@
      * @see org.apache.servicemix.nmr.api.Endpoint
      */
     public void register(Endpoint endpoint, Map<String, ?> properties) {
-        Executor executor = Executors.newCachedThreadPool();
         InternalEndpointWrapper wrapper = new InternalEndpointWrapper(endpoint);
-        ChannelImpl channel = new ChannelImpl(wrapper, executor, nmr);
-        wrapper.setChannel(channel);
-        endpoints.put(endpoint, wrapper);
-        wrappers.put(wrapper, endpoint);
-        registry.register(wrapper, properties);
-        for (EndpointListener listener : nmr.getListenerRegistry().getListeners(EndpointListener.class)) {
-            listener.endpointRegistered(endpoint);
-        }
-        for (DynamicReferenceImpl ref : references.keySet()) {
-            ref.setDirty();
+        if (endpoints.putIfAbsent(endpoint, wrapper) == null) {
+            Executor executor = Executors.newCachedThreadPool();
+            ChannelImpl channel = new ChannelImpl(wrapper, executor, nmr);
+            wrapper.setChannel(channel);
+            wrappers.put(wrapper, endpoint);
+            registry.register(wrapper, properties);
+            for (EndpointListener listener : nmr.getListenerRegistry().getListeners(EndpointListener.class)) {
+                listener.endpointRegistered(wrapper);
+            }
+            for (DynamicReferenceImpl ref : references.keySet()) {
+                ref.setDirty();
+            }
         }
     }
 
@@ -118,7 +131,7 @@
         }
         registry.unregister(wrapper, properties);
         for (EndpointListener listener : nmr.getListenerRegistry().getListeners(EndpointListener.class)) {
-            listener.endpointUnregistered(endpoint);
+            listener.endpointUnregistered(wrapper);
         }
         for (DynamicReferenceImpl ref : references.keySet()) {
             ref.setDirty();

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java Wed Mar  5 09:23:59 2008
@@ -16,6 +16,8 @@
  */
 package org.apache.servicemix.nmr.core;
 
+import java.util.UUID;
+
 import org.apache.servicemix.nmr.api.Channel;
 import org.apache.servicemix.nmr.api.Endpoint;
 import org.apache.servicemix.nmr.api.Exchange;
@@ -28,10 +30,12 @@
 public class InternalEndpointWrapper implements InternalEndpoint {
 
     private final Endpoint endpoint;
+    private final String id;
     private InternalChannel channel;
 
     public InternalEndpointWrapper(Endpoint endpoint) {
         this.endpoint = endpoint;
+        this.id = UUID.randomUUID().toString();
     }
 
     public InternalChannel getChannel() {
@@ -42,6 +46,10 @@
         return endpoint;
     }
 
+    public String getId() {
+        return id;
+    }
+
     /**
      * Set the channel so that the endpoint can send exchanges back
      * when they are processed or act as a consumer itself.
@@ -70,4 +78,15 @@
         endpoint.process(exchange);
     }
 
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof InternalEndpointWrapper)) return false;
+        InternalEndpointWrapper that = (InternalEndpointWrapper) o;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+        return true;
+    }
+
+    public int hashCode() {
+        return (id != null ? id.hashCode() : 0);
+    }
 }

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ServiceRegistryImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ServiceRegistryImpl.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ServiceRegistryImpl.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ServiceRegistryImpl.java Wed Mar  5 09:23:59 2008
@@ -16,10 +16,15 @@
  */
 package org.apache.servicemix.nmr.core;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.nmr.api.ServiceMixException;
 import org.apache.servicemix.nmr.api.service.ServiceRegistry;
 
 /**
@@ -28,16 +33,62 @@
  */
 public class ServiceRegistryImpl<T> implements ServiceRegistry<T> {
 
-    private Map<T, Map<String, ?>> registry = new ConcurrentHashMap<T, Map<String, ?>>();
+    private ConcurrentMap<T, Map<String, ?>> registry = new ConcurrentHashMap<T, Map<String, ?>>();
+
+    private final Log logger = LogFactory.getLog(getClass());
 
     public void register(T service, Map<String, ?> properties) {
         assert service != null : "service should not be null";
-        registry.put(service, properties);
+        if (properties == null) {
+            properties = new HashMap<String, Object>();
+        }
+        if (registry.putIfAbsent(service, properties) == null) {
+            try {
+                doRegister(service, properties);
+            } catch (Exception e) {
+                logger.warn("Unable to register service " +
+                        service + " with properties " + properties + ". Reason: " + e, e);
+                registry.remove(service);
+                throw new ServiceMixException("Unable to register service " +
+                        service + " with properties " + properties + ". Reason: " + e, e);
+            }
+        }
+    }
+
+    /**
+     * Placeholder to perform any registry specific operation
+     * when a new service is registered.
+     *
+     * @param service
+     * @param properties
+     * @throws Exception
+     */
+    protected void doRegister(T service, Map<String, ?> properties) throws Exception {
     }
 
     public void unregister(T service, Map<String, ?> properties) {
         assert service != null : "service should not be null";
-        registry.remove(service);
+        if (registry.remove(service) != null) {
+            try {
+                doUnregister(service, properties);
+            } catch (Exception e) {
+                logger.warn("Unable to unregister service " +
+                        service + " with properties " + properties + ". Reason: " + e, e);
+                throw new ServiceMixException("Unable to unregister service " + 
+                        service + " with properties " + properties + ". Reason: " + e, e);
+            }
+        }
+    }
+
+    /**
+     * Placeholder to perform any registry specific operation
+     * when a service is unregistered.
+     *
+     * @param service
+     * @param properties
+     * @throws Exception
+     */
+    protected void doUnregister(T service, Map<String, ?> properties) throws Exception {
     }
 
     public Set<T> getServices() {

Modified: servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/EndpointRegistryImplTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/EndpointRegistryImplTest.java?rev=633939&r1=633938&r2=633939&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/EndpointRegistryImplTest.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/EndpointRegistryImplTest.java Wed Mar  5 09:23:59 2008
@@ -26,11 +26,13 @@
 import org.apache.servicemix.nmr.api.Exchange;
 import org.apache.servicemix.nmr.api.NMR;
 import org.apache.servicemix.nmr.api.Reference;
+import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
 import org.apache.servicemix.nmr.api.event.EndpointListener;
 import org.apache.servicemix.nmr.api.service.ServiceHelper;
 import static org.junit.Assert.*;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.Ignore;
 
 public class EndpointRegistryImplTest {
 
@@ -79,6 +81,8 @@
 
     @Test
     public void testLdapFilter() throws Exception {
+        System.setProperty("org.osgi.vendor.framework", "org.apache.servicemix.nmr.core");
+
         Endpoint endpoint = new DummyEndpoint();
         Reference ref = registry.lookup("(NAME=id)");
         assertNotNull(ref);
@@ -100,10 +104,10 @@
         final CountDownLatch unregLatch = new CountDownLatch(1);
         Endpoint endpoint = new DummyEndpoint();
         nmr.getListenerRegistry().register(new EndpointListener() {
-            public void endpointRegistered(Endpoint endpoint) {
+            public void endpointRegistered(InternalEndpoint endpoint) {
                 regLatch.countDown();
             }
-            public void endpointUnregistered(Endpoint endpoint) {
+            public void endpointUnregistered(InternalEndpoint endpoint) {
                 unregLatch.countDown();
             }
         }, new HashMap<String,Object>());

Added: servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/FrameworkUtil.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/FrameworkUtil.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/FrameworkUtil.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/test/java/org/apache/servicemix/nmr/core/FrameworkUtil.java Wed Mar  5 09:23:59 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.nmr.core;
+
+import org.apache.felix.framework.FilterImpl;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ */
+public class FrameworkUtil {
+
+    public static Filter createFilter(String f) throws InvalidSyntaxException {
+        return new FilterImpl(f);
+    }
+
+}

Propchange: servicemix/smx4/nmr/trunk/nmr/management/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Mar  5 09:23:59 2008
@@ -0,0 +1,7 @@
+target
+*.iml
+*.ipr
+*.iws
+.classpath
+.project
+.settings

Added: servicemix/smx4/nmr/trunk/nmr/management/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/pom.xml?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/pom.xml (added)
+++ servicemix/smx4/nmr/trunk/nmr/management/pom.xml Wed Mar  5 09:23:59 2008
@@ -0,0 +1,94 @@
+<?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.management</artifactId>
+    <packaging>bundle</packaging>
+    <name>ServiceMix NMR Management</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.servicemix.nmr</groupId>
+            <artifactId>org.apache.servicemix.nmr.api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.nmr</groupId>
+            <artifactId>org.apache.servicemix.nmr.core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.nmr</groupId>
+            <artifactId>org.apache.servicemix.nmr.spring</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <version>${spring.osgi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>${felix.osgi.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>${commons.logging.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Export-Package>${pom.artifactId}*;version=${pom.version}</Export-Package>
+                        <Spring-Context>*;publish-context:=false;create-asynchronously:=true</Spring-Context>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

Added: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/DefaultNamingStrategy.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/DefaultNamingStrategy.java?rev=633939&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/DefaultNamingStrategy.java (added)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/DefaultNamingStrategy.java Wed Mar  5 09:23:59 2008
@@ -0,0 +1,60 @@
+/*
+ * 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.management;
+
+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
+
+import org.apache.servicemix.nmr.api.Endpoint;
+
+/**
+ */
+public class DefaultNamingStrategy implements NamingStrategy {
+
+    private String jmxDomainName;
+
+    public String getJmxDomainName() {
+        return jmxDomainName;
+    }
+
+    public void setJmxDomainName(String jmxDomainName) {
+        this.jmxDomainName = jmxDomainName;
+    }
+
+    public ObjectName getObjectName(ManagedEndpoint endpoint) throws MalformedObjectNameException {
+        return new ObjectName(jmxDomainName + ":Type=Endpoint,Id=" + sanitize(getId(endpoint)));
+    }
+
+    private String getId(ManagedEndpoint endpoint) {
+        return endpoint.getEndpoint().getId();
+    }
+
+    private String sanitize(String in) {
+        String result = null;
+        if (in != null) {
+            result = in.replace(':', '_');
+            result = result.replace('/', '_');
+            result = result.replace('\\', '_');
+            result = result.replace('?', '_');
+            result = result.replace('=', '_');
+            result = result.replace(',', '_');
+        }
+        return result;
+    }
+
+}
+