This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-factory-subsystems.git
commit 13be339ad51e697982ed0099b03ed58088a49e43 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Oct 10 16:12:45 2014 +0000 Separate install from start task git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1630931 13f79535-47bb-0310-9956-ffa450edef68 --- .../subsystems/impl/InstallSubsystemTask.java | 7 +- ...lSubsystemTask.java => StartSubsystemTask.java} | 30 ++++---- .../subsystems/impl/SubsystemInstaller.java | 86 +++++++++++++--------- .../subsystems/impl/UninstallSubsystemTask.java | 4 + .../subsystems/impl/UpdateSubsystemTask.java | 3 + 5 files changed, 75 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java index 230272c..0b1086f 100644 --- a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java +++ b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java @@ -28,6 +28,9 @@ import org.apache.sling.installer.api.tasks.TaskResource; import org.apache.sling.installer.api.tasks.TaskResourceGroup; import org.osgi.service.subsystem.Subsystem; +/** + * This is the subsystem install task. + */ public class InstallSubsystemTask extends InstallTask { private static final String INSTALL_ORDER = "53-"; @@ -46,8 +49,8 @@ public class InstallSubsystemTask extends InstallTask { try { final Subsystem sub = this.rootSubsystem.install(tr.getURL(), tr.getInputStream()); - sub.start(); - ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.INSTALLED)); + ctx.addTaskToCurrentCycle(new StartSubsystemTask(this.getResourceGroup(), sub)); + ctx.log("Installed new subsystem {}", sub); } catch (final IOException e) { ctx.log("Unable to install subsystem {} : {}", tr, e); ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.IGNORED)); diff --git a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/StartSubsystemTask.java similarity index 64% copy from src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java copy to src/main/java/org/apache/sling/installer/factories/subsystems/impl/StartSubsystemTask.java index 230272c..a5eb224 100644 --- a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/InstallSubsystemTask.java +++ b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/StartSubsystemTask.java @@ -18,8 +18,6 @@ */ package org.apache.sling.installer.factories.subsystems.impl; -import java.io.IOException; - import org.apache.sling.installer.api.tasks.ChangeStateTask; import org.apache.sling.installer.api.tasks.InstallTask; import org.apache.sling.installer.api.tasks.InstallationContext; @@ -28,30 +26,28 @@ import org.apache.sling.installer.api.tasks.TaskResource; import org.apache.sling.installer.api.tasks.TaskResourceGroup; import org.osgi.service.subsystem.Subsystem; -public class InstallSubsystemTask extends InstallTask { +/** + * This is the subsystem start task. + */ +public class StartSubsystemTask extends InstallTask { - private static final String INSTALL_ORDER = "53-"; + private static final String INSTALL_ORDER = "55-"; - private final Subsystem rootSubsystem; + private final Subsystem subsystem; - public InstallSubsystemTask(final TaskResourceGroup grp, final Subsystem rootSubsystem) { + public StartSubsystemTask(final TaskResourceGroup grp, final Subsystem system) { super(grp); - this.rootSubsystem = rootSubsystem; + this.subsystem = system; } @Override public void execute(final InstallationContext ctx) { final TaskResource tr = this.getResource(); - ctx.log("Installing new subsystem from {}", tr); - - try { - final Subsystem sub = this.rootSubsystem.install(tr.getURL(), tr.getInputStream()); - sub.start(); - ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.INSTALLED)); - } catch (final IOException e) { - ctx.log("Unable to install subsystem {} : {}", tr, e); - ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.IGNORED)); - } + ctx.log("Starting subsystem from {}", tr); + + this.subsystem.start(); + ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.INSTALLED)); + ctx.log("Started subsystem {}", this.subsystem); } @Override diff --git a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/SubsystemInstaller.java b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/SubsystemInstaller.java index 3b29961..c58d7a3 100644 --- a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/SubsystemInstaller.java +++ b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/SubsystemInstaller.java @@ -42,15 +42,19 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.framework.Version; import org.osgi.service.subsystem.Subsystem; +import org.osgi.service.subsystem.Subsystem.State; import org.osgi.service.subsystem.SubsystemConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This is an extension for the OSGi installer - * It listens for files ending with ".esa" and a proper manifest. Though subsystems does - * not require a complete manifest, the installer supports only subsystems with the - * basic info. + * It listens for files ending with ".esa" and a proper subsystem manifest. + * Though subsystems does not require a complete manifest, the installer supports + * only subsystems with the basic info (name and version). + * + * As subsystems currently do not support an update, an uninstall/install is done + * instead - which will lose bundle private data, bound configurations etc. */ public class SubsystemInstaller implements ResourceTransformer, InstallTaskFactory { @@ -175,45 +179,55 @@ public class SubsystemInstaller // search a subsystem with the symbolic name final ServiceReference<Subsystem> ref = this.getSubsystemReference(info.symbolicName); - final Version newVersion = new Version(info.version); - final Version oldVersion = (ref == null ? null : (Version)ref.getProperty("subsystem.version")); - - // Install - if ( rsrc.getState() == ResourceState.INSTALL ) { - if ( oldVersion != null ) { - - final int compare = oldVersion.compareTo(newVersion); - if (compare < 0) { - // installed version is lower -> update - result = new UpdateSubsystemTask(toActivate, this.bundleContext, ref, this.rootSubsystem); - } else if ( compare == 0 && isSnapshot(newVersion) ) { - // same version but snapshot -> update - result = new UpdateSubsystemTask(toActivate, this.bundleContext, ref, this.rootSubsystem); + final Subsystem currentSubsystem = (ref != null ? this.bundleContext.getService(ref) : null); + try { + final Version newVersion = new Version(info.version); + final Version oldVersion = (ref == null ? null : (Version)ref.getProperty("subsystem.version")); + + // Install + if ( rsrc.getState() == ResourceState.INSTALL ) { + if ( oldVersion != null ) { + + final int compare = oldVersion.compareTo(newVersion); + if (compare < 0) { + // installed version is lower -> update + result = new UpdateSubsystemTask(toActivate, this.bundleContext, ref, this.rootSubsystem); + } else if ( compare == 0 && isSnapshot(newVersion) ) { + // same version but snapshot -> update + result = new UpdateSubsystemTask(toActivate, this.bundleContext, ref, this.rootSubsystem); + } else if ( compare == 0 && currentSubsystem != null && currentSubsystem.getState() != State.ACTIVE ) { + // try to start the version + result = new StartSubsystemTask(toActivate, currentSubsystem); + } else { + logger.info("{} is not installed, subsystem with same or higher version is already installed: {}", info, newVersion); + result = new ChangeStateTask(toActivate, ResourceState.IGNORED); + } } else { - logger.debug("{} is not installed, subsystem with same or higher version is already installed: {}", info, newVersion); - result = new ChangeStateTask(toActivate, ResourceState.IGNORED); + result = new InstallSubsystemTask(toActivate, this.rootSubsystem); } - } else { - result = new InstallSubsystemTask(toActivate, this.rootSubsystem); - } - // Uninstall - } else if ( rsrc.getState() == ResourceState.UNINSTALL ) { - if ( oldVersion == null ) { - logger.error("Nothing to uninstall. {} is currently not installed.", info); - result = new ChangeStateTask(toActivate, ResourceState.IGNORED); - } else { - - final int compare = oldVersion.compareTo(newVersion); - if ( compare == 0 ) { - result = new UninstallSubsystemTask(toActivate, this.bundleContext, ref); - } else { - logger.error("Nothing to uninstall. {} is currently not installed, different version is installed {}", info, oldVersion); + // Uninstall + } else if ( rsrc.getState() == ResourceState.UNINSTALL ) { + if ( oldVersion == null ) { + logger.error("Nothing to uninstall. {} is currently not installed.", info); result = new ChangeStateTask(toActivate, ResourceState.IGNORED); + } else { + + final int compare = oldVersion.compareTo(newVersion); + if ( compare == 0 ) { + result = new UninstallSubsystemTask(toActivate, this.bundleContext, ref); + } else { + logger.error("Nothing to uninstall. {} is currently not installed, different version is installed {}", info, oldVersion); + result = new ChangeStateTask(toActivate, ResourceState.IGNORED); + } } + } else { + result = null; + } + } finally { + if ( currentSubsystem != null ) { + this.bundleContext.ungetService(ref); } - } else { - result = null; } } } else { diff --git a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UninstallSubsystemTask.java b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UninstallSubsystemTask.java index 4ae0dab..a499c61 100644 --- a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UninstallSubsystemTask.java +++ b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UninstallSubsystemTask.java @@ -28,6 +28,9 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.subsystem.Subsystem; +/** + * Uninstall a subsystem + */ public class UninstallSubsystemTask extends InstallTask { private static final String INSTALL_ORDER = "52-"; @@ -55,6 +58,7 @@ public class UninstallSubsystemTask extends InstallTask { if ( subsystem != null ) { subsystem.uninstall(); ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.UNINSTALLED)); + ctx.log("Uninstalled subsystem {}", subsystem); } else { ctx.log("Unable to uninstall subsystem {}.", tr); ctx.addTaskToCurrentCycle(new ChangeStateTask(this.getResourceGroup(), ResourceState.IGNORED)); diff --git a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UpdateSubsystemTask.java b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UpdateSubsystemTask.java index cb6939c..781fcee 100644 --- a/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UpdateSubsystemTask.java +++ b/src/main/java/org/apache/sling/installer/factories/subsystems/impl/UpdateSubsystemTask.java @@ -28,6 +28,9 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.subsystem.Subsystem; +/** + * Update subsystem by uninstalling and installing it. + */ public class UpdateSubsystemTask extends InstallTask { private static final String INSTALL_ORDER = "54-"; -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
