Author: sseifert
Date: Wed Dec 7 21:36:09 2016
New Revision: 1773149
URL: http://svn.apache.org/viewvc?rev=1773149&view=rev
Log:
SLING-6374 Context-Aware Config: Allow to control property order in annotation
classes
Modified:
sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/caconfig/annotation/Property.java
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParser.java
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/MetadataSimpleConfig.java
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParserTest.java
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/metadata/PropertyMetadata.java
Modified:
sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/caconfig/annotation/Property.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/caconfig/annotation/Property.java?rev=1773149&r1=1773148&r2=1773149&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/caconfig/annotation/Property.java
(original)
+++
sling/trunk/contrib/extensions/contextaware-config/api/src/main/java/org/apache/sling/caconfig/annotation/Property.java
Wed Dec 7 21:36:09 2016
@@ -45,4 +45,9 @@ public @interface Property {
*/
String[] property() default {};
+ /**
+ * @return Number to control property order in configuration editor.
+ */
+ int order() default 0;
+
}
Modified:
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParser.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParser.java?rev=1773149&r1=1773148&r2=1773149&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParser.java
(original)
+++
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParser.java
Wed Dec 7 21:36:09 2016
@@ -147,12 +147,17 @@ public final class AnnotationClassParser
}
private static Collection<PropertyMetadata<?>>
buildConfigurationMetadata_PropertyMetadata(Class<?> clazz) {
+ // sort properties by order number, or alternatively by label, name
SortedSet<PropertyMetadata<?>> propertyMetadataSet = new TreeSet<>(new
Comparator<PropertyMetadata<?>>() {
@Override
public int compare(PropertyMetadata<?> o1, PropertyMetadata<?> o2)
{
- String sort1 = StringUtils.defaultString(o1.getLabel(),
o1.getName());
- String sort2 = StringUtils.defaultString(o2.getLabel(),
o2.getName());
- return sort1.compareTo(sort2);
+ int compare = Integer.compare(o1.getOrder(), o2.getOrder());
+ if (compare == 0) {
+ String sort1 = StringUtils.defaultString(o1.getLabel(),
o1.getName());
+ String sort2 = StringUtils.defaultString(o2.getLabel(),
o2.getName());
+ compare = sort1.compareTo(sort2);
+ }
+ return compare;
}
});
Method[] propertyMethods = clazz.getDeclaredMethods();
@@ -187,7 +192,8 @@ public final class AnnotationClassParser
if (propertyAnnotation != null) {
propertyMetadata.label(emptyToNull(propertyAnnotation.label()))
.description(emptyToNull(propertyAnnotation.description()))
- .properties(propsArrayToMap(propertyAnnotation.property()));
+ .properties(propsArrayToMap(propertyAnnotation.property()))
+ .order(propertyAnnotation.order());
}
else {
Map<String,String> emptyMap = Collections.emptyMap();
Modified:
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/MetadataSimpleConfig.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/MetadataSimpleConfig.java?rev=1773149&r1=1773148&r2=1773149&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/MetadataSimpleConfig.java
(original)
+++
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/MetadataSimpleConfig.java
Wed Dec 7 21:36:09 2016
@@ -30,12 +30,13 @@ import org.apache.sling.caconfig.annotat
})
public @interface MetadataSimpleConfig {
- @Property(label = "String Param", description = "Enter strings here.",
property = "p1=v1")
+ @Property(label = "String Param", description = "Enter strings here.",
property = "p1=v1", order = 1)
String stringParam();
- @Property(label = "Integer Param")
+ @Property(label = "Integer Param", order = 2)
int intParam() default 5;
+ @Property(order = 3)
boolean boolParam();
}
Modified:
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParserTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParserTest.java?rev=1773149&r1=1773148&r2=1773149&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParserTest.java
(original)
+++
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassParserTest.java
Wed Dec 7 21:36:09 2016
@@ -29,6 +29,7 @@ import static org.junit.Assert.assertTru
import static org.junit.Assert.fail;
import java.util.Collection;
+import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.caconfig.example.AllTypesConfig;
@@ -41,6 +42,7 @@ import org.apache.sling.caconfig.spi.met
import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
import org.junit.Test;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
public class AnnotationClassParserTest {
@@ -84,32 +86,26 @@ public class AnnotationClassParserTest {
assertEquals(ImmutableMap.of("param1", "value1", "param2", "123"),
metadata.getProperties());
assertFalse(metadata.isCollection());
- Collection<PropertyMetadata<?>> propertyMetadataList =
metadata.getPropertyMetadata().values();
+ List<PropertyMetadata<?>> propertyMetadataList =
ImmutableList.copyOf(metadata.getPropertyMetadata().values());
assertEquals(3, propertyMetadataList.size());
- for (PropertyMetadata<?> propertyMetadata : propertyMetadataList) {
- if (StringUtils.equals(propertyMetadata.getName(), "stringParam"))
{
- assertEquals("String Param", propertyMetadata.getLabel());
- assertEquals("Enter strings here.",
propertyMetadata.getDescription());
- assertEquals(ImmutableMap.of("p1", "v1"),
propertyMetadata.getProperties());
- assertNull(propertyMetadata.getDefaultValue());
- }
- else if (StringUtils.equals(propertyMetadata.getName(),
"intParam")) {
- assertEquals("Integer Param", propertyMetadata.getLabel());
- assertNull(propertyMetadata.getDescription());
- assertTrue(propertyMetadata.getProperties().isEmpty());
- assertEquals(5, propertyMetadata.getDefaultValue());
- }
- else if (StringUtils.equals(propertyMetadata.getName(),
"boolParam")) {
- assertNull(propertyMetadata.getLabel());
- assertNull(propertyMetadata.getDescription());
- assertTrue(propertyMetadata.getProperties().isEmpty());
- assertNull(propertyMetadata.getDefaultValue());
- }
- else {
- fail("Unexpected property name: " +
propertyMetadata.getName());
- }
- }
+ PropertyMetadata<?> stringParam = propertyMetadataList.get(0);
+ assertEquals("String Param", stringParam.getLabel());
+ assertEquals("Enter strings here.", stringParam.getDescription());
+ assertEquals(ImmutableMap.of("p1", "v1"), stringParam.getProperties());
+ assertNull(stringParam.getDefaultValue());
+
+ PropertyMetadata<?> intParam = propertyMetadataList.get(1);
+ assertEquals("Integer Param", intParam.getLabel());
+ assertNull(intParam.getDescription());
+ assertTrue(intParam.getProperties().isEmpty());
+ assertEquals(5, intParam.getDefaultValue());
+
+ PropertyMetadata<?> boolParam = propertyMetadataList.get(2);
+ assertNull(boolParam.getLabel());
+ assertNull(boolParam.getDescription());
+ assertTrue(boolParam.getProperties().isEmpty());
+ assertNull(boolParam.getDefaultValue());
}
@Test
Modified:
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/metadata/PropertyMetadata.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/metadata/PropertyMetadata.java?rev=1773149&r1=1773148&r2=1773149&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/metadata/PropertyMetadata.java
(original)
+++
sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/metadata/PropertyMetadata.java
Wed Dec 7 21:36:09 2016
@@ -53,6 +53,7 @@ public final class PropertyMetadata<T> e
private final Class<T> type;
private T defaultValue;
private ConfigurationMetadata configurationMetadata;
+ private int order;
/**
* @param name Property name
@@ -151,6 +152,22 @@ public final class PropertyMetadata<T> e
}
/**
+ * @return Number to control property order in configuration editor.
+ */
+ public int getOrder() {
+ return order;
+ }
+
+ /**
+ * @param value Number to control property order in configuration editor.
+ * @return this
+ */
+ public PropertyMetadata<T> order(int value) {
+ this.order = value;
+ return this;
+ }
+
+ /**
* @return Metadata for nested configuration
*/
public ConfigurationMetadata getConfigurationMetadata() {
@@ -174,7 +191,7 @@ public final class PropertyMetadata<T> e
return configurationMetadata != null
&& (this.type.equals(ConfigurationMetadata.class) ||
this.type.equals(ConfigurationMetadata[].class));
}
-
+
@Override
public String toString() {
return getName() + "[" + this.type.getSimpleName() + "]";