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/17 15:51:14 UTC

svn commit: r612835 - in /servicemix/smx4/nmr/trunk: jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ jbi/deployer/src/main/resources/META-INF/spring/ preferences/ preferences/src/main/java/org/apache/servicemix/preferences/

Author: gnodet
Date: Thu Jan 17 06:50:21 2008
New Revision: 612835

URL: http://svn.apache.org/viewvc?rev=612835&view=rev
Log:
Auto start / state persistence of JBI components and SAs

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/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml
    servicemix/smx4/nmr/trunk/preferences/pom.xml
    servicemix/smx4/nmr/trunk/preferences/src/main/java/org/apache/servicemix/preferences/PreferencesServiceFactoryImpl.java

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=612835&r1=612834&r2=612835&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 Thu Jan 17 06:50:21 2008
@@ -17,12 +17,12 @@
 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.ComponentContext;
 import javax.jbi.component.ComponentLifeCycle;
 import javax.jbi.component.ServiceUnitManager;
-import javax.jbi.component.ComponentContext;
 import javax.jbi.management.LifeCycleMBean;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.servicedesc.ServiceEndpoint;
 import javax.management.ObjectName;
 
 import org.w3c.dom.Document;
@@ -30,6 +30,10 @@
 
 import org.apache.servicemix.jbi.deployer.Component;
 import org.apache.servicemix.jbi.deployer.descriptor.ComponentDesc;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
 
 /**
  * Created by IntelliJ IDEA.
@@ -40,6 +44,10 @@
  */
 public class ComponentImpl implements Component {
 
+    private static final Log LOGGER = LogFactory.getLog(ComponentImpl.class);
+
+    private static final String STATE = "state";
+
     protected enum State {
         Unknown,
         Initialized,
@@ -50,12 +58,18 @@
 
     private ComponentDesc componentDesc;
     private javax.jbi.component.Component component;
-
     private State state = State.Unknown;
+    private Preferences prefs;
+    private State runningState;
 
-    public ComponentImpl(ComponentDesc componentDesc, javax.jbi.component.Component component) {
+    public ComponentImpl(ComponentDesc componentDesc,
+                         javax.jbi.component.Component component,
+                         Preferences prefs,
+                         boolean autoStart) {
         this.componentDesc = componentDesc;
         this.component = new ComponentWrapper(component);
+        this.prefs = prefs;
+        this.runningState = State.valueOf(this.prefs.get(STATE, (autoStart ? State.Started : State.Initialized).name()));
     }
 
     public String getName() {
@@ -77,12 +91,14 @@
     public void start() throws JBIException {
         component.getLifeCycle().start();
         state = State.Started;
+        saveState();
     }
 
     public void stop() throws JBIException {
         if (state == State.Started) {
             component.getLifeCycle().stop();
             state = State.Stopped;
+            saveState();
         }
     }
 
@@ -93,6 +109,16 @@
         if (state == State.Stopped) {
             component.getLifeCycle().shutDown();
             state = State.Shutdown;
+            saveState();
+        }
+    }
+
+    private void saveState() {
+        this.prefs.put(STATE, state.name());
+        try {
+            this.prefs.flush();
+        } catch (BackingStoreException e) {
+            LOGGER.warn("Unable to persist state", e);
         }
     }
 
@@ -155,6 +181,18 @@
                 Thread.currentThread().setContextClassLoader(lifeCycle.getClass().getClassLoader());
                 lifeCycle.init(context);
                 state = State.Initialized;
+                if (runningState == State.Started) {
+                    start();
+                    state = State.Started;
+                } else if (runningState == State.Stopped) {
+                    start();
+                    state = State.Started;
+                    stop();
+                    state = State.Stopped;
+                } else if (runningState == State.Shutdown) {
+                    shutDown();
+                    state = State.Shutdown;
+                }
             } finally {
                 Thread.currentThread().setContextClassLoader(cl);
             }

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=612835&r1=612834&r2=612835&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 17 06:50:21 2008
@@ -19,7 +19,6 @@
 import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
@@ -45,6 +44,8 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.prefs.Preferences;
+import org.osgi.service.prefs.PreferencesService;
 import org.springframework.osgi.util.BundleDelegatingClassLoader;
 import org.springframework.osgi.util.OsgiServiceReferenceUtils;
 import org.springframework.osgi.util.OsgiServiceUtils;
@@ -73,6 +74,10 @@
 
     private File jbiRootDir;
 
+    private PreferencesService preferencesService;
+
+    private boolean autoStart = true;
+
     public Deployer() throws JBIException{
         sharedLibraries = new ConcurrentHashMap<String, SharedLibraryImpl>();
         serviceAssemblies = new ConcurrentHashMap<String, ServiceAssemblyImpl>();
@@ -83,6 +88,22 @@
         jbiRootDir.mkdirs();
     }
 
+    public PreferencesService getPreferencesService() {
+        return preferencesService;
+    }
+
+    public void setPreferencesService(PreferencesService preferencesService) {
+        this.preferencesService = preferencesService;
+    }
+
+    public boolean isAutoStart() {
+        return autoStart;
+    }
+
+    public void setAutoStart(boolean autoStart) {
+        this.autoStart = autoStart;
+    }
+
     @Override
     protected boolean match(Bundle bundle) {
         LOGGER.debug("Checking bundle: '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "'");
@@ -150,9 +171,10 @@
         ClassLoader classLoader = createComponentClassLoader(componentDesc, bundle);
         Thread.currentThread().setContextClassLoader(classLoader);
         // Instanciate component
+        Preferences prefs = preferencesService.getUserPreferences(componentDesc.getIdentification().getName());
         Class clazz = classLoader.loadClass(componentDesc.getComponentClassName());
         javax.jbi.component.Component innerComponent = (javax.jbi.component.Component) clazz.newInstance();
-        ComponentImpl component = new ComponentImpl(componentDesc, innerComponent);
+        ComponentImpl component = new ComponentImpl(componentDesc, innerComponent, prefs, autoStart);
         // populate props from the component meta-data
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put(NAME, componentDesc.getIdentification().getName());
@@ -199,7 +221,8 @@
             sus.add(su);
         }
         // Now create the SA and initialize it
-        ServiceAssemblyImpl sa = new ServiceAssemblyImpl(serviceAssembyDesc, sus);
+        Preferences prefs = preferencesService.getUserPreferences(serviceAssembyDesc.getIdentification().getName());
+        ServiceAssemblyImpl sa = new ServiceAssemblyImpl(serviceAssembyDesc, sus, prefs, autoStart);
         sa.init();
         // populate props from the component meta-data
         Dictionary<String, String> props = new Hashtable<String, String>();

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=612835&r1=612834&r2=612835&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 17 06:50:21 2008
@@ -27,13 +27,17 @@
 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.service.prefs.Preferences;
+import org.osgi.service.prefs.BackingStoreException;
 
 /**
  * ServiceAssembly object
  */
 public class ServiceAssemblyImpl implements ServiceAssembly {
 
-	private static final Log Logger = LogFactory.getLog(ServiceAssemblyImpl.class);
+	private static final Log LOGGER = LogFactory.getLog(ServiceAssemblyImpl.class);
+
+    private static final String STATE = "state";
 
     protected enum State {
         Unknown,
@@ -49,9 +53,18 @@
 
     private State state = State.Unknown;
 
-    public ServiceAssemblyImpl(ServiceAssemblyDesc serviceAssemblyDesc, List<ServiceUnitImpl> serviceUnits) {
+    private Preferences prefs;
+
+    private State runningState;
+
+    public ServiceAssemblyImpl(ServiceAssemblyDesc serviceAssemblyDesc,
+                               List<ServiceUnitImpl> serviceUnits,
+                               Preferences prefs,
+                               boolean autoStart) {
 		this.serviceAssemblyDesc = serviceAssemblyDesc;
         this.serviceUnits = serviceUnits;
+        this.prefs = prefs;
+        this.runningState = State.valueOf(this.prefs.get(STATE, (autoStart ? State.Started : State.Initialized).name()));
 	}
 
 	public String getName() {
@@ -82,19 +95,39 @@
 
     public void init() throws JBIException {
         transition(State.Initialized);
-	}
-
-	public void shutDown() throws JBIException {
-        transition(State.Shutdown);
-	}
+        if (runningState == State.Started) {
+            transition(State.Started);
+        } else if (runningState == State.Stopped) {
+            transition(State.Started);
+            transition(State.Stopped);
+        } else if (runningState == State.Shutdown) {
+            transition(State.Shutdown);
+        }
+    }
 
 	public void start() throws JBIException {
         transition(State.Started);
+        saveState();
 	}
 
 	public void stop() throws JBIException {
         transition(State.Stopped);
+        saveState();
 	}
+
+    public void shutDown() throws JBIException {
+        transition(State.Shutdown);
+        saveState();
+    }
+
+    private void saveState() {
+        this.prefs.put(STATE, state.name());
+        try {
+            this.prefs.flush();
+        } catch (BackingStoreException e) {
+            LOGGER.warn("Unable to persist state", e);
+        }
+    }
 
     protected void transition(State to) throws JBIException {
         // TODO: reject invalid transitions, for example Started -> Shutdown

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml?rev=612835&r1=612834&r2=612835&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml Thu Jan 17 06:50:21 2008
@@ -31,6 +31,8 @@
 
     <!-- JBI Deployer -->
     <bean id="deployer" class="org.apache.servicemix.jbi.deployer.impl.Deployer">
+        <property name="preferencesService" ref="preferencesService" />
+        <property name="autoStart" value="true" />
     </bean>
 
     <!-- Deployment listener -->
@@ -38,6 +40,10 @@
     
     <!-- JBI Handler -->
     <bean id="jbiHandler" class="org.apache.servicemix.jbi.deployer.handler.URLHandler" />
+
+    <!-- Preferences Service -->
+    <osgi:reference id="preferencesService"
+                    interface="org.osgi.service.prefs.PreferencesService" />
 
     <osgi:service ref="jbiHandler" interface="org.osgi.service.url.URLStreamHandlerService">
     	<osgi:service-properties>

Modified: servicemix/smx4/nmr/trunk/preferences/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/preferences/pom.xml?rev=612835&r1=612834&r2=612835&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/preferences/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/preferences/pom.xml Thu Jan 17 06:50:21 2008
@@ -24,7 +24,7 @@
 
     <parent>
         <groupId>org.apache.servicemix.nmr</groupId>
-        <artifactId>nmr</artifactId>
+        <artifactId>nmr-parent</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
 

Modified: servicemix/smx4/nmr/trunk/preferences/src/main/java/org/apache/servicemix/preferences/PreferencesServiceFactoryImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/preferences/src/main/java/org/apache/servicemix/preferences/PreferencesServiceFactoryImpl.java?rev=612835&r1=612834&r2=612835&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/preferences/src/main/java/org/apache/servicemix/preferences/PreferencesServiceFactoryImpl.java (original)
+++ servicemix/smx4/nmr/trunk/preferences/src/main/java/org/apache/servicemix/preferences/PreferencesServiceFactoryImpl.java Thu Jan 17 06:50:21 2008
@@ -66,7 +66,7 @@
 
     public synchronized Object getService(Bundle bundle, ServiceRegistration serviceRegistration) {
         checkInit();
-        return preferences.node("/" + bundle.getBundleId());
+        return new PreferencesServiceImpl((AbstractPreferencesImpl) preferences.node("/" + bundle.getBundleId()));
     }
 
     public synchronized void ungetService(Bundle bundle, ServiceRegistration serviceRegistration, Object o) {