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