This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.installer.provider.file-1.1.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-provider-file.git
commit 18301e1ddea5764e6b9e9aa7a700ce7116cbd1cb Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Mar 6 12:04:59 2015 +0000 SLING-4478 : Support run modes. git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/installer/providers/file@1664597 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ++ .../provider/file/impl/FileInstaller.java | 5 +- .../installer/provider/file/impl/Installer.java | 74 +++++++++++++++++----- .../provider/file/impl/ServicesListener.java | 21 ++++-- 4 files changed, 83 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index c38ef1c..9300572 100644 --- a/pom.xml +++ b/pom.xml @@ -92,6 +92,12 @@ <version>3.5.4</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.settings</artifactId> + <version>1.1.0</version> + <scope>provided</scope> + </dependency> <!-- We use a class from the config admin implementation to read config files --> <dependency> <groupId>org.apache.felix</groupId> diff --git a/src/main/java/org/apache/sling/installer/provider/file/impl/FileInstaller.java b/src/main/java/org/apache/sling/installer/provider/file/impl/FileInstaller.java index a12cc7c..b0dce00 100644 --- a/src/main/java/org/apache/sling/installer/provider/file/impl/FileInstaller.java +++ b/src/main/java/org/apache/sling/installer/provider/file/impl/FileInstaller.java @@ -34,6 +34,7 @@ import org.apache.sling.installer.api.InstallableResource; import org.apache.sling.installer.api.OsgiInstaller; import org.apache.sling.installer.api.UpdateHandler; import org.apache.sling.installer.api.UpdateResult; +import org.apache.sling.settings.SlingSettingsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,11 +71,11 @@ public class FileInstaller return !this.scanConfigurations.isEmpty(); } - public void start(final OsgiInstaller installer) { + public void start(final OsgiInstaller installer, final SlingSettingsService settings) { for(final ScanConfiguration config : this.scanConfigurations) { logger.debug("Starting monitor for {}", config.directory); this.monitors.add(new FileMonitor(new File(config.directory), - config.scanInterval, new Installer(installer, hash(config.directory)))); + config.scanInterval, new Installer(installer, settings, config.directory, hash(config.directory)))); } } diff --git a/src/main/java/org/apache/sling/installer/provider/file/impl/Installer.java b/src/main/java/org/apache/sling/installer/provider/file/impl/Installer.java index cc6bddc..1b05e78 100644 --- a/src/main/java/org/apache/sling/installer/provider/file/impl/Installer.java +++ b/src/main/java/org/apache/sling/installer/provider/file/impl/Installer.java @@ -26,9 +26,11 @@ import java.util.ArrayList; import java.util.Dictionary; import java.util.Hashtable; import java.util.List; +import java.util.Set; import org.apache.sling.installer.api.InstallableResource; import org.apache.sling.installer.api.OsgiInstaller; +import org.apache.sling.settings.SlingSettingsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,13 +48,23 @@ public class Installer /** The OSGi installer service. */ private final OsgiInstaller installer; + /** The settings service. */ + private final Set<String> activeRunModes; + /** The scheme to use. */ private final String scheme; + /** Prefix. */ + private final String prefix; + public Installer(final OsgiInstaller installer, + final SlingSettingsService settings, + final String root, final String id) { this.scheme = FileInstaller.SCHEME_PREFIX + id; this.installer = installer; + this.activeRunModes = settings.getRunModes(); + this.prefix = new File(root).getAbsolutePath() + File.separator; } /** @@ -126,27 +138,59 @@ public class Installer private InstallableResource createResource(final File file) { try { - final InputStream is = new FileInputStream(file); - final String digest = String.valueOf(file.lastModified()); - // if this is a bundle check for start level directory! - final Dictionary<String, Object> dict = new Hashtable<String, Object>(); - if ( file.getName().endsWith(".jar") || file.getName().endsWith(".war") ) { - final String parentName = file.getParentFile().getName(); - try { - final int startLevel = Integer.valueOf(parentName); - if ( startLevel > 0 ) { - dict.put(InstallableResource.BUNDLE_START_LEVEL, startLevel); + // check for run modes + final String name = file.getAbsolutePath().substring(this.prefix.length()).replace(File.separatorChar, '/'); + boolean isActive = true; + Integer prio = null; + final int pos = name.indexOf('/'); + if ( pos != -1 && name.startsWith("install.") ) { + final String runModes = name.substring(8, pos); + final int activeModes = this.isActive(runModes); + if ( activeModes > 0 ) { + prio = InstallableResource.DEFAULT_PRIORITY + activeModes; + } else { + isActive = false; + } + } + if ( isActive ) { + final InputStream is = new FileInputStream(file); + final String digest = String.valueOf(file.lastModified()); + // if this is a bundle check for start level directory! + final Dictionary<String, Object> dict = new Hashtable<String, Object>(); + if ( file.getName().endsWith(".jar") || file.getName().endsWith(".war") ) { + final String parentName = file.getParentFile().getName(); + try { + final int startLevel = Integer.valueOf(parentName); + if ( startLevel > 0 ) { + dict.put(InstallableResource.BUNDLE_START_LEVEL, startLevel); + } + } catch (NumberFormatException nfe) { + // ignore this } - } catch (NumberFormatException nfe) { - // ignore this } + dict.put(InstallableResource.RESOURCE_URI_HINT, file.toURI().toString()); + return new InstallableResource(file.getAbsolutePath(), is, dict, digest, + null, prio); + } else { + logger.info("Ignoring inactive resource at {}", file); } - dict.put(InstallableResource.RESOURCE_URI_HINT, file.toURI().toString()); - return new InstallableResource(file.getAbsolutePath(), is, dict, digest, - null, null); + } catch (IOException io) { logger.error("Unable to read file " + file, io); } return null; } + + private int isActive(final String runModesString) { + final String[] runModes = runModesString.split("\\."); + boolean active = true; + for(final String mode : runModes) { + if ( !activeRunModes.contains(mode) ) { + active = false; + break; + } + } + + return active ? runModes.length : 0; + } } diff --git a/src/main/java/org/apache/sling/installer/provider/file/impl/ServicesListener.java b/src/main/java/org/apache/sling/installer/provider/file/impl/ServicesListener.java index c71bfca..90d016a 100644 --- a/src/main/java/org/apache/sling/installer/provider/file/impl/ServicesListener.java +++ b/src/main/java/org/apache/sling/installer/provider/file/impl/ServicesListener.java @@ -24,6 +24,7 @@ import java.util.List; import org.apache.sling.installer.api.OsgiInstaller; import org.apache.sling.installer.api.UpdateHandler; +import org.apache.sling.settings.SlingSettingsService; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; @@ -47,12 +48,18 @@ public class ServicesListener { /** The name of the installer service. */ private static final String INSTALLER_SERVICE_NAME = OsgiInstaller.class.getName(); + /** The name of the settings service. */ + private static final String SETTINGS_SERVICE_NAME = SlingSettingsService.class.getName(); + /** The bundle context. */ private final BundleContext bundleContext; /** The listener for the installer. */ private final Listener installerListener; + /** The listener for the settings service. */ + private final Listener settingsListener; + /** The file installer. */ private final FileInstaller installer; @@ -71,18 +78,20 @@ public class ServicesListener { } this.installer = new FileInstaller(configs, writeBack); this.installerListener = new Listener(INSTALLER_SERVICE_NAME); + this.settingsListener = new Listener(SETTINGS_SERVICE_NAME); this.installerListener.start(); + this.settingsListener.start(); } public synchronized void notifyChange() { final boolean shouldRun = this.installer.hasConfigurations(); if ( (shouldRun && !running) || (!shouldRun && running) ) { final OsgiInstaller installer = (OsgiInstaller)this.installerListener.getService(); - - if ( installer != null&& !running ) { + final SlingSettingsService settings = (SlingSettingsService)this.settingsListener.getService(); + if ( installer != null && settings != null && !running ) { logger.debug("Starting scanner"); - this.startScanner(installer); - } else if ( running && installer == null ) { + this.startScanner(installer, settings); + } else if ( running && (installer == null || settings == null) ) { logger.debug("Stopping scanner"); this.stopScanner(); } @@ -100,9 +109,9 @@ public class ServicesListener { /** Vendor of all registered services. */ public static final String VENDOR = "The Apache Software Foundation"; - private void startScanner(final OsgiInstaller installer) { + private void startScanner(final OsgiInstaller installer, final SlingSettingsService settings) { if ( !running ) { - this.installer.start(installer); + this.installer.start(installer, settings); final Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling File Installer Controller Service"); props.put(Constants.SERVICE_VENDOR, VENDOR); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
