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 2009/03/16 23:29:49 UTC

svn commit: r755028 - in /servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer: DeployedAssembly.java impl/AbstractInstaller.java impl/Deployer.java impl/ServiceAssemblyInstaller.java

Author: gnodet
Date: Mon Mar 16 22:29:49 2009
New Revision: 755028

URL: http://svn.apache.org/viewvc?rev=755028&view=rev
Log:
SMX4NMR-130: Lifecycle issues when using OSGi package service assemblies

Modified:
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/DeployedAssembly.java
    servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractInstaller.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/ServiceAssemblyInstaller.java

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/DeployedAssembly.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/DeployedAssembly.java?rev=755028&r1=755027&r2=755028&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/DeployedAssembly.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/DeployedAssembly.java Mon Mar 16 22:29:49 2009
@@ -26,8 +26,8 @@
 
     String getName();
 
-    void deploy();
-
     Map<String, String> getServiceUnits();
 
+    void undeploy(boolean restart);
+
 }

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractInstaller.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractInstaller.java?rev=755028&r1=755027&r2=755028&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractInstaller.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AbstractInstaller.java Mon Mar 16 22:29:49 2009
@@ -88,7 +88,7 @@
         long lastInstall = prefs.getLong(LAST_INSTALL, 0);
         isFirstInstall = lastInstall == 0; 
         isModified = lastInstall == 0 || getBundle().getLastModified() > lastInstall;
-        if (isModified) {
+        if (isModified && installRoot != null) {
             extractBundle(installRoot, getBundle(), "/");
             lastInstall = getBundle().getLastModified();
             prefs.put(AbstractLifecycleJbiArtifact.STATE, isAutoStart()

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=755028&r1=755027&r2=755028&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 Mon Mar 16 22:29:49 2009
@@ -101,6 +101,8 @@
 
     private final Set<AbstractInstaller> pendingInstallers = new HashSet<AbstractInstaller>();
 
+    private final Set<ServiceAssemblyImpl> pendingAssemblies = new HashSet<ServiceAssemblyImpl>();
+
     private File jbiRootDir;
 
     private PreferencesService preferencesService;
@@ -339,7 +341,7 @@
                         installer = new ComponentInstaller(this, descriptor, null, true);
                     } else if (descriptor.getServiceAssembly() != null) {
                         LOGGER.info("Deploying bundle '" + OsgiStringUtils.nullSafeNameAndSymName(bundle) + "' as a JBI service assembly");
-                        installer = new ServiceAssemblyInstaller(this, descriptor, null, true);
+                        installer = new ServiceAssemblyInstaller(this, descriptor, (File) null, true);
                     } else {
                         throw new IllegalStateException("Unrecognized JBI descriptor: " + url);
                     }
@@ -478,9 +480,13 @@
                     if (installer != null) {
                         try {
                             installer.stop(true);
-                            unregisterServiceAssembly(sa);
                             pendingAssemblies.remove(sa);
-                            pendingInstallers.add(installer);
+                            if (installer.getDeployedAssembly() == null) {
+                                unregisterServiceAssembly(sa);
+                                pendingInstallers.add(installer);
+                            } else {
+                                installers.remove(bundle);
+                            }
                         } catch (Exception e) {
                             LOGGER.warn("Error uninstalling service assembly", e);
                         }
@@ -500,11 +506,11 @@
     protected void unregisterServiceAssembly(ServiceAssemblyImpl assembly) {
         if (assembly != null) {
             serviceAssemblies.remove(assembly.getName());
+            pendingAssemblies.remove(assembly);
             unregisterServices(assembly.getBundle());
             for (ServiceUnitImpl su : assembly.getServiceUnitsList()) {
                 su.getComponentImpl().removeServiceUnit(su);
             }
-            pendingAssemblies.remove(assembly);
         }
     }
 
@@ -554,8 +560,6 @@
         }
     }
 
-    private Set<ServiceAssemblyImpl> pendingAssemblies = new HashSet<ServiceAssemblyImpl>();
-
     protected void checkPendingAssemblies() {
         List<ServiceAssemblyImpl> sas = new ArrayList<ServiceAssemblyImpl>(pendingAssemblies);
         pendingAssemblies.clear();
@@ -665,21 +669,32 @@
 
     public void registerDeployedServiceAssembly(ServiceReference reference, DeployedAssembly assembly) {
         try {
-            assembly.deploy();
             ServiceAssemblyDesc desc = new ServiceAssemblyDesc();
             desc.setIdentification(new Identification());
             desc.getIdentification().setName(assembly.getName());
-            List<ServiceUnitImpl> sus = new ArrayList<ServiceUnitImpl>();
+            List<ServiceUnitDesc> sus = new ArrayList<ServiceUnitDesc>();
             for (Map.Entry<String, String> unit : assembly.getServiceUnits().entrySet()) {
                 ServiceUnitDesc suDesc = new ServiceUnitDesc();
                 suDesc.setIdentification(new Identification());
                 suDesc.getIdentification().setName(unit.getKey());
                 suDesc.setTarget(new Target());
                 suDesc.getTarget().setComponentName(unit.getValue());
-                ServiceUnitImpl su = createServiceUnit(suDesc, null, components.get(unit.getValue()));
-                sus.add(su);
+                sus.add(suDesc);
+            }
+            desc.setServiceUnits(sus.toArray(new ServiceUnitDesc[sus.size()]));
+            Descriptor descriptor = new Descriptor();
+            descriptor.setServiceAssembly(desc);
+
+            ServiceAssemblyInstaller installer = new ServiceAssemblyInstaller(this, descriptor, assembly, autoStart);
+            installer.setBundle(reference.getBundle());
+            try {
+                installer.init();
+                installer.install();
+                installers.put(installer.getBundle(), installer);
+            } catch (PendingException e) {
+                pendingInstallers.add(installer);
+                LOGGER.warn("Requirements not met for JBI artifact in bundle " + OsgiStringUtils.nullSafeNameAndSymName(reference.getBundle()) + ". Installation pending. " + e);
             }
-            registerServiceAssembly(reference.getBundle(), desc, sus);
             bundles.add(reference.getBundle());
         } catch (Exception e) {
             LOGGER.error("Error registering deployed service assembly", e);

Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyInstaller.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyInstaller.java?rev=755028&r1=755027&r2=755028&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyInstaller.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyInstaller.java Mon Mar 16 22:29:49 2009
@@ -27,6 +27,7 @@
 
 import org.apache.servicemix.jbi.deployer.Component;
 import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.apache.servicemix.jbi.deployer.DeployedAssembly;
 import org.apache.servicemix.jbi.deployer.artifacts.ComponentImpl;
 import org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl;
 import org.apache.servicemix.jbi.deployer.artifacts.ServiceUnitImpl;
@@ -40,16 +41,27 @@
 
 public class ServiceAssemblyInstaller extends AbstractInstaller {
 
+    private DeployedAssembly deployedAssembly;
+
     public ServiceAssemblyInstaller(Deployer deployer, Descriptor descriptor, File jbiArtifact, boolean autoStart) {
         super(deployer, descriptor, jbiArtifact, autoStart);
         this.installRoot = new File(System.getProperty("servicemix.base"), "data/jbi/" + getName() + "/install");
         this.installRoot.mkdirs();
     }
 
+    public ServiceAssemblyInstaller(Deployer deployer, Descriptor descriptor, DeployedAssembly deployedAssembly, boolean autoStart) {
+        super(deployer, descriptor, null, autoStart);
+        this.deployedAssembly = deployedAssembly;
+    }
+
     public String getName() {
         return descriptor.getServiceAssembly().getIdentification().getName();
     }
 
+    public DeployedAssembly getDeployedAssembly() {
+        return deployedAssembly;
+    }
+
     public void init() throws Exception {
         // Check requirements
         for (ServiceUnitDesc sud : descriptor.getServiceAssembly().getServiceUnits()) {
@@ -68,7 +80,19 @@
 
     public ObjectName install() throws JBIException {
         try {
-            List<ServiceUnitImpl> sus = deploySUs();
+            List<ServiceUnitImpl> sus;
+            if (deployedAssembly == null) {
+                sus = deploySUs();
+            } else {
+                sus = new ArrayList<ServiceUnitImpl>();
+                for (ServiceUnitDesc sud : descriptor.getServiceAssembly().getServiceUnits()) {
+                    String componentName = sud.getTarget().getComponentName();
+                    ComponentImpl component = deployer.getComponent(componentName);
+                    // Create service unit object
+                    ServiceUnitImpl su = deployer.createServiceUnit(sud, null, component);
+                    sus.add(su);
+                }
+            }
             postInstall();
             ServiceAssembly sa = deployer.registerServiceAssembly(bundle, descriptor.getServiceAssembly(), sus);
             return deployer.getNamingStrategy().getObjectName(sa);
@@ -94,9 +118,13 @@
             if (LifeCycleMBean.STOPPED.equals(assembly.getCurrentState())) {
                 assembly.shutDown(false, force);
             }
+        }
+        if (deployedAssembly == null) {
             for (ServiceUnitImpl su : assembly.getServiceUnitsList()) {
                 su.getComponentImpl().removeServiceUnit(su);
             }
+        } else {
+            deployedAssembly.undeploy(bundle.getState() == Bundle.ACTIVE);
         }
     }