You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:44:19 UTC
[sling-org-apache-sling-installer-provider-file] 05/14: SLING-4478
: Support run modes.
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 <cz...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.