From 9ae739de482050f849abf880a3572574b595802f Mon Sep 17 00:00:00 2001 From: Paul Ferraro Date: Thu, 27 Jul 2017 15:56:40 -0400 Subject: [PATCH] WFLY-9146 Fix transformation of legacy protocol write-attribute operations --- .../OperationStepHandlerDescriptor.java | 11 ------- .../RemoveStepHandlerDescriptor.java | 11 +++++++ .../controller/ResourceRegistration.java | 31 +++++++++++++------ ...rtParentResourceWriteAttributeHandler.java | 6 +--- .../controller/WriteAttributeStepHandler.java | 5 +-- .../as/clustering/function/Predicates.java | 4 +++ 6 files changed, 38 insertions(+), 30 deletions(-) diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/OperationStepHandlerDescriptor.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/OperationStepHandlerDescriptor.java index 71d2b5154e65..e603bce08c66 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/OperationStepHandlerDescriptor.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/OperationStepHandlerDescriptor.java @@ -25,9 +25,7 @@ import java.util.Collections; import java.util.Map; import java.util.function.Predicate; -import java.util.function.UnaryOperator; -import org.jboss.as.controller.OperationStepHandler; import org.jboss.dmr.ModelNode; /** @@ -42,13 +40,4 @@ public interface OperationStepHandlerDescriptor { default Map> getCapabilities() { return Collections.emptyMap(); } - - /** - * Returns a transformer to be applied to all operations that operate on an existing resource. - * This is typically used to adapt legacy operations to conform to the current version of the model. - * @return an operation handler transformer. - */ - default UnaryOperator getOperationTransformation() { - return UnaryOperator.identity(); - } } diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/RemoveStepHandlerDescriptor.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/RemoveStepHandlerDescriptor.java index 27c3725458c6..704cb1e749c5 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/RemoveStepHandlerDescriptor.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/RemoveStepHandlerDescriptor.java @@ -25,8 +25,10 @@ import java.util.Collections; import java.util.Map; import java.util.function.Function; +import java.util.function.UnaryOperator; import org.jboss.as.controller.CapabilityReferenceRecorder; +import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.descriptions.ResourceDescriptionResolver; @@ -58,4 +60,13 @@ default Collection getRuntimeResourceRegistrations( default Map> getResourceCapabilityReferences() { return Collections.emptyMap(); } + + /** + * Returns a transformer to be applied to all operations that operate on an existing resource. + * This is typically used to adapt legacy operations to conform to the current version of the model. + * @return an operation handler transformer. + */ + default UnaryOperator getOperationTransformation() { + return UnaryOperator.identity(); + } } diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/ResourceRegistration.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/ResourceRegistration.java index 0afaf3818b5c..ce09cf515e58 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/ResourceRegistration.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/ResourceRegistration.java @@ -22,11 +22,14 @@ package org.jboss.as.clustering.controller; -import java.util.function.UnaryOperator; +import java.util.Optional; +import org.jboss.as.clustering.function.Predicates; +import org.jboss.as.controller.OperationDefinition; import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.operations.global.ListOperations; import org.jboss.as.controller.operations.global.MapOperations; +import org.jboss.as.controller.operations.global.WriteAttributeHandler; import org.jboss.as.controller.registry.ManagementResourceRegistration; /** @@ -64,16 +67,24 @@ public void register(ManagementResourceRegistration registration) { this.addRegistration.register(registration); this.removeRegistration.register(registration); - UnaryOperator transformer = this.descriptor.getOperationTransformation(); + // Override global operations with transformed operations, if necessary + this.registerTransformedOperation(registration, WriteAttributeHandler.DEFINITION, WriteAttributeHandler.INSTANCE); - registration.registerOperationHandler(MapOperations.MAP_PUT_DEFINITION, transformer.apply(MapOperations.MAP_PUT_HANDLER)); - registration.registerOperationHandler(MapOperations.MAP_GET_DEFINITION, transformer.apply(MapOperations.MAP_GET_HANDLER)); - registration.registerOperationHandler(MapOperations.MAP_REMOVE_DEFINITION, transformer.apply(MapOperations.MAP_REMOVE_HANDLER)); - registration.registerOperationHandler(MapOperations.MAP_CLEAR_DEFINITION, transformer.apply(MapOperations.MAP_CLEAR_HANDLER)); + this.registerTransformedOperation(registration, MapOperations.MAP_PUT_DEFINITION, MapOperations.MAP_PUT_HANDLER); + this.registerTransformedOperation(registration, MapOperations.MAP_GET_DEFINITION, MapOperations.MAP_GET_HANDLER); + this.registerTransformedOperation(registration, MapOperations.MAP_REMOVE_DEFINITION, MapOperations.MAP_REMOVE_HANDLER); + this.registerTransformedOperation(registration, MapOperations.MAP_CLEAR_DEFINITION, MapOperations.MAP_CLEAR_HANDLER); - registration.registerOperationHandler(ListOperations.LIST_ADD_DEFINITION, transformer.apply(ListOperations.LIST_ADD_HANDLER)); - registration.registerOperationHandler(ListOperations.LIST_REMOVE_DEFINITION, transformer.apply(ListOperations.LIST_REMOVE_HANDLER)); - registration.registerOperationHandler(ListOperations.LIST_GET_DEFINITION, transformer.apply(ListOperations.LIST_GET_HANDLER)); - registration.registerOperationHandler(ListOperations.LIST_CLEAR_DEFINITION, transformer.apply(ListOperations.LIST_CLEAR_HANDLER)); + this.registerTransformedOperation(registration, ListOperations.LIST_ADD_DEFINITION, ListOperations.LIST_ADD_HANDLER); + this.registerTransformedOperation(registration, ListOperations.LIST_GET_DEFINITION, ListOperations.LIST_GET_HANDLER); + this.registerTransformedOperation(registration, ListOperations.LIST_REMOVE_DEFINITION, ListOperations.LIST_REMOVE_HANDLER); + this.registerTransformedOperation(registration, ListOperations.LIST_CLEAR_DEFINITION, ListOperations.LIST_CLEAR_HANDLER); + } + + private void registerTransformedOperation(ManagementResourceRegistration registration, OperationDefinition definition, OperationStepHandler handler) { + // Only override global operation handlers for non-identity transformations + Optional.of(handler).map(this.descriptor.getOperationTransformation()) + .filter(Predicates.same(handler).negate()) + .ifPresent(transformedHandler -> registration.registerOperationHandler(definition, transformedHandler)); } } diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/RestartParentResourceWriteAttributeHandler.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/RestartParentResourceWriteAttributeHandler.java index d33ce1d82e27..e044d6eaffc0 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/RestartParentResourceWriteAttributeHandler.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/RestartParentResourceWriteAttributeHandler.java @@ -22,12 +22,9 @@ package org.jboss.as.clustering.controller; -import java.util.function.UnaryOperator; - import org.jboss.as.clustering.controller.transform.InitialAttributeValueOperationContextAttachment; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; -import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.RestartParentWriteAttributeHandler; import org.jboss.as.controller.registry.ManagementResourceRegistration; @@ -68,8 +65,7 @@ protected PathAddress getParentAddress(PathAddress address) { @Override public void register(ManagementResourceRegistration registration) { - UnaryOperator transformer = this.descriptor.getOperationTransformation(); - this.descriptor.getAttributes().forEach(attribute -> registration.registerReadWriteAttribute(attribute, null, transformer.apply(this))); + this.descriptor.getAttributes().forEach(attribute -> registration.registerReadWriteAttribute(attribute, null, this)); } @Override diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/WriteAttributeStepHandler.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/WriteAttributeStepHandler.java index 75f4064bd341..63c5703f26c0 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/WriteAttributeStepHandler.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/WriteAttributeStepHandler.java @@ -24,13 +24,11 @@ import java.util.Map; import java.util.function.Predicate; -import java.util.function.UnaryOperator; import org.jboss.as.clustering.controller.transform.InitialAttributeValueOperationContextAttachment; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; -import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.ReloadRequiredWriteAttributeHandler; import org.jboss.as.controller.registry.AttributeAccess; @@ -65,8 +63,7 @@ protected boolean requiresRuntime(OperationContext context) { @Override public void register(ManagementResourceRegistration registration) { - UnaryOperator transformer = this.descriptor.getOperationTransformation(); - this.descriptor.getAttributes().forEach(attribute -> registration.registerReadWriteAttribute(attribute, null, transformer.apply(this))); + this.descriptor.getAttributes().forEach(attribute -> registration.registerReadWriteAttribute(attribute, null, this)); } @Override diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/function/Predicates.java b/clustering/common/src/main/java/org/jboss/as/clustering/function/Predicates.java index 6ccfc2391e8a..a458dbf02e53 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/function/Predicates.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/function/Predicates.java @@ -41,4 +41,8 @@ public static Predicate never() { public static Predicate when(boolean condition) { return test -> condition; } + + public static Predicate same(T object) { + return test -> test == object; + } }