/* * 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.config.spring.dsl.model; import org.mule.metadata.api.model.MetadataType; import org.mule.metadata.api.model.ObjectType; import org.mule.runtime.api.app.declaration.ElementDeclaration; import org.mule.runtime.api.dsl.DslResolvingContext; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.api.meta.model.config.ConfigurationModel; import org.mule.runtime.api.meta.model.operation.OperationModel; import org.mule.runtime.api.meta.model.source.SourceModel; import org.mule.runtime.config.spring.dsl.model.internal.DefaultDslElementModelFactory; import org.mule.runtime.dsl.api.component.config.ComponentConfiguration; import java.util.Optional; /** * Provides the {@link DslElementModel} of any {@link ComponentConfiguration} within the context of the available application * plugins, provided for each instance of this {@link DslElementModelFactory} * * @since 4.0 */ public interface DslElementModelFactory { /** * Provides a default implementation of the {@link DslElementModelFactory} * * @param context the {@link DslResolvingContext} to be used when performing a * {@link org.mule.runtime.api.component.ComponentIdentifier#getNamespace namespace} or * {@link ElementDeclaration#getName} based lookup for a given {@link ExtensionModel}. * @return a default implementation of the {@link DslElementModelFactory} */ static DslElementModelFactory getDefault(DslResolvingContext context) { return new DefaultDslElementModelFactory(context); } /** * Resolves the {@link DslElementModel} for the given {@link ElementDeclaration}, providing an element with all the required * information for representing this {@code elementDeclaration} element in the DSL and binding it to its {@link ExtensionModel * model} component or {@link MetadataType}. This resolution can only be performed from DSL top-level-elements, which have * global representations in the {@link ExtensionModel}, so this method will return an {@link Optional#empty} result if the * given {@code applicationElement} does not identify either a {@link ConfigurationModel}, {@link OperationModel}, * {@link SourceModel} * * @param elementDeclaration the {@link ElementDeclaration} for which its {@link DslElementModel} representation is required. * @param <T> the expected model type of the {@link DslElementModel element} * @return a {@link DslElementModel} representation of the {@link ElementDeclaration} if one is possible to be built based on * the {@link ExtensionModel extensions} provided as resolution context, or {@link Optional#empty} if no * {@link DslElementModel} could be created for the given {@code applicationElement} with the current extensions * context. */ <T> Optional<DslElementModel<T>> create(ElementDeclaration elementDeclaration); /** * Resolves the {@link DslElementModel} for the given {@link ComponentConfiguration applicationElement}, providing an element * with all the required information for representing this {@code applicationElement} element in the DSL and binding it to its * {@link ExtensionModel model} component or {@link MetadataType}. This resolution can only be performed from DSL * top-level-elements, which have global representations in the {@link ExtensionModel}, so this method will return an * {@link Optional#empty} result if the given {@code applicationElement} does not identify either a {@link ConfigurationModel}, * {@link OperationModel}, {@link SourceModel} or an {@link ObjectType} than can be expressed as an explicit top level element. * * @param componentConfiguration the {@link ComponentConfiguration} for which its {@link DslElementModel} representation is * required. * @param <T> the expected model type of the {@link DslElementModel element} * @return a {@link DslElementModel} representation of the {@link ComponentConfiguration} if one is possible to be built based * on the {@link ExtensionModel extensions} provided as resolution context, or {@link Optional#empty} if no * {@link DslElementModel} could be created for the given {@code applicationElement} with the current extensions * context. */ <T> Optional<DslElementModel<T>> create(ComponentConfiguration componentConfiguration); }