use of org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer in project mule by mulesoft.
the class XmlExtensionLoaderDelegate method createTnsExtensionModel.
/**
* Transforms the current <module/> by stripping out the <body/>'s content, so that there are not parsing errors, to generate
* a simpler {@link ExtensionModel} if there are references to the TNS prefix defined by the {@link #XMLNS_TNS}.
*
* @param resource <module/>'s resource
* @param extensions complete list of extensions the current module depends on
* @return an {@link ExtensionModel} if there's a {@link #XMLNS_TNS} defined, {@link Optional#empty()} otherwise
* @throws IOException if it fails reading the resource
*/
private Optional<ExtensionModel> createTnsExtensionModel(URL resource, Set<ExtensionModel> extensions) throws IOException {
ExtensionModel result = null;
final ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
try {
final Source xslt = new StreamSource(getClass().getClassLoader().getResourceAsStream(TRANSFORMATION_FOR_TNS_RESOURCE));
final Source moduleToTransform = new StreamSource(resource.openStream());
TransformerFactory.newInstance().newTransformer(xslt).transform(moduleToTransform, new StreamResult(resultStream));
} catch (TransformerException e) {
throw new MuleRuntimeException(createStaticMessage(format("There was an issue transforming the stream for the resource %s while trying to remove the content of the <body> element to generate an XSD", resource.getFile())), e);
}
final Document transformedModuleDocument = schemaValidatingDocumentLoader(NoOpXmlErrorHandler::new).loadDocument(extensions, resource.getFile(), new ByteArrayInputStream(resultStream.toByteArray()));
if (StringUtils.isNotBlank(transformedModuleDocument.getDocumentElement().getAttribute(XMLNS_TNS))) {
final ExtensionDeclarer extensionDeclarer = new ExtensionDeclarer();
loadModuleExtension(extensionDeclarer, resource, transformedModuleDocument, extensions, true);
result = createExtensionModel(extensionDeclarer);
}
return Optional.ofNullable(result);
}
use of org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer in project mule by mulesoft.
the class TestConnectionFailuresTestCase method mockedExtension.
private ExtensionModel mockedExtension(final String name, final String config, final String connectionProvider) {
final ExtensionDeclarer extensionDeclarer = new ExtensionDeclarer();
extensionDeclarer.named(name).onVersion("4.0.0").fromVendor("MuleSoft testcase").withCategory(Category.COMMUNITY).withConfig(config).withConnectionProvider(connectionProvider).withConnectionManagementType(ConnectionManagementType.NONE);
return new ExtensionModelFactory().create(new DefaultExtensionLoadingContext(extensionDeclarer, currentThread().getContextClassLoader(), new NullDslResolvingContext()));
}
use of org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer in project mule by mulesoft.
the class BooleanParameterDeclarationEnricherTestCase method setUp.
@Before
public void setUp() {
ExtensionDeclarer declarer = new DefaultJavaModelLoaderDelegate(HeisenbergExtension.class, getProductVersion()).declare(new DefaultExtensionLoadingContext(getClass().getClassLoader(), getDefault(emptySet())));
new BooleanParameterDeclarationEnricher().enrich(new DefaultExtensionLoadingContext(declarer, this.getClass().getClassLoader(), getDefault(emptySet())));
declaration = declarer.getDeclaration();
}
use of org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer in project mule by mulesoft.
the class SubTypesDeclarationEnricher method enrich.
@Override
public void enrich(ExtensionLoadingContext extensionLoadingContext) {
ExtensionDeclarer declarer = extensionLoadingContext.getExtensionDeclarer();
ExtensionDeclaration extensionDeclaration = declarer.getDeclaration();
Optional<ExtensionTypeDescriptorModelProperty> implementingType = extensionDeclaration.getModelProperty(ExtensionTypeDescriptorModelProperty.class);
if (!implementingType.isPresent()) {
return;
}
Type type = implementingType.get().getType();
List<AnnotationValueFetcher<SubTypeMapping>> typeMappings = parseRepeatableAnnotation(type, SubTypeMapping.class, c -> ((SubTypesMapping) c).value());
if (!typeMappings.isEmpty()) {
declareSubTypesMapping(declarer, typeMappings, extensionDeclaration.getName());
}
}
use of org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer in project mule by mulesoft.
the class XmlExtensionLoaderDelegate method loadModuleExtension.
private void loadModuleExtension(ExtensionDeclarer declarer, URL resource, Document moduleDocument, Set<ExtensionModel> extensions, boolean comesFromTNS) {
final ComponentModel moduleModel = getModuleComponentModel(resource, moduleDocument);
if (!moduleModel.getIdentifier().equals(MODULE_IDENTIFIER)) {
throw new MuleRuntimeException(createStaticMessage(format("The root element of a module must be '%s', but found '%s'", MODULE_IDENTIFIER.toString(), moduleModel.getIdentifier().toString())));
}
final String name = moduleModel.getParameters().get(MODULE_NAME);
// TODO(fernandezlautaro): MULE-11010 remove version from ExtensionModel
final String version = "4.0.0";
final String category = moduleModel.getParameters().get(CATEGORY);
final String vendor = moduleModel.getParameters().get(VENDOR);
final XmlDslModel xmlDslModel = getXmlDslModel(moduleModel, name, version);
final String description = getDescription(moduleModel);
final String xmlnsTnsValue = moduleModel.getParameters().get(XMLNS_TNS);
if (xmlnsTnsValue != null && !xmlDslModel.getNamespace().equals(xmlnsTnsValue)) {
throw new MuleRuntimeException(createStaticMessage(format("The %s attribute value of the module must be '%s', but found '%s'", XMLNS_TNS, xmlDslModel.getNamespace(), xmlnsTnsValue)));
}
fillDeclarer(declarer, name, version, category, vendor, xmlDslModel, description);
declarer.withModelProperty(getXmlExtensionModelProperty(moduleModel, xmlDslModel));
DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class);
// loading public operations
final Optional<ConfigurationDeclarer> configurationDeclarer = loadPropertiesFrom(declarer, moduleModel, extensions);
final HasOperationDeclarer hasOperationDeclarer = configurationDeclarer.isPresent() ? configurationDeclarer.get() : declarer;
loadOperationsFrom(hasOperationDeclarer, moduleModel, directedGraph, xmlDslModel, OperationVisibility.PUBLIC);
// loading private operations
if (comesFromTNS) {
// when parsing for the TNS, we need the <operation/>s to be part of the extension model to validate the XML properly
loadOperationsFrom(hasOperationDeclarer, moduleModel, directedGraph, xmlDslModel, OperationVisibility.PRIVATE);
} else {
// when parsing for the macro expansion, the <operation/>s will be left in the PrivateOperationsModelProperty model property
final ExtensionDeclarer temporalDeclarer = new ExtensionDeclarer();
fillDeclarer(temporalDeclarer, name, version, category, vendor, xmlDslModel, description);
loadOperationsFrom(temporalDeclarer, moduleModel, directedGraph, xmlDslModel, OperationVisibility.PRIVATE);
final ExtensionModel result = createExtensionModel(temporalDeclarer);
declarer.withModelProperty(new PrivateOperationsModelProperty(result.getOperationModels()));
}
final CycleDetector<String, DefaultEdge> cycleDetector = new CycleDetector<>(directedGraph);
final Set<String> cycles = cycleDetector.findCycles();
if (!cycles.isEmpty()) {
throw new MuleRuntimeException(createStaticMessage(format(CYCLIC_OPERATIONS_ERROR, new TreeSet(cycles))));
}
}
Aggregations