This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch CAUSEWAY-3718
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/CAUSEWAY-3718 by this push:
new e4461ac56c CAUSEWAY-3718: JsonValueEncoderServiceDefault: fix for
recover pojo from string
e4461ac56c is described below
commit e4461ac56c4a73a6e847bd6c1efa357d2c2afc2a
Author: Andi Huber <[email protected]>
AuthorDate: Tue Apr 9 05:52:09 2024 +0200
CAUSEWAY-3718: JsonValueEncoderServiceDefault: fix for recover pojo from
string
---
.../valuesemantics/BlobValueSemantics.java | 2 -
.../JsonValueEncoderServiceDefault.java | 21 +-
viewers/restfulobjects/test/pom.xml | 281 +++++++++++----------
.../staff/Staff_lowlevel_v1_IntegTest.java | 36 +--
4 files changed, 169 insertions(+), 171 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BlobValueSemantics.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BlobValueSemantics.java
index 9949d8afb9..e128bb4002 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BlobValueSemantics.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BlobValueSemantics.java
@@ -22,12 +22,10 @@ import java.util.function.UnaryOperator;
import javax.annotation.Priority;
import javax.inject.Named;
-import javax.inject.Provider;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.stereotype.Component;
import org.apache.causeway.applib.annotation.PriorityPrecedence;
import org.apache.causeway.applib.util.schema.CommonDtoUtils;
diff --git
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderServiceDefault.java
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderServiceDefault.java
index 0b2415a232..0a8f3607e3 100644
---
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderServiceDefault.java
+++
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderServiceDefault.java
@@ -114,9 +114,9 @@ public class JsonValueEncoderServiceDefault implements
JsonValueEncoderService {
return ManagedObject.value(spec, pojo);
}
- // best effort: try 'String' type
- return asStringElseFail(valueRepr, valueSerializer)
- .map(string->ManagedObject.value(spec, string))
+ // best effort: try 'String' repr. type
+ return recoverPojoFromStringElseFail(valueRepr, valueSerializer)
+ .map(pojo->ManagedObject.value(spec, pojo))
.orElseGet(()->ManagedObject.empty(spec));
}
@@ -139,7 +139,7 @@ public class JsonValueEncoderServiceDefault implements
JsonValueEncoderService {
* Returns the recovered nullable String, wrapped as optional.
* @throws IllegalArgumentException if cannot be parsed as String
*/
- private static Optional<String> asStringElseFail(
+ private static Optional<Object> recoverPojoFromStringElseFail(
final JsonRepresentation valueRepr,
final ValueSerializer<?> valueSerializer) {
if (valueRepr.isString()) {
@@ -147,17 +147,8 @@ public class JsonValueEncoderServiceDefault implements
JsonValueEncoderService {
valueSerializer.destring(Format.JSON,
valueRepr.asString()))
.mapFailure(ex->_Exceptions
.illegalArgument(ex, "Unable to parse value %s as
String", valueRepr))
- .ifFailureFail()
- .getValue().orElse(null);
- ;
- if(recoveredValue==null) {
- return Optional.empty();
- }
- val recoveredStringIfAny = _Casts.castTo(String.class,
recoveredValue);
- if(recoveredStringIfAny.isPresent()) {
- return recoveredStringIfAny;
- }
- throw _Exceptions.illegalArgument("Unable to parse value %s as
String", recoveredValue.getClass());
+ .valueAsNullableElseFail();
+ return Optional.ofNullable(recoveredValue);
}
throw _Exceptions.illegalArgument("Unable to parse value %s as String"
+ " (using 'String' as a fallback attempt)", valueRepr);
diff --git a/viewers/restfulobjects/test/pom.xml
b/viewers/restfulobjects/test/pom.xml
index bd9d4d2400..a6986d2ef6 100644
--- a/viewers/restfulobjects/test/pom.xml
+++ b/viewers/restfulobjects/test/pom.xml
@@ -17,29 +17,32 @@
specific language governing permissions and limitations
under the License.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.apache.causeway.viewer</groupId>
- <artifactId>causeway-viewer-restfulobjects</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- </parent>
+ <parent>
+ <groupId>org.apache.causeway.viewer</groupId>
+ <artifactId>causeway-viewer-restfulobjects</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
+ </parent>
- <artifactId>causeway-viewer-restfulobjects-test</artifactId>
+ <artifactId>causeway-viewer-restfulobjects-test</artifactId>
<name>Apache Causeway Viewer - RO (Test)</name>
- <properties>
-
<jar-plugin.automaticModuleName>org.apache.causeway.viewer.restfulobjects.test</jar-plugin.automaticModuleName>
-
<git-plugin.propertiesDir>org/apache/causeway/viewer/restfulobjects/test</git-plugin.propertiesDir>
+ <properties>
+ <jar-plugin.automaticModuleName>
+
org.apache.causeway.viewer.restfulobjects.test</jar-plugin.automaticModuleName>
+
<git-plugin.propertiesDir>org/apache/causeway/viewer/restfulobjects/test</git-plugin.propertiesDir>
- <maven.install.skip>true</maven.install.skip>
- <maven.deploy.skip>true</maven.deploy.skip>
+ <maven.install.skip>true</maven.install.skip>
+ <maven.deploy.skip>true</maven.deploy.skip>
- </properties>
+ </properties>
- <build>
+ <build>
<testResources>
<testResource>
<directory>src/test/resources</directory>
@@ -52,126 +55,132 @@
</testResources>
</build>
- <dependencies>
-
- <!-- TESTING -->
-
- <dependency>
- <groupId>org.apache.causeway.core</groupId>
- <artifactId>causeway-core-webapp</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.causeway.viewer</groupId>
- <artifactId>causeway-viewer-commons-services</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.causeway.viewer</groupId>
- <artifactId>causeway-viewer-restfulobjects-rendering</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.module</groupId>
- <artifactId>jackson-module-jaxb-annotations</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.causeway.core</groupId>
- <artifactId>causeway-core-runtimeservices</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.persistence</groupId>
- <artifactId>causeway-persistence-jpa-eclipselink</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.security</groupId>
- <artifactId>causeway-security-bypass</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.core</groupId>
- <artifactId>causeway-core-internaltestsupport</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.testing</groupId>
- <artifactId>causeway-testing-fixtures-applib</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.viewer</groupId>
- <artifactId>causeway-viewer-restfulobjects-client</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.viewer</groupId>
- <artifactId>causeway-viewer-restfulobjects-viewer</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.causeway.viewer</groupId>
-
<artifactId>causeway-viewer-restfulobjects-jaxrsresteasy</artifactId>
- <scope>test</scope>
- </dependency>
-
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <!-- we use log4j-2 instead -->
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-test-autoconfigure</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.glassfish.jersey.core</groupId>
- <artifactId>jersey-client</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.inject</groupId>
- <artifactId>jersey-hk2</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.github.gavlyukovskiy</groupId>
- <artifactId>datasource-proxy-spring-boot-starter</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.github.vertical-blank</groupId>
- <artifactId>sql-formatter</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>com.approvaltests</groupId>
- <artifactId>approvaltests</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
+ <dependencies>
+
+ <!-- TESTING -->
+
+ <dependency>
+ <groupId>org.apache.causeway.core</groupId>
+ <artifactId>causeway-core-webapp</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.causeway.viewer</groupId>
+
<artifactId>causeway-viewer-commons-services</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.causeway.viewer</groupId>
+
<artifactId>causeway-viewer-restfulobjects-rendering</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.module</groupId>
+ <artifactId>jackson-module-jaxb-annotations</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.causeway.core</groupId>
+ <artifactId>causeway-core-runtimeservices</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.persistence</groupId>
+
<artifactId>causeway-persistence-jpa-eclipselink</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.security</groupId>
+ <artifactId>causeway-security-bypass</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.core</groupId>
+
<artifactId>causeway-core-internaltestsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.testing</groupId>
+
<artifactId>causeway-testing-fixtures-applib</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.viewer</groupId>
+
<artifactId>causeway-viewer-restfulobjects-client</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.viewer</groupId>
+
<artifactId>causeway-viewer-restfulobjects-viewer</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.causeway.viewer</groupId>
+
<artifactId>causeway-viewer-restfulobjects-jaxrsresteasy</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <!-- we use log4j-2 instead -->
+
<groupId>org.springframework.boot</groupId>
+
<artifactId>spring-boot-starter-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-test-autoconfigure</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.glassfish.jersey.core</groupId>
+ <artifactId>jersey-client</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.inject</groupId>
+ <artifactId>jersey-hk2</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.github.gavlyukovskiy</groupId>
+
<artifactId>datasource-proxy-spring-boot-starter</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.github.vertical-blank</groupId>
+ <artifactId>sql-formatter</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.approvaltests</groupId>
+ <artifactId>approvaltests</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
</project>
diff --git
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_lowlevel_v1_IntegTest.java
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_lowlevel_v1_IntegTest.java
index 05cf9712e8..b06259afdc 100644
---
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_lowlevel_v1_IntegTest.java
+++
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/staff/Staff_lowlevel_v1_IntegTest.java
@@ -34,19 +34,6 @@ import javax.ws.rs.core.Response;
import com.google.common.io.Resources;
import com.google.gson.GsonBuilder;
-import org.apache.causeway.applib.annotation.PriorityPrecedence;
-import org.apache.causeway.applib.value.Blob;
-import org.apache.causeway.applib.value.NamedWithMimeType;
-import org.apache.causeway.applib.value.semantics.Renderer;
-import org.apache.causeway.applib.value.semantics.ValueDecomposition;
-import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
-import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Bytes;
-import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.core.metamodel.valuesemantics.BlobValueSemantics;
-import org.apache.causeway.schema.common.v2.ValueType;
-
import org.approvaltests.Approvals;
import org.approvaltests.reporters.DiffReporter;
import org.approvaltests.reporters.UseReporter;
@@ -61,7 +48,19 @@ import org.springframework.stereotype.Component;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.transaction.annotation.Propagation;
+import org.apache.causeway.applib.annotation.PriorityPrecedence;
import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.applib.value.Blob;
+import org.apache.causeway.applib.value.NamedWithMimeType;
+import org.apache.causeway.applib.value.semantics.Renderer;
+import org.apache.causeway.applib.value.semantics.ValueDecomposition;
+import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._Bytes;
+import org.apache.causeway.commons.internal.base._Strings;
+import
org.apache.causeway.core.internaltestsupport.annotations.DisabledIfRunningWithSurefire;
+import org.apache.causeway.core.metamodel.valuesemantics.BlobValueSemantics;
+import org.apache.causeway.schema.common.v2.ValueType;
import
org.apache.causeway.viewer.restfulobjects.test.scenarios.Abstract_IntegTest;
import lombok.Getter;
@@ -81,6 +80,7 @@ public class Staff_lowlevel_v1_IntegTest extends
Abstract_IntegTest {
gsonBuilder = new GsonBuilder();
}
+ @DisabledIfRunningWithSurefire
@SneakyThrows
@Test
@UseReporter(DiffReporter.class)
@@ -138,15 +138,15 @@ public class Staff_lowlevel_v1_IntegTest extends
Abstract_IntegTest {
assertThat(bookmarkAfterIfAny).isNotEmpty();
}
- private String asAbsoluteHref(Bookmark bookmark) {
+ private String asAbsoluteHref(final Bookmark bookmark) {
return String.format("%s%s",
restfulClient.getConfig().getRestfulBaseUrl(), asRelativeHref(bookmark));
}
- private String asRelativeHref(Bookmark bookmark) {
+ private String asRelativeHref(final Bookmark bookmark) {
return String.format("objects/%s/%s", bookmark.getLogicalTypeName(),
bookmark.getIdentifier());
}
- private String readFileAndEncodeAsBlob(String fileName) throws
IOException, URISyntaxException {
+ private String readFileAndEncodeAsBlob(final String fileName) throws
IOException, URISyntaxException {
byte[] bytes =
Resources.toByteArray(Resources.getResource(Abstract_IntegTest.class,
fileName));
String photoEncoded = encodePdf(fileName, bytes);
return photoEncoded;
@@ -166,7 +166,7 @@ public class Staff_lowlevel_v1_IntegTest extends
Abstract_IntegTest {
* @param departmentHrefValue
* @param blobValue - is the Blob encoded format:
"filename.pdf:application/pdf:pdfBytesBase64Encoded"
*/
- Body(String nameValue, String departmentHrefValue, String blobValue) {
+ Body(final String nameValue, final String departmentHrefValue, final
String blobValue) {
photo = new Blob(blobValue);
name = new Name(nameValue);
department = new Department(new
Department.Value(departmentHrefValue));
@@ -216,7 +216,7 @@ public class Staff_lowlevel_v1_IntegTest extends
Abstract_IntegTest {
@Override
public ValueType getSchemaValueType() {
- return ValueType.BLOB;
+ return ValueType.STRING;
}
// -- COMPOSER