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 b2fb7b1 ISIS-2877: adds composite value marshalling tests
b2fb7b1 is described below
commit b2fb7b14672a2dcdf6228a2f659ca17b2ca1a975
Author: Andi Huber <[email protected]>
AuthorDate: Tue Feb 1 13:59:11 2022 +0100
ISIS-2877: adds composite value marshalling tests
---
.../metamodel/facets/object/value/ValueFacet.java | 6 ++
.../facets/object/value/ValueFacetAbstract.java | 13 ++++
.../applib/value/CalendarEventSemantics.java | 20 ------
.../isis/testdomain/value/ValueSemanticsTest.java | 76 +++++++++++++---------
.../testdomain/value/ValueSemanticsTester.java | 32 +++++++--
5 files changed, 91 insertions(+), 56 deletions(-)
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 9f2974d..6e26c1c 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
@@ -30,6 +30,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider.Context;
import org.apache.isis.commons.collections.Can;
@@ -78,6 +79,11 @@ public interface ValueFacet<T> extends Facet {
/** no qualifiers allowed on the default semantics provider*/
Optional<EncoderDecoder<T>> selectDefaultEncoderDecoder();
+ // -- ENCODER DECODER
+
+ /** no qualifiers allowed on the default semantics provider*/
+ Optional<ValueComposer<T>> selectDefaultComposer();
+
// -- PARSER
/** no qualifiers allowed on the default semantics provider*/
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 6a1abb8..6a9f1b7 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider.Context;
import org.apache.isis.commons.collections.Can;
@@ -145,6 +146,18 @@ implements ValueFacet<T> {
.findFirst();
}
+ // -- COMPOSER
+
+ @Override
+ public Optional<ValueComposer<T>> selectDefaultComposer() {
+ return getValueSemantics()
+ .stream()
+ .filter(isMatchingAnyOf(Can.empty()))
+ .map(ValueSemanticsProvider::getComposer)
+ .filter(_NullSafe::isPresent)
+ .findFirst();
+ }
+
// -- PARSER
@Override
diff --git
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
index e5b5310..3ba7f0c 100644
---
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
+++
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
@@ -35,12 +35,10 @@ import org.apache.isis.applib.annotation.PromptStyle;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.util.schema.CommonDtoUtils;
import org.apache.isis.applib.value.semantics.DefaultsProvider;
-import org.apache.isis.applib.value.semantics.EncoderDecoder;
import org.apache.isis.applib.value.semantics.Renderer;
import org.apache.isis.applib.value.semantics.ValueComposer;
import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Strings;
import org.apache.isis.schema.common.v2.TypedTupleDto;
import org.apache.isis.schema.common.v2.ValueType;
@@ -57,7 +55,6 @@ public class CalendarEventSemantics
extends ValueSemanticsAbstract<CalendarEvent>
implements
DefaultsProvider<CalendarEvent>,
- EncoderDecoder<CalendarEvent>,
Renderer<CalendarEvent>,
ValueComposer<CalendarEvent> {
@@ -79,23 +76,6 @@ implements
Instant.now().toEpochMilli(), "Default Calendar", "New Event",
"empty");
}
- // -- ENCODER/DECODER
-
- @Override
- public String toEncodedString(final CalendarEvent value) {
- return value!=null
- ? new CalendarEvent.JaxbAdapter().marshal(value)
- : null;
- }
-
- @Override
- public CalendarEvent fromEncodedString(final String encodedString) {
- val text = _Strings.blankToNullOrTrim(encodedString);
- return text!=null
- ? new CalendarEvent.JaxbAdapter().unmarshal(text)
- : null;
- }
-
// -- COMPOSER
@Override
diff --git
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
index 4ea0fdb..2f6e05d 100644
---
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
+++
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
@@ -38,6 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.graph.tree.TreeNode;
import org.apache.isis.applib.locale.UserLocale;
import org.apache.isis.applib.services.command.Command;
@@ -48,11 +49,15 @@ import org.apache.isis.applib.value.Password;
import org.apache.isis.applib.value.semantics.EncoderDecoder;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
import org.apache.isis.commons.internal.collections._Sets;
import org.apache.isis.core.config.presets.IsisPresets;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction;
import org.apache.isis.core.metamodel.services.schema.SchemaValueMarshaller;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.schema.cmd.v2.PropertyDto;
import org.apache.isis.testdomain.conf.Configuration_headless;
@@ -125,37 +130,51 @@ class ValueSemanticsTest {
new PropertyInteractionProbe<T>() {
@Override
+ public void testComposer(
+ final ValueSemanticsProvider.Context context,
+ final ValueComposer<T> composer) {
+
+ // composer round-trip test
+ val dto = composer.decompose(example.getValue());
+
+ tester.assertValueEquals(
+ example.getValue(),
+ composer.compose(dto),
+ "decompose/compose roundtrip failed");
+
+
+ val valueMixin =
composer.getValueMixin(example.getValue());
+ if(valueMixin!=null) {
+
+ val spec =
specLoader.specForTypeElseFail(valueMixin.getClass());
+ val interaction = ActionInteraction
+ .start(ManagedObject.of(spec, valueMixin),
"act", Where.ANYWHERE);
+
+ val pendingParams = interaction
+ .startParameterNegotiation()
+ .get();
+
+ val managedAction =
interaction.getManagedActionElseFail();
+ val typedTuple = pendingParams.getParamValues();
+
+ val recoveredValue = managedAction
+ .invoke(typedTuple,
InteractionInitiatedBy.PASS_THROUGH)
+ .leftIfAny()
+ .getPojo();
+
+ tester.assertValueEquals(
+ example.getValue(),
+ recoveredValue,
+ "serialization roundtrip failed");
+ }
+
+ }
+
+ @Override
public void testEncoderDecoder(
final ValueSemanticsProvider.Context context,
final EncoderDecoder<T> codec) {
-// val valueMixin =
composer.getValueMixin(example.getValue());
-// if(valueMixin!=null) {
-//
-// val spec =
specLoader.specForTypeElseFail(valueMixin.getClass());
-// val interaction = ActionInteraction
-// .start(ManagedObject.of(spec,
valueMixin), "act", Where.ANYWHERE);
-//
-// val pendingParams = interaction
-// .startParameterNegotiation()
-// .get();
-//
-// val managedAction =
interaction.getManagedActionElseFail();
-// val typedTuple = pendingParams.getParamValues();
-//
-// val recoveredValue = managedAction
-// .invoke(typedTuple,
InteractionInitiatedBy.PASS_THROUGH)
-// .leftIfAny()
-// .getPojo();
-//
-// tester.assertValueEquals(
-// example.getValue(),
-// recoveredValue,
-// "serialization roundtrip failed");
-//
-// return;
-// }
-
// CoderDecoder round-trip test
val serialized =
codec.toEncodedString(example.getValue());
@@ -195,8 +214,7 @@ class ValueSemanticsTest {
@Override
public void testCommand(
final ValueSemanticsProvider.Context context,
- final Command command,
- final EncoderDecoder<T> codec) {
+ final Command command) {
val propertyDto =
(PropertyDto)command.getCommandDto().getMember();
val newValueRecordedDto = propertyDto.getNewValue();
diff --git
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
index a497efc..2ce3797 100644
---
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
+++
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
import org.apache.isis.applib.value.semantics.OrderRelation;
import org.apache.isis.applib.value.semantics.Parser;
import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
import org.apache.isis.commons.internal.base._Casts;
import org.apache.isis.commons.internal.base._Refs;
@@ -73,10 +74,11 @@ public class ValueSemanticsTester<T> {
}
public static interface PropertyInteractionProbe<T> {
+ void testComposer(ValueSemanticsProvider.Context context,
ValueComposer<T> composer);
void testEncoderDecoder(ValueSemanticsProvider.Context context,
EncoderDecoder<T> codec);
void testParser(ValueSemanticsProvider.Context context, Parser<T>
parser);
void testRenderer(ValueSemanticsProvider.Context context, Renderer<T>
renderer);
- void testCommand(ValueSemanticsProvider.Context context, Command
command, EncoderDecoder<T> codec);
+ void testCommand(ValueSemanticsProvider.Context context, Command
command);
}
@SneakyThrows
@@ -92,9 +94,20 @@ public class ValueSemanticsTester<T> {
val context = valueFacet(prop)
.createValueSemanticsContext(prop);
- val codec = codec(prop);
+ val composerIfAny = composer(prop);
+ if(composerIfAny.isPresent()) {
+ probe.testComposer(context, composerIfAny.get());
+ }
+
+ val codecIfAny = codec(prop);
+ if(codecIfAny.isPresent()) {
+ probe.testEncoderDecoder(context, codecIfAny.get());
+ }
- probe.testEncoderDecoder(context, codec);
+ assertTrue(composerIfAny.isPresent()
+ || codecIfAny.isPresent(), ()->
+ "either codec or composer must be available for "
+ + context.getFeatureIdentifier());
val parserIfAny = parser(prop);
if(parserIfAny.isPresent()) {
@@ -116,7 +129,7 @@ public class ValueSemanticsTester<T> {
propInteraction.modifyProperty(managedProp->
ManagedObject.of(managedProp.getElementType(),
newProperyValueProvider.apply(managedProp)));
- probe.testCommand(context, command, codec);
+ probe.testCommand(context, command);
});
}
@@ -171,11 +184,16 @@ public class ValueSemanticsTester<T> {
return _Casts.uncheckedCast(valueFacet);
}
- private EncoderDecoder<T> codec(
+ private Optional<ValueComposer<T>> composer(
+ final ObjectFeature feature) {
+ val valueFacet = valueFacet(feature);
+ return valueFacet.selectDefaultComposer();
+ }
+
+ private Optional<EncoderDecoder<T>> codec(
final ObjectFeature feature) {
val valueFacet = valueFacet(feature);
- return valueFacet.selectDefaultEncoderDecoder()
- .orElseThrow(()->_Exceptions.noSuchElement());
+ return valueFacet.selectDefaultEncoderDecoder();
}
private Optional<Parser<T>> parser(