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