/*
* 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.module.extension.internal.capability.xml.schema.builder;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang.StringUtils.capitalize;
import static org.mule.runtime.config.spring.dsl.api.xml.SchemaConstants.MULE_ABSTRACT_MESSAGE_SOURCE;
import static org.mule.runtime.config.spring.dsl.api.xml.SchemaConstants.MULE_ABSTRACT_MESSAGE_SOURCE_TYPE;
import static org.mule.runtime.config.spring.dsl.api.xml.SchemaConstants.TYPE_SUFFIX;
import org.mule.runtime.api.meta.model.parameter.ParameterGroupModel;
import org.mule.runtime.api.meta.model.parameter.ParameterModel;
import org.mule.runtime.api.meta.model.parameter.ParameterizedModel;
import org.mule.runtime.api.meta.model.source.SourceModel;
import org.mule.runtime.extension.api.dsl.syntax.DslElementSyntax;
import org.mule.runtime.module.extension.internal.capability.xml.schema.model.Element;
import org.mule.runtime.module.extension.internal.capability.xml.schema.model.ExplicitGroup;
import org.mule.runtime.module.extension.internal.capability.xml.schema.model.ExtensionType;
import org.mule.runtime.module.extension.internal.capability.xml.schema.model.TopLevelElement;
import java.util.List;
import javax.xml.namespace.QName;
/**
* Builder delegation class to generate a XSD schema that describes a {@link SourceModel}
*
* @since 4.0.0
*/
class SourceSchemaDelegate extends ExecutableTypeSchemaDelegate {
SourceSchemaDelegate(SchemaBuilder builder) {
super(builder);
}
void registerMessageSource(SourceModel sourceModel, DslElementSyntax dslSyntax) {
String typeName = capitalize(sourceModel.getName()) + TYPE_SUFFIX;
registerSourceElement(sourceModel, typeName, dslSyntax);
registerSourceType(typeName, sourceModel, dslSyntax);
}
private void registerSourceElement(SourceModel sourceModel, String typeName, DslElementSyntax dslSyntax) {
Element element = new TopLevelElement();
element.setName(dslSyntax.getElementName());
element.setType(new QName(builder.getSchema().getTargetNamespace(), typeName));
element.setAnnotation(builder.createDocAnnotation(sourceModel.getDescription()));
element.setSubstitutionGroup(MULE_ABSTRACT_MESSAGE_SOURCE);
builder.getSchema().getSimpleTypeOrComplexTypeOrGroup().add(element);
}
private void registerSourceType(String name, SourceModel sourceModel, DslElementSyntax dslSyntax) {
final ExtensionType sourceType = createExecutableType(name, MULE_ABSTRACT_MESSAGE_SOURCE_TYPE, dslSyntax);
initialiseSequence(sourceType);
ExplicitGroup sequence = sourceType.getSequence();
builder.addInfrastructureParameters(sourceType, sourceModel, sequence);
List<ParameterGroupModel> inlineGroupedParameters = getInlineGroups(sourceModel);
sourceModel.getSuccessCallback().ifPresent(cb -> inlineGroupedParameters.addAll(getInlineGroups(cb)));
sourceModel.getErrorCallback().ifPresent(cb -> inlineGroupedParameters.addAll(getInlineGroups(cb)));
List<ParameterModel> flatParameters = sourceModel.getAllParameterModels().stream()
.filter(p -> inlineGroupedParameters.stream().noneMatch(g -> g.getParameterModels().contains(p)))
.collect(toList());
registerParameters(sourceType, flatParameters);
inlineGroupedParameters.forEach(g -> builder.addInlineParameterGroup(g, sourceType.getSequence()));
}
private List<ParameterGroupModel> getInlineGroups(ParameterizedModel model) {
return model.getParameterGroupModels().stream()
.filter(ParameterGroupModel::isShowInDsl)
.collect(toList());
}
}