/* * 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.loader.enricher; import static java.util.Arrays.stream; import org.mule.metadata.api.ClassTypeLoader; import org.mule.metadata.api.model.ArrayType; import org.mule.metadata.api.model.IntersectionType; import org.mule.metadata.api.model.MetadataType; import org.mule.metadata.api.model.ObjectFieldType; import org.mule.metadata.api.model.ObjectType; import org.mule.metadata.api.model.UnionType; import org.mule.metadata.api.visitor.MetadataTypeVisitor; import org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclarer; import org.mule.runtime.extension.api.annotation.Export; import org.mule.runtime.extension.api.declaration.type.ExtensionsTypeLoaderFactory; import org.mule.runtime.extension.api.loader.ExtensionLoadingContext; /** * Enriches the delcaration with the types which are manually exported through {@link Export} * * @since 4.0 */ public final class JavaExportedTypesDeclarationEnricher extends AbstractAnnotatedDeclarationEnricher { private final ClassTypeLoader typeLoader; public JavaExportedTypesDeclarationEnricher() { this.typeLoader = ExtensionsTypeLoaderFactory.getDefault().createTypeLoader(); } @Override public void enrich(ExtensionLoadingContext extensionLoadingContext) { Export exportAnnotation = extractAnnotation(extensionLoadingContext.getExtensionDeclarer().getDeclaration(), Export.class); if (exportAnnotation != null) { ExtensionDeclarer declarer = extensionLoadingContext.getExtensionDeclarer(); stream(exportAnnotation.classes()) .map(typeLoader::load) .forEach(type -> registerType(declarer, type)); stream(exportAnnotation.resources()).forEach(declarer::withResource); } } private void registerType(ExtensionDeclarer declarer, MetadataType type) { type.accept(new MetadataTypeVisitor() { @Override public void visitObject(ObjectType objectType) { if (objectType.isOpen()) { objectType.getOpenRestriction().get().accept(this); } else { declarer.withType(objectType); } } @Override public void visitArrayType(ArrayType arrayType) { arrayType.getType().accept(this); } @Override public void visitIntersection(IntersectionType intersectionType) { intersectionType.getTypes().forEach(type -> type.accept(this)); } @Override public void visitUnion(UnionType unionType) { unionType.getTypes().forEach(type -> type.accept(this)); } @Override public void visitObjectField(ObjectFieldType objectFieldType) { objectFieldType.getValue().accept(this); } }); } }