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
}