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