You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2020/03/07 09:49:28 UTC

[sling-org-apache-sling-installer-core] branch master updated: SLING-9166 : Installer core must not depend on org.osgi.service.event

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 5b7963a  SLING-9166 : Installer core must not depend on org.osgi.service.event
5b7963a is described below

commit 5b7963a43a3d0cc785e5a66044df4dc43803bc9b
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Sat Mar 7 10:49:04 2020 +0100

    SLING-9166 : Installer core must not depend on org.osgi.service.event
---
 bnd.bnd                                            |   3 +-
 pom.xml                                            |   7 --
 .../installer/core/impl/OsgiInstallerImpl.java     |  30 +++---
 .../installer/core/impl/SortingServiceTracker.java | 107 +++++++++++++++++++--
 .../installer/core/impl/UpdateHandlerTracker.java  |  37 ++++---
 5 files changed, 134 insertions(+), 50 deletions(-)

diff --git a/bnd.bnd b/bnd.bnd
index 5e69b98..7de035a 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -1,5 +1,4 @@
--conditionalpackage: org.apache.sling.commons.osgi,\
-                     org.apache.felix.cm.*,\
+-conditionalpackage: org.apache.felix.cm.*,\
                      org.apache.felix.configurator.impl.*,\
                      org.apache.sling.feature.io.*
 Provide-Capability:  osgi.service;objectClass:List<String>="org.apache.sling.installer.api.OsgiInstaller,org.apache.sling.installer.api.ResourceChangeListener,org.apache.sling.installer.api.info.InfoProvider,org.apache.sling.installer.api.tasks.RetryHandler",\
diff --git a/pom.xml b/pom.xml
index b0aa8de..92178c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,13 +183,6 @@
             <artifactId>annotations</artifactId>
             <scope>provided</scope>
         </dependency>
-        <!-- all compile scope dependencies are embedded -->
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.2.0</version>
-            <scope>compile</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/core/impl/OsgiInstallerImpl.java b/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
index 15ae3ed..e97a021 100644
--- a/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
+++ b/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
@@ -39,7 +39,6 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.installer.api.InstallableResource;
 import org.apache.sling.installer.api.OsgiInstaller;
 import org.apache.sling.installer.api.ResourceChangeListener;
@@ -70,7 +69,7 @@ import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
 import org.osgi.service.startlevel.StartLevel;
-import org.osgi.service.url.URLStreamHandlerService;
+import org.osgi.util.converter.Converters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -165,7 +164,8 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
         final File f = FileDataStore.SHARED.getDataFile("RegisteredResourceList.ser");
         this.listener = new InstallListener(ctx, logger);
         this.persistentList = new PersistentResourceList(f, listener);
-        this.switchStartLevel = PropertiesUtil.toBoolean(ctx.getProperty(PROP_START_LEVEL_HANDLING), false);
+        this.switchStartLevel = Converters.standardConverter().convert(ctx.getProperty(PROP_START_LEVEL_HANDLING))
+                .defaultValue(Boolean.FALSE).to(Boolean.class);
     }
 
     /**
@@ -703,7 +703,7 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
         SLEEP,
         SHUTDOWN,
         CYCLE
-    };
+    }
 
     /**
      * Execute all tasks
@@ -806,7 +806,6 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
 
             final InstallationContext ctx = new InstallationContext() {
 
-                @SuppressWarnings("deprecation")
                 @Override
                 public void addTaskToNextCycle(final InstallTask t) {
                     logger.warn("Deprecated method addTaskToNextCycle was called. Task will be executed in this cycle instead: {}", t);
@@ -823,7 +822,6 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
                     }
                 }
 
-                @SuppressWarnings("deprecation")
                 @Override
                 public void addAsyncTask(final InstallTask t) {
                     if ( t.isAsynchronousTask() ) {
@@ -946,7 +944,8 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
      */
     private void transformResources() {
         boolean changed = false;
-        final List<ServiceReference> serviceRefs = this.transformerTracker.getSortedServiceReferences();
+        final List<ServiceReference<ResourceTransformer>> serviceRefs = this.transformerTracker
+                .getSortedServiceReferences();
 
         if ( serviceRefs.size() > 0 ) {
             synchronized ( this.resourcesLock ) {
@@ -956,7 +955,7 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
 
                 while ( index < unknownList.size() ) {
                     final RegisteredResource resource = unknownList.get(index);
-                    for(final ServiceReference reference : serviceRefs) {
+                    for (final ServiceReference<ResourceTransformer> reference : serviceRefs) {
                         final Long id = (Long)reference.getProperty(Constants.SERVICE_ID);
                         // check if this transformer has already been invoked for the resource
                         final String transformers = (String)((RegisteredResourceImpl)resource).getAttribute(ResourceTransformer.class.getName());
@@ -964,7 +963,7 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
                                 (transformers != null && transformers.contains(":" + id + ':'))) {
                             continue;
                         }
-                        final ResourceTransformer transformer = (ResourceTransformer) this.transformerTracker.getService(reference);
+                        final ResourceTransformer transformer = this.transformerTracker.getService(reference);
                         if ( transformer != null ) {
                             try {
                                 final TransformationResult[] result = transformer.transform(resource);
@@ -1143,7 +1142,10 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
             final Dictionary<String, Object> dict,
             final Map<String, Object> attributes) {
         final String key = resourceType + ':' + entityId;
-        final boolean persistChange = (attributes != null ? PropertiesUtil.toBoolean(attributes.get(ResourceChangeListener.RESOURCE_PERSIST), true) : true);
+        final boolean persistChange = attributes != null
+                ? Converters.standardConverter().convert(attributes.get(ResourceChangeListener.RESOURCE_PERSIST))
+                        .defaultValue(Boolean.TRUE).to(Boolean.class)
+                : true;
         try {
             boolean compactAndSave = false;
             boolean done = false;
@@ -1362,14 +1364,16 @@ implements OsgiInstaller, ResourceChangeListener, RetryHandler, InfoProvider, Ru
     /**
      * Search a handler for the scheme.
      */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     private UpdateHandler findHandler(final String scheme) {
-        final List<ServiceReference> references = this.updateHandlerTracker.getSortedServiceReferences();
+        final List<ServiceReference<UpdateHandler>> references = this.updateHandlerTracker.getSortedServiceReferences();
         for(final ServiceReference ref : references) {
-            final String[] supportedSchemes = PropertiesUtil.toStringArray(ref.getProperty(UpdateHandler.PROPERTY_SCHEMES));
+            final String[] supportedSchemes = Converters.standardConverter()
+                    .convert(ref.getProperty(UpdateHandler.PROPERTY_SCHEMES)).defaultValue(null).to(String[].class);
             if ( supportedSchemes != null ) {
                 for(final String support : supportedSchemes ) {
                     if ( scheme.equals(support) ) {
-                        return (UpdateHandler) this.updateHandlerTracker.getService(ref);
+                        return this.updateHandlerTracker.getService(ref);
                     }
                 }
             }
diff --git a/src/main/java/org/apache/sling/installer/core/impl/SortingServiceTracker.java b/src/main/java/org/apache/sling/installer/core/impl/SortingServiceTracker.java
index 7b15601..5328b0d 100644
--- a/src/main/java/org/apache/sling/installer/core/impl/SortingServiceTracker.java
+++ b/src/main/java/org/apache/sling/installer/core/impl/SortingServiceTracker.java
@@ -18,31 +18,70 @@
  */
 package org.apache.sling.installer.core.impl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.sling.installer.api.tasks.RetryHandler;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
 
-public class SortingServiceTracker<T> extends
-        org.apache.sling.commons.osgi.SortingServiceTracker<T> {
+public class SortingServiceTracker<T> extends ServiceTracker<T, T> {
 
     private final RetryHandler listener;
 
+    private volatile int lastCount = -1;
+
+    private volatile int lastRefCount = -1;
+
+    private volatile List<T> sortedServiceCache;
+
+    private volatile List<ServiceReference<T>> sortedReferences;
+
     /**
      * Constructor
+     * 
+     * @param context Bundle context
+     * @param clazz   Class
      */
     public SortingServiceTracker(final BundleContext context,
             final String clazz,
             final RetryHandler listener) {
-        super(context, clazz);
+        super(context, clazz, null);
         this.listener = listener;
     }
 
     /**
+     * @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference,
+     *      java.lang.Object)
+     */
+    @Override
+    public void removedService(ServiceReference<T> reference, T service) {
+        this.sortedServiceCache = null;
+        this.sortedReferences = null;
+        this.context.ungetService(reference);
+    }
+
+    /**
+     * @see org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference,
+     *      java.lang.Object)
+     */
+    @Override
+    public void modifiedService(ServiceReference<T> reference, T service) {
+        this.sortedServiceCache = null;
+        this.sortedReferences = null;
+    }
+
+    /**
      * @see org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
      */
     @Override
-    public Object addingService(ServiceReference reference) {
-        Object returnValue = super.addingService(reference);
+    public T addingService(ServiceReference<T> reference) {
+        this.sortedServiceCache = null;
+        this.sortedReferences = null;
+        T returnValue = context.getService(reference);
         if ( listener != null ) {
             // new factory or resource transformer has been added, wake up main thread
             this.listener.scheduleRetry();
@@ -51,14 +90,66 @@ public class SortingServiceTracker<T> extends
     }
 
     /**
+     * Return a sorted list of the services.
+     * 
+     * @return Service list
+     */
+    public List<T> getSortedServices() {
+        List<T> result = this.sortedServiceCache;
+        if (result == null || this.lastCount < this.getTrackingCount()) {
+            this.lastCount = this.getTrackingCount();
+            final ServiceReference<T>[] references = this.getServiceReferences();
+            if (references == null || references.length == 0) {
+                result = Collections.emptyList();
+            } else {
+                Arrays.sort(references);
+                result = new ArrayList<T>();
+                for (int i = 0; i < references.length; i++) {
+                    final T service = this.getService(references[references.length - 1 - i]);
+                    if (service != null) {
+                        result.add(service);
+                    }
+                }
+            }
+            this.sortedServiceCache = result;
+        }
+        return result;
+    }
+
+    /**
+     * Return a sorted list of the services references.
+     * 
+     * @return Service list
+     */
+    public List<ServiceReference<T>> getSortedServiceReferences() {
+        List<ServiceReference<T>> result = this.sortedReferences;
+        if (result == null || this.lastRefCount < this.getTrackingCount()) {
+            this.lastRefCount = this.getTrackingCount();
+            final ServiceReference<T>[] references = this.getServiceReferences();
+            if (references == null || references.length == 0) {
+                result = Collections.emptyList();
+            } else {
+                Arrays.sort(references);
+                result = new ArrayList<ServiceReference<T>>();
+                for (int i = 0; i < references.length; i++) {
+                    result.add(references[references.length - 1 - i]);
+                }
+            }
+            this.sortedReferences = result;
+        }
+        return result;
+    }
+
+    /**
      * Check if a service with the given name is registered.
+     * 
      * @param name Name
      * @return {@code true} if it exists, {@code false} otherwise.
      */
     public boolean check(final String key, final String name) {
-        final ServiceReference[] refs = this.getServiceReferences();
+        final ServiceReference<T>[] refs = this.getServiceReferences();
         if ( refs != null ) {
-            for(final ServiceReference ref : refs) {
+            for (final ServiceReference<T> ref : refs) {
                 final Object val = ref.getProperty(key);
                 if ( name.equals(val) ) {
                     return true;
@@ -67,6 +158,4 @@ public class SortingServiceTracker<T> extends
         }
         return false;
     }
-
-
 }
diff --git a/src/main/java/org/apache/sling/installer/core/impl/UpdateHandlerTracker.java b/src/main/java/org/apache/sling/installer/core/impl/UpdateHandlerTracker.java
index a4403cb..650fde4 100644
--- a/src/main/java/org/apache/sling/installer/core/impl/UpdateHandlerTracker.java
+++ b/src/main/java/org/apache/sling/installer/core/impl/UpdateHandlerTracker.java
@@ -24,7 +24,6 @@ import java.util.Hashtable;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.installer.api.UpdateHandler;
 import org.apache.sling.installer.api.info.InfoProvider;
 import org.osgi.framework.BundleContext;
@@ -32,6 +31,7 @@ import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.url.URLConstants;
 import org.osgi.service.url.URLStreamHandlerService;
+import org.osgi.util.converter.Converters;
 
 /**
  * Registers one (singleton) url handler handling all registered schemes of UpdateHandler's.
@@ -51,35 +51,34 @@ public class UpdateHandlerTracker extends SortingServiceTracker<UpdateHandler> {
     }
 
     @Override
-    public Object addingService(ServiceReference reference) {
+    public UpdateHandler addingService(ServiceReference<UpdateHandler> reference) {
         addOrRemoveService(reference, true);
         return super.addingService(reference);
     }
 
     @Override
-    public void removedService(ServiceReference reference, Object service) {
+    public void removedService(ServiceReference<UpdateHandler> reference, UpdateHandler service) {
         addOrRemoveService(reference, false);
         super.removedService(reference, service);
     }
 
-    private void addOrRemoveService(ServiceReference reference, boolean isAdd) {
-        final String[] schemes = PropertiesUtil.toStringArray(reference.getProperty(UpdateHandler.PROPERTY_SCHEMES));
-        if (schemes != null && schemes.length > 0) {
-            boolean hasChanged = false;
-            for (String scheme : schemes) {
-                if (isAdd) {
-                    if (addScheme(scheme)) {
-                        hasChanged = true;
-                    }
-                } else {
-                    if (removeScheme(scheme)) {
-                        hasChanged = true;
-                    }
+    private void addOrRemoveService(ServiceReference<UpdateHandler> reference, boolean isAdd) {
+        final String[] schemes = Converters.standardConverter()
+                .convert(reference.getProperty(UpdateHandler.PROPERTY_SCHEMES)).to(String[].class);
+        boolean hasChanged = false;
+        for (String scheme : schemes) {
+            if (isAdd) {
+                if (addScheme(scheme)) {
+                    hasChanged = true;
+                }
+            } else {
+                if (removeScheme(scheme)) {
+                    hasChanged = true;
                 }
             }
-            if (hasChanged) {
-                updateUrlStreamHandler();
-            }
+        }
+        if (hasChanged) {
+            updateUrlStreamHandler();
         }
     }