This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.caconfig.spi-1.2.0
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-caconfig-spi.git

commit c20d62a203e056ebe5bdbe23fc77a79b5678628d
Author: Stefan Seifert <[email protected]>
AuthorDate: Thu Dec 8 20:48:34 2016 +0000

    SLING-6367 validate configuration collection item names
    
    git-svn-id: 
https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/contextaware-config/spi@1773298
 13f79535-47bb-0310-9956-ffa450edef68
---
 .../spi/ConfigurationCollectionPersistData.java    | 24 +++++++++++++
 .../ConfigurationCollectionPersistDataTest.java    | 40 ++++++++++++++++++++--
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
 
b/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
index dfbfa82..800b1ce 100644
--- 
a/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
+++ 
b/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
@@ -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.ProviderType;
  */
 @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 ConfigurationCollectionPersistData {
      * @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
diff --git 
a/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
 
b/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
index 730bb7c..f62382a 100644
--- 
a/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
+++ 
b/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java
@@ -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 ConfigurationCollectionPersistDataTest {
         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);
+    }
+
 }

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to