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 2017/01/16 15:33:10 UTC
svn commit: r1779044 - in /sling/trunk/bundles/resourceresolver/src:
main/java/org/apache/sling/resourceresolver/impl/
main/java/org/apache/sling/resourceresolver/impl/console/
test/java/org/apache/sling/resourceresolver/impl/
Author: cziegeler
Date: Mon Jan 16 15:33:09 2017
New Revision: 1779044
URL: http://svn.apache.org/viewvc?rev=1779044&view=rev
Log:
SLING-6469 : Resource Resolver Factory does not start if updating from an older version
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/console/ResourceResolverWebConsolePlugin.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java?rev=1779044&r1=1779043&r2=1779044&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java Mon Jan 16 15:33:09 2017
@@ -20,6 +20,7 @@ package org.apache.sling.resourceresolve
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.apache.sling.resourceresolver.impl.legacy.LegacyResourceProviderWhiteboard;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
@@ -49,8 +50,8 @@ public class FactoryPreconditions {
private volatile List<RequiredProvider> requiredProviders;
public void activate(final BundleContext bc,
- final String[] legycyConfiguration,
- final String[] namesConfiguration,
+ final Set<String> legycyConfiguration,
+ final Set<String> namesConfiguration,
final ResourceProviderTracker tracker) {
synchronized ( this ) {
this.tracker = tracker;
@@ -58,36 +59,28 @@ public class FactoryPreconditions {
final List<RequiredProvider> rps = new ArrayList<RequiredProvider>();
if ( legycyConfiguration != null ) {
final Logger logger = LoggerFactory.getLogger(getClass());
- for(final String r : legycyConfiguration) {
- if ( r != null && r.trim().length() > 0 ) {
- final String value = r.trim();
- RequiredProvider rp = new RequiredProvider();
- if ( value.startsWith("(") ) {
- try {
- rp.filter = bc.createFilter(value);
- } catch (final InvalidSyntaxException e) {
- logger.warn("Ignoring invalid filter syntax for required provider: " + value, e);
- rp = null;
- }
- } else {
- rp.pid = value;
- }
- if ( rp != null ) {
- rps.add(rp);
+ for(final String value : legycyConfiguration) {
+ RequiredProvider rp = new RequiredProvider();
+ if ( value.startsWith("(") ) {
+ try {
+ rp.filter = bc.createFilter(value);
+ } catch (final InvalidSyntaxException e) {
+ logger.warn("Ignoring invalid filter syntax for required provider: " + value, e);
+ rp = null;
}
+ } else {
+ rp.pid = value;
+ }
+ if ( rp != null ) {
+ rps.add(rp);
}
}
}
if ( namesConfiguration != null ) {
- for(final String r : namesConfiguration) {
- if( r != null ) {
- final String value = r.trim();
- if ( !value.isEmpty() ) {
- final RequiredProvider rp = new RequiredProvider();
- rp.name = value;
- rps.add(rp);
- }
- }
+ for(final String value : namesConfiguration) {
+ final RequiredProvider rp = new RequiredProvider();
+ rp.name = value;
+ rps.add(rp);
}
}
this.requiredProviders = rps;
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1779044&r1=1779043&r2=1779044&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java Mon Jan 16 15:33:09 2017
@@ -22,11 +22,13 @@ import java.lang.reflect.InvocationHandl
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
import java.util.Dictionary;
+import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.bidimap.TreeBidiMap;
@@ -329,27 +331,54 @@ public class ResourceResolverFactoryActi
}
// check for required property
- final String[] requiredResourceProvidersLegacy = config.resource_resolver_required_providers();
- final String[] requiredResourceProviderNames = config.resource_resolver_required_providernames();
+ Set<String> requiredResourceProvidersLegacy = getStringSet(config.resource_resolver_required_providers());
+ Set<String> requiredResourceProviderNames = getStringSet(config.resource_resolver_required_providernames());
- if ( requiredResourceProvidersLegacy != null && requiredResourceProvidersLegacy.length > 0 ) {
- boolean hasRealValue = false;
+ boolean hasLegacyRequiredProvider = false;
+ if ( requiredResourceProvidersLegacy != null ) {
for(final String name : requiredResourceProvidersLegacy) {
- if ( name != null && !name.trim().isEmpty() ) {
- hasRealValue = true;
- break;
- }
+ if ( name.equals(ResourceResolverFactoryConfig.LEGACY_REQUIRED_PROVIDER_PID)) {
+ hasLegacyRequiredProvider = true;
+ break;
+ }
}
- if ( hasRealValue ) {
- logger.error("ResourceResolverFactory is using deprecated required providers configuration (resource.resolver.required.providers" +
- "). Please change to use the property resource.resolver.required.providernames for values: " + Arrays.toString(requiredResourceProvidersLegacy));
+ if ( hasLegacyRequiredProvider ) {
+ requiredResourceProvidersLegacy.remove(ResourceResolverFactoryConfig.LEGACY_REQUIRED_PROVIDER_PID);
}
+ if ( !requiredResourceProvidersLegacy.isEmpty() ) {
+ logger.error("ResourceResolverFactory is using deprecated required providers configuration (resource.resolver.required.providers" +
+ "). Please change to use the property resource.resolver.required.providernames for values: " + requiredResourceProvidersLegacy);
+ } else {
+ requiredResourceProvidersLegacy = null;
+ }
+ }
+ if ( hasLegacyRequiredProvider ) {
+ final boolean hasRequiredProvider;
+ if ( requiredResourceProviderNames != null ) {
+ hasRequiredProvider = !requiredResourceProviderNames.add(ResourceResolverFactoryConfig.REQUIRED_PROVIDER_NAME);
+ } else {
+ hasRequiredProvider = false;
+ requiredResourceProviderNames = Collections.singleton(ResourceResolverFactoryConfig.REQUIRED_PROVIDER_NAME);
+ }
+ if ( hasRequiredProvider ) {
+ logger.warn("ResourceResolverFactory is using deprecated required providers configuration (resource.resolver.required.providers" +
+ ") with value '" + ResourceResolverFactoryConfig.LEGACY_REQUIRED_PROVIDER_PID + ". Please remove this configuration property. " +
+ ResourceResolverFactoryConfig.REQUIRED_PROVIDER_NAME + " is already contained in the property resource.resolver.required.providernames.");
+ } else {
+ logger.warn("ResourceResolverFactory is using deprecated required providers configuration (resource.resolver.required.providers" +
+ ") with value '" + ResourceResolverFactoryConfig.LEGACY_REQUIRED_PROVIDER_PID + ". Please remove this configuration property and add " +
+ ResourceResolverFactoryConfig.REQUIRED_PROVIDER_NAME + " to the property resource.resolver.required.providernames.");
+ }
}
+
// for testing: if we run unit test, both trackers are set from the outside
if ( this.resourceProviderTracker == null ) {
this.resourceProviderTracker = new ResourceProviderTracker();
this.changeListenerWhiteboard = new ResourceChangeListenerWhiteboard();
- this.preconds.activate(this.bundleContext, requiredResourceProvidersLegacy, requiredResourceProviderNames, resourceProviderTracker);
+ this.preconds.activate(this.bundleContext,
+ requiredResourceProvidersLegacy,
+ requiredResourceProviderNames,
+ resourceProviderTracker);
this.changeListenerWhiteboard.activate(this.bundleContext,
this.resourceProviderTracker, searchPath);
this.resourceProviderTracker.activate(this.bundleContext,
@@ -375,7 +404,10 @@ public class ResourceResolverFactoryActi
}
});
} else {
- this.preconds.activate(this.bundleContext, requiredResourceProvidersLegacy, requiredResourceProviderNames, resourceProviderTracker);
+ this.preconds.activate(this.bundleContext,
+ requiredResourceProvidersLegacy,
+ requiredResourceProviderNames,
+ resourceProviderTracker);
this.checkFactoryPreconditions(null, null);
}
}
@@ -554,6 +586,22 @@ public class ResourceResolverFactoryActi
return resourceProviderTracker;
}
+ /**
+ * Utility method to create a set out of a string array
+ */
+ private Set<String> getStringSet(final String[] values) {
+ if ( values == null || values.length == 0 ) {
+ return null;
+ }
+ final Set<String> set = new HashSet<>();
+ for(final String val : values) {
+ if ( val != null && !val.trim().isEmpty() ) {
+ set.add(val.trim());
+ }
+ }
+ return set.isEmpty() ? null : set;
+ }
+
public static ResourceResolverFactoryConfig DEFAULT_CONFIG;
static {
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java?rev=1779044&r1=1779043&r2=1779044&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryConfig.java Mon Jan 16 15:33:09 2017
@@ -26,6 +26,9 @@ import org.osgi.service.metatype.annotat
description = "Configures the Resource Resolver for request URL and resource path rewriting.")
public @interface ResourceResolverFactoryConfig {
+ String LEGACY_REQUIRED_PROVIDER_PID = "org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider";
+ String REQUIRED_PROVIDER_NAME = "JCR";
+
@AttributeDefinition(name = "Resource Search Path",
description = "The list of absolute path prefixes " +
"applied to find resources whose path is just specified with a relative path. " +
@@ -79,7 +82,7 @@ public @interface ResourceResolverFactor
description = "A resource resolver factory is only " +
"available (registered) if all resource providers mentioned in this configuration " +
"are available. Each entry is refers to the name of a registered provider.")
- String[] resource_resolver_required_providernames() default {"JCR"};
+ String[] resource_resolver_required_providernames() default {REQUIRED_PROVIDER_NAME};
/**
* The resolver.virtual property has no default configuration. But the Sling
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/console/ResourceResolverWebConsolePlugin.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/console/ResourceResolverWebConsolePlugin.java?rev=1779044&r1=1779043&r2=1779044&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/console/ResourceResolverWebConsolePlugin.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/console/ResourceResolverWebConsolePlugin.java Mon Jan 16 15:33:09 2017
@@ -31,6 +31,7 @@ import java.util.Hashtable;
import java.util.List;
import java.util.Set;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -68,7 +69,7 @@ public class ResourceResolverWebConsoleP
private final transient CommonResourceResolverFactoryImpl resolverFactory;
- private transient ServiceRegistration service;
+ private transient ServiceRegistration<Servlet> service;
private final transient RuntimeService runtimeService;
@@ -92,8 +93,7 @@ public class ResourceResolverWebConsoleP
props.put("felix.webconsole.category", "Sling");
props.put("felix.webconsole.configprinter.modes", "always");
- service = context.registerService(
- new String[] { "javax.servlet.Servlet" }, this, props);
+ service = context.registerService(Servlet.class, this, props);
}
public void dispose() {
@@ -367,12 +367,13 @@ public class ResourceResolverWebConsoleP
}
}
- private ServiceReference getServiceReference(final long id) {
+ private ServiceReference<ResourceProvider<?>> getServiceReference(final long id) {
try {
- final ServiceReference[] refs = this.bundleContext.getServiceReferences(ResourceProvider.class.getName(),
+ final Collection<ServiceReference<ResourceProvider>> refs = this.bundleContext.getServiceReferences(ResourceProvider.class,
"(" + Constants.SERVICE_ID + "=" + String.valueOf(id) + ")");
- if ( refs != null && refs.length > 0 ) {
- return refs[0];
+ if ( refs != null && !refs.isEmpty() ) {
+ final ServiceReference rp = refs.iterator().next();
+ return rp;
}
} catch ( final InvalidSyntaxException ise) {
// ignore
@@ -393,7 +394,7 @@ public class ResourceResolverWebConsoleP
final RuntimeDTO runtimeDTO = this.runtimeService.getRuntimeDTO();
for(final ResourceProviderDTO dto : runtimeDTO.providers) {
// get service reference
- final ServiceReference ref = this.getServiceReference(dto.serviceId);
+ final ServiceReference<ResourceProvider<?>> ref = this.getServiceReference(dto.serviceId);
final StringBuilder sb = new StringBuilder();
if ( dto.name != null ) {
sb.append(dto.name);
@@ -452,7 +453,7 @@ public class ResourceResolverWebConsoleP
for(final ResourceProviderFailureDTO dto : runtimeDTO.failedProviders) {
// get service reference
- final ServiceReference ref = this.getServiceReference(dto.serviceId);
+ final ServiceReference<ResourceProvider<?>> ref = this.getServiceReference(dto.serviceId);
final StringBuilder sb = new StringBuilder();
if ( dto.name != null ) {
sb.append(dto.name);
@@ -493,7 +494,7 @@ public class ResourceResolverWebConsoleP
final RuntimeDTO runtimeDTO = this.runtimeService.getRuntimeDTO();
for(final ResourceProviderDTO dto : runtimeDTO.providers) {
// get service reference
- final ServiceReference ref = this.getServiceReference(dto.serviceId);
+ final ServiceReference<ResourceProvider<?>> ref = this.getServiceReference(dto.serviceId);
final StringBuilder sb = new StringBuilder();
if ( dto.name != null ) {
sb.append(dto.name);
@@ -532,7 +533,7 @@ public class ResourceResolverWebConsoleP
for(final ResourceProviderFailureDTO dto : runtimeDTO.failedProviders) {
// get service reference
- final ServiceReference ref = this.getServiceReference(dto.serviceId);
+ final ServiceReference<ResourceProvider<?>> ref = this.getServiceReference(dto.serviceId);
final StringBuilder sb = new StringBuilder();
if ( dto.name != null ) {
sb.append(dto.name);
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java?rev=1779044&r1=1779043&r2=1779044&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java Mon Jan 16 15:33:09 2017
@@ -22,6 +22,9 @@ import static org.junit.Assert.assertFal
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
@@ -46,7 +49,7 @@ public class FactoryPreconditionsTest {
assertTrue(conditions.checkPreconditions(null, null));
conditions = new FactoryPreconditions();
- conditions.activate(null, new String[0], new String[0], tracker);
+ conditions.activate(null, Collections.<String> emptySet(), Collections.<String> emptySet(), tracker);
assertTrue(conditions.checkPreconditions(null, null));
}
@@ -106,7 +109,7 @@ public class FactoryPreconditionsTest {
Mockito.when(tracker.getResourceProviderStorage()).thenReturn(storage);
FactoryPreconditions conditions = new FactoryPreconditions();
- conditions.activate(null, new String[] {"pid1", "pid3"}, null, tracker);
+ conditions.activate(null, new HashSet<>(Arrays.asList("pid1", "pid3")), null, tracker);
final List<ResourceProviderHandler> handlers1 = getResourceProviderHandlers(new String[] {"pid2"});
Mockito.when(storage.getAllHandlers()).thenReturn(handlers1);
@@ -127,7 +130,7 @@ public class FactoryPreconditionsTest {
Mockito.when(tracker.getResourceProviderStorage()).thenReturn(storage);
FactoryPreconditions conditions = new FactoryPreconditions();
- conditions.activate(null, null, new String[] {"n1", "n2"}, tracker);
+ conditions.activate(null, null,new HashSet<>(Arrays.asList("n1", "n2")), tracker);
final List<ResourceProviderHandler> handlers1 = getResourceProviderHandlersWithNames(new String[] {"n2"});
Mockito.when(storage.getAllHandlers()).thenReturn(handlers1);
@@ -148,7 +151,7 @@ public class FactoryPreconditionsTest {
Mockito.when(tracker.getResourceProviderStorage()).thenReturn(storage);
FactoryPreconditions conditions = new FactoryPreconditions();
- conditions.activate(null, new String[] {"pid1", "pid3"}, null, tracker);
+ conditions.activate(null, new HashSet<>(Arrays.asList("pid1", "pid3")), null, tracker);
final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlers(new String[] {"pid1", "pid2", "pid3"});
Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);