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 257e85f  Add support for Inherit.class and None.class in annotations.
257e85f is described below

commit 257e85f74bd65b4a9b8cde17495fdeb3f7d0004f
Author: JamesBognar <[email protected]>
AuthorDate: Wed May 23 19:02:26 2018 -0400

    Add support for Inherit.class and None.class in annotations.
---
 juneau-doc/src/main/javadoc/overview.html          |  12 +++
 .../juneau/microservice/BasicRestServletJena.java  |   4 +-
 .../microservice/BasicRestServletJenaGroup.java    |   4 +-
 .../org/apache/juneau/rest/RestContextBuilder.java |   9 +-
 .../org/apache/juneau/rest/RestJavaMethod.java     |  35 +------
 .../apache/juneau/rest/annotation/RestMethod.java  |   3 -
 .../juneau/rest/annotation/RestResource.java       |  22 ++++-
 .../java/org/apache/juneau/rest/util/Utils.java    | 105 +++++++++++++--------
 .../rest/annotation/RestMethodInheritTest.java     |   6 +-
 9 files changed, 112 insertions(+), 88 deletions(-)

diff --git a/juneau-doc/src/main/javadoc/overview.html 
b/juneau-doc/src/main/javadoc/overview.html
index 66cc6f1..2d585fd 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -21765,6 +21765,18 @@
                                        <li class='jc'>{@link 
org.apache.juneau.rest.Inherit}
                                        <li class='jc'>{@link 
org.apache.juneau.rest.None}
                                </ul>
+                               <br>These can be used in the following 
locations:
+                               <ul>
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestResource#serializers()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestResource#parsers()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestResource#beanFilters()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestResource#pojoSwaps()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#serializers()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#parsers()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#beanFilters()}
+                                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#pojoSwaps()}
+                               </ul>
+                               <br>One advantage is that you now have control 
over the precedence of serializers and parsers by where you insert the 
<code>Inherit</code> class. 
                </ul>
        
                <h5 class='topic w800'>juneau-rest-client</h5>
diff --git 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
 
b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
index c0711e8..2732bfc 100755
--- 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
+++ 
b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.microservice;
 
-import org.apache.juneau.html.*;
 import org.apache.juneau.jena.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -23,7 +22,7 @@ import org.apache.juneau.rest.annotation.*;
 @SuppressWarnings("serial")
 @RestResource(
        serializers={
-               HtmlDocSerializer.class,  // HTML must be listed first because 
Internet Explore does not include text/html in their Accept header.
+               Inherit.class,
                RdfSerializer.Xml.class,
                RdfSerializer.XmlAbbrev.class,
                RdfSerializer.Turtle.class,
@@ -31,6 +30,7 @@ import org.apache.juneau.rest.annotation.*;
                RdfSerializer.N3.class
        },
        parsers={
+               Inherit.class,
                RdfParser.Xml.class,
                RdfParser.Turtle.class,
                RdfParser.NTriple.class,
diff --git 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJenaGroup.java
 
b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJenaGroup.java
index dde9662..ae5ba04 100644
--- 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJenaGroup.java
+++ 
b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJenaGroup.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.microservice;
 
-import org.apache.juneau.html.*;
 import org.apache.juneau.jena.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -23,7 +22,7 @@ import org.apache.juneau.rest.annotation.*;
 @SuppressWarnings("serial")
 @RestResource(
        serializers={
-               HtmlDocSerializer.class,  // HTML must be listed first because 
Internet Explore does not include text/html in their Accept header.
+               Inherit.class,
                RdfSerializer.Xml.class,
                RdfSerializer.XmlAbbrev.class,
                RdfSerializer.Turtle.class,
@@ -31,6 +30,7 @@ import org.apache.juneau.rest.annotation.*;
                RdfSerializer.N3.class
        },
        parsers={
+               Inherit.class,
                RdfParser.Xml.class,
                RdfParser.Turtle.class,
                RdfParser.NTriple.class,
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 9252be5..cf68b1e 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -18,6 +18,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.parser.Parser.*;
 import static org.apache.juneau.rest.RestContext.*;
+import static org.apache.juneau.rest.util.Utils.*;
 import static org.apache.juneau.serializer.Serializer.*;
 
 import java.lang.reflect.Method;
@@ -165,8 +166,8 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                                        set(vr.resolve(p.name()), 
vr.resolve(p.value()));
                                for (String p : r.flags())
                                        set(p, true);
-                               serializers(r.serializers());
-                               parsers(r.parsers());
+                               serializers(false, 
merge(ObjectUtils.toType(psb.peek(REST_serializers), Object[].class), 
r.serializers()));
+                               parsers(false, 
merge(ObjectUtils.toType(psb.peek(REST_parsers), Object[].class), r.parsers()));
                                encoders(r.encoders());
                                if (r.produces().length > 0)
                                        produces(false, resolveVars(vr, 
r.produces()));
@@ -178,8 +179,8 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                                converters(r.converters());
                                guards(reverse(r.guards()));
                                children(r.children());
-                               beanFilters((Object[])r.beanFilters());
-                               pojoSwaps(r.pojoSwaps());
+                               beanFilters(false, 
merge(ObjectUtils.toType(psb.peek(BEAN_beanFilters), Object[].class), 
r.beanFilters()));
+                               pojoSwaps(false, 
merge(ObjectUtils.toType(psb.peek(BEAN_pojoSwaps), Object[].class), 
r.pojoSwaps()));
                                paramResolvers(r.paramResolvers());
                                if (r.serializerListener() != 
SerializerListener.Null.class)
                                        
serializerListener(r.serializerListener());
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
index ae7384f..a70d892 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
@@ -20,6 +20,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.Utils.*;
 import static org.apache.juneau.rest.RestContext.*;
 import static org.apache.juneau.rest.util.RestUtils.*;
+import static org.apache.juneau.rest.util.Utils.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
@@ -166,21 +167,16 @@ public class RestJavaMethod implements 
Comparable<RestJavaMethod>  {
                                        hdb.style("INHERIT", 
"$W{"+w.getName()+".style}");
                                }
 
-//                             ASet<String> inherit = new 
ASet<String>().appendAll(StringUtils.split(m.inherit()));
-//                             if (inherit.contains("*")) 
-//                                     
inherit.appendAll("SERIALIZERS","PARSERS","TRANSFORMS","PROPERTIES","ENCODERS");
-
                                SerializerGroupBuilder sgb = null;
                                ParserGroupBuilder pgb = null;
                                ParserBuilder uepb = null;
                                BeanContextBuilder bcb = null;
                                PropertyStore cps = context.getPropertyStore();
                                
-                               
-                               Object[] mSerializers = 
resolve(cps.getArrayProperty(REST_serializers, Object.class), m.serializers());
-                               Object[] mParsers = 
resolve(cps.getArrayProperty(REST_parsers, Object.class), m.parsers());
-                               Object[] mPojoSwaps = 
resolve(cps.getArrayProperty(BEAN_pojoSwaps, Object.class), m.pojoSwaps());
-                               Object[] mBeanFilters = 
resolve(cps.getArrayProperty(BEAN_beanFilters, Object.class), m.beanFilters());
+                               Object[] mSerializers = 
merge(cps.getArrayProperty(REST_serializers, Object.class), m.serializers());
+                               Object[] mParsers = 
merge(cps.getArrayProperty(REST_parsers, Object.class), m.parsers());
+                               Object[] mPojoSwaps = 
merge(cps.getArrayProperty(BEAN_pojoSwaps, Object.class), m.pojoSwaps());
+                               Object[] mBeanFilters = 
merge(cps.getArrayProperty(BEAN_beanFilters, Object.class), m.beanFilters());
                                
                                if (m.serializers().length > 0 || 
m.parsers().length > 0 || m.properties().length > 0 || m.flags().length > 0
                                                || m.beanFilters().length > 0 
|| m.pojoSwaps().length > 0 || m.bpi().length > 0
@@ -404,27 +400,6 @@ public class RestJavaMethod implements 
Comparable<RestJavaMethod>  {
                }
        }
        
-       static Object[] resolve(Object[] fromClass, Object[] fromAnnotation) {
-               
-               if (ArrayUtils.contains(None.class, fromAnnotation)) 
-                       return ArrayUtils.remove(None.class, fromAnnotation);
-               
-               if (fromAnnotation.length == 0)
-                       return fromClass;
-               
-               if (! ArrayUtils.contains(Inherit.class, fromAnnotation))
-                       return fromAnnotation;
-               
-               List<Object> l = new ArrayList<>(fromClass.length + 
fromAnnotation.length);
-               for (Object o : fromAnnotation) {
-                       if (o == Inherit.class)
-                               l.addAll(Arrays.asList(fromClass));
-                       else
-                               l.add(o);
-               }
-               return l.toArray(new Object[l.size()]);
-       }
-
        /**
         * Returns <jk>true</jk> if this Java method has any guards or matchers.
         */
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
index 8144782f..eaf4f01 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
@@ -629,9 +629,6 @@ public @interface RestMethod {
         * Serializers. 
         * 
         * <p>
-        * Overrides the list of serializers assigned at the method level.
-        * 
-        * <p>
         * If no value is specified, the serializers are inherited from the 
class.
         * <br>Otherwise, this value overrides the serializers defined on the 
class.
         * 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
index 1263201..719d023 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
@@ -542,14 +542,21 @@ public @interface RestResource {
         * Parsers. 
         * 
         * <p>
-        * Adds class-level parsers to this resource.
+        * If no value is specified, the parsers are inherited from parent 
class.
+        * <br>Otherwise, this value overrides the parsers defined on the 
parent class.
+        * 
+        * <p>
+        * Use {@link Inherit} to inherit parsers defined on the parent class.
+        * 
+        * <p>
+        * Use {@link None} to suppress inheriting parsers defined on the 
parent class.
         * 
         * <h5 class='section'>See Also:</h5>
         * <ul>
         *      <li class='jf'>{@link RestContext#REST_parsers}
         * </ul>
         */
-       Class<? extends Parser>[] parsers() default {};
+       Class<?>[] parsers() default {};
 
        /**
         * HTTP part parser. 
@@ -709,14 +716,21 @@ public @interface RestResource {
         * Serializers. 
         * 
         * <p>
-        * Adds class-level serializers to this resource.
+        * If no value is specified, the serializers are inherited from parent 
class.
+        * <br>Otherwise, this value overrides the serializers defined on the 
parent class.
+        * 
+        * <p>
+        * Use {@link Inherit} to inherit serializers defined on the parent 
class.
+        * 
+        * <p>
+        * Use {@link None} to suppress inheriting serializers defined on the 
parent class.
         * 
         * <h5 class='section'>See Also:</h5>
         * <ul>
         *      <li class='jf'>{@link RestContext#REST_serializers}
         * </ul>
         */
-       Class<? extends Serializer>[] serializers() default {};
+       Class<?>[] serializers() default {};
 
        /**
         * Optional site name.
diff --git 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java
old mode 100755
new mode 100644
similarity index 50%
copy from 
juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
copy to 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java
index c0711e8..671495a
--- 
a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/BasicRestServletJena.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java
@@ -1,40 +1,65 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.microservice;
-
-import org.apache.juneau.html.*;
-import org.apache.juneau.jena.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.annotation.*;
-
-/**
- * Resource servlet with additional RDF support.
- */
-@SuppressWarnings("serial")
-@RestResource(
-       serializers={
-               HtmlDocSerializer.class,  // HTML must be listed first because 
Internet Explore does not include text/html in their Accept header.
-               RdfSerializer.Xml.class,
-               RdfSerializer.XmlAbbrev.class,
-               RdfSerializer.Turtle.class,
-               RdfSerializer.NTriple.class,
-               RdfSerializer.N3.class
-       },
-       parsers={
-               RdfParser.Xml.class,
-               RdfParser.Turtle.class,
-               RdfParser.NTriple.class,
-               RdfParser.N3.class
-       }
-)
-public abstract class BasicRestServletJena extends BasicRestServlet {}
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              * 
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.rest.util;
+
+import java.util.*;
+
+import org.apache.juneau.internal.*;
+import org.apache.juneau.rest.*;
+
+/**
+ * Various reusable utility methods used by the REST server API.
+ */
+public final class Utils {
+       
+       /**
+        * Merges the specified parent and child arrays.
+        * 
+        * <p>
+        * The general concept is to allow child values to override parent 
values.
+        * 
+        * <p>
+        * The rules are:
+        * <ul>
+        *      <li>If the child array is not empty, then the child array is 
returned.
+        *      <li>If the child array is empty, then the parent array is 
returned.
+        *      <li>If the child array contains {@link None}, then an empty 
array is always returned.
+        *      <li>If the child array contains {@link Inherit}, then the 
contents of the parent array are inserted into the position of the {@link 
Inherit} entry.
+        * </ul>
+        * 
+        * @param fromParent The parent array.
+        * @param fromChild The child array.
+        * @return A new merged array.
+        */
+       public static Object[] merge(Object[] fromParent, Object[] fromChild) {
+               
+               if (ArrayUtils.contains(None.class, fromChild)) 
+                       return new Object[0];
+               
+               if (fromChild.length == 0)
+                       return fromParent;
+               
+               if (! ArrayUtils.contains(Inherit.class, fromChild))
+                       return fromChild;
+               
+               List<Object> l = new ArrayList<>(fromParent.length + 
fromChild.length);
+               for (Object o : fromChild) {
+                       if (o == Inherit.class)
+                               l.addAll(Arrays.asList(fromParent));
+                       else
+                               l.add(o);
+               }
+               return l.toArray(new Object[l.size()]);
+       }
+
+}
diff --git 
a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodInheritTest.java
 
b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodInheritTest.java
index 7666da6..2598ada 100644
--- 
a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodInheritTest.java
+++ 
b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodInheritTest.java
@@ -131,7 +131,7 @@ public class RestMethodInheritTest {
        @RestResource(serializers={S1.class,S2.class})
        public static class A {}
        
-       @RestResource(serializers={S3.class,S4.class})
+       @RestResource(serializers={S3.class,S4.class,Inherit.class})
        public static class A01 extends A {}
 
        @RestResource
@@ -174,7 +174,7 @@ public class RestMethodInheritTest {
        @RestResource(parsers={P1.class,P2.class})
        public static class B {}
 
-       @RestResource(parsers={P3.class,P4.class})
+       @RestResource(parsers={P3.class,P4.class,Inherit.class})
        public static class B01 extends B {}
 
        @RestResource
@@ -217,7 +217,7 @@ public class RestMethodInheritTest {
        @RestResource(pojoSwaps={F1Swap.class})
        public static class D {}
 
-       @RestResource(pojoSwaps={F2Swap.class})
+       @RestResource(pojoSwaps={F2Swap.class,Inherit.class})
        public static class D01 extends D {}
 
        @RestResource(serializers=JsonSerializer.Simple.class)

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to