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]>.
