You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/05/07 20:13:52 UTC
git commit: ISIS-233: fix url encoding handling on PUT.
Updated Branches:
refs/heads/master e5e5a7286 -> 38afedd2b
ISIS-233: fix url encoding handling on PUT.
tried to always url decode, even for arguments that went in the body and so were not encoded.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/38afedd2
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/38afedd2
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/38afedd2
Branch: refs/heads/master
Commit: 38afedd2b7f27073dbe6ae7ed10ce70d6f8a1eac
Parents: e5e5a72
Author: Dan Haywood <da...@apache.org>
Authored: Tue May 7 19:13:29 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue May 7 19:13:29 2013 +0100
----------------------------------------------------------------------
.../restfulobjects/server/ResourceContext.java | 8 ++
.../server/resources/DomainResourceHelper.java | 10 ++-
.../resources/DomainTypeResourceServerside.java | 4 +-
...enRepresentation_doesNotContainSelfLink_ok.java | 15 +--
.../action/invoke/Put_whenStringArgs_then_ok.java | 89 +++++++++++++++
.../tck/dom/actions/ActionsEntityRepository.java | 8 ++
6 files changed, 118 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index bf2fd54..16edd2c 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -163,6 +163,14 @@ public class ResourceContext implements RendererContext {
return httpHeaders;
}
+ /**
+ * The {@link HttpServletRequest#getQueryString() query string}, cached
+ * after first call.
+ *
+ * <p>
+ * Note that this can return non-null for <tt>PUT</tt>s as well as <tt>GET</tt>s.
+ * It will only have been URL encoded for the latter; the caller should handle both cases.
+ */
public String getQueryString() {
if(queryString != null) {
return queryString;
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index d965aea..33e8406 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -550,7 +550,15 @@ public final class DomainResourceHelper {
if (queryStringTrimmed.isEmpty()) {
return JsonRepresentation.newMap();
}
- final String queryStringUrlDecoded = UrlEncodingUtils.urlDecode(queryStringTrimmed);
+
+ String queryStringUrlDecoded;
+ try {
+ // this is a bit hacky...
+ queryStringUrlDecoded = UrlEncodingUtils.urlDecode(queryStringTrimmed);
+ } catch(Exception ex) {
+ queryStringUrlDecoded = queryStringTrimmed;
+ }
+
if (queryStringUrlDecoded.isEmpty()) {
return JsonRepresentation.newMap();
}
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
index 1d2de44..5865857 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
@@ -28,6 +28,8 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import com.google.common.base.Strings;
+
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -57,8 +59,6 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.TypeListReprR
import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
import org.apache.isis.viewer.restfulobjects.server.util.UrlParserUtils;
-import com.google.common.base.Strings;
-
/**
* Implementation note: it seems to be necessary to annotate the implementation
* with {@link Path} rather than the interface (at least under RestEasy 1.0.2
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_thenRepresentation_doesNotContainSelfLink_ok.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_thenRepresentation_doesNotContainSelfLink_ok.java b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_thenRepresentation_doesNotContainSelfLink_ok.java
index 70f09d2..c0f394b 100644
--- a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_thenRepresentation_doesNotContainSelfLink_ok.java
+++ b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_thenRepresentation_doesNotContainSelfLink_ok.java
@@ -1,34 +1,23 @@
package org.apache.isis.viewer.restfulobjects.tck.domainobjectorservice.id.action.invoke;
-import static org.apache.isis.viewer.restfulobjects.tck.RestfulMatchers.assertThat;
-import static org.apache.isis.viewer.restfulobjects.tck.RestfulMatchers.isLink;
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.CoreMatchers.endsWith;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
-import java.io.IOException;
-import java.io.InputStream;
-
import javax.ws.rs.core.Response;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.Rel;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
import org.apache.isis.viewer.restfulobjects.applib.client.RestfulClient;
import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ActionResultRepresentation;
import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource;
import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ObjectActionRepresentation;
import org.apache.isis.viewer.restfulobjects.applib.util.JsonNodeUtils;
-import org.apache.isis.viewer.restfulobjects.applib.util.UrlEncodingUtils;
import org.apache.isis.viewer.restfulobjects.tck.IsisWebServerRule;
import org.apache.isis.viewer.restfulobjects.tck.Util;
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_whenStringArgs_then_ok.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_whenStringArgs_then_ok.java b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_whenStringArgs_then_ok.java
new file mode 100644
index 0000000..2e86969
--- /dev/null
+++ b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Put_whenStringArgs_then_ok.java
@@ -0,0 +1,89 @@
+package org.apache.isis.viewer.restfulobjects.tck.domainobjectorservice.id.action.invoke;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import javax.ws.rs.core.Response;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulClient;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ActionResultRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource;
+import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ObjectActionRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ScalarValueRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.errors.ErrorRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.util.JsonNodeUtils;
+import org.apache.isis.viewer.restfulobjects.tck.IsisWebServerRule;
+import org.apache.isis.viewer.restfulobjects.tck.Util;
+
+public class Put_whenStringArgs_then_ok {
+
+ @Rule
+ public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+ private RestfulClient client;
+
+ private DomainServiceResource serviceResource;
+
+ @Before
+ public void setUp() throws Exception {
+ client = webServerRule.getClient();
+
+ serviceResource = client.getDomainServiceResource();
+ }
+
+ @Test
+ public void usingClientFollow() throws Exception {
+
+ // given
+ final JsonRepresentation givenAction = Util.givenAction(client, "ActionsEntities", "concatenate");
+ final ObjectActionRepresentation actionRepr = givenAction.as(ObjectActionRepresentation.class);
+
+ final LinkRepresentation invokeLink = actionRepr.getInvoke();
+ final JsonRepresentation args =invokeLink.getArguments();
+
+ // when
+ args.mapPut("str1.value", "IVA VENDITE 21%");
+ args.mapPut("str2.value", "AAA");
+
+ // when
+ final RestfulResponse<ActionResultRepresentation> restfulResponse = client.followT(invokeLink, args);
+
+ // then
+ then(restfulResponse);
+ }
+
+
+
+ @Test
+ public void usingResourceProxy() throws Exception {
+
+ // given, when
+ final JsonRepresentation args = JsonRepresentation.newMap();
+ args.mapPut("str1.value", "IVA VENDITE 21%");
+ args.mapPut("str2.value", "AAA");
+
+ final Response response = serviceResource.invokeActionIdempotent("ActionsEntities", "concatenate", JsonNodeUtils.asInputStream(args));
+ final RestfulResponse<ActionResultRepresentation> restfulResponse = RestfulResponse.ofT(response);
+
+ // then
+ then(restfulResponse);
+ }
+
+ private void then(RestfulResponse<ActionResultRepresentation> restfulResponse) throws Exception {
+ assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+ final ActionResultRepresentation entity = restfulResponse.getEntity();
+ final ScalarValueRepresentation svr = entity.getResult().as(ScalarValueRepresentation.class);
+ assertThat(svr.getValue().asString(), is("IVA VENDITE 21%AAA"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/38afedd2/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/actions/ActionsEntityRepository.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/actions/ActionsEntityRepository.java b/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/actions/ActionsEntityRepository.java
index 65c07f7..632abd1 100644
--- a/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/actions/ActionsEntityRepository.java
+++ b/core/tck/tck-dom/src/main/java/org/apache/isis/core/tck/dom/actions/ActionsEntityRepository.java
@@ -119,4 +119,12 @@ public class ActionsEntityRepository extends AbstractEntityRepository<ActionsEnt
private static int valueElseDefault(Integer value, int i) {
return value != null? value: i;
}
+
+ @ActionSemantics(Of.IDEMPOTENT)
+ @MemberOrder(sequence = "90")
+ public String concatenate(@Named("str1") String str1, @Named("str2") String str2) {
+ return str1 + str2;
+ }
+
+
}