This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 943c9a2  JUNEAU-146 Add ranks to @Config annotations.
943c9a2 is described below

commit 943c9a2262ff33d3013f220998433dac05621772
Author: JamesBognar <[email protected]>
AuthorDate: Sun Sep 8 17:09:09 2019 -0400

    JUNEAU-146 Add ranks to @Config annotations.
---
 .../juneau/html/HtmlDocConfigAnnotationTest.java   |  74 +++++++++++++++++++++
 .../apache/juneau/jena/annotation/RdfConfig.java   |   8 +++
 .../org/apache/juneau/PropertyStoreBuilder.java    |   2 +-
 .../org/apache/juneau/annotation/BeanConfig.java   |   8 +++
 .../apache/juneau/csv/annotation/CsvConfig.java    |  11 ++-
 .../apache/juneau/html/annotation/HtmlConfig.java  |   8 +++
 .../juneau/html/annotation/HtmlDocConfig.java      |   8 +++
 .../apache/juneau/jso/annotation/JsoConfig.java    |  11 ++-
 .../apache/juneau/json/annotation/JsonConfig.java  |   8 +++
 .../jsonschema/annotation/JsonSchemaConfig.java    |   8 +++
 .../juneau/msgpack/annotation/MsgPackConfig.java   |   8 +++
 .../juneau/oapi/annotation/OpenApiConfig.java      |  11 ++-
 .../juneau/parser/annotation/ParserConfig.java     |   8 +++
 .../plaintext/annotation/PlainTextConfig.java      |  11 ++-
 .../org/apache/juneau/reflect/AnnotationInfo.java  |  23 +++++--
 .../org/apache/juneau/reflect/AnnotationList.java  |  19 +++++-
 .../serializer/annotation/SerializerConfig.java    |   8 +++
 .../juneau/soap/annotation/SoapXmlConfig.java      |   8 +++
 .../apache/juneau/uon/annotation/UonConfig.java    |   8 +++
 .../urlencoding/annotation/UrlEncodingConfig.java  |   8 +++
 .../apache/juneau/xml/annotation/XmlConfig.java    |   8 +++
 .../juneau/petstore/rest/PetStoreResource.java     |   3 +-
 .../apache/juneau/petstore/rest/RootResources.java |   2 +-
 .../src/main/resources/htdocs/cat.png              | Bin 0 -> 1878 bytes
 .../apache/juneau/rest/mock2/MockHttpSession.java  |   2 +-
 .../org/apache/juneau/rest/BasicRestConfig.java    |   2 +
 .../org/apache/juneau/rest/RequestAttributes.java  |   4 ++
 .../java/org/apache/juneau/rest/RestRequest.java   |   2 +-
 28 files changed, 266 insertions(+), 15 deletions(-)

diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
index 126e322..8fd217b 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
@@ -335,4 +335,78 @@ public class HtmlDocConfigAnnotationTest {
                        "<script>xxx| yyy|</script>"
                );
        }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Rank sorting
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       @HtmlDocConfig(
+               rank=1,
+               aside="f1"
+       )
+       static class F1 {}
+
+       @HtmlDocConfig(
+               aside="f2"
+       )
+       static class F2 extends F1 {}
+
+       @HtmlDocConfig(
+               rank=3,
+               aside="f3"
+       )
+       static class F3 extends F2 {}
+
+       @HtmlDocConfig(
+               rank=2,
+               aside="f4"
+       )
+       static class F4 extends F3 {}
+
+       @HtmlDocConfig(
+               rank=3,
+               aside="f5"
+       )
+       static class F5 extends F4 {}
+
+       static ClassInfo f1 = ClassInfo.of(F1.class);
+       static ClassInfo f2 = ClassInfo.of(F2.class);
+       static ClassInfo f3 = ClassInfo.of(F3.class);
+       static ClassInfo f4 = ClassInfo.of(F4.class);
+       static ClassInfo f5 = ClassInfo.of(F5.class);
+
+       @Test
+       public void e01_rankedAnnotations_f1() throws Exception {
+               AnnotationList al = 
f1.getAnnotationListParentFirst(null).sort();
+               HtmlDocSerializerSession x = 
HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+               check("f1", x.getAside());
+       }
+
+       @Test
+       public void e02_rankedAnnotations_f2() throws Exception {
+               AnnotationList al = 
f2.getAnnotationListParentFirst(null).sort();
+               HtmlDocSerializerSession x = 
HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+               check("f1", x.getAside());
+       }
+
+       @Test
+       public void e03_rankedAnnotations_f3() throws Exception {
+               AnnotationList al = 
f3.getAnnotationListParentFirst(null).sort();
+               HtmlDocSerializerSession x = 
HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+               check("f3", x.getAside());
+       }
+
+       @Test
+       public void e04_rankedAnnotations_f4() throws Exception {
+               AnnotationList al = 
f4.getAnnotationListParentFirst(null).sort();
+               HtmlDocSerializerSession x = 
HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+               check("f3", x.getAside());
+       }
+
+       @Test
+       public void e05_rankedAnnotations_f5() throws Exception {
+               AnnotationList al = 
f5.getAnnotationListParentFirst(null).sort();
+               HtmlDocSerializerSession x = 
HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+               check("f5", x.getAside());
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
index 68725b4..153a075 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
@@ -36,6 +36,14 @@ import org.apache.juneau.xml.annotation.*;
 @PropertyStoreApply(RdfConfigApply.class)
 public @interface RdfConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // RdfCommon
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
index 05fd053..e3d4b30 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
@@ -124,7 +124,7 @@ public class PropertyStoreBuilder {
         */
        @SuppressWarnings("unchecked")
        public PropertyStoreBuilder applyAnnotations(AnnotationList al, 
VarResolverSession r) {
-               for (AnnotationInfo<?> ai : al) {
+               for (AnnotationInfo<?> ai : al.sort()) {
                        try {
                                
ai.getConfigApply(r).apply((AnnotationInfo<Annotation>)ai, this);
                        } catch (ConfigException ex) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
index c686719..82f3c1e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
@@ -37,6 +37,14 @@ import org.apache.juneau.transform.*;
 @PropertyStoreApply(BeanConfigApply.class)
 public @interface BeanConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-----------------------------------------------------------------------------------------------------------------
        // BeanContext
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
index 4b78b63..1d731ef 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
@@ -31,4 +31,13 @@ import org.apache.juneau.csv.*;
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(CsvConfigApply.class)
-public @interface CsvConfig {}
+public @interface CsvConfig {
+
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
index 3abd195..2f53268 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
@@ -34,6 +34,14 @@ import org.apache.juneau.serializer.*;
 @PropertyStoreApply(HtmlConfigApply.class)
 public @interface HtmlConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // HtmlSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
index 657742f..13cbf24 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
@@ -35,6 +35,14 @@ import org.apache.juneau.svl.*;
 @PropertyStoreApply(HtmlDocConfigApply.class)
 public @interface HtmlDocConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // HtmlDocSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
index e011d35..50c350b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
@@ -31,4 +31,13 @@ import org.apache.juneau.jso.*;
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(JsoConfigApply.class)
-public @interface JsoConfig {}
+public @interface JsoConfig {
+
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
index 5fa3188..4528785 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
@@ -34,6 +34,14 @@ import org.apache.juneau.serializer.*;
 @PropertyStoreApply(JsonConfigApply.class)
 public @interface JsonConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // JsonParser
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
index dbf6987..064ab0c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
@@ -34,6 +34,14 @@ import org.apache.juneau.jsonschema.*;
 @PropertyStoreApply(JsonSchemaConfigApply.class)
 public @interface JsonSchemaConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // JsonSchemaGenerator
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
index 9c4ef6b..46293fc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
@@ -34,6 +34,14 @@ import org.apache.juneau.serializer.*;
 @PropertyStoreApply(MsgPackConfigApply.class)
 public @interface MsgPackConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // MsgPackSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
index 1540a16..7dbeb9b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
@@ -31,4 +31,13 @@ import org.apache.juneau.msgpack.*;
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(OpenApiConfigApply.class)
-public @interface OpenApiConfig {}
+public @interface OpenApiConfig {
+
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
index ea51ae0..47d553c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
@@ -38,6 +38,14 @@ import org.apache.juneau.xml.*;
 @PropertyStoreApply(ParserConfigApply.class)
 public @interface ParserConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // InputStreamParser
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
index 6c99ddf..ee433fa 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
@@ -31,4 +31,13 @@ import org.apache.juneau.plaintext.*;
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(PlainTextConfigApply.class)
-public @interface PlainTextConfig {}
+public @interface PlainTextConfig {
+
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
index eab269f..4227828 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
@@ -29,10 +29,11 @@ import org.apache.juneau.svl.*;
  */
 public class AnnotationInfo<T extends Annotation> {
 
-       private ClassInfo c;
-       private MethodInfo m;
-       private Package p;
-       private T a;
+       private final ClassInfo c;
+       private final MethodInfo m;
+       private final Package p;
+       private final T a;
+       final int rank;
 
        /**
         * Constructor.
@@ -47,6 +48,20 @@ public class AnnotationInfo<T extends Annotation> {
                this.m = m;
                this.p = p;
                this.a = a;
+               this.rank = getRank(a);
+       }
+
+       private static int getRank(Object a) {
+               ClassInfo ci = ClassInfo.ofc(a);
+               MethodInfo mi = ci.getPublicMethod("rank");
+               if (mi != null && mi.hasReturnType(int.class)) {
+                       try {
+                               return (int)mi.invoke(a);
+                       } catch (ExecutableException e) {
+                               e.printStackTrace();
+                       }
+               }
+               return 0;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
index 86240fa..17332a9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
@@ -12,7 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.reflect;
 
-import java.util.ArrayList;
+import java.util.*;
 import java.util.function.*;
 
 /**
@@ -49,4 +49,21 @@ public class AnnotationList extends 
ArrayList<AnnotationInfo<?>> {
                }
                return false;
        }
+
+       private static final Comparator<AnnotationInfo<?>> RANK_COMPARATOR = 
new Comparator<AnnotationInfo<?>>() {
+               @Override
+               public int compare(AnnotationInfo<?> o1, AnnotationInfo<?> o2) {
+                       return o1.rank - o2.rank;
+               }
+       };
+
+       /**
+        * Sort the annotations in this list based on rank.
+        *
+        * @return This object (for method chaining).
+        */
+       public AnnotationList sort() {
+               Collections.sort(this, RANK_COMPARATOR);
+               return this;
+       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
index cc6efc7..c3a6d86 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
@@ -34,6 +34,14 @@ import org.apache.juneau.serializer.*;
 @PropertyStoreApply(SerializerConfigApply.class)
 public @interface SerializerConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // OutputStreamSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
index 2d1917f..1c10d1b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
@@ -33,6 +33,14 @@ import org.apache.juneau.soap.*;
 @PropertyStoreApply(SoapXmlConfigApply.class)
 public @interface SoapXmlConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // SoapXmlSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
index 8425825..9e40c5b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
@@ -35,6 +35,14 @@ import org.apache.juneau.urlencoding.*;
 @PropertyStoreApply(UonConfigApply.class)
 public @interface UonConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // UonParser
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
index 6e67f4d..090cc8d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
@@ -33,6 +33,14 @@ import org.apache.juneau.urlencoding.*;
 @PropertyStoreApply(UrlEncodingConfigApply.class)
 public @interface UrlEncodingConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // UrlEncodingSerializer
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
index 835ed66..e436ce8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
@@ -39,6 +39,14 @@ import org.apache.juneau.xmlschema.*;
 @PropertyStoreApply(XmlConfigApply.class)
 public @interface XmlConfig {
 
+       /**
+        * Optional rank for this config.
+        *
+        * <p>
+        * Can be used to override default ordering and application of config 
annotations.
+        */
+       int rank() default 0;
+
        
//-------------------------------------------------------------------------------------------------------------------
        // XmlParser
        
//-------------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
index d84d480..05a08e3 100644
--- 
a/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
+++ 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
@@ -108,10 +108,9 @@ import org.apache.juneau.rest.converters.*;
        navlinks={
                "up: request:/..",
                "options: servlet:/?method=OPTIONS",
-               "init: servlet:/init",
                "$W{ContentTypeMenuItem}",
                "$W{ThemeMenuItem}",
-               "source: 
$C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"
+               "source: 
$C{Source/gitHub}/org/apache/juneau/petstore/rest/$R{servletClassSimple}.java"
        },
        head={
                "<link rel='icon' href='$U{servlet:/htdocs/cat.png}'/>"  // Add 
a cat icon to the page.
diff --git 
a/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/RootResources.java
 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/RootResources.java
index 424b8f3..a92d9de 100644
--- 
a/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/RootResources.java
+++ 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/java/org/apache/juneau/petstore/rest/RootResources.java
@@ -42,7 +42,7 @@ import org.apache.juneau.serializer.annotation.*;
                "options: ?method=OPTIONS",
                "$W{ContentTypeMenuItem}",
                "$W{ThemeMenuItem}",
-               "source: 
$C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"
+               "source: 
$C{Source/gitHub}/org/apache/juneau/petstore/rest/$R{servletClassSimple}.java"
        },
        aside={
                "<div style='max-width:400px' class='text'>",
diff --git 
a/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/resources/htdocs/cat.png
 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/resources/htdocs/cat.png
new file mode 100644
index 0000000..917abc6
Binary files /dev/null and 
b/juneau-examples/juneau-examples-petstore/juneau-examples-petstore-server/src/main/resources/htdocs/cat.png
 differ
diff --git 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
index b778d75..3860b1b 100644
--- 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
+++ 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
@@ -82,7 +82,7 @@ public class MockHttpSession implements HttpSession {
 
        @Override /* HttpSession */
        public Enumeration<String> getAttributeNames() {
-               return null;
+               return Collections.enumeration(Collections.emptyList());
        }
 
        @Override /* HttpSession */
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
index 78aa3e8..e24c14f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
@@ -156,6 +156,8 @@ public interface BasicRestConfig {
                }
        )
        @HtmlDocConfig(
+               // Should override config annotations defined on class.
+               rank=10,
                // Override the nav links for the swagger page.
                navlinks={
                        "back: servlet:/",
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
index 3f2614c..0b33efc 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
@@ -51,6 +51,8 @@ public class RequestAttributes extends ObjectMap {
                String k = key.toString();
                Object o = req.getAttribute(k);
                if (o == null)
+                        o = req.getSession().getAttribute(k);
+               if (o == null)
                        o = defaultEntries.get(k);
                return resolve(o);
        }
@@ -80,6 +82,8 @@ public class RequestAttributes extends ObjectMap {
                                        {
                                                for (String s : 
iterable(req.getAttributeNames()))
                                                        keys.add(s);
+                                               for (String s : 
iterable(req.getSession().getAttributeNames()))
+                                                       keys.add(s);
                                        }
                                        Iterator<String> keyIterator = 
keys.iterator();
                                        Iterator<Map.Entry<String,Object>> 
defaultsIterator = defaultEntries.entrySet().iterator();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 1c3b821..5f6e3a7 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -214,7 +214,7 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
 
                String stylesheet = getQuery().getString("stylesheet");
                if (stylesheet != null)
-                       getSession().setAttribute("stylesheet", 
stylesheet.replace(' ', '$'));  // Prevent SVL insertion.
+                       getSession().setAttribute(HTMLDOC_stylesheet, 
stylesheet.replace(' ', '$'));  // Prevent SVL insertion.
                stylesheet = (String)getSession().getAttribute("stylesheet");
                if (stylesheet != null)
                        properties.put(HTMLDOC_stylesheet, new 
String[]{stylesheet});

Reply via email to