From 05c84a978e0ad14a9ec92657051a8af40e603c88 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 28 Feb 2024 13:58:50 +0100 Subject: [PATCH 1/4] refactor: add default implementation for name(), keep name on DR node Signed-off-by: Chris Laprun --- .../api/reconciler/dependent/DependentResource.java | 4 +++- .../dependent/AbstractDependentResource.java | 7 ++++++- .../AbstractEventSourceHolderDependentResource.java | 5 +++++ .../kubernetes/KubernetesDependentResource.java | 7 ++++++- .../workflow/AbstractWorkflowExecutor.java | 6 ++---- .../dependent/workflow/DefaultManagedWorkflow.java | 8 ++++---- .../dependent/workflow/DefaultWorkflow.java | 2 +- .../dependent/workflow/DependentResourceNode.java | 3 +++ .../dependent/workflow/WorkflowBuilder.java | 3 +-- .../ControllerConfigurationOverriderTest.java | 11 +---------- .../DependentResourceConfigurationResolverTest.java | 10 +--------- .../workflow/AbstractWorkflowExecutorTest.java | 8 +++----- .../config/BaseConfigurationServiceTest.java | 13 +------------ 13 files changed, 37 insertions(+), 50 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java index eb51ac3688..98d700324d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java @@ -69,6 +69,8 @@ default boolean isDeletable() { return this instanceof Deleter; } - String name(); + default String name() { + return defaultNameFor(getClass()); + } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java index 21dc66bd98..aa2f0616ba 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java @@ -30,16 +30,21 @@ public abstract class AbstractDependentResource private ResourceDiscriminator resourceDiscriminator; private final DependentResourceReconciler dependentResourceReconciler; - protected String name = DependentResource.defaultNameFor(this.getClass()); + protected String name; @SuppressWarnings({"unchecked"}) protected AbstractDependentResource() { + this(null); + } + + protected AbstractDependentResource(String name) { creator = creatable ? (Creator) this : null; updater = updatable ? (Updater) this : null; dependentResourceReconciler = this instanceof BulkDependentResource ? new BulkDependentResourceReconciler<>((BulkDependentResource) this) : new SingleDependentResourceReconciler<>(this); + this.name = name == null ? DependentResource.defaultNameFor(this.getClass()) : name; } /** diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java index 6562afd09f..0b9f2ae897 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java @@ -31,6 +31,11 @@ public abstract class AbstractEventSourceHolderDependentResource resourceType) { + this(resourceType, null); + } + + protected AbstractEventSourceHolderDependentResource(Class resourceType, String name) { + super(name); this.resourceType = resourceType; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index b804b88a30..a190853b58 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -43,7 +43,12 @@ public abstract class KubernetesDependentResource resourceType) { - super(resourceType); + this(resourceType, null); + } + + @SuppressWarnings("unchecked") + public KubernetesDependentResource(Class resourceType, String name) { + super(resourceType, name); usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher; updaterMatcher = usingCustomResourceUpdateMatcher diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java index cde85a7af4..56e5e17d07 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java @@ -139,13 +139,11 @@ protected void registerOrDeregisterEventSourceBasedOnActivation( .eventSourceContextForDynamicRegistration()); var es = eventSource.orElseThrow(); context.eventSourceRetriever() - .dynamicallyRegisterEventSource(dependentResourceNode.getDependentResource().name(), - es); + .dynamicallyRegisterEventSource(dependentResourceNode.getName(), es); } else { context.eventSourceRetriever() - .dynamicallyDeRegisterEventSource( - dependentResourceNode.getDependentResource().name()); + .dynamicallyDeRegisterEventSource(dependentResourceNode.getName()); } } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java index f125fcbe84..08fe788f73 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java @@ -85,7 +85,7 @@ public Workflow

resolve(KubernetesClient client, spec.getReadyCondition(), spec.getActivationCondition(), resolve(spec, client, configuration)); - alreadyResolved.put(node.getDependentResource().name(), node); + alreadyResolved.put(node.getName(), node); spec.getDependsOn() .forEach(depend -> node.addDependsOnRelation(alreadyResolved.get(depend))); } @@ -106,9 +106,9 @@ private DependentResource resolve(DependentResourceSpec spec, configuration.getConfigurationService().dependentResourceFactory() .createFrom(spec, configuration); - if (spec.getName() != null && !spec.getName().equals(NO_VALUE_SET) - && dependentResource instanceof NameSetter) { - ((NameSetter) dependentResource).setName(spec.getName()); + final var name = spec.getName(); + if (name != null && !NO_VALUE_SET.equals(name) && dependentResource instanceof NameSetter) { + ((NameSetter) dependentResource).setName(name); } if (dependentResource instanceof KubernetesClientAware) { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java index 9b899c21f7..d31f42419d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java @@ -77,7 +77,7 @@ private Map toMap(Set node bottomLevelResource.remove(dependsOn); } } - map.put(node.getDependentResource().name(), node); + map.put(node.getName(), node); } if (topLevelResources.size() == 0) { throw new IllegalStateException( diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java index 0a524d573f..4872d4306a 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java @@ -54,6 +54,9 @@ public Optional> getReconcilePrecondition() { return Optional.ofNullable(reconcilePrecondition); } + public String getName() { + return dependentResource.name(); + } public Optional> getDeletePostcondition() { return Optional.ofNullable(deletePostcondition); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java index 83e85539c3..90ece70d26 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java @@ -65,8 +65,7 @@ public WorkflowBuilder

withActivationCondition(Condition activationCondition) DependentResourceNode getNodeByDependentResource(DependentResource dependentResource) { // first check by name - final var node = - dependentResourceNodes.get(dependentResource.name()); + final var node = dependentResourceNodes.get(dependentResource.name()); if (node != null) { return node; } else { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java index 2782c860dd..fa860c917d 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java @@ -26,11 +26,7 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class ControllerConfigurationOverriderTest { private final BaseConfigurationService configurationService = new BaseConfigurationService(); @@ -102,11 +98,6 @@ public Class resourceType() { return Object.class; } - @Override - public String name() { - return null; - } - @Override public void configureWith(String config) { this.config = config; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfigurationResolverTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfigurationResolverTest.java index 4a91909771..31f140c558 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfigurationResolverTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfigurationResolverTest.java @@ -24,10 +24,7 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; import static io.javaoperatorsdk.operator.api.config.dependent.DependentResourceConfigurationResolverTest.CustomAnnotationReconciler.DR_NAME; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class DependentResourceConfigurationResolverTest { @@ -175,11 +172,6 @@ public Class resourceType() { return ConfigMap.class; } - @Override - public String name() { - return null; - } - @Override public void configureWith(CustomConfig config) { this.config = config; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java index 59e6fef55a..219e9af869 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java @@ -36,9 +36,7 @@ public class AbstractWorkflowExecutorTest { public class TestDependent extends KubernetesDependentResource { public TestDependent(String name) { - super(ConfigMap.class); - setName(name); - + super(ConfigMap.class, name); } @Override @@ -51,7 +49,7 @@ public ReconcileResult reconcile(TestCustomResource primary, @Override public String toString() { - return name; + return name(); } } @@ -91,7 +89,7 @@ public void delete(TestCustomResource primary, Context conte } public class TestErrorDependent implements DependentResource { - private String name; + private final String name; public TestErrorDependent(String name) { this.name = name; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java index fb94047aa0..97c5ec112c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java @@ -42,13 +42,7 @@ import io.javaoperatorsdk.operator.processing.retry.RetryExecution; import io.javaoperatorsdk.operator.sample.readonly.ReadOnlyDependent; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; class BaseConfigurationServiceTest { @@ -470,11 +464,6 @@ public Class resourceType() { return ConfigMap.class; } - @Override - public String name() { - return null; - } - @Override public void configureWith(CustomConfig config) { this.config = config; From 39d0ff1b1a7931f6c500d80fa9865f0b141de586 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 1 Mar 2024 14:08:20 +0100 Subject: [PATCH 2/4] refactor: make class package-protected since it's internal Signed-off-by: Chris Laprun --- .../processing/dependent/workflow/DependentResourceNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java index 4872d4306a..f9b812b065 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java @@ -8,7 +8,7 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @SuppressWarnings("rawtypes") -public class DependentResourceNode { +class DependentResourceNode { private final List dependsOn = new LinkedList<>(); private final List parents = new LinkedList<>(); From a9929afb0965662e1872d7ecfe762fe03f590274 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 1 Mar 2024 14:11:27 +0100 Subject: [PATCH 3/4] refactor: make package-protected since it's internal, remove unused method Signed-off-by: Chris Laprun --- .../dependent/workflow/DependentResourceNode.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java index f9b812b065..7ab606908c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java @@ -107,12 +107,6 @@ public int hashCode() { return this.getDependentResource().name().hashCode(); } - @SuppressWarnings("rawtypes") - static String getNameFor(DependentResource dependentResource) { - return DependentResource.defaultNameFor(dependentResource.getClass()) + "#" - + dependentResource.hashCode(); - } - @Override public String toString() { return "DependentResourceNode{" + getDependentResource() + '}'; From 1b906cb43d60922252497c887ef02ceb66b7fdde Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 1 Mar 2024 14:29:31 +0100 Subject: [PATCH 4/4] fix: remove DependentResourceNode.getName method, clean-up Signed-off-by: Chris Laprun --- .../workflow/AbstractWorkflowExecutor.java | 13 ++++++------- .../dependent/workflow/DefaultManagedWorkflow.java | 5 +++-- .../dependent/workflow/DefaultWorkflow.java | 6 +++--- .../dependent/workflow/DependentResourceNode.java | 4 ---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java index 56e5e17d07..05b546553c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java @@ -18,7 +18,7 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID; @SuppressWarnings("rawtypes") -public abstract class AbstractWorkflowExecutor

{ +abstract class AbstractWorkflowExecutor

{ protected final Workflow

workflow; protected final P primary; @@ -133,17 +133,16 @@ protected void registerOrDeregisterEventSourceBasedOnActivation( boolean activationConditionMet, DependentResourceNode dependentResourceNode) { if (dependentResourceNode.getActivationCondition().isPresent()) { + final var dr = dependentResourceNode.getDependentResource(); + final var eventSourceRetriever = context.eventSourceRetriever(); if (activationConditionMet) { var eventSource = - dependentResourceNode.getDependentResource().eventSource(context.eventSourceRetriever() - .eventSourceContextForDynamicRegistration()); + dr.eventSource(eventSourceRetriever.eventSourceContextForDynamicRegistration()); var es = eventSource.orElseThrow(); - context.eventSourceRetriever() - .dynamicallyRegisterEventSource(dependentResourceNode.getName(), es); + eventSourceRetriever.dynamicallyRegisterEventSource(dr.name(), es); } else { - context.eventSourceRetriever() - .dynamicallyDeRegisterEventSource(dependentResourceNode.getName()); + eventSourceRetriever.dynamicallyDeRegisterEventSource(dr.name()); } } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java index 08fe788f73..fb0b733c32 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java @@ -79,13 +79,14 @@ public Workflow

resolve(KubernetesClient client, ControllerConfiguration

configuration) { final var alreadyResolved = new HashMap(orderedSpecs.size()); for (DependentResourceSpec spec : orderedSpecs) { + final var dependentResource = resolve(spec, client, configuration); final var node = new DependentResourceNode( spec.getReconcileCondition(), spec.getDeletePostCondition(), spec.getReadyCondition(), spec.getActivationCondition(), - resolve(spec, client, configuration)); - alreadyResolved.put(node.getName(), node); + dependentResource); + alreadyResolved.put(dependentResource.name(), node); spec.getDependsOn() .forEach(depend -> node.addDependsOnRelation(alreadyResolved.get(depend))); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java index d31f42419d..1c241aebbc 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java @@ -20,7 +20,7 @@ * @param

primary resource */ @SuppressWarnings("rawtypes") -public class DefaultWorkflow

implements Workflow

{ +class DefaultWorkflow

implements Workflow

{ private final Map dependentResourceNodes; private final Set topLevelResources; @@ -77,9 +77,9 @@ private Map toMap(Set node bottomLevelResource.remove(dependsOn); } } - map.put(node.getName(), node); + map.put(node.getDependentResource().name(), node); } - if (topLevelResources.size() == 0) { + if (topLevelResources.isEmpty()) { throw new IllegalStateException( "No top-level dependent resources found. This might indicate a cyclic Set of DependentResourceNode has been provided."); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java index 7ab606908c..3e8a762c5e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java @@ -54,10 +54,6 @@ public Optional> getReconcilePrecondition() { return Optional.ofNullable(reconcilePrecondition); } - public String getName() { - return dependentResource.name(); - } - public Optional> getDeletePostcondition() { return Optional.ofNullable(deletePostcondition); }