/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.dsl.api.component.config; import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableMap; import org.mule.runtime.api.component.ComponentIdentifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; /** * Defines a mule component configuration content. * <p> * A {@code ComponentConfiguration} allows to define a mule component configuration programmatically by defining the component * namespace, name and the set of simple attributes or complex nested attributes required by the component. * * @since 4.0 */ // TODO MULE-11496 Delete this configuration once everything has an ExtensionModel and can be represented with // ComponentDeclaration public class ComponentConfiguration { private ComponentIdentifier identifier; private Map<String, Object> properties = new HashMap<>(); private Map<String, String> parameters = new HashMap<>(); private List<ComponentConfiguration> nestedComponents = new ArrayList<>(); private String value; /** * @return the configuration identifier. */ public ComponentIdentifier getIdentifier() { return identifier; } /** * @return a map with the configuration parameters of the component where the key is the parameter name and the value is the * parameter value. */ public Map<String, String> getParameters() { return unmodifiableMap(parameters); } /** * @return content of the configuration element. */ public Optional<String> getValue() { return Optional.ofNullable(value); } /** * @param name the name of the property * @return the property for the given name, or {@link Optional#empty()} if none was found. */ public Optional<Object> getProperty(String name) { return Optional.ofNullable(properties.get(name)); } /** * @return a collection of the complex child configuration components. */ public List<ComponentConfiguration> getNestedComponents() { return unmodifiableList(nestedComponents); } private ComponentConfiguration() {} /** * Builder for creating {@code ComponentConfiguration} instances. */ public static class Builder { private ComponentConfiguration componentConfiguration = new ComponentConfiguration(); private Builder() {} /** * @param identifier identifier for the configuration element this object represents. * @return the builder. */ public Builder withIdentifier(ComponentIdentifier identifier) { componentConfiguration.identifier = identifier; return this; } /** * Adds a configuration parameter to the component * * @param name configuration attribute name * @param value configuration attribute value * @return the builder */ public Builder withParameter(String name, String value) { componentConfiguration.parameters.put(name, value); return this; } /** * Sets the inner content of the configuration element. * * @param textContent inner text content from the configuration * @return the builder */ public Builder withValue(String textContent) { componentConfiguration.value = textContent; return this; } /** * Adds a property to the {@link ComponentConfiguration}. * This property is meant to hold only metadata of the configuration. * * @param name custom attribute name. * @param value custom attribute value. * @return the builder. */ public Builder withProperty(String name, Object value) { componentConfiguration.properties.put(name, value); return this; } /** * Adds a complex configuration parameter to the component. * <p> * For instance, to define a file:matcher for a file:read component: * * * <pre> * {@code * <file:read> * <file:matcher regex="XYZ"/> * </file:read> * } * </pre> * * @param nestedComponent the {@link ComponentConfiguration} that represents the nested configuration * @return {@code this} {@link Builder} */ public Builder withNestedComponent(ComponentConfiguration nestedComponent) { componentConfiguration.nestedComponents.add(nestedComponent); return this; } /** * @return a {@code ComponentConfiguration} with the provided configuration */ public ComponentConfiguration build() { return componentConfiguration; } } /** * @return a new {@link Builder} */ public static Builder builder() { return new Builder(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ComponentConfiguration that = (ComponentConfiguration) o; if (!identifier.equals(that.identifier)) { return false; } if (!parameters.equals(that.parameters)) { return false; } return nestedComponents.equals(that.nestedComponents); } @Override public int hashCode() { int result = 0; result = 31 * result + identifier.hashCode(); result = 31 * result + parameters.hashCode(); result = 31 * result + nestedComponents.hashCode(); return result; } }