use of org.mule.metadata.api.model.MetadataType in project mule by mulesoft.
the class DeclarationElementModelFactoryTestCase method testGlobalParameterDeclarationToElement.
@Test
public void testGlobalParameterDeclarationToElement() {
ElementDeclarer ext = ElementDeclarer.forExtension(EXTENSION_NAME);
final ParameterObjectValue.Builder value = newObjectValue().withParameter(BEHAVIOUR_NAME, "additional").withParameter(CONTENT_NAME, "#[{field: value}]");
getId(complexType).ifPresent(value::ofType);
TopLevelParameterDeclaration declaration = ext.newGlobalParameter(SOURCE_NAME).withRefName("globalParameter").withValue(value.build()).getDeclaration();
DslElementModel<MetadataType> element = create(declaration);
assertThat(element.getModel(), is(complexType));
assertThat(element.getContainedElements().size(), is(2));
assertThat(element.findElement(BEHAVIOUR_NAME).isPresent(), is(true));
assertThat(element.findElement("myCamelCaseName").get().getValue().get(), is("#[{field: value}]"));
assertThat(element.getConfiguration().get().getParameters().get(BEHAVIOUR_NAME), is("additional"));
}
use of org.mule.metadata.api.model.MetadataType in project mule by mulesoft.
the class MuleExtensionModelDeclarer method declareScheduler.
private void declareScheduler(ExtensionDeclarer extensionDeclarer, ClassTypeLoader typeLoader) {
SourceDeclarer scheduler = extensionDeclarer.withMessageSource("scheduler").hasResponse(false).describedAs("Source that schedules periodic execution of a flow.");
scheduler.withOutput().ofType(typeLoader.load(Object.class));
scheduler.withOutputAttributes().ofType(typeLoader.load(Object.class));
MetadataType baseSchedulingStrategy = typeLoader.load(Scheduler.class);
scheduler.onDefaultParameterGroup().withRequiredParameter("schedulingStrategy").ofType(baseSchedulingStrategy).withExpressionSupport(NOT_SUPPORTED);
MetadataType fixedFrequencyScheduler = typeLoader.load(FixedFrequencyScheduler.class);
MetadataType cronScheduler = typeLoader.load(CronScheduler.class);
extensionDeclarer.withSubType(baseSchedulingStrategy, fixedFrequencyScheduler);
extensionDeclarer.withSubType(baseSchedulingStrategy, cronScheduler);
// workaround for an "org.mule.runtime" package and still export the type in the extension model
extensionDeclarer.getDeclaration().addType((ObjectType) baseSchedulingStrategy);
extensionDeclarer.getDeclaration().addType((ObjectType) fixedFrequencyScheduler);
extensionDeclarer.getDeclaration().addType((ObjectType) cronScheduler);
}
use of org.mule.metadata.api.model.MetadataType in project mule by mulesoft.
the class ExecutableTypeSchemaDelegate method registerParameters.
protected ExtensionType registerParameters(ExtensionType type, List<ParameterModel> parameterModels) {
List<TopLevelElement> childElements = new LinkedList<>();
parameterModels.forEach(parameter -> {
DslElementSyntax paramDsl = dsl.resolve(parameter);
MetadataType parameterType = parameter.getType();
boolean shouldDeclare = true;
if (parameter.getModelProperty(QNameModelProperty.class).isPresent() && !parameter.getDslConfiguration().allowsReferences()) {
shouldDeclare = false;
}
if (shouldDeclare) {
this.builder.declareAsParameter(parameterType, type, parameter, paramDsl, childElements);
}
});
appendToSequence(type, childElements);
return type;
}
use of org.mule.metadata.api.model.MetadataType in project mule by mulesoft.
the class MapSchemaDelegate method generateMapComplexType.
private LocalComplexType generateMapComplexType(DslElementSyntax mapDsl, final ObjectType metadataType) {
final MetadataType valueType = metadataType.getOpenRestriction().get();
final LocalComplexType entryComplexType = new LocalComplexType();
final Attribute keyAttribute = builder.createAttribute(KEY_ATTRIBUTE_NAME, keyType, true, REQUIRED);
entryComplexType.getAttributeOrAttributeGroup().add(keyAttribute);
final LocalComplexType mapComplexType = new LocalComplexType();
final ExplicitGroup mapEntrySequence = new ExplicitGroup();
mapComplexType.setSequence(mapEntrySequence);
DslElementSyntax entryValueDsl = mapDsl.getGeneric(valueType).orElseThrow(() -> new IllegalArgumentException("Illegal DslSyntax definition of the given DictionaryType. The DslElementSyntax for the entry is required"));
final TopLevelElement mapEntryElement = new TopLevelElement();
mapEntryElement.setName(entryValueDsl.getElementName());
mapEntryElement.setMinOccurs(ZERO);
mapEntryElement.setMaxOccurs(UNBOUNDED);
valueType.accept(new MetadataTypeVisitor() {
/**
* For a Map with an {@link ObjectType} as value. The resulting {@link ComplexType} declares a sequence of either a
* {@code ref} or a {@code choice}.
* <p/>
* It creates an element {@code ref} to the concrete element whose {@code type} is the {@link ComplexType} associated to the
* {@code objectType}
* <p/>
* In the case of having a {@link DslElementSyntax#isWrapped wrapped} {@link ObjectType}, then a {@link ExplicitGroup
* Choice} group that can receive a {@code ref} to any subtype that this wrapped type might have, be it either a top-level
* element for the mule schema, or if it can only be declared as child of this element.
*
* If the map's value is another map, then a value attribute is created for the value map.
*
* @param objectType the item's type
*/
@Override
public void visitObject(ObjectType objectType) {
Optional<DslElementSyntax> containedElement = entryValueDsl.getContainedElement(VALUE_ATTRIBUTE_NAME);
if (isMap(objectType) || !containedElement.isPresent()) {
defaultVisit(objectType);
return;
}
final boolean shouldGenerateChildElement = containedElement.get().supportsChildDeclaration() || containedElement.get().isWrapped();
entryComplexType.getAttributeOrAttributeGroup().add(builder.createAttribute(VALUE_ATTRIBUTE_NAME, valueType, !shouldGenerateChildElement, SUPPORTED));
if (shouldGenerateChildElement) {
DslElementSyntax typeDsl = builder.getDslResolver().resolve(objectType).orElseThrow(() -> new IllegalArgumentException(format("The given type [%s] cannot be represented as a child element in Map entries", getId(objectType))));
if (typeDsl.isWrapped()) {
ExplicitGroup choice = builder.createTypeRefChoiceLocalOrGlobal(typeDsl, objectType, ZERO, UNBOUNDED);
entryComplexType.setChoice(choice);
} else {
ExplicitGroup singleItemSequence = new ExplicitGroup();
singleItemSequence.setMaxOccurs("1");
TopLevelElement mapItemElement = builder.createTypeRef(typeDsl, objectType, false);
singleItemSequence.getParticle().add(objectFactory.createElement(mapItemElement));
entryComplexType.setSequence(singleItemSequence);
}
}
}
@Override
public void visitArrayType(ArrayType arrayType) {
entryComplexType.getAttributeOrAttributeGroup().add(builder.createAttribute(VALUE_ATTRIBUTE_NAME, valueType, false, SUPPORTED));
entryComplexType.setSequence(new ExplicitGroup());
LocalComplexType itemComplexType = new LocalComplexType();
MetadataType itemType = arrayType.getType();
itemComplexType.getAttributeOrAttributeGroup().add(builder.createAttribute(VALUE_ATTRIBUTE_NAME, itemType, true, REQUIRED));
DslElementSyntax itemDsl = entryValueDsl.getGeneric(itemType).orElseThrow(() -> new IllegalArgumentException("Illegal DslSyntax definition of the given ArrayType. The DslElementSyntax for the item is required"));
TopLevelElement itemElement = builder.createTopLevelElement(itemDsl.getElementName(), ZERO, UNBOUNDED, itemComplexType);
entryComplexType.getSequence().getParticle().add(objectFactory.createElement(itemElement));
}
@Override
protected void defaultVisit(MetadataType metadataType) {
entryComplexType.getAttributeOrAttributeGroup().add(builder.createValueAttribute(valueType));
}
});
mapEntryElement.setComplexType(entryComplexType);
mapEntrySequence.getParticle().add(objectFactory.createElement(mapEntryElement));
return mapComplexType;
}
use of org.mule.metadata.api.model.MetadataType in project mule by mulesoft.
the class CollectionSchemaDelegate method generateCollectionComplexType.
private LocalComplexType generateCollectionComplexType(DslElementSyntax collectionDsl, final ArrayType metadataType) {
final LocalComplexType collectionComplexType = new LocalComplexType();
final ExplicitGroup sequence = new ExplicitGroup();
final MetadataType genericType = metadataType.getType();
DslElementSyntax itemDsl = collectionDsl.getGeneric(genericType).orElseThrow(() -> new IllegalArgumentException(format("Missing item's DSL information for collection [%s]", collectionDsl.getAttributeName())));
genericType.accept(new MetadataTypeVisitor() {
/**
* For a Collection with an {@link ObjectType} as generic. The generated {@link ComplexType} declares a sequence of either a
* {@code ref} or a {@code choice}.
* <p/>
* It creates an element {@code ref} to the concrete element whose {@code type} is the {@link ComplexType} associated to the
* {@code objectType}
* <p/>
* In the case of having a {@link DslElementSyntax#isWrapped wrapped} {@link ObjectType}, then a {@link ExplicitGroup
* Choice} group that can receive a {@code ref} to any subtype that this wrapped type might have, be it either a top-level
* element for the mule schema, or if it can only be declared as child of this element.
*
* If the collections's value is a map, then a value attribute is created for the value map.
*
* @param objectType the item's type
*/
@Override
public void visitObject(ObjectType objectType) {
if (isMap(objectType)) {
defaultVisit(objectType);
return;
}
DslElementSyntax typeDsl = builder.getDslResolver().resolve(objectType).orElseThrow(() -> new IllegalArgumentException(format("The given type [%s] cannot be represented as a collection item", getId(objectType))));
if (typeDsl.isWrapped()) {
ExplicitGroup choice = builder.createTypeRefChoiceLocalOrGlobal(typeDsl, objectType, ZERO, UNBOUNDED);
sequence.getParticle().add(objectFactory.createChoice(choice));
} else {
TopLevelElement collectionItemElement = builder.createTypeRef(typeDsl, objectType, false);
collectionItemElement.setMaxOccurs(UNBOUNDED);
sequence.getParticle().add(objectFactory.createElement(collectionItemElement));
}
}
/**
* For a Collection with any other type as generic.
* The generated {@link ComplexType} declares a sequence of child elements with an inline declaration of the type
*
* @param metadataType the item's type
*/
@Override
protected void defaultVisit(MetadataType metadataType) {
final LocalComplexType complexType = new LocalComplexType();
complexType.getAttributeOrAttributeGroup().add(builder.createValueAttribute(genericType));
TopLevelElement collectionItemElement = builder.createTopLevelElement(itemDsl.getElementName(), ZERO, UNBOUNDED);
collectionItemElement.setComplexType(complexType);
sequence.getParticle().add(objectFactory.createElement(collectionItemElement));
}
});
collectionComplexType.setSequence(sequence);
return collectionComplexType;
}
Aggregations