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();
}
}