Author: sseifert
Date: Thu Dec  8 20:48:34 2016
New Revision: 1773298

URL: http://svn.apache.org/viewvc?rev=1773298&view=rev
Log:
SLING-6367 validate configuration collection item names

Modified:
    
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
    
sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java

Modified: 
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java?rev=1773298&r1=1773297&r2=1773298&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
 Thu Dec  8 20:48:34 2016
@@ -19,11 +19,15 @@
 package org.apache.sling.caconfig.spi;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
+import org.apache.commons.lang3.StringUtils;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -31,6 +35,8 @@ import org.osgi.annotation.versioning.Pr
  */
 @ProviderType
 public final class ConfigurationCollectionPersistData {
+    
+    private static final Pattern ITEM_NAME_PATTERN = 
Pattern.compile("^[a-zA-Z0-9_-]+$");
 
     private final Collection<ConfigurationPersistData> items;
     private Map<String,Object> properties;
@@ -39,8 +45,26 @@ public final class ConfigurationCollecti
      * @param collection Collection of configuration collection items
      */
     public ConfigurationCollectionPersistData(@Nonnull 
Collection<ConfigurationPersistData> items) {
+        validateItems(items);
         this.items = items;
     }
+    
+    private void validateItems(Collection<ConfigurationPersistData> items) {
+        // ensure unique and valid key names        
+        Set<String> keyNames = new HashSet<>();
+        for (ConfigurationPersistData item : items) {
+            if (StringUtils.isBlank(item.getCollectionItemName())) {
+                throw new ConfigurationPersistenceException("Collection item 
name is missing.");
+            }
+            if 
(!ITEM_NAME_PATTERN.matcher(item.getCollectionItemName()).matches()) {
+                throw new ConfigurationPersistenceException("Invalid 
collection item name: " + item.getCollectionItemName());
+            }
+            if (keyNames.contains(item.getCollectionItemName())) {
+                throw new ConfigurationPersistenceException("Duplicate 
collection item name: " + item.getCollectionItemName());
+            }
+            keyNames.add(item.getCollectionItemName());
+        }
+    }
 
     /**
      * @return Collection of configuration collection items

Modified: 
sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java?rev=1773298&r1=1773297&r2=1773298&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
 Thu Dec  8 20:48:34 2016
@@ -28,16 +28,22 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 @RunWith(MockitoJUnitRunner.class)
 public class ConfigurationCollectionPersistDataTest {
 
     @Mock
-    private Collection<ConfigurationPersistData> items;
-    @Mock
     private Map<String,Object> props;
     
     @Test
     public void testProperties() {
+        Collection<ConfigurationPersistData> items = ImmutableList.of(
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item1"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item2"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item3"));
+
         ConfigurationCollectionPersistData underTest = new 
ConfigurationCollectionPersistData(items)
                 .properties(props);
         
@@ -45,4 +51,34 @@ public class ConfigurationCollectionPers
         assertSame(props, underTest.getProperties());
     }
 
+    @Test(expected=ConfigurationPersistenceException.class)
+    public void testItemsDuplicateKeys() {
+        Collection<ConfigurationPersistData> itemList = ImmutableList.of(
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item1"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item2"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item1"));
+
+        new ConfigurationCollectionPersistData(itemList);
+    }
+
+    @Test(expected=ConfigurationPersistenceException.class)
+    public void testItemsMissingItemName() {
+        Collection<ConfigurationPersistData> itemList = ImmutableList.of(
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item1"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item2"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()));
+
+        new ConfigurationCollectionPersistData(itemList);
+    }
+
+    @Test(expected=ConfigurationPersistenceException.class)
+    public void testItemsInvalidItemNAme() {
+        Collection<ConfigurationPersistData> itemList = ImmutableList.of(
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item1"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item2"),
+                new ConfigurationPersistData(ImmutableMap.<String, 
Object>of()).collectionItemName("item #1"));
+
+        new ConfigurationCollectionPersistData(itemList);
+    }
+
 }


Reply via email to