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

thiagohp pushed a commit to branch rest
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/rest by this push:
     new 982c978  TAP5-2696: some REST code adjustments
982c978 is described below

commit 982c978034a19a64c6b4061f52fe6dd6cd3eb790
Author: Thiago H. de Paula Figueiredo <[email protected]>
AuthorDate: Sun Oct 17 16:48:51 2021 -0300

    TAP5-2696: some REST code adjustments
---
 .gitignore                                         |  1 +
 .../services/ComponentResultProcessorWrapper.java  |  2 +-
 .../DefaultOpenApiDescriptionGenerator.java        | 36 +++++++++++++++++-----
 ...ava => JSONCollectionEventResultProcessor.java} |  8 ++---
 .../java/org/apache/tapestry5/modules/.gitignore   |  1 -
 .../apache/tapestry5/modules/TapestryModule.java   |  6 +++-
 tapestry-core/src/test/app1/WEB-INF/app.properties | 14 +++++++++
 .../integration/app1/base/BaseRestDemoPage.java    | 15 ++++++---
 .../app1/pages/RestWithOnEventDemo.java            |  1 -
 .../tapestry5/integration/rest/RestTests.java      | 10 ++++--
 ...=> JSONCollectionEventResultProcessorTest.java} | 34 ++++++++++++++++++--
 .../test/services/AppModule.java                   |  8 +++++
 12 files changed, 110 insertions(+), 26 deletions(-)

diff --git a/.gitignore b/.gitignore
index c9a495f..2c39566 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@ gradle-app.setting
 *~
 \#*
 /.metadata/
+docs/
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentResultProcessorWrapper.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentResultProcessorWrapper.java
index 148e747..70705ed 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentResultProcessorWrapper.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentResultProcessorWrapper.java
@@ -22,7 +22,7 @@ import 
org.apache.tapestry5.services.ComponentEventResultProcessor;
 /**
  * A wrapper around {@link ComponentEventResultProcessor} that encapsulates 
capturing the exception.
  */
-@SuppressWarnings("unchecked")
+@SuppressWarnings({ "unchecked", "rawtypes" })
 public class ComponentResultProcessorWrapper implements 
TrackableComponentEventCallback
 {
     private boolean aborted;
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DefaultOpenApiDescriptionGenerator.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DefaultOpenApiDescriptionGenerator.java
index 89cf549..9a26f95 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DefaultOpenApiDescriptionGenerator.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DefaultOpenApiDescriptionGenerator.java
@@ -33,7 +33,9 @@ import org.apache.tapestry5.annotations.OnEvent;
 import org.apache.tapestry5.annotations.RequestParameter;
 import org.apache.tapestry5.annotations.StaticActivationContextValue;
 import org.apache.tapestry5.commons.Messages;
+import org.apache.tapestry5.commons.util.CommonsUtils;
 import org.apache.tapestry5.http.services.BaseURLSource;
+import org.apache.tapestry5.http.services.Request;
 import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.ioc.services.SymbolSource;
@@ -78,6 +80,8 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
     
     final private PageRenderLinkSource pageRenderLinkSource;
     
+    final private Request request;
+    
     final private static String KEY_PREFIX = "openapi.";
     
     public DefaultOpenApiDescriptionGenerator(
@@ -87,7 +91,8 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
             final ThreadLocale threadLocale,
             final PageSource pageSource,
             final ComponentClassResolver componentClassResolver,
-            final PageRenderLinkSource pageRenderLinkSource) 
+            final PageRenderLinkSource pageRenderLinkSource,
+            final Request request) 
     {
         super();
         this.baseUrlSource = baseUrlSource;
@@ -97,6 +102,7 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
         this.pageSource = pageSource;
         this.componentClassResolver = componentClassResolver;
         this.pageRenderLinkSource = pageRenderLinkSource;
+        this.request = request;
         messages = new ThreadLocal<>();
         failedPageNames = new HashSet<>();
     }
@@ -135,8 +141,7 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
         generateInfo(documentation);
         
         JSONArray servers = new JSONArray();
-        servers.add(new JSONObject("url", baseUrlSource.getBaseURL(false)));
-        servers.add(new JSONObject("url", baseUrlSource.getBaseURL(true)));
+        servers.add(new JSONObject("url", 
baseUrlSource.getBaseURL(request.isSecure())));
         
         documentation.put("servers", servers);
         
@@ -241,7 +246,7 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
         {
             throw new RuntimeException(String.format(
                     "There are at least two different REST endpoints for path 
%s and HTTP method %s in class %s",
-                    uri, httpMethod, pageClass.getName()));
+                    uri, httpMethod.toUpperCase(), pageClass.getName()));
         }
         else
         {
@@ -279,8 +284,9 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
             }
             if (!parameterDescription.isEmpty())
             {
-                Optional<String> parameterName = getValue(method, uri, 
httpMethod, parameter, "name");
-                parameterDescription.put("name", 
parameterName.orElse(parameter.getName()));
+//                Optional<String> parameterName = getValue(method, uri, 
httpMethod, parameter, "name");
+//                parameterDescription.put("name", 
parameterName.orElse(parameter.getName()));
+                parameterDescription.put("name", getParameterName(parameter));
                 getValue(method, uri, httpMethod, parameter, "description")
                     .ifPresent((v) -> parameterDescription.put("description", 
v));
                 
@@ -294,10 +300,24 @@ public class DefaultOpenApiDescriptionGenerator 
implements OpenApiDescriptionGen
         }
     }
 
+    private String getParameterName(Parameter parameter) {
+        String name = null;
+        final RequestParameter requestParameter = 
parameter.getAnnotation(RequestParameter.class);
+        if (requestParameter != null && 
!CommonsUtils.isBlank(requestParameter.value()))
+        {
+            name = requestParameter.value();
+        }
+        if (CommonsUtils.isBlank(name))
+        {
+            name = parameter.getName();
+        }
+        return name;
+    }
+
     private void processResponses(Method method, final String uri, final 
String httpMethod, final JSONObject methodDescription) {
         JSONObject responses = new JSONObject();
         JSONObject defaultResponse = new JSONObject();
-        int statusCode = httpMethod.equals("post") ? 
+        int statusCode = httpMethod.equals("post") || httpMethod.equals("put") 
? 
                 HttpServletResponse.SC_CREATED : HttpServletResponse.SC_OK;
         putIfNotEmpty(defaultResponse, "description", getValue(method, uri, 
httpMethod, statusCode));
         responses.put(String.valueOf(statusCode), defaultResponse);
@@ -471,7 +491,7 @@ public class DefaultOpenApiDescriptionGenerator implements 
OpenApiDescriptionGen
                 else
                 {
                     builder.append("{");
-                    builder.append(parameter.getName());
+                    builder.append(getParameterName(parameter));
                     builder.append("}");
                 }
             }
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessor.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessor.java
similarity index 85%
rename from 
tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessor.java
rename to 
tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessor.java
index 9db611c..7e2bc02 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessor.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessor.java
@@ -18,13 +18,13 @@ import 
org.apache.tapestry5.http.TapestryHttpSymbolConstants;
 import org.apache.tapestry5.http.services.Response;
 import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONCollection;
 import org.apache.tapestry5.services.ComponentEventResultProcessor;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 
-public class JSONArrayEventResultProcessor implements 
ComponentEventResultProcessor<JSONArray>
+public class JSONCollectionEventResultProcessor implements 
ComponentEventResultProcessor<JSONCollection>
 {
     private final Response response;
 
@@ -32,7 +32,7 @@ public class JSONArrayEventResultProcessor implements 
ComponentEventResultProces
 
     private final ContentType contentType;
 
-    public JSONArrayEventResultProcessor(Response response,
+    public JSONCollectionEventResultProcessor(Response response,
 
                                          
@Symbol(TapestryHttpSymbolConstants.CHARSET)
                                          String outputEncoding,
@@ -46,7 +46,7 @@ public class JSONArrayEventResultProcessor implements 
ComponentEventResultProces
         contentType = new 
ContentType(InternalConstants.JSON_MIME_TYPE).withCharset(outputEncoding);
     }
 
-    public void processResultValue(JSONArray value) throws IOException
+    public void processResultValue(JSONCollection value) throws IOException
     {
         PrintWriter pw = response.getPrintWriter(contentType.toString());
 
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/modules/.gitignore 
b/tapestry-core/src/main/java/org/apache/tapestry5/modules/.gitignore
deleted file mode 100644
index d970588..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/TapestryHttpModule.java
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java 
b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 1597c2c..94b7615 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -250,6 +250,7 @@ import org.apache.tapestry5.ioc.services.ThreadLocale;
 import org.apache.tapestry5.ioc.services.UpdateListener;
 import org.apache.tapestry5.ioc.services.UpdateListenerHub;
 import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONCollection;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.json.modules.JSONModule;
 import org.apache.tapestry5.plastic.MethodAdvice;
@@ -1615,6 +1616,9 @@ public final class TapestryModule
         configuration.addInstance(StreamResponse.class, 
StreamResponseResultProcessor.class);
 
         configuration.addInstance(StreamPageContent.class, 
StreamPageContentResultProcessor.class);
+        
+        configuration.addInstance(JSONArray.class, 
JSONCollectionEventResultProcessor.class);
+        configuration.addInstance(JSONObject.class, 
JSONCollectionEventResultProcessor.class);
     }
 
     /**
@@ -1652,7 +1656,7 @@ public final class TapestryModule
         configuration.addInstance(RenderCommand.class, 
RenderCommandComponentEventResultProcessor.class);
         configuration.addInstance(Component.class, 
AjaxComponentInstanceEventResultProcessor.class);
         configuration.addInstance(JSONObject.class, 
JSONObjectEventResultProcessor.class);
-        configuration.addInstance(JSONArray.class, 
JSONArrayEventResultProcessor.class);
+        configuration.addInstance(JSONArray.class, 
JSONCollectionEventResultProcessor.class);
         configuration.addInstance(StreamResponse.class, 
StreamResponseResultProcessor.class);
         configuration.addInstance(String.class, 
AjaxPageNameComponentEventResultProcessor.class);
         configuration.addInstance(Link.class, 
AjaxLinkComponentEventResultProcessor.class);
diff --git a/tapestry-core/src/test/app1/WEB-INF/app.properties 
b/tapestry-core/src/test/app1/WEB-INF/app.properties
index 3e42ca1..26e9036 100644
--- a/tapestry-core/src/test/app1/WEB-INF/app.properties
+++ b/tapestry-core/src/test/app1/WEB-INF/app.properties
@@ -31,6 +31,20 @@ openapi.put.response.200 = Generic 200
 openapi.response.200 = Generic 200
 openapi.response.201 = PUT request succesful
 
+openapi./restrequestnothandleddemo.put.response.200=SQN
+openapi.put.response.200 = Generic 200
+openapi.response.200 = Generic 200
+openapi.response.201 = PUT request succesful
+
+#openapi./restwitheventhandlermethodnamedemo/parametersTest/{arg2}.get.parameter.arg2.name=path-parameter-specific
+#openapi.get.parameter.arg2.name=path-parameter-get-specific
+openapi.parameter.arg2.name = path-parameter-general
+
+#openapi./restwitheventhandlermethodnamedemo/parametersTest/{arg2}.get.parameter.arg2.description=Specific
 arg2 description
+#openapi.get.parameter.arg2.description=GET-specific arg2 description
+openapi.parameter.arg2.description = Generic arg2 description
+
+
 
openapi.org.apache.tapestry5.integration.app1.pages.RestRequestNotHandledDemo.tag.name=fcqnTag
 openapi.RestRequestNotHandledDemo.tag.name=nameTag
 
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/base/BaseRestDemoPage.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/base/BaseRestDemoPage.java
index 20fbc4b..69d6294 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/base/BaseRestDemoPage.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/base/BaseRestDemoPage.java
@@ -16,6 +16,8 @@ import org.apache.tapestry5.annotations.OnEvent;
 import org.apache.tapestry5.annotations.RequestParameter;
 import org.apache.tapestry5.annotations.StaticActivationContextValue;
 import org.apache.tapestry5.http.services.Response;
+import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.util.TextStreamResponse;
 
 public class BaseRestDemoPage extends AbstractRestDemoPage {
@@ -39,19 +41,22 @@ public class BaseRestDemoPage extends AbstractRestDemoPage {
     }
     
     @OnEvent(EventConstants.HTTP_GET)
-    protected Object 
superclassEndpoint(@StaticActivationContextValue("superclassEndpoint") String 
pathParameter)
+    public Object 
superclassEndpoint(@StaticActivationContextValue("superclassEndpoint") String 
pathParameter)
     {
-        return new TextStreamResponse("text/plain", pathParameter);
+        final JSONArray jsonArray = new JSONArray();
+        jsonArray.add(pathParameter);
+        return jsonArray;
     }
     
     @OnEvent(EventConstants.HTTP_GET)
-    protected Object withParameters(
+    public Object withParameters(
             @StaticActivationContextValue("parametersTest") String 
staticParameter,
             @RequestParameter(value = "fromQueryString", allowBlank = true) 
String queryParameter,
             String pathParameter)
     {
-        return new TextStreamResponse("text/plain", 
-                String.join(":", staticParameter, pathParameter, 
queryParameter));
+        return new JSONObject("staticParameter", staticParameter, 
+                "pathParameter", pathParameter, 
+                "queryParameter", queryParameter);
     }
     
 }
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RestWithOnEventDemo.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RestWithOnEventDemo.java
index 4d6ee77..7b101ae 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RestWithOnEventDemo.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RestWithOnEventDemo.java
@@ -72,5 +72,4 @@ public class RestWithOnEventDemo extends BaseRestDemoPage {
         return new TextStreamResponse("text/plain", parameter + " 
overridden!");
     }
 
-
 }
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/rest/RestTests.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/rest/RestTests.java
index 5072084..eed8912 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/rest/RestTests.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/rest/RestTests.java
@@ -49,7 +49,7 @@ public class RestTests extends App1TestCase
     
     final private static String ENDPOINT_URL = 
RestWithOnEventDemo.class.getSimpleName();
     
-    final private static String PATH_PARAMETER_VALUE = "nice";
+    final private static String PATH_PARAMETER_VALUE = 
RestWithOnEventDemo.class.getSimpleName();
     
     @Test
     public void on_event_http_get() throws IOException
@@ -70,6 +70,12 @@ public class RestTests extends App1TestCase
     }
 
     @Test
+    public void on_event_http_put_without_other_parameters() throws IOException
+    {
+        test(EventConstants.HTTP_PUT, new HttpPut(getBaseURL() + 
ENDPOINT_URL));
+    }
+
+    @Test
     public void on_event_http_delete() throws IOException
     {
         test(EventConstants.HTTP_DELETE, new HttpDelete(getUrl()));
@@ -167,7 +173,7 @@ public class RestTests extends App1TestCase
     
     private void test(String eventName, HttpRequestBase method) throws 
ClientProtocolException, IOException
     {
-        String expectedResponse = eventName + ":" + PATH_PARAMETER_VALUE;;
+        String expectedResponse = eventName + ":" + PATH_PARAMETER_VALUE;
         if (method instanceof HttpEntityEnclosingRequest)
         {
             HttpEntityEnclosingRequest heer = (HttpEntityEnclosingRequest) 
method;
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessorTest.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessorTest.java
similarity index 58%
rename from 
tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessorTest.java
rename to 
tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessorTest.java
index 0e980e9..f14908e 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONArrayEventResultProcessorTest.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/JSONCollectionEventResultProcessorTest.java
@@ -17,16 +17,17 @@ package org.apache.tapestry5.internal.services;
 import org.apache.tapestry5.http.services.Response;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONObject;
 import org.testng.annotations.Test;
 
 import java.io.CharArrayWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 
-public class JSONArrayEventResultProcessorTest extends InternalBaseTestCase
+public class JSONCollectionEventResultProcessorTest extends 
InternalBaseTestCase
 {
     @Test
-    public void response_sent() throws IOException
+    public void response_sent_jsonarray() throws IOException
     {
         String encoding = "UTF-8";
         Response response = mockResponse();
@@ -40,12 +41,39 @@ public class JSONArrayEventResultProcessorTest extends 
InternalBaseTestCase
 
         JSONArray array = new JSONArray("   [ \"fred\", \"barney\" \n\n]");
 
-        JSONArrayEventResultProcessor p = new 
JSONArrayEventResultProcessor(response, encoding, false);
+        JSONCollectionEventResultProcessor p = new 
JSONCollectionEventResultProcessor(response, encoding, false);
 
         p.processResultValue(array);
 
         verify();
 
         assertEquals(writer.toString(), "[\n  \"fred\",\n  \"barney\"\n]");
+        
+
+    }
+    
+    @Test
+    public void response_sent_jsonobject() throws IOException
+    {
+        String encoding = "UTF-8";
+        Response response = mockResponse();
+
+        CharArrayWriter writer = new CharArrayWriter();
+        PrintWriter pw = new PrintWriter(writer);
+
+        
expect(response.getPrintWriter("application/json;charset=UTF-8")).andReturn(pw);
+
+        replay();
+
+        JSONObject object = new JSONObject("\n   { \n \"fred\" : \"barney\" \n 
} \n");
+
+        JSONCollectionEventResultProcessor p = new 
JSONCollectionEventResultProcessor(response, encoding, false);
+
+        p.processResultValue(object);
+
+        verify();
+
+        assertEquals(writer.toString(), "{\n  \"fred\" : \"barney\"\n}");
+        
     }
 }
diff --git 
a/tapestry-openapi-viewer/src/test/java/org/apache/tapestry5/tapestryopenapiviewer/test/services/AppModule.java
 
b/tapestry-openapi-viewer/src/test/java/org/apache/tapestry5/tapestryopenapiviewer/test/services/AppModule.java
index 9a050d3..43e6d8b 100644
--- 
a/tapestry-openapi-viewer/src/test/java/org/apache/tapestry5/tapestryopenapiviewer/test/services/AppModule.java
+++ 
b/tapestry-openapi-viewer/src/test/java/org/apache/tapestry5/tapestryopenapiviewer/test/services/AppModule.java
@@ -11,7 +11,9 @@
 // limitations under the License.
 package org.apache.tapestry5.tapestryopenapiviewer.test.services;
 
+import org.apache.tapestry5.SymbolConstants;
 import org.apache.tapestry5.commons.Configuration;
+import org.apache.tapestry5.commons.MappedConfiguration;
 import org.apache.tapestry5.services.LibraryMapping;
 
 public class AppModule
@@ -20,4 +22,10 @@ public class AppModule
     {
         configuration.add(new LibraryMapping("app1", 
"org.apache.tapestry5.integration.app1"));
     }
+    
+    public static void 
contributeApplicationDefaults(MappedConfiguration<String, Object> configuration)
+    {
+        configuration.add(SymbolConstants.PUBLISH_OPENAPI_DEFINITON, true);
+        configuration.add(SymbolConstants.PRODUCTION_MODE, true);
+    }
 }

Reply via email to