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() + "]";


Reply via email to