You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2016/09/01 12:29:30 UTC

svn commit: r1758767 - in /sling/trunk/contrib/extensions/contextaware-config: api/src/main/java/org/apache/sling/contextaware/config/resource/ impl/src/main/java/org/apache/sling/contextaware/config/impl/ impl/src/main/java/org/apache/sling/contextawa...

Author: sseifert
Date: Thu Sep  1 12:29:30 2016
New Revision: 1758767

URL: http://svn.apache.org/viewvc?rev=1758767&view=rev
Log:
SLING-6024 Context-Aware Config: Introduce "bucket name" parameter in ConfigurationResourceResolver

Modified:
    sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/contextaware/config/resource/ConfigurationResourceResolver.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/impl/ConfigurationBuilderImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/WebConsolePlugin.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java

Modified: sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/contextaware/config/resource/ConfigurationResourceResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/contextaware/config/resource/ConfigurationResourceResolver.java?rev=1758767&r1=1758766&r2=1758767&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/contextaware/config/resource/ConfigurationResourceResolver.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/contextaware/config/resource/ConfigurationResourceResolver.java Thu Sep  1 12:29:30 2016
@@ -39,18 +39,24 @@ public interface ConfigurationResourceRe
      * Get a context-specific singleton configuration resource defined by the given configuration name.
      *
      * @param resource Context resource to fetch configuration for
+     * @param bucketName Configuration "bucket" name. Each high-level configuration resolver should store 
+     *     it's configuration data grouped in a child resource of the configuration resource. This is what
+     *     we call a "bucket", and the resource name is specified with this parameter.
      * @param configName Configuration name or relative path.
      * @return Configuration resource or {@code null}.
      */
-    @CheckForNull Resource getResource(@Nonnull Resource resource, @Nonnull String configName);
+    @CheckForNull Resource getResource(@Nonnull Resource resource, @Nonnull String bucketName, @Nonnull String configName);
 
     /**
      * Get a collection of context-specific configuration resources defined by the given configuration name.
      * @param resource Context resource to fetch configuration for
+     * @param bucketName Configuration "bucket" name. Each high-level configuration resolver should store 
+     *     it's configuration data grouped in a child resource of the configuration resource. This is what
+     *     we call a "bucket", and the resource name is specified with this parameter.
      * @param configName Configuration name or relative path.
      * @return Collection of configuration resources, the collection might be empty.
      */
-    @Nonnull Collection<Resource> getResourceCollection(@Nonnull Resource resource, @Nonnull String configName);
+    @Nonnull Collection<Resource> getResourceCollection(@Nonnull Resource resource, @Nonnull String bucketName, @Nonnull String configName);
 
     /**
      * Get the inner-most context path (deepest path) returned by {@link #getAllContextPaths(Resource)}.

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/impl/ConfigurationBuilderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/impl/ConfigurationBuilderImpl.java?rev=1758767&r1=1758766&r2=1758767&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/impl/ConfigurationBuilderImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/impl/ConfigurationBuilderImpl.java Thu Sep  1 12:29:30 2016
@@ -67,15 +67,13 @@ class ConfigurationBuilderImpl implement
     }
 
     /**
-     * Configurations are stored below a "sling:configs" child node in the config resource.
+     * Validate the configuration name.
      * @param name Configuration name or relative path
-     * @return Full relative path under configuration resource
      */
-    private String getConfigRelativePath(String name) {
+    private void validateConfigurationName(String name) {
         if (name == null) {
             throw new ConfigurationResolveException("Configuration name is required.");
         }
-        return CONFIGS_PARENT_NAME + "/" + name;
     }
 
     /**
@@ -96,8 +94,8 @@ class ConfigurationBuilderImpl implement
     private <T> T getConfigResource(String name, Class<T> clazz, Converter<T> converter) {
         Resource configResource = null;
         if (this.contentResource != null) {
-            String path = getConfigRelativePath(name);
-            configResource = this.configurationResourceResolver.getResource(this.contentResource, path);
+            validateConfigurationName(name);
+            configResource = this.configurationResourceResolver.getResource(this.contentResource, CONFIGS_PARENT_NAME, name);
         }
         return converter.convert(configResource, clazz);
     }
@@ -111,9 +109,9 @@ class ConfigurationBuilderImpl implement
      */
     private <T> Collection<T> getConfigResourceCollection(String name, Class<T> clazz, Converter<T> converter) {
         if (this.contentResource != null) {
-           String path = getConfigRelativePath(name);
+           validateConfigurationName(name);
            final Collection<T> result = new ArrayList<>();
-           for(final Resource rsrc : this.configurationResourceResolver.getResourceCollection(this.contentResource, path)) {
+           for(final Resource rsrc : this.configurationResourceResolver.getResourceCollection(this.contentResource, CONFIGS_PARENT_NAME, name)) {
                final T obj = converter.convert(rsrc, clazz);
                if ( obj != null ) {
                    result.add(obj);

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImpl.java?rev=1758767&r1=1758766&r2=1758767&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImpl.java Thu Sep  1 12:29:30 2016
@@ -196,10 +196,11 @@ public class ConfigurationResourceResolv
     }
 
     @Override
-    public Resource getResource(final Resource contentResource, final String name) {
-        if (contentResource == null || !checkName(name)) {
+    public Resource getResource(final Resource contentResource, final String bucketName, final String configName) {
+        if (contentResource == null || !checkName(bucketName) || !checkName(configName)) {
             return null;
         }
+        String name = bucketName + "/" + configName;
         logger.debug("Searching {} for resource {}", name, contentResource.getPath());
 
         // strategy: find first item among all configured paths
@@ -221,10 +222,11 @@ public class ConfigurationResourceResolv
     }
 
     @Override
-    public Collection<Resource> getResourceCollection(final Resource contentResource, final String name) {
-        if (contentResource == null || !checkName(name)) {
+    public Collection<Resource> getResourceCollection(final Resource contentResource, final String bucketName, final String configName) {
+        if (contentResource == null || !checkName(bucketName) || !checkName(configName)) {
             return Collections.emptyList();
         }
+        String name = bucketName + "/" + configName;
         if (logger.isTraceEnabled()) {
             logger.trace("- searching for list '{}'", name);
         }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/WebConsolePlugin.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/WebConsolePlugin.java?rev=1758767&r1=1758766&r2=1758767&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/WebConsolePlugin.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/WebConsolePlugin.java Thu Sep  1 12:29:30 2016
@@ -28,6 +28,7 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.sling.api.resource.LoginException;
@@ -140,7 +141,7 @@ public class WebConsolePlugin extends Ab
             tableStart(pw, "Test Configuration Resolution", 2);
             pw.println("<td style='width:20%'>Content Path</td>");
             pw.print("<td><input name='path' value='");
-            pw.print(xssAPI.encodeForHTMLAttr(path));
+            pw.print(xssAPI.encodeForHTMLAttr(StringUtils.defaultString(path)));
             pw.println("' style='width:100%'/>");
             if (resolver != null && content == null) {
                 pw.println("<div>");
@@ -159,7 +160,7 @@ public class WebConsolePlugin extends Ab
 
             pw.println("<td>User</td>");
             pw.println("<td><input name='user' value='");
-            pw.print(xssAPI.encodeForHTMLAttr(user));
+            pw.print(xssAPI.encodeForHTMLAttr(StringUtils.defaultString(user)));
             pw.println("' style='width:50%'/>");
             if (path != null && resolver == null) {
                 pw.println("<div>");
@@ -180,7 +181,8 @@ public class WebConsolePlugin extends Ab
 
             if (content != null) {
 
-                final Resource confRsrc = configResolver.getResource(content, item);
+                // TODO: use sensible bucket name or make it configurable
+                final Resource confRsrc = configResolver.getResource(content, "sling:configs", item);
 
                 tableStart(pw, "Resolved", 2);
                 pw.println("<td style='width:20%'>Code</td>");

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java?rev=1758767&r1=1758766&r2=1758767&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java Thu Sep  1 12:29:30 2016
@@ -35,6 +35,8 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableMap;
 
 public class ConfigurationResourceResolverImplTest {
+    
+    private static final String BUCKET = "sling:test";
 
     @Rule
     public SlingContext context = new SlingContext();
@@ -59,28 +61,37 @@ public class ConfigurationResourceResolv
         site2Page1 = context.create().resource("/content/site2/page1");
 
         // configuration
-        context.create().resource("/libs/test");
-        context.create().resource("/config/site1/test");
-        context.create().resource("/apps/feature/a");
-        context.create().resource("/libs/feature/b");
-        context.create().resource("/config/site1/feature/c");
-        context.create().resource("/config/site2/feature/c");
-        context.create().resource("/config/site2/feature/d");
+        context.create().resource("/libs/sling:test/test");
+        context.create().resource("/config/site1/sling:test/test");
+        context.create().resource("/apps/sling:test/feature/a");
+        context.create().resource("/libs/sling:test/feature/b");
+        context.create().resource("/config/site1/sling:test/feature/c");
+        context.create().resource("/config/site2/sling:test/feature/c");
+        context.create().resource("/config/site2/sling:test/feature/d");
     }
 
     @Test
     public void testGetResource() {
-        assertEquals("/config/site1/test", underTest.getResource(site1Page1, "test").getPath());
-        assertEquals("/libs/test", underTest.getResource(site2Page1, "test").getPath());
+        assertEquals("/config/site1/sling:test/test", underTest.getResource(site1Page1, BUCKET, "test").getPath());
+        assertEquals("/libs/sling:test/test", underTest.getResource(site2Page1, BUCKET, "test").getPath());
     }
 
     @Test
     public void testGetResourceCollection() {
-        Collection<Resource> col1 = underTest.getResourceCollection(site1Page1, "feature");
-        assetResourcePaths(new String[] { "/config/site1/feature/c", "/apps/feature/a", "/libs/feature/b" }, col1);
-
-        Collection<Resource> col2 = underTest.getResourceCollection(site2Page1, "feature");
-        assetResourcePaths(new String[] { "/config/site2/feature/c", "/config/site2/feature/d", "/apps/feature/a", "/libs/feature/b" }, col2);
+        Collection<Resource> col1 = underTest.getResourceCollection(site1Page1, BUCKET, "feature");
+        assetResourcePaths(new String[] {
+                "/config/site1/sling:test/feature/c",
+                "/apps/sling:test/feature/a", 
+                "/libs/sling:test/feature/b" },
+                col1);
+
+        Collection<Resource> col2 = underTest.getResourceCollection(site2Page1, BUCKET, "feature");
+        assetResourcePaths(new String[] {
+                "/config/site2/sling:test/feature/c",
+                "/config/site2/sling:test/feature/d",
+                "/apps/sling:test/feature/a",
+                "/libs/sling:test/feature/b" },
+                col2);
     }
 
     @Test