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

Reply via email to