You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/12/21 11:34:27 UTC

[isis] branch master updated: ISIS-2882: properly implement EncodableFacet from ValueFacet

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new e256283  ISIS-2882: properly implement EncodableFacet from ValueFacet
e256283 is described below

commit e25628341a078f29f95482c543d4908fe0ba0484
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 21 12:27:41 2021 +0100

    ISIS-2882: properly implement EncodableFacet from ValueFacet
---
 ...oder.java => EncodableFacetFromValueFacet.java} | 46 +++++++++++++++-------
 .../metamodel/facets/object/value/ValueFacet.java  | 10 +++++
 ...ionOrAnyMatchingValueSemanticsFacetFactory.java | 16 +++-----
 .../ValueSemanticsProviderAbstractTestCase.java    | 10 ++---
 ...avaSqlDateHolder_actionReturningCollection.java |  3 +-
 .../javasqldate/samples/JavaSqlDateSamples.java    |  5 +--
 6 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetFromValueFacet.java
similarity index 73%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetFromValueFacet.java
index 7374876..1f8cd1b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetUsingEncoderDecoder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/encoder/EncodableFacetFromValueFacet.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.object.encodeable.encoder;
 
+import java.util.Optional;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
@@ -25,28 +26,36 @@ import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class EncodableFacetUsingEncoderDecoder
+public class EncodableFacetFromValueFacet
 extends FacetAbstract
 implements EncodableFacet {
 
-    private final EncoderDecoder<?> encoderDecoder;
-
-    public EncodableFacetUsingEncoderDecoder(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder) {
-        super(EncodableFacet.class, holder);
-        this.encoderDecoder = encoderDecoder;
-    }
-
     // TODO: is this safe? really?
     public static final String ENCODED_NULL = "NULL";
 
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("codec", encoderDecoder.toString());
+    public static Optional<EncodableFacet> create(final ValueFacet<?> valueFacet, final FacetHolder holder) {
+        return valueFacet.selectDefaultEncoderDecoder()
+                .map(encoderDecoder->new EncodableFacetFromValueFacet(encoderDecoder, holder));
     }
 
+    /**
+     * JUnit support.
+     */
+    public static EncodableFacetFromValueFacet forTesting(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder) {
+        return new EncodableFacetFromValueFacet(encoderDecoder, holder);
+    }
+
+    // -- CONSTRUCTION
+
+    private final EncoderDecoder<?> encoderDecoder;
+
+    private EncodableFacetFromValueFacet(final EncoderDecoder<?> encoderDecoder, final FacetHolder holder) {
+        super(EncodableFacet.class, holder);
+        this.encoderDecoder = encoderDecoder;
+    }
 
     @Override
     public ManagedObject fromEncodedString(final String encodedData) {
@@ -57,14 +66,23 @@ implements EncodableFacet {
             final Object decodedObject = encoderDecoder.fromEncodedString(encodedData);
             return getObjectManager().adapt(decodedObject);
         }
-
     }
 
     @Override
     public String toEncodedString(final ManagedObject adapter) {
-        return adapter == null ? ENCODED_NULL: encode(encoderDecoder, adapter.getPojo());
+        return adapter == null
+                ? ENCODED_NULL
+                : encode(encoderDecoder, adapter.getPojo());
     }
 
+    @Override
+    public void visitAttributes(final BiConsumer<String, Object> visitor) {
+        super.visitAttributes(visitor);
+        visitor.accept("codec", encoderDecoder.toString());
+    }
+
+    // -- HELPER
+
     private static <T> String encode(final EncoderDecoder<T> encoderDecoder, final Object pojo) {
         @SuppressWarnings("unchecked")
         T pojoAsT = (T) pojo;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index fab1cb2..3d3d45f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -50,6 +50,15 @@ public interface ValueFacet<T> extends Facet {
 
     LogicalType getValueType();
     Can<ValueSemanticsProvider<T>> getValueSemantics();
+
+//    /**
+//     *  There might be multiple {@link ValueSemanticsProvider}(s) registered for
+//     *  a specific value-type. However, there should be one primary, that is not qualified.
+//     *  Used eg. to provide encoding/decoding.
+//     */
+//    ValueSemanticsProvider<T> getPrimaryValueSemantics();
+
+
     Context createValueSemanticsContext(@Nullable ObjectFeature feature);
     <X> Stream<X> streamValueSemantics(Class<X> requiredType);
 
@@ -118,4 +127,5 @@ public interface ValueFacet<T> extends Facet {
     }
 
 
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
index e3ef5a7..4016ab2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
@@ -34,7 +34,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
+import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetFromValueFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet;
@@ -133,24 +133,18 @@ extends FacetFactoryAbstract {
         addFacet(new ImmutableFacetViaValueSemantics(holder));
         addFacet(TitleFacetUsingValueFacet.create(valueFacet, holder));
 
+        addFacetIfPresent(EncodableFacetFromValueFacet.create(valueFacet, holder));
+
         semanticsProviders
         .forEach(semanticsProvider->{
 
-            // install the EncodeableFacet if we've been given an EncoderDecoder
-            final EncoderDecoder<?> encoderDecoder = semanticsProvider.getEncoderDecoder();
-            if (encoderDecoder != null) {
-                //getServiceInjector().injectServicesInto(encoderDecoder);
-                //FIXME convert to using value-facet
-                addFacet(new EncodableFacetUsingEncoderDecoder(encoderDecoder, holder));
-            }
-
             // install the ParseableFacet and other facets if we've been given a
             // Parser
             final Parser<?> parser = semanticsProvider.getParser();
             if (parser != null) {
 
                 //holder.getServiceInjector().injectServicesInto(parser);
-               //FIXME convert to using value-facet
+               //FIXME[ISIS-2882] convert to using value-facet, see EncodableFacetFromValueFacet
                 holder.addFacet(new TypicalLengthFacetUsingParser(parser, holder));
                 final int maxLength = parser.maxLength();
                 if(maxLength >=0) {
@@ -163,7 +157,7 @@ extends FacetFactoryAbstract {
             final DefaultsProvider<?> defaultsProvider = semanticsProvider.getDefaultsProvider();
             if (defaultsProvider != null) {
                 //holder.getServiceInjector().injectServicesInto(defaultsProvider);
-                //FIXME convert to using value-facet
+                //FIXME[ISIS-2882] convert to using value-facet, see EncodableFacetFromValueFacet
                 addFacet(new DefaultedFacetUsingDefaultsProvider(defaultsProvider, holder));
             }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index 9138d7c..a25f2e4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -43,7 +43,7 @@ import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
+import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetFromValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.valuesemantics.StringValueSemantics;
 
@@ -60,7 +60,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     //private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
     private ValueSemanticsProvider<?> valueSemanticsProvider;
-    private EncodableFacetUsingEncoderDecoder encodeableFacet;
+    private EncodableFacetFromValueFacet encodeableFacet;
 
     @Before
     public void setUp() throws Exception {
@@ -99,7 +99,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     protected void setSemantics(final ValueSemanticsAbstract<?> valueSemantics) {
         this.valueSemanticsProvider = valueSemantics;
-        this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(
+        this.encodeableFacet = EncodableFacetFromValueFacet.forTesting(
                 valueSemantics.getEncoderDecoder(),
                 mockFacetHolder);
     }
@@ -137,7 +137,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     public void testDecodeNULL() throws Exception {
         Assume.assumeThat(valueSemanticsProvider.getEncoderDecoder(), is(not(nullValue())));
 
-        final Object newValue = encodeableFacet.fromEncodedString(EncodableFacetUsingEncoderDecoder.ENCODED_NULL);
+        final Object newValue = encodeableFacet.fromEncodedString(EncodableFacetFromValueFacet.ENCODED_NULL);
         assertNull(newValue);
     }
 
@@ -145,7 +145,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     public void testEmptyEncoding() {
         Assume.assumeThat(valueSemanticsProvider.getEncoderDecoder(), is(not(nullValue())));
 
-        assertEquals(EncodableFacetUsingEncoderDecoder.ENCODED_NULL, encodeableFacet.toEncodedString(null));
+        assertEquals(EncodableFacetFromValueFacet.ENCODED_NULL, encodeableFacet.toEncodedString(null));
     }
 
     @Test
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder_actionReturningCollection.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder_actionReturningCollection.java
index d1f354d..8063a61 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder_actionReturningCollection.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder_actionReturningCollection.java
@@ -18,7 +18,6 @@
  */
 package demoapp.dom.types.javasql.javasqldate.holder;
 
-import java.sql.Date;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
@@ -45,6 +44,6 @@ public class JavaSqlDateHolder_actionReturningCollection {
     }
 
     @Inject
-    Samples<Date> samples;
+    Samples<java.sql.Date> samples;
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/samples/JavaSqlDateSamples.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/samples/JavaSqlDateSamples.java
index da7c4cc..ac8f663 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/samples/JavaSqlDateSamples.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/samples/JavaSqlDateSamples.java
@@ -18,7 +18,6 @@
  */
 package demoapp.dom.types.javasql.javasqldate.samples;
 
-import java.sql.Date;
 import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
@@ -26,10 +25,10 @@ import org.springframework.stereotype.Service;
 import demoapp.dom.types.Samples;
 
 @Service
-public class JavaSqlDateSamples implements Samples<Date> {
+public class JavaSqlDateSamples implements Samples<java.sql.Date> {
 
     @Override
-    public Stream<Date> stream() {
+    public Stream<java.sql.Date> stream() {
         return Stream.of(1, 2, 3)
                 .map(x -> new java.sql.Date(120,x,x));  // 1900 is the epoch
     }