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