@Override public void convertResourceAttribute(PathAddress address, String name, ModelNode value, TransformationContext context) { ModelNode remoteSite = context.readResourceFromRoot(address).getModel(); String channelName = remoteSite.get(Attribute.CHANNEL.getName()).asString(); if (DeprecatedAttribute.STACK.getName().equals(name)) { PathAddress subsystemAddress = address.subAddress(0, address.size() - 3); PathAddress channelAddress = subsystemAddress.append(ChannelResourceDefinition.pathElement(channelName)); ModelNode channel = context.readResourceFromRoot(channelAddress).getModel(); if (channel.hasDefined(ChannelResourceDefinition.Attribute.STACK.getName())) { value.set(channel.get(ChannelResourceDefinition.Attribute.STACK.getName()).asString()); } else { ModelNode subsystem = context.readResourceFromRoot(subsystemAddress).getModel(); value.set(subsystem.get(JGroupsSubsystemResourceDefinition.Attribute.DEFAULT_STACK.getName()).asString()); } } else if (DeprecatedAttribute.CLUSTER.getName().equals(name)) { value.set(channelName); } else { throw new IllegalStateException(); } } };
/** * @return contextual discard policy if any resource attributes are undefined and has no children; {@link DiscardPolicy#SILENT} otherwise. */ @Override public DiscardPolicy checkResource(TransformationContext context, PathAddress address) { Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS); ImmutableManagementResourceRegistration registration = context.getResourceRegistration(PathAddress.EMPTY_ADDRESS); ModelNode model = resource.getModel(); if (model.isDefined()) { for (String attribute : registration.getAttributeNames(PathAddress.EMPTY_ADDRESS)) { if (model.hasDefined(attribute)) { return this.policy; } } } for (PathElement path : registration.getChildAddresses(PathAddress.EMPTY_ADDRESS)) { if (path.isWildcard() ? resource.hasChildren(path.getKey()) : resource.hasChild(path)) { return this.policy; } } return DiscardPolicy.SILENT; } }
@Override public String getFailureDescription() { return context.getLogger().getRejectedResourceWarning(address, operation); } }, OperationResultTransformer.ORIGINAL_RESULT);
@Override public TransformedOperation transformOperation(TransformationContext context, PathAddress address, ModelNode operation) throws OperationFailedException { if (operation.get(NAME).asString().equals(PROPERTIES)) { InitialAttributeValueOperationContextAttachment attachment = context.getAttachment(InitialAttributeValueOperationContextAttachment.INITIAL_VALUES_ATTACHMENT); assert attachment != null; ModelNode newValue = context.readResourceFromRoot(resolvedAddress).getModel().get(PROPERTIES).clone(); if (initialValue.equals(newValue) || (initialValue.isDefined() && initialValue.asPropertyList().isEmpty() && !newValue.isDefined())) { return new TransformedOperation(null, DEFAULT_REJECTION_POLICY, SUCCESSFUL_RESULT); if (!oldPropValue.equals(value)) { ModelNode writeOp = Util.getWriteAttributeOperation(legacyAddress.append(PathElement.pathElement(PROPERTY, key)), VALUE, value); operations.add(writeOp); ModelNode removeOperation = Util.createRemoveOperation(legacyAddress.append(PathElement.pathElement(PROPERTY, prop.getKey()))); operations.add(removeOperation); initialValue.set(newValue.clone()); return new TransformedOperation(Operations.createCompositeOperation(operations), OperationResultTransformer.ORIGINAL_RESULT); return new TransformedOperation(operation, OperationResultTransformer.ORIGINAL_RESULT);
@Override public OperationTransformer.TransformedOperation transformOperation(final OperationContext operationContext, final ModelNode operation) throws OperationFailedException { final PathAddress original = PathAddress.pathAddress(operation.require(OP_ADDR)); final String operationName = operation.require(OP).asString(); final OperationTransformer transformer = target.resolveTransformer(original, operationName); if (transformer == null) { ControllerLogger.ROOT_LOGGER.tracef("operation %s does not need transformation", operation); return new OperationTransformer.TransformedOperation(operation, OperationResultTransformer.ORIGINAL_RESULT); } // Transform the path address final PathAddress transformed = transformAddress(original, target); // Update the operation using the new path address operation.get(OP_ADDR).set(transformed.toModelNode()); // TODO should this happen by default? final TransformationContext context = ResourceTransformationContextImpl.create(operationContext, target, transformed, original); final OperationTransformer.TransformedOperation op = transformer.transformOperation(context, transformed, operation); context.getLogger().flushLogQueue(); return op; }
String opName = operation.require(OP).asString(); if (ADD.equals(opName)) { return isDiscardAllowed(operation); } else if (WRITE_ATTRIBUTE_OPERATION.equals(opName)) { String attr = operation.require(NAME).asString(); if (attr.equals(attributeName)) { return isDiscardAllowed(context.readResource(PathAddress.EMPTY_ADDRESS).getModel()); return isDiscardAllowed(context.readResource(PathAddress.EMPTY_ADDRESS).getModel());
TransformedOperation transformOperation(final TransformationContext context, final PathAddress address, final ModelNode operation, final boolean nested) throws OperationFailedException { assert address.size() == 0; final ModelNode composite = operation.clone(); composite.get(STEPS).setEmptyList(); final TransformationTarget target = context.getTarget(); final List<Step> steps = new ArrayList<Step>(); int stepIdx = 0, resultIdx = 0; for(final ModelNode step : operation.require(STEPS).asList()) { stepIdx++; final String operationName = step.require(OP).asString(); final PathAddress stepAddress = step.hasDefined(OP_ADDR) ? PathAddress.pathAddress(step.require(OP_ADDR)) : PathAddress.EMPTY_ADDRESS; final TransformedOperation result; if(stepAddress.size() == 0 && COMPOSITE.equals(operationName)) { // Process nested steps directly result = transformOperation(context, PathAddress.EMPTY_ADDRESS, step, false); } else { final OperationTransformer transformer = target.resolveTransformer(stepAddress, operationName); result = transformer.transformOperation(context, stepAddress, step); } final ModelNode transformedOperation = result.getTransformedOperation(); if (transformedOperation != null) { composite.get(STEPS).add(transformedOperation); resultIdx++; } steps.add(new Step(stepIdx, resultIdx, result)); } final CompositeResultTransformer resultHandler = new CompositeResultTransformer(steps); return new TransformedOperation(composite, resultHandler, resultHandler); }
private TransformedOperation transformOperation(final TransformationContext context, final ModelNode operation) throws OperationFailedException { final ModelNode composite = operation.clone(); composite.get(STEPS).setEmptyList(); final TransformationTarget target = context.getTarget(); final List<Step> steps = new ArrayList<Step>(); int stepIdx = 0, resultIdx = 0; stepIdx++; final String operationName = step.require(OP).asString(); final PathAddress stepAddress = step.hasDefined(OP_ADDR) ? PathAddress.pathAddress(step.require(OP_ADDR)) : PathAddress.EMPTY_ADDRESS; final TransformedOperation result; if(stepAddress.size() == 0 && COMPOSITE.equals(operationName)) { ImmutableManagementResourceRegistration reg = context.getResourceRegistrationFromRoot(stepAddress); final PathAddress useAddress; if (reg != null && reg.isAlias()) { final PathAddress transformed = TransformersImpl.transformAddress(useAddress, target); step.get(OP_ADDR).set(transformed.toModelNode()); // TODO should this happen by default? final ModelNode transformedOperation = result.getTransformedOperation(); if (transformedOperation != null) { composite.get(STEPS).add(transformedOperation); return new TransformedOperation(composite, resultHandler, resultHandler);
@Override public TransformedOperation transformOperation(final TransformationContext context, final PathAddress address, final ModelNode original) throws OperationFailedException{ final ModelNode operation = original.clone(); final PathAddress transformedAddress = transformer.transformAddress(address); operation.get(ModelDescriptionConstants.OP_ADDR).set(transformedAddress.toModelNode()); // Hand-off to a local operation transformer at the right address final String operationName = operation.get(ModelDescriptionConstants.OP).asString(); final OperationTransformer aliasTransformer = context.getTarget().resolveTransformer(context, transformedAddress, operationName); if(aliasTransformer != null) { return aliasTransformer.transformOperation(context, transformedAddress, operation); } else { return new TransformedOperation(operation, OperationResultTransformer.ORIGINAL_RESULT); } }
@Override public void convert(PathAddress address, String name, ModelNode value, ModelNode model, TransformationContext context) { if (value.isDefined()) { PathAddress rootAddress = address.subAddress(0, address.size() - 4); PathAddress subsystemAddress = rootAddress.append(PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, "datasources")); Resource subsystem = context.readResourceFromRoot(subsystemAddress); String poolName = value.asString(); for (String type : Arrays.asList("data-source", "xa-data-source")) { if (subsystem.hasChildren(type)) { for (Resource.ResourceEntry entry : subsystem.getChildren(type)) { if (entry.getName().equals(poolName)) { value.set(entry.getModel().get("jndi-name")); return; } } } } } } };
@Override protected void convertAttribute(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { if (attributeValue.isDefined()) { ModelNode allPermissions = new ModelNode(); for (ModelNode permissionSet : attributeValue.asList()) { ModelNode permissionSetName = permissionSet.get(ElytronDescriptionConstants.PERMISSION_SET); PathAddress permissionSetAddress = address.getParent().append(ElytronDescriptionConstants.PERMISSION_SET, permissionSetName.asString()); ModelNode permissions = context.readResourceFromRoot(permissionSetAddress).getModel().get(ElytronDescriptionConstants.PERMISSIONS); for (ModelNode permission: permissions.asList()) { allPermissions.add(permission); } } attributeValue.set(allPermissions); } } };
String channelName = address.getLastElement().getValue(); PathAddress rootAddress = address.subAddress(0, address.size() - 2); PathAddress subsystemAddress = rootAddress.append(PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, "infinispan")); infinispanResource = context.readResourceFromRoot(subsystemAddress); } catch (Resource.NoSuchResourceException ex) { return DiscardPolicy.REJECT_AND_WARN; if (infinispanModel.hasDefined("cache-container")) { for (ModelNode container : infinispanModel.get("cache-container").asList()) { ModelNode cacheContainer = container.get(0); if (cacheContainer.hasDefined("transport")) { ModelNode subsystem = context.readResourceFromRoot(address.subAddress(0, address.size() - 1)).getModel(); if (subsystem.hasDefined(JGroupsSubsystemResourceDefinition.Attribute.DEFAULT_CHANNEL.getName())) { if (subsystem.get(JGroupsSubsystemResourceDefinition.Attribute.DEFAULT_CHANNEL.getName()).asString().equals(channelName)) {
static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder builder) { if (InfinispanModel.VERSION_6_0_0.requiresTransformation(version)) { Converter converter = (PathAddress address, String name, ModelNode value, ModelNode model, TransformationContext context) -> { PathAddress storeAddress = address.getParent(); PathElement storePath = storeAddress.getLastElement(); if (storePath.equals(StringKeyedJDBCStoreResourceDefinition.STRING_JDBC_PATH) || storePath.equals(StringKeyedJDBCStoreResourceDefinition.LEGACY_PATH)) { storeAddress = storeAddress.getParent().append(StringKeyedJDBCStoreResourceDefinition.PATH); } else if (storePath.equals(BinaryKeyedJDBCStoreResourceDefinition.LEGACY_PATH)) { storeAddress = storeAddress.getParent().append(BinaryKeyedJDBCStoreResourceDefinition.PATH); } else if (storePath.equals(MixedKeyedJDBCStoreResourceDefinition.LEGACY_PATH)) { storeAddress = storeAddress.getParent().append(MixedKeyedJDBCStoreResourceDefinition.PATH); } ModelNode store = context.readResourceFromRoot(storeAddress).getModel(); value.set(store.hasDefined(StoreResourceDefinition.Attribute.MAX_BATCH_SIZE.getName()) ? store.get(StoreResourceDefinition.Attribute.MAX_BATCH_SIZE.getName()) : StoreResourceDefinition.Attribute.MAX_BATCH_SIZE.getDefinition().getDefaultValue()); }; builder.getAttributeBuilder().setValueConverter(new SimpleAttributeConverter(converter), DeprecatedAttribute.BATCH_SIZE.getDefinition()); } }
@Override public TransformedOperation transformOperation(final TransformationContext context, final PathAddress address, final ModelNode operation) throws OperationFailedException { Resource original = context.readResourceFromRoot(address); String defaultDataStore = original.getModel().get(TimerServiceResourceDefinition.DEFAULT_DATA_STORE.getName()).asString(); boolean hasFileDataStore = original.hasChild(PathElement.pathElement(EJB3SubsystemModel.FILE_DATA_STORE_PATH.getKey(), defaultDataStore)); if (original.getChildren(EJB3SubsystemModel.FILE_DATA_STORE).size() > 1 || !hasFileDataStore) { return new TransformedOperation(operation, new OperationRejectionPolicy() { @Override public boolean rejectOperation(ModelNode preparedResult) { return true; } @Override public String getFailureDescription() { return context.getLogger().getRejectedResourceWarning(address, operation); } }, OperationResultTransformer.ORIGINAL_RESULT); } operation.get(TimerServiceResourceDefinition.THREAD_POOL_NAME.getName()).set(original.getModel().get(TimerServiceResourceDefinition.THREAD_POOL_NAME.getName())); return new TransformedOperation(operation, OperationResultTransformer.ORIGINAL_RESULT); }
private void transformModulesToAttributes(final PathAddress address, final String newName, final String oldName, final TransformationContext context, final ModelNode model) { ModelNode modules = model.get(oldName).setEmptyList(); for (Resource.ResourceEntry entry : context.readResourceFromRoot(address).getChildren(newName)) { Resource moduleResource = context.readResourceFromRoot(address.append(entry.getPathElement())); modules.add(moduleResource.getModel()); } } }
@Override protected boolean isValueDiscardable(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { boolean synced = context.readResourceFromRoot(address).getModel().get(SYNCHRONIZED).asBoolean(); return synced == attributeValue.asBoolean(); } };
@Override public TransformedOperation transformOperation(TransformationContext context, PathAddress address, ModelNode operation) throws OperationFailedException { final String name = operation.require(NAME).asString(); final ModelNode value = operation.get(ModelDescriptionConstants.VALUE); if (SLOT_ATTRIBUTE_NAME.equals(name)) { if (value.isDefined() && value.equals(SLOT_DEFAULT_VALUE)) { return DISCARD.transformOperation(context, address, operation); } else { return new TransformedOperation(operation, new RejectionWithFailurePolicy(MESSAGES.invalidJSFSlotValue(value.asString())), OperationResultTransformer.ORIGINAL_RESULT); } } // reject the operation for any other attribute return new TransformedOperation(operation, new RejectionWithFailurePolicy(MESSAGES.unknownAttributesFromSubsystemVersion(ADD, JSF_SUBSYSTEM, context.getTarget().getSubsystemVersion(JSF_SUBSYSTEM), Arrays.asList(name))), OperationResultTransformer.ORIGINAL_RESULT); } });
@Override public TransformedOperation transformOperation(TransformationContext context, PathAddress address, ModelNode operation) throws OperationFailedException { if (operation.hasDefined(SLOT_ATTRIBUTE_NAME)) { ModelNode slot = operation.get(SLOT_ATTRIBUTE_NAME); if (!SLOT_DEFAULT_VALUE.equals(slot.asString())) { return new TransformedOperation(operation, new RejectionWithFailurePolicy(MESSAGES.invalidJSFSlotValue(slot.asString())), OperationResultTransformer.ORIGINAL_RESULT); } } Set<String> attributes = new HashSet<String>(); for (Property prop : operation.asPropertyList()) { attributes.add(prop.getName()); } attributes.remove(SLOT_ATTRIBUTE_NAME); if (!attributes.isEmpty()) { return new TransformedOperation(operation, new RejectionWithFailurePolicy(MESSAGES.unknownAttributesFromSubsystemVersion(ADD, JSF_SUBSYSTEM, context.getTarget().getSubsystemVersion(JSF_SUBSYSTEM), attributes)), OperationResultTransformer.ORIGINAL_RESULT); } return DISCARD.transformOperation(context, address, operation); } });
@Override public DiscardPolicy checkResource(TransformationContext context, PathAddress address) { // If this was an auto-generated channel, discard it @SuppressWarnings("deprecation") ModelNode defaultStack = context.readResourceFromRoot(address.getParent()).getModel().get(JGroupsSubsystemResourceDefinition.Attribute.DEFAULT_STACK.getName()); return context.readResourceFromRoot(address).getModel().get(ChannelResourceDefinition.Attribute.STACK.getName()).equals(defaultStack) ? DiscardPolicy.SILENT : DiscardPolicy.NEVER; } };
@Override protected boolean rejectAttribute(PathAddress address, String attributeName, ModelNode attributeValue, TransformationContext context) { if (attributeValue.isDefined()) { ModelVersion version = context.getTarget().getVersion(); if (version.getMajor() == 1 && version.getMinor() == 2) { //7.1.2 has model version 1.2.0 and should have this transformation //7.1.3 has model version 1.3.0 and should not have this transformation if (attributeValue.getType() == ModelType.BOOLEAN) { return !attributeValue.asBoolean(); } else { if (!Boolean.parseBoolean(attributeValue.asString())) { return true; } } } } return false; } }, EeSubsystemRootResource.JBOSS_DESCRIPTOR_PROPERTY_REPLACEMENT);