This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch SLING-9867
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-extension-apiregions.git
The following commit(s) were added to refs/heads/SLING-9867 by this push:
new baae44b Update javadocs and add conf validation tests
baae44b is described below
commit baae44ba617d3bd50eb35ece6ec25010b137f45b
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Thu Nov 12 06:25:45 2020 +0100
Update javadocs and add conf validation tests
---
.../apiregions/api/config/AttributeableEntity.java | 11 ++-
.../apiregions/api/config/ConfigurableEntity.java | 5 +-
.../apiregions/api/config/ConfigurationApi.java | 23 +++---
.../api/config/ConfigurationDescription.java | 3 +
.../apiregions/api/config/DescribableEntity.java | 21 +++---
.../config/FactoryConfigurationDescription.java | 15 +++-
.../api/config/FrameworkPropertyDescription.java | 2 +-
.../extension/apiregions/api/config/Operation.java | 4 +-
.../extension/apiregions/api/config/Option.java | 7 +-
.../apiregions/api/config/PropertyDescription.java | 9 ++-
.../extension/apiregions/api/config/Range.java | 9 ++-
.../validation/ConfigurationValidationResult.java | 2 +-
.../config/validation/FeatureValidationResult.java | 2 +-
.../validation/ConfigurationValidatorTest.java | 82 ++++++++++++++++++++++
14 files changed, 156 insertions(+), 39 deletions(-)
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/AttributeableEntity.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/AttributeableEntity.java
index 7ca4b67..31210f8 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/AttributeableEntity.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/AttributeableEntity.java
@@ -28,13 +28,16 @@ import javax.json.JsonValue;
import org.apache.felix.cm.json.Configurations;
+/**
+ * Abstract class used by all entities which allow additional attributes to be
stored.
+ */
public abstract class AttributeableEntity {
/** The additional attributes */
private final Map<String, JsonValue> attributes = new LinkedHashMap<>();
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
this.attributes.clear();
@@ -54,6 +57,7 @@ public abstract class AttributeableEntity {
/**
* Extract the metadata from the JSON object.
* This method first calls {@link #clear()}
+ *
* @param jsonObj The JSON Object
* @throws IOException If JSON parsing fails
*/
@@ -70,7 +74,7 @@ public abstract class AttributeableEntity {
/**
* Get the attributes
- * @return The attributes
+ * @return Mutable map of attributes, by attribute name
*/
public Map<String, JsonValue> getAttributes() {
return this.attributes;
@@ -139,6 +143,9 @@ public abstract class AttributeableEntity {
return null;
}
+ /**
+ * Helper method to set a string value
+ */
void setString(final JsonObjectBuilder builder, final String
attributeName, final String value) {
if ( value != null ) {
builder.add(attributeName, value);
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurableEntity.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurableEntity.java
index 73513fb..6f25d4d 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurableEntity.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurableEntity.java
@@ -35,7 +35,7 @@ public abstract class ConfigurableEntity extends
DescribableEntity {
private final Map<String, PropertyDescription> properties = new
LinkedHashMap<>();
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -45,6 +45,7 @@ public abstract class ConfigurableEntity extends
DescribableEntity {
/**
* Extract the metadata from the JSON object.
* This method first calls {@link #clear()}
+ *
* @param jsonObj The JSON Object
* @throws IOException If JSON parsing fails
*/
@@ -66,7 +67,7 @@ public abstract class ConfigurableEntity extends
DescribableEntity {
/**
* Get the properties
- * @return The properties
+ * @return Mutable map of properties by property name
*/
public Map<String, PropertyDescription> getPropertyDescriptions() {
return this.properties;
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
index 558a0fe..33599d8 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationApi.java
@@ -59,7 +59,7 @@ public class ConfigurationApi extends AttributeableEntity {
* Get the configuration api from the extension.
*
* @param ext The extension
- * @return The configuration api or {@code null}.
+ * @return The configuration api or {@code null} if the extension is
{@code null}.
* @throws IllegalArgumentException If the extension is wrongly formatted
*/
public static ConfigurationApi getConfigurationApi(final Extension ext) {
@@ -97,7 +97,7 @@ public class ConfigurationApi extends AttributeableEntity {
private final List<String> internalFrameworkProperties = new ArrayList<>();
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -111,7 +111,8 @@ public class ConfigurationApi extends AttributeableEntity {
/**
* Extract the metadata from the JSON object.
- * This method first calls {@link #clear()}
+ * This method first calls {@link #clear()}.
+ *
* @param jsonObj The JSON Object
* @throws IOException If JSON parsing fails
*/
@@ -174,7 +175,7 @@ public class ConfigurationApi extends AttributeableEntity {
/**
* Get the configuration descriptions
- * @return the configuration descriptions
+ * @return Mutable map of configuration descriptions by pid
*/
public Map<String, ConfigurationDescription>
getConfigurationDescriptions() {
return configurations;
@@ -182,7 +183,7 @@ public class ConfigurationApi extends AttributeableEntity {
/**
* Get the factory configuration descriptions
- * @return the factories
+ * @return Mutable map of factory descriptions by factory pid
*/
public Map<String, FactoryConfigurationDescription>
getFactoryConfigurationDescriptions() {
return factories;
@@ -190,23 +191,23 @@ public class ConfigurationApi extends AttributeableEntity
{
/**
* Get the framework properties
- * @return the frameworkProperties
+ * @return Mutable map of framework properties
*/
public Map<String, FrameworkPropertyDescription>
getFrameworkPropertyDescriptions() {
return frameworkProperties;
}
/**
- * Get the internal configuration names
- * @return the internalConfigurations
+ * Get the internal configuration pids
+ * @return Mutable list of internal configuration pids
*/
public List<String> getInternalConfigurations() {
return internalConfigurations;
}
/**
- * Get the internal factory names
- * @return the internalFactories
+ * Get the internal factory pids
+ * @return Mutable list of internal factory configuration pids
*/
public List<String> getInternalFactoryConfigurations() {
return internalFactories;
@@ -214,7 +215,7 @@ public class ConfigurationApi extends AttributeableEntity {
/**
* Get the internal framework property names
- * @return the internalFrameworkProperties
+ * @return Mutable list of internal framework property names
*/
public List<String> getInternalFrameworkProperties() {
return internalFrameworkProperties;
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationDescription.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationDescription.java
index e9184f2..0e2c7e9 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationDescription.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/ConfigurationDescription.java
@@ -16,6 +16,9 @@
*/
package org.apache.sling.feature.extension.apiregions.api.config;
+/**
+ * A description of an OSGi configuration
+ */
public class ConfigurationDescription extends ConfigurableEntity {
}
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/DescribableEntity.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/DescribableEntity.java
index 0f36d8a..b2617d4 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/DescribableEntity.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/DescribableEntity.java
@@ -22,6 +22,10 @@ import javax.json.JsonException;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
+/**
+ * Abstract class for all describable entities, having an optional title,
+ * description and deprecation info.
+ */
public abstract class DescribableEntity extends AttributeableEntity {
/** The title */
@@ -34,7 +38,7 @@ public abstract class DescribableEntity extends
AttributeableEntity {
private String deprecated;
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -46,6 +50,7 @@ public abstract class DescribableEntity extends
AttributeableEntity {
/**
* Extract the metadata from the JSON object.
* This method first calls {@link #clear()}
+ *
* @param jsonObj The JSON Object
* @throws IOException If JSON parsing fails
*/
@@ -62,7 +67,7 @@ public abstract class DescribableEntity extends
AttributeableEntity {
/**
* Get the title
- * @return the title
+ * @return The title or {@code null}
*/
public String getTitle() {
return title;
@@ -72,13 +77,13 @@ public abstract class DescribableEntity extends
AttributeableEntity {
* Set the title
* @param title the title to set
*/
- public void setTitle(String title) {
+ public void setTitle(final String title) {
this.title = title;
}
/**
* Get the description
- * @return the description
+ * @return the description or {@code null}
*/
public String getDescription() {
return description;
@@ -88,13 +93,13 @@ public abstract class DescribableEntity extends
AttributeableEntity {
* Set the description
* @param description the description to set
*/
- public void setDescription(String description) {
+ public void setDescription(final String description) {
this.description = description;
}
/**
* Get the deprecation text
- * @return the deprecated
+ * @return the deprecation text or {@code null}
*/
public String getDeprecated() {
return deprecated;
@@ -102,9 +107,9 @@ public abstract class DescribableEntity extends
AttributeableEntity {
/**
* Set the deprecation text
- * @param deprecated the deprecated to set
+ * @param deprecated the deprecation text to set
*/
- public void setDeprecated(String deprecated) {
+ public void setDeprecated(final String deprecated) {
this.deprecated = deprecated;
}
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FactoryConfigurationDescription.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FactoryConfigurationDescription.java
index 6ce6936..9c8d7fa 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FactoryConfigurationDescription.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FactoryConfigurationDescription.java
@@ -29,6 +29,9 @@ import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonValue;
+/**
+ * Description of an OSGi factory configuration
+ */
public class FactoryConfigurationDescription extends ConfigurableEntity {
private final Set<Operation> operations = new HashSet<>();
@@ -45,7 +48,7 @@ public class FactoryConfigurationDescription extends
ConfigurableEntity {
}
/**
- * Clear the object and remove all metadata
+ * Clear the object and set the defaults
*/
public void clear() {
super.clear();
@@ -56,6 +59,7 @@ public class FactoryConfigurationDescription extends
ConfigurableEntity {
/**
* Extract the metadata from the JSON object.
* This method first calls {@link #clear()}
+ *
* @param jsonObj The JSON Object
* @throws IOException If JSON parsing fails
*/
@@ -70,6 +74,9 @@ public class FactoryConfigurationDescription extends
ConfigurableEntity {
final String v = getString(innerVal).toUpperCase();
this.getOperations().add(Operation.valueOf(v));
}
+ if ( this.getOperations().isEmpty() ) {
+ throw new IOException("Operations must not be empty");
+ }
}
val =
this.getAttributes().remove(InternalConstants.KEY_INTERNAL_NAMES);
@@ -85,14 +92,16 @@ public class FactoryConfigurationDescription extends
ConfigurableEntity {
}
/**
- * @return the operations
+ * Get the operations
+ * @return Mutable set of operations
*/
public Set<Operation> getOperations() {
return operations;
}
/**
- * @return the internalNames
+ * Get the internal factory configuration name
+ * @return Mutable list of internal names
*/
public List<String> getInternalNames() {
return internalNames;
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FrameworkPropertyDescription.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FrameworkPropertyDescription.java
index 3e1e75f..df9a3b0 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FrameworkPropertyDescription.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/FrameworkPropertyDescription.java
@@ -17,7 +17,7 @@
package org.apache.sling.feature.extension.apiregions.api.config;
/**
- * A framework property
+ * A framework property description
*/
public class FrameworkPropertyDescription extends PropertyDescription {
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Operation.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Operation.java
index 308143b..312c2b2 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Operation.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Operation.java
@@ -21,6 +21,6 @@ package
org.apache.sling.feature.extension.apiregions.api.config;
*/
public enum Operation {
- CREATE,
- UPDATE
+ CREATE, // allowed to create a factory configuration
+ UPDATE // allowed to update a factory configuration
}
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Option.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Option.java
index 4efeecf..41d2c23 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Option.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Option.java
@@ -22,13 +22,16 @@ import javax.json.JsonException;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
+/**
+ * Option for a property value
+ */
public class Option extends DescribableEntity {
/** The value for the option */
private String value;
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -52,7 +55,7 @@ public class Option extends DescribableEntity {
/**
* Get the value for the option
- * @return the value
+ * @return the value or {@code null}
*/
public String getValue() {
return value;
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
index 571c9c9..4323937 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
@@ -60,6 +60,9 @@ public class PropertyDescription extends DescribableEntity {
/** Required? */
private boolean required;
+ /**
+ * Create a new description
+ */
public PropertyDescription() {
this.setDefaults();
}
@@ -71,7 +74,7 @@ public class PropertyDescription extends DescribableEntity {
}
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -222,7 +225,7 @@ public class PropertyDescription extends DescribableEntity {
/**
* Get the variable
- * @return the variable
+ * @return the variable or {@code null}
*/
public String getVariable() {
return variable;
@@ -302,7 +305,7 @@ public class PropertyDescription extends DescribableEntity {
/**
* Get the regex
- * @return the regex
+ * @return the regex or {@code null}
*/
public String getRegex() {
return pattern == null ? null : pattern.pattern();
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Range.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Range.java
index 3acac02..f5daf55 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Range.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/Range.java
@@ -24,6 +24,9 @@ import javax.json.JsonObjectBuilder;
import org.apache.felix.cm.json.Configurations;
+/**
+ * A numerical value range
+ */
public class Range extends AttributeableEntity {
/** The optional min value */
@@ -33,7 +36,7 @@ public class Range extends AttributeableEntity {
private Number max;
/**
- * Clear the object and remove all metadata
+ * Clear the object and reset to defaults
*/
public void clear() {
super.clear();
@@ -59,7 +62,7 @@ public class Range extends AttributeableEntity {
/**
* Get the min value
- * @return the min
+ * @return the min or {@code null}
*/
public Number getMin() {
return min;
@@ -75,7 +78,7 @@ public class Range extends AttributeableEntity {
/**
* Get the max value
- * @return the max
+ * @return the max or {@code null}
*/
public Number getMax() {
return max;
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidationResult.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidationResult.java
index 8765347..f1cb9f4 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidationResult.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidationResult.java
@@ -33,7 +33,7 @@ public class ConfigurationValidationResult {
boolean valid = globalErrors.isEmpty();
if ( valid ) {
for(final PropertyValidationResult r :
this.propertyResults.values()) {
- if ( r.isValid() ) {
+ if ( !r.isValid() ) {
valid = false;
break;
}
diff --git
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidationResult.java
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidationResult.java
index 257df68..1e49dd0 100644
---
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidationResult.java
+++
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidationResult.java
@@ -26,7 +26,7 @@ public class FeatureValidationResult {
public boolean isValid() {
boolean valid = true;
for(final ConfigurationValidationResult r :
this.configurationResults.values()) {
- if ( r.isValid() ) {
+ if ( !r.isValid() ) {
valid = false;
break;
}
diff --git
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
index 1a451b2..8620daf 100644
---
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
+++
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
@@ -18,11 +18,15 @@ package
org.apache.sling.feature.extension.apiregions.api.config.validation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import org.apache.sling.feature.Configuration;
import
org.apache.sling.feature.extension.apiregions.api.config.ConfigurationDescription;
import
org.apache.sling.feature.extension.apiregions.api.config.FactoryConfigurationDescription;
+import
org.apache.sling.feature.extension.apiregions.api.config.PropertyDescription;
+import org.apache.sling.feature.extension.apiregions.api.config.PropertyType;
import org.junit.Test;
+import org.osgi.framework.Constants;
public class ConfigurationValidatorTest {
@@ -45,4 +49,82 @@ public class ConfigurationValidatorTest {
assertFalse(result.isValid());
assertEquals(1, result.getGlobalErrors().size());
}
+
+ @Test public void testDeprecated() {
+ final Configuration cfg = new Configuration("org.apache");
+ final ConfigurationDescription cd = new ConfigurationDescription();
+
+ ConfigurationValidationResult result = validator.validate(cd, cfg);
+ assertTrue(result.isValid());
+ assertTrue(result.getWarnings().isEmpty());
+
+ cd.setDeprecated("this is deprecated");
+ result = validator.validate(cd, cfg);
+ assertTrue(result.isValid());
+ assertFalse(result.getWarnings().isEmpty());
+ assertEquals("this is deprecated", result.getWarnings().get(0));
+ }
+
+ @Test public void testServiceRanking() {
+ final Configuration cfg = new Configuration("org.apache");
+ final ConfigurationDescription cd = new ConfigurationDescription();
+ cfg.getProperties().put(Constants.SERVICE_RANKING, 5);
+
+ ConfigurationValidationResult result = validator.validate(cd, cfg);
+ assertTrue(result.isValid());
+
+ cfg.getProperties().put(Constants.SERVICE_RANKING, "5");
+ result = validator.validate(cd, cfg);
+ assertFalse(result.isValid());
+ }
+
+ @Test public void testAllowedProperties() {
+ final Configuration cfg = new Configuration("org.apache");
+ final ConfigurationDescription cd = new ConfigurationDescription();
+ cfg.getProperties().put(Constants.SERVICE_DESCRIPTION, "desc");
+ cfg.getProperties().put(Constants.SERVICE_VENDOR, "vendor");
+
+ ConfigurationValidationResult result = validator.validate(cd, cfg);
+ assertTrue(result.isValid());
+ }
+
+ @Test public void testAdditionalProperties() {
+ final Configuration cfg = new Configuration("org.apache");
+ cfg.getProperties().put("a", "desc");
+
+ final ConfigurationDescription cd = new ConfigurationDescription();
+ final PropertyDescription prop = new PropertyDescription();
+ cd.getPropertyDescriptions().put("a", prop);
+
+ ConfigurationValidationResult result = validator.validate(cd, cfg);
+ assertTrue(result.isValid());
+ assertEquals(1, result.getPropertyResults().size());
+ assertTrue(result.getPropertyResults().get("a").isValid());
+
+ cfg.getProperties().put("b", "vendor");
+ result = validator.validate(cd, cfg);
+ assertFalse(result.isValid());
+ assertEquals(2, result.getPropertyResults().size());
+ assertTrue(result.getPropertyResults().get("a").isValid());
+ assertFalse(result.getPropertyResults().get("b").isValid());
+ }
+
+ @Test public void testInvalidProperty() {
+ final Configuration cfg = new Configuration("org.apache");
+ cfg.getProperties().put("a", "desc");
+ cfg.getProperties().put("b", "vendor");
+
+ final ConfigurationDescription cd = new ConfigurationDescription();
+ final PropertyDescription propA = new PropertyDescription();
+ cd.getPropertyDescriptions().put("a", propA);
+ final PropertyDescription propB = new PropertyDescription();
+ propB.setType(PropertyType.INTEGER);
+ cd.getPropertyDescriptions().put("b", propB);
+
+ ConfigurationValidationResult result = validator.validate(cd, cfg);
+ assertFalse(result.isValid());
+ assertEquals(2, result.getPropertyResults().size());
+ assertTrue(result.getPropertyResults().get("a").isValid());
+ assertFalse(result.getPropertyResults().get("b").isValid());
+ }
}