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>.