use of org.mule.runtime.extension.api.dsl.syntax.DslElementSyntax 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.runtime.extension.api.dsl.syntax.DslElementSyntax in project mule by mulesoft.
the class ObjectTypeSchemaDelegate method declareGroupedFields.
private void declareGroupedFields(ExtensionType extension, List<TopLevelElement> childElements, ObjectFieldType field) {
DslElementSyntax groupDsl = dsl.resolve(field.getValue()).get();
((ObjectType) field.getValue()).getFields().forEach(subField -> {
DslElementSyntax subFieldDsl = groupDsl.getContainedElement(subField.getKey().getName().getLocalPart()).orElse(null);
declareObjectField(subFieldDsl, subField, extension, childElements);
});
}
use of org.mule.runtime.extension.api.dsl.syntax.DslElementSyntax in project mule by mulesoft.
the class ObjectTypeSchemaDelegate method getAbstractElementSubstitutionGroup.
private QName getAbstractElementSubstitutionGroup(DslElementSyntax typeDsl, Optional<DslElementSyntax> baseDsl) {
QName substitutionGroup;
if (baseDsl.isPresent()) {
DslElementSyntax base = baseDsl.get();
String abstractElementName = typeDsl.supportsTopLevelDeclaration() ? getGlobalAbstractName(base) : getAbstractElementName(base);
substitutionGroup = new QName(base.getNamespace(), abstractElementName, base.getPrefix());
} else {
if (typeDsl.isWrapped()) {
substitutionGroup = new QName(typeDsl.getNamespace(), getGlobalAbstractName(typeDsl), typeDsl.getPrefix());
} else {
substitutionGroup = MULE_ABSTRACT_SHARED_EXTENSION;
}
}
return substitutionGroup;
}
use of org.mule.runtime.extension.api.dsl.syntax.DslElementSyntax in project mule by mulesoft.
the class ObjectTypeSchemaDelegate method addImportedTypeElement.
private void addImportedTypeElement(DslElementSyntax paramDsl, String description, MetadataType metadataType, List<TopLevelElement> all, boolean required) {
DslElementSyntax typeDsl = builder.getDslResolver().resolve(metadataType).orElseThrow(() -> new IllegalArgumentException(format("The given type [%s] is not eligible for Import", getId(metadataType))));
if (paramDsl.isWrapped()) {
TopLevelElement objectElement = builder.createTopLevelElement(paramDsl.getElementName(), ZERO, MAX_ONE);
objectElement.setComplexType(new LocalComplexType());
objectElement.setAnnotation(builder.createDocAnnotation(description));
if (typeDsl.isWrapped()) {
objectElement.getComplexType().setChoice(builder.createTypeRefChoiceLocalOrGlobal(typeDsl, metadataType, ZERO, UNBOUNDED));
} else {
ExplicitGroup sequence = new ExplicitGroup();
sequence.setMinOccurs(ONE);
sequence.setMaxOccurs(MAX_ONE);
QName refQName = new QName(paramDsl.getNamespace(), getAbstractElementName(typeDsl), paramDsl.getPrefix());
sequence.getParticle().add(objectFactory.createElement(builder.createRefElement(refQName, false)));
objectElement.getComplexType().setSequence(sequence);
}
all.add(objectElement);
} else {
QName extensionBase = new QName(typeDsl.getNamespace(), sanitizeName(getId(metadataType)), typeDsl.getPrefix());
addChildElementTypeExtension(extensionBase, description, paramDsl.getElementName(), !paramDsl.supportsAttributeDeclaration() && required, all);
}
}
use of org.mule.runtime.extension.api.dsl.syntax.DslElementSyntax in project mule by mulesoft.
the class ObjectTypeSchemaDelegate method createGlobalMuleExtensionAbstractElement.
private void createGlobalMuleExtensionAbstractElement(QName typeQName, DslElementSyntax typeDsl, Optional<DslElementSyntax> baseDsl) {
QName globalSubGroup;
if (baseDsl.isPresent()) {
DslElementSyntax base = baseDsl.get();
globalSubGroup = new QName(base.getNamespace(), getGlobalAbstractName(base), base.getPrefix());
} else {
globalSubGroup = MULE_ABSTRACT_SHARED_EXTENSION;
}
TopLevelElement abstractElement = new TopLevelElement();
abstractElement.setName(getGlobalAbstractName(typeDsl));
abstractElement.setSubstitutionGroup(globalSubGroup);
abstractElement.setAbstract(true);
if (!typeDsl.supportsTopLevelDeclaration()) {
abstractElement.setType(typeQName);
}
builder.getSchema().getSimpleTypeOrComplexTypeOrGroup().add(abstractElement);
}
Aggregations