This is an automated email from the ASF dual-hosted git repository.
danhaywood 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 86819e1f03 CAUSEWAY-3718: adds Legacy impl of BlobValueSemantics
86819e1f03 is described below
commit 86819e1f03c19e861e4794567b71f80550c87208
Author: danhaywood <[email protected]>
AuthorDate: Mon Apr 8 22:22:27 2024 +0200
CAUSEWAY-3718: adds Legacy impl of BlobValueSemantics
... however, unfortunately does not get picked up, as calling code makes
the assumption that the text cannot be parsed into a Blob
---
.../value/semantics/ValueSemanticsAbstract.java | 1 -
core/metamodel/src/main/java/module-info.java | 1 +
.../metamodel/CausewayModuleCoreMetamodel.java | 2 +-
.../valuesemantics/BlobValueSemantics.java | 15 ++-
.../staff/Staff_lowlevel_v1_IntegTest.java | 104 +++++++++++++++++++++
.../src/test/resources/junit-platform.propertes | 2 +
6 files changed, 122 insertions(+), 3 deletions(-)
diff --git
a/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/ValueSemanticsAbstract.java
b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/ValueSemanticsAbstract.java
index d18c7e1e7b..b467d7cab0 100644
---
a/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/ValueSemanticsAbstract.java
+++
b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/ValueSemanticsAbstract.java
@@ -398,5 +398,4 @@ ValueSemanticsProvider<T> {
return
placeholderRenderService.orElseGet(PlaceholderRenderService::fallback);
}
-
}
diff --git a/core/metamodel/src/main/java/module-info.java
b/core/metamodel/src/main/java/module-info.java
index 084d238751..1a80a200ae 100644
--- a/core/metamodel/src/main/java/module-info.java
+++ b/core/metamodel/src/main/java/module-info.java
@@ -163,6 +163,7 @@ open module org.apache.causeway.core.metamodel {
requires spring.beans;
requires spring.context;
requires spring.core;
+ requires spring.boot.autoconfigure;
//JUnit testing stuff, not required as long this module is an 'open' one
// opens org.apache.causeway.core.metamodel.services to spring.core;
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
index 9d95c92868..b9e2e59397 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/CausewayModuleCoreMetamodel.java
@@ -148,7 +148,7 @@ import lombok.NonNull;
StringValueSemantics.class,
PasswordValueSemantics.class,
BufferedImageValueSemantics.class,
- BlobValueSemantics.class,
+ BlobValueSemantics.AutoConfiguration.class,
ClobValueSemantics.class,
MarkupValueSemantics.class,
URLValueSemantics.class,
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 08f3126842..9949d8afb9 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,7 +22,11 @@ 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;
@@ -36,7 +40,6 @@ import
org.apache.causeway.applib.value.semantics.ValueSemanticsProvider;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.schema.common.v2.ValueType;
-@Component
@Named("causeway.metamodel.value.BlobValueSemantics")
@Priority(PriorityPrecedence.LATE)
public class BlobValueSemantics
@@ -44,6 +47,16 @@ extends ValueSemanticsAbstract<Blob>
implements
Renderer<Blob> {
+ @Configuration
+ public static class AutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean(BlobValueSemantics.class)
+ public BlobValueSemantics defaultBlobValueSemantics() {
+ return new BlobValueSemantics();
+ }
+ }
+
@Override
public Class<Blob> getCorrespondingClass() {
return Blob.class;
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 150f332917..05cf9712e8 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
@@ -20,8 +20,13 @@ package
org.apache.causeway.viewer.restfulobjects.test.scenarios.staff;
import java.io.IOException;
import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
import java.util.Base64;
+import javax.activation.MimeType;
+import javax.activation.MimeTypeParseException;
+import javax.annotation.Priority;
+import javax.inject.Named;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;
@@ -29,14 +34,31 @@ 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;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
+import org.springframework.context.annotation.Import;
+import org.springframework.stereotype.Component;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.transaction.annotation.Propagation;
import org.apache.causeway.applib.services.bookmark.Bookmark;
@@ -46,6 +68,10 @@ import lombok.Getter;
import lombok.SneakyThrows;
import lombok.val;
+
+@Order(value = Integer.MAX_VALUE) // last
+@DirtiesContext
+@Import({Staff_lowlevel_v1_IntegTest.BlobValueSemanticsV1LegacyEncoding.class})
public class Staff_lowlevel_v1_IntegTest extends Abstract_IntegTest {
private GsonBuilder gsonBuilder;
@@ -172,6 +198,84 @@ public class Staff_lowlevel_v1_IntegTest extends
Abstract_IntegTest {
}
}
+ @Component
+ @Named("causeway.metamodel.value.BlobValueSemantics")
+ @Priority(PriorityPrecedence.EARLY)
+ public static class BlobValueSemanticsV1LegacyEncoding
+ extends BlobValueSemantics
+ implements
+ Renderer<Blob> {
+
+ public BlobValueSemanticsV1LegacyEncoding(){
+ }
+
+ @Override
+ public Class<Blob> getCorrespondingClass() {
+ return Blob.class;
+ }
+
+ @Override
+ public ValueType getSchemaValueType() {
+ return ValueType.BLOB;
+ }
+
+ // -- COMPOSER
+
+ @Override
+ public ValueDecomposition decompose(final Blob value) {
+ return decomposeAsString(value, this::toEncodedString, () -> null);
+ }
+
+ @Override
+ public Blob compose(final ValueDecomposition decomposition) {
+ return composeFromString(decomposition, this::fromEncodedString,
()->null);
+ }
+
+ // RENDERER
+
+ @Override
+ public String titlePresentation(final ValueSemanticsProvider.Context
context, final Blob value) {
+ return renderTitle(value, Blob::getName);
+ }
+
+ @Override
+ public String htmlPresentation(final ValueSemanticsProvider.Context
context, final Blob value) {
+ return renderHtml(value, Blob::getName);
+ }
+
+ private String toEncodedString(final Blob blob) {
+ return blob.getName() + ":" + blob.getMimeType().getBaseType() +
":" +
+ _Strings.ofBytes(_Bytes.encodeToBase64(Base64.getEncoder(),
blob.getBytes()), StandardCharsets.UTF_8);
+ }
+
+ private Blob fromEncodedString(final String data) {
+ final int colonIdx = data.indexOf(':');
+ final String name = data.substring(0, colonIdx);
+ final int colon2Idx = data.indexOf(":", colonIdx+1);
+ final String mimeTypeBase = data.substring(colonIdx+1, colon2Idx);
+ final String payload = data.substring(colon2Idx+1);
+ final byte[] bytes = _Bytes.decodeBase64(Base64.getDecoder(),
payload.getBytes(StandardCharsets.UTF_8));
+ try {
+ return new Blob(name, new MimeType(mimeTypeBase), bytes);
+ } catch (MimeTypeParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // -- EXAMPLES
+
+ @Override
+ public Can<Blob> getExamples() {
+ return Can.of(
+ Blob.of("a Blob", NamedWithMimeType.CommonMimeType.BIN,
new byte[] {1, 2, 3}),
+ Blob.of("another Blob",
NamedWithMimeType.CommonMimeType.BIN, new byte[] {3, 4}));
+ }
+
+ }
+
+
}
+
+
diff --git
a/viewers/restfulobjects/test/src/test/resources/junit-platform.propertes
b/viewers/restfulobjects/test/src/test/resources/junit-platform.propertes
new file mode 100644
index 0000000000..f61913bd47
--- /dev/null
+++ b/viewers/restfulobjects/test/src/test/resources/junit-platform.propertes
@@ -0,0 +1,2 @@
+# ClassOrderer$OrderAnnotation sorts classes based on their @Order annotation
+junit.jupiter.testclass.order.default=org.junit.jupiter.api.ClassOrderer$OrderAnnotation
\ No newline at end of file