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 f3b7f47  Swagger improvments.
f3b7f47 is described below

commit f3b7f47156538682be2d5e7e312304e34f761766
Author: JamesBognar <[email protected]>
AuthorDate: Wed Jun 6 12:42:52 2018 -0400

    Swagger improvments.
---
 .../main/java/org/apache/juneau/ObjectList.java    | 64 ++++++++++++++++++++++
 .../src/main/java/org/apache/juneau/ObjectMap.java | 59 ++++++++++++++++++++
 juneau-doc/src/main/javadoc/overview.html          | 16 ++++++
 .../apache/juneau/rest/BasicRestInfoProvider.java  |  3 +-
 .../org/apache/juneau/rest/RestMethodParam.java    |  2 +-
 .../org/apache/juneau/rest/RestMethodReturn.java   |  7 ++-
 .../org/apache/juneau/rest/RestMethodThrown.java   |  7 ++-
 .../org/apache/juneau/rest/RestParamDefaults.java  |  3 +
 .../org/apache/juneau/rest/util/RestUtils.java     | 46 +++++++---------
 .../juneau/rest/BasicRestInfoProviderTest.java     | 22 ++++++++
 10 files changed, 196 insertions(+), 33 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java
index cec754d..8e129ae 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java
@@ -719,6 +719,37 @@ public class ObjectList extends LinkedList<Object> {
        }
 
        /**
+        * Returns <jk>true</jk> if this list is unmodifiable.
+        * 
+        * @return <jk>true</jk> if this list is unmodifiable.
+        */
+       public boolean isUnmodifiable() {
+               return false;
+       }
+       
+       /**
+        * Returns a modifiable copy of this list if it's unmodifiable.
+        * 
+        * @return A modifiable copy of this list if it's unmodifiable, or this 
list if it is already modifiable.
+        */
+       public ObjectList modifiable() {
+               if (isUnmodifiable()) 
+                       return new ObjectList(this);
+               return this;
+       }
+       
+       /**
+        * Returns an unmodifiable copy of this list if it's modifiable.
+        * 
+        * @return An unmodifiable copy of this list if it's modifiable, or 
this list if it is already unmodifiable.
+        */
+       public ObjectList unmodifiable() {
+               if (this instanceof UnmodifiableObjectList)
+                       return this;
+               return new UnmodifiableObjectList(this);
+       }
+
+       /**
         * Serialize this array to JSON using the {@link 
JsonSerializer#DEFAULT} serializer.
         */
        @Override /* Object */
@@ -759,6 +790,39 @@ public class ObjectList extends LinkedList<Object> {
                }
        }
        
+       private static final class UnmodifiableObjectList extends ObjectList {
+               private static final long serialVersionUID = 1L;
+
+               UnmodifiableObjectList(ObjectList contents) {
+                       super();
+                       if (contents != null) {
+                               for (Object e : this) {
+                                       super.add(e);
+                               }
+                       }
+               }
+               
+               @Override /* List */
+               public void add(int location, Object object) {
+                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
+               }
+
+               @Override /* List */
+               public Object remove(int location) {
+                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
+               }
+
+               @Override /* List */
+               public Object set(int location, Object object) {
+                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
+               }
+               
+               @Override
+               public final boolean isUnmodifiable() {
+                       return true;
+               }
+       }
+
        BeanSession bs() {
                if (session == null)
                        session = BeanContext.DEFAULT.createBeanSession();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
index 6718064..cdf2ee0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
@@ -1543,6 +1543,37 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
                JsonSerializer.DEFAULT.serialize(this);
                return this;
        }
+       
+       /**
+        * Returns <jk>true</jk> if this map is unmodifiable.
+        * 
+        * @return <jk>true</jk> if this map is unmodifiable.
+        */
+       public boolean isUnmodifiable() {
+               return false;
+       }
+       
+       /**
+        * Returns a modifiable copy of this map if it's unmodifiable.
+        * 
+        * @return A modifiable copy of this map if it's unmodifiable, or this 
map if it is already modifiable.
+        */
+       public ObjectMap modifiable() {
+               if (isUnmodifiable()) 
+                       return new ObjectMap(this);
+               return this;
+       }
+       
+       /**
+        * Returns an unmodifiable copy of this map if it's modifiable.
+        * 
+        * @return An unmodifiable copy of this map if it's modifiable, or this 
map if it is already unmodifiable.
+        */
+       public ObjectMap unmodifiable() {
+               if (this instanceof UnmodifiableObjectMap)
+                       return this;
+               return new UnmodifiableObjectMap(this);
+       }
 
        @Override /* Map */
        public Set<String> keySet() {
@@ -1610,6 +1641,34 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
                };
        }
        
+       private static final class UnmodifiableObjectMap extends ObjectMap {
+               private static final long serialVersionUID = 1L;
+
+               UnmodifiableObjectMap(ObjectMap contents) {
+                       super();
+                       if (contents != null) {
+                               for (Map.Entry<String,Object> e : 
contents.entrySet()) {
+                                       super.put(e.getKey(), e.getValue());
+                               }
+                       }
+               }
+               
+               @Override
+               public final Object put(String key, Object val) {
+                       throw new UnsupportedOperationException("ObjectMap is 
read-only.");
+               }
+
+               @Override
+               public final Object remove(Object key) {
+                       throw new UnsupportedOperationException("ObjectMap is 
read-only.");
+               }
+               
+               @Override
+               public final boolean isUnmodifiable() {
+                       return true;
+               }
+       }
+
        private BeanSession bs() {
                if (session == null)
                        session = BeanContext.DEFAULT.createBeanSession();
diff --git a/juneau-doc/src/main/javadoc/overview.html 
b/juneau-doc/src/main/javadoc/overview.html
index 5895c90..58a15da 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -21629,6 +21629,22 @@
                                Serializers now allow for q-values on the media 
types they handle.
                                <br>For example, the accept media type on 
<code>JsonSerializer.Simple</code> is 
<js>"application/json+simple,application/json;q=0.9"</js>.
                                <br>This means the serializer CAN handle 
requests for <js>"application/json"</js> if no other serializers provide a 
better match.
+                       <li>
+                               New methods for creating unmodifiable {@link 
org.apache.juneau.ObjectMap ObjectMaps} and {@link org.apache.juneau.ObjectList 
ObjectLists}.
+                               <ul class='doctree'>
+                                       <li class='jc'>{@link 
org.apache.juneau.ObjectMap}
+                                       <ul>
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectMap#isUnmodifiable() isUnmodifable()}
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectMap#unmodifiable() unmodifiable()}
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectMap#modifiable() modifiable()}
+                                       </ul>
+                                       <li class='jp'>{@link 
org.apache.juneau.ObjectList}
+                                       <ul>
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectList#isUnmodifiable() isUnmodifable()}
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectList#unmodifiable() unmodifiable()}
+                                               <li class='jm'>{@link 
org.apache.juneau.ObjectList#modifiable() modifiable()}
+                                       </ul>
+                               </ul>
                </ul>
                
                <h5 class='topic w800'>juneau-dto</h5>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index e56e5a5..74204bb 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -409,7 +409,7 @@ public class BasicRestInfoProvider implements 
RestInfoProvider {
                                
                                ObjectMap pi = mp.getMetaData();
                                if (pi.containsKey("_api"))
-                                       
param.putAll(parseMap(pi.getString("_api"), vr, true, false, "@Body(api) on 
class {0} method {1}"));
+                                       
param.putAll(parseMap(pi.getString("_api"), vr, true, false, "@Body(api) on 
class {0} method {1}", c, m));
 
                                // Common to all
                                param.appendSkipEmpty("description", 
vr.resolve(pi.getString("description")));
@@ -609,7 +609,6 @@ public class BasicRestInfoProvider implements 
RestInfoProvider {
                return swagger;
        }
 
-       
        
//=================================================================================================================
        // Utility methods
        
//=================================================================================================================
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodParam.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodParam.java
index 31692dc..e3df438 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodParam.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodParam.java
@@ -138,7 +138,7 @@ public abstract class RestMethodParam {
                this.name = name;
                this.type = type;
                this.c = type instanceof Class ? (Class<?>)type : type 
instanceof ParameterizedType ? (Class<?>)((ParameterizedType)type).getRawType() 
: null;
-               this.metaData = metaData;
+               this.metaData = metaData.unmodifiable();
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
index 84e6460..5ac5d0f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
@@ -31,14 +31,17 @@ public class RestMethodReturn {
        
        RestMethodReturn(Type type) {
                this.type = type;
-               this.metaData = new ObjectMap();
+               
+               ObjectMap om = new ObjectMap();
                
                int code = 200;
                if (type instanceof Class)
                for (Response ri : 
ReflectionUtils.findAnnotationsParentFirst(Response.class, (Class<?>)type)) {
                        code = ObjectUtils.firstNonZero(ri.code(), code);
-                       merge(metaData, ri);
+                       om = merge(om, ri);
                }
+               
+               this.metaData = om.unmodifiable();
                 
                this.code = code;
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
index 7c2fe7e..d2a2b5b 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
@@ -31,14 +31,17 @@ public class RestMethodThrown {
        
        RestMethodThrown(Class<?> type) {
                this.type = type;
-               this.metaData = new ObjectMap();
+               
+               ObjectMap om = new ObjectMap();
                
                int code = 500;
                for (Response ri : 
ReflectionUtils.findAnnotationsParentFirst(Response.class, type)) {
                        code = ObjectUtils.firstNonZero(ri.code(), code);
-                       merge(metaData, ri);
+                       om = merge(om, ri);
                }
                
+               this.metaData = om.unmodifiable();
+
                this.code = code;
        }
        
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
index bd196a5..76315e2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
@@ -658,6 +658,7 @@ class RestParamDefaults {
                        ObjectMap om = existing == null ? new ObjectMap() : 
existing.metaData;
                        if (a == null)
                                return om;
+                       om = om.modifiable();
                        List<Integer> codes = new ArrayList<>();
                        if (a.code() != 0)
                                codes.add(a.code());
@@ -708,6 +709,7 @@ class RestParamDefaults {
                        ObjectMap om = existing == null ? new ObjectMap() : 
existing.metaData;
                        if (a == null)
                                return om;
+                       om = om.modifiable();
                        int status = ObjectUtils.firstNonZero(a.code(), 200);
                        merge(om.getObjectMap(String.valueOf(status), true), a);
                        return om;
@@ -750,6 +752,7 @@ class RestParamDefaults {
                        ObjectMap om = existing == null ? new ObjectMap() : 
existing.metaData;
                        if (a == null)
                                return om;
+                       om = om.modifiable();
                        int status = firstNonZero(a.code(), a.value(), 200);
                        ObjectMap om2 = om.getObjectMap(String.valueOf(status), 
true);
                        om2
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
index 1df6c1d..9bd796d 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
@@ -420,6 +420,12 @@ public final class RestUtils {
        // Methods for merging annotation values.
        
//=================================================================================================================
        
+       private static ObjectMap newMap(ObjectMap om) {
+               if (om == null)
+                       return new ObjectMap();
+               return om.modifiable();
+       }
+       
        /**
         * Merges the contents of the specified annotation into the specified 
map.
         * 
@@ -430,8 +436,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Body a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -451,8 +456,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, ExternalDocs a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.value()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -469,8 +473,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Schema a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.value()))
                        .appendSkipEmpty("$ref", a.$ref())
@@ -517,16 +520,14 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Response a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
-               om
+               om = newMap(om);
+               return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
                        .appendSkipEmpty("example", joinnl(a.example()))
                        .appendSkipEmpty("examples", joinnl(a.examples()))
                        .append("schema", merge(om.getObjectMap("schema"), 
a.schema()))
                        .append("headers", merge(om.getObjectMap("headers"), 
a.headers()));
-               return om;
        }       
        
        /**
@@ -539,8 +540,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, ResponseHeader[] a) {
                if (a.length == 0)
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                for (ResponseHeader aa : a) {
                        String name = firstNonEmpty(aa.name(), aa.value());
                        if (isEmpty(name))
@@ -560,8 +560,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Items a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.value()))
                        .appendSkipEmpty("type", a.type())
@@ -593,8 +592,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, ResponseHeader a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om 
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("$ref", a.$ref())
@@ -629,8 +627,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Path a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -660,8 +657,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Query a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -698,8 +694,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, Header a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -736,8 +731,7 @@ public final class RestUtils {
        public static ObjectMap merge(ObjectMap om, FormData a) {
                if (empty(a))
                        return om;
-               if (om == null)
-                       om = new ObjectMap();
+               om = newMap(om);
                return om
                        .appendSkipEmpty("_api", joinnl(a.api()))
                        .appendSkipEmpty("description", joinnl(a.description()))
@@ -835,7 +829,7 @@ public final class RestUtils {
                if (a == null)
                        return true;
                return 
-                       empty(a.description(), a.example(), a.examples())
+                       empty(a.description(), a.example(), a.examples(), 
a.api())
                        && a.headers().length == 0
                        && empty(a.schema())
                ;
@@ -906,7 +900,7 @@ public final class RestUtils {
                if (a == null)
                        return true;
                return 
-                       empty(a.description(), a.example(), a.examples()) 
+                       empty(a.description(), a.example(), a.examples(), 
a.api()) 
                        && empty(a.required())
                        && empty(a.schema());
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
 
b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
index a8ae336..18e035f 100644
--- 
a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
+++ 
b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
@@ -4761,6 +4761,20 @@ public class BasicRestInfoProviderTest {
                @RestMethod(name=GET,path="/basic")
                public void ta00(TA00 h) {}
 
+               @Body(
+                       api={
+                               "description:'a\nb',",
+                               "required:true,",
+                               "schema:{type:'a'},",
+                               "examples:{foo:'bar'}"
+                       }
+               )
+               public static class TA01 {
+                       public TA01(String x) {}
+               }
+               
+               @RestMethod(name=GET,path="/api")
+               public void ta01(TA01 h) {}
 
                @Body(schema=@Schema(" type:'b' "))
                public static class TA18b {}
@@ -4814,6 +4828,14 @@ public class BasicRestInfoProviderTest {
                assertObjectEquals("'a'", x.getExample());
                assertObjectEquals("{foo:'bar'}", x.getExamples());
        }
+//     @Test
+//     public void ta01_Body_onPojo_api() throws Exception {
+//             ParameterInfo x = getSwagger(new 
TA()).getPaths().get("/api").get("get").getParameter("body", null);
+//             assertEquals("a\nb", x.getDescription());
+//             assertObjectEquals("true", x.getRequired());
+//             assertObjectEquals("{type:'a'}", x.getSchema());
+//             assertObjectEquals("{foo:'bar'}", x.getExamples());
+//     }
        @Test
        public void ta18b_Body_onPojo_schema2() throws Exception {
                ParameterInfo x = getSwagger(new 
TA()).getPaths().get("/schema2").get("get").getParameter("body", null);

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

Reply via email to