From aad1490336952b411d7ac9569b2e1ed4173e8b48 Mon Sep 17 00:00:00 2001 From: "ah.jo" Date: Mon, 26 Feb 2024 16:54:09 +0900 Subject: [PATCH] Refactor moving ObjectNode mutable properties to ArbitraryProperty (#932) --- docs/content/v1.0.x/release-notes/_index.md | 2 + .../api/generator/ArbitraryProperty.java | 45 ++++++++++++++++--- .../IntrospectedArbitraryGenerator.java | 2 +- .../api/generator/ObjectProperty.java | 7 +++ .../ObjectPropertyGeneratorContext.java | 5 +++ .../introspector/OptionalIntrospector.java | 2 +- .../NodeSetDecomposedValueManipulator.java | 1 - .../tree/ArbitraryTraverser.java | 14 ++++-- .../fixturemonkey/tree/ObjectTree.java | 2 +- 9 files changed, 65 insertions(+), 15 deletions(-) diff --git a/docs/content/v1.0.x/release-notes/_index.md b/docs/content/v1.0.x/release-notes/_index.md index 6be39a61b..ca43eab20 100644 --- a/docs/content/v1.0.x/release-notes/_index.md +++ b/docs/content/v1.0.x/release-notes/_index.md @@ -9,6 +9,8 @@ sectionStart ### v.1.0.14 Add supporting for sealed class and sealed interface. +Deprecate `nullInject` and `childPropertyListsByCandidateProperty` properties in `ObjectNode`. They would be moved to `ArbitraryProperty`. + sectionEnd sectionStart diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryProperty.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryProperty.java index 9ab47f2a1..658c07500 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryProperty.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ArbitraryProperty.java @@ -20,21 +20,40 @@ import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import org.apiguardian.api.API; import org.apiguardian.api.API.Status; +import com.navercorp.fixturemonkey.api.matcher.Matcher; import com.navercorp.fixturemonkey.api.property.Property; @API(since = "0.4.0", status = Status.MAINTAINED) public final class ArbitraryProperty { private final ObjectProperty objectProperty; private final boolean container; + private final double nullInject; + private final Map> childPropertyListsByCandidateProperty; + @Deprecated public ArbitraryProperty(ObjectProperty objectProperty, boolean container) { this.objectProperty = objectProperty; this.container = container; + this.nullInject = objectProperty.getNullInject(); + this.childPropertyListsByCandidateProperty = objectProperty.getChildPropertyListsByCandidateProperty(); + } + + public ArbitraryProperty( + ObjectProperty objectProperty, + boolean container, + double nullInject, + Map> childPropertyListsByCandidateProperty + ) { + this.objectProperty = objectProperty; + this.container = container; + this.nullInject = nullInject; + this.childPropertyListsByCandidateProperty = childPropertyListsByCandidateProperty; } public ObjectProperty getObjectProperty() { @@ -49,13 +68,25 @@ public ArbitraryProperty withNullInject(double nullInject) { return new ArbitraryProperty(this.objectProperty.withNullInject(nullInject), this.container); } - public ArbitraryProperty withChildPropertyListsByCandidateProperty( - Map> childPropertyListsByCandidateProperty - ) { - return new ArbitraryProperty( - this.objectProperty.withChildPropertyListsByCandidateProperty(childPropertyListsByCandidateProperty), - this.container - ); + public double getNullInject() { + return nullInject; + } + + public Map> getChildPropertyListsByCandidateProperty() { + return childPropertyListsByCandidateProperty; + } + + public Map.Entry> getChildPropertiesByResolvedProperty(Matcher matcher) { + for ( + Entry> childPropertyListByPossibleProperty : + childPropertyListsByCandidateProperty.entrySet() + ) { + Property property = childPropertyListByPossibleProperty.getKey(); + if (matcher.match(property)) { + return childPropertyListByPossibleProperty; + } + } + throw new IllegalArgumentException("No resolved property is found."); } @Override diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/IntrospectedArbitraryGenerator.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/IntrospectedArbitraryGenerator.java index bcaf70c3d..85b211c19 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/IntrospectedArbitraryGenerator.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/IntrospectedArbitraryGenerator.java @@ -63,7 +63,7 @@ public CombinableArbitrary generate(ArbitraryGeneratorContext context) { ArbitraryIntrospectorResult result = this.arbitraryIntrospector.introspect(context); if (result != ArbitraryIntrospectorResult.NOT_INTROSPECTED && result.getValue() != null) { - double nullInject = context.getArbitraryProperty().getObjectProperty().getNullInject(); + double nullInject = context.getArbitraryProperty().getNullInject(); return new TraceableCombinableArbitrary<>( result.getValue() .injectNull(nullInject), diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectProperty.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectProperty.java index b8aae951c..bbd20155f 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectProperty.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectProperty.java @@ -39,11 +39,13 @@ public final class ObjectProperty { private final PropertyNameResolver propertyNameResolver; + @Deprecated private final double nullInject; @Nullable private final Integer elementIndex; + @Deprecated private final Map> childPropertyListsByCandidateProperty; public ObjectProperty( @@ -72,6 +74,7 @@ public String getResolvedPropertyName() { return this.getPropertyNameResolver().resolve(this.property); } + @Deprecated public double getNullInject() { return this.nullInject; } @@ -81,6 +84,7 @@ public Integer getElementIndex() { return this.elementIndex; } + @Deprecated public Map.Entry> getChildPropertiesByResolvedProperty(Matcher matcher) { for ( Entry> childPropertyListByPossibleProperty : @@ -94,6 +98,7 @@ public Map.Entry> getChildPropertiesByResolvedProperty( throw new IllegalArgumentException("No resolved property is found."); } + @Deprecated public Map> getChildPropertyListsByCandidateProperty() { return childPropertyListsByCandidateProperty; } @@ -102,6 +107,7 @@ public boolean isRoot() { return this.property instanceof RootProperty; } + @Deprecated public ObjectProperty withNullInject(double nullInject) { return new ObjectProperty( this.property, @@ -112,6 +118,7 @@ public ObjectProperty withNullInject(double nullInject) { ); } + @Deprecated public ObjectProperty withChildPropertyListsByCandidateProperty( Map> childPropertyListsByCandidateProperty ) { diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectPropertyGeneratorContext.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectPropertyGeneratorContext.java index 912b391b0..dfcd54d58 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectPropertyGeneratorContext.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/generator/ObjectPropertyGeneratorContext.java @@ -36,10 +36,13 @@ public final class ObjectPropertyGeneratorContext { @Nullable private final ArbitraryProperty ownerProperty; private final boolean container; + @Deprecated private final PropertyGenerator propertyGenerator; private final PropertyNameResolver propertyNameResolver; + @Deprecated private final NullInjectGenerator nullInjectGenerator; + @Deprecated public ObjectPropertyGeneratorContext( Property property, @Nullable Integer elementIndex, @@ -76,6 +79,7 @@ public boolean isContainer() { return this.container; } + @Deprecated public PropertyGenerator getPropertyGenerator() { return propertyGenerator; } @@ -84,6 +88,7 @@ public PropertyNameResolver getPropertyNameResolver() { return propertyNameResolver; } + @Deprecated public NullInjectGenerator getNullInjectGenerator() { return nullInjectGenerator; } diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/OptionalIntrospector.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/OptionalIntrospector.java index eabed452f..b241decd5 100644 --- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/OptionalIntrospector.java +++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/introspector/OptionalIntrospector.java @@ -60,7 +60,7 @@ public ArbitraryIntrospectorResult introspect(ArbitraryGeneratorContext context) } Class type = Types.getActualType(property.getObjectProperty().getProperty().getType()); ArbitraryProperty valueProperty = children.get(0); - double presenceProbability = 1 - valueProperty.getObjectProperty().getNullInject(); + double presenceProbability = 1 - valueProperty.getNullInject(); if (children.size() == 1) { presenceProbability = 1.0d; } diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/customizer/NodeSetDecomposedValueManipulator.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/customizer/NodeSetDecomposedValueManipulator.java index c2a1a25fa..69a7c5bb1 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/customizer/NodeSetDecomposedValueManipulator.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/customizer/NodeSetDecomposedValueManipulator.java @@ -149,7 +149,6 @@ private void setValue(ObjectNode objectNode, @Nullable Object value) { } Entry> childPropertiesByResolvedProperty = objectNode.getArbitraryProperty() - .getObjectProperty() .getChildPropertiesByResolvedProperty( property -> isAssignable(value.getClass(), Types.getActualType(property.getType())) ); diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ArbitraryTraverser.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ArbitraryTraverser.java index 9f32555fc..3e31e1fea 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ArbitraryTraverser.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ArbitraryTraverser.java @@ -107,7 +107,12 @@ public ObjectNode traverse( ); } - ArbitraryProperty arbitraryProperty = new ArbitraryProperty(objectProperty, container); + ArbitraryProperty arbitraryProperty = new ArbitraryProperty( + objectProperty, + container, + objectProperty.getNullInject(), + objectProperty.getChildPropertyListsByCandidateProperty() + ); List parentArbitraryProperties = new ArrayList<>(); parentArbitraryProperties.add(arbitraryProperty); @@ -182,11 +187,10 @@ private ObjectNode generateObjectNode( @Nullable Property resolvedParentProperty, TraverseContext context ) { - ObjectProperty objectProperty = arbitraryProperty.getObjectProperty(); List children = new ArrayList<>(); Map> childPropertyListsByCandidateProperty = - objectProperty.getChildPropertyListsByCandidateProperty(); + arbitraryProperty.getChildPropertyListsByCandidateProperty(); for ( Entry> childPropertiesByCandidateProperty : @@ -315,7 +319,9 @@ private List generateChildrenNodes( ArbitraryProperty childArbitraryProperty = new ArbitraryProperty( childObjectProperty, - childContainerProperty != null + childContainer, + childObjectProperty.getNullInject(), + childObjectProperty.getChildPropertyListsByCandidateProperty() ); ObjectNode childNode = this.traverse( diff --git a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ObjectTree.java b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ObjectTree.java index 9c2805345..33c5d6bd3 100644 --- a/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ObjectTree.java +++ b/fixture-monkey/src/main/java/com/navercorp/fixturemonkey/tree/ObjectTree.java @@ -139,7 +139,7 @@ private CombinableArbitrary generateIntrospected( CombinableArbitrary generated; if (node.getArbitrary() != null) { generated = node.getArbitrary() - .injectNull(node.getArbitraryProperty().getObjectProperty().getNullInject()); + .injectNull(node.getArbitraryProperty().getNullInject()); } else { CombinableArbitrary cached = monkeyContext.getCachedArbitrary(node.getProperty());