/* * 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.runtime.config; import static org.mule.runtime.api.metadata.resolving.MetadataFailure.Builder.newFailure; import static org.mule.runtime.api.metadata.resolving.MetadataResult.failure; import static org.mule.runtime.api.metadata.resolving.MetadataResult.success; import static org.mule.runtime.core.api.config.MuleProperties.OBJECT_CONNECTION_MANAGER; import static org.mule.runtime.core.api.config.MuleProperties.OBJECT_METADATA_SERVICE; import static org.mule.runtime.extension.api.metadata.NullMetadataResolver.NULL_CATEGORY_NAME; import static org.mule.runtime.module.extension.internal.util.MuleExtensionUtils.getClassLoader; import static org.mule.runtime.module.extension.internal.util.MuleExtensionUtils.getInitialiserEvent; import static org.mule.runtime.module.extension.internal.util.MuleExtensionUtils.getMetadataResolverFactory; import org.mule.runtime.api.connection.ConnectionException; import org.mule.runtime.api.meta.model.ComponentModel; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.api.meta.model.config.ConfigurationModel; import org.mule.runtime.api.metadata.MetadataContext; import org.mule.runtime.api.metadata.MetadataKey; import org.mule.runtime.api.metadata.MetadataKeyProvider; import org.mule.runtime.api.metadata.MetadataKeysContainer; import org.mule.runtime.api.metadata.MetadataKeysContainerBuilder; import org.mule.runtime.api.metadata.MetadataResolvingException; import org.mule.runtime.api.metadata.resolving.MetadataResult; import org.mule.runtime.api.metadata.resolving.TypeKeysResolver; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.connector.ConnectionManager; import org.mule.runtime.core.internal.metadata.DefaultMetadataContext; import org.mule.runtime.core.internal.metadata.MuleMetadataService; import org.mule.runtime.extension.api.declaration.type.ExtensionsTypeLoaderFactory; import org.mule.runtime.extension.api.runtime.ConfigurationInstance; import java.util.List; import java.util.Optional; /** * Adds the capability to expose all the {@link MetadataKey}s associated with the {@link StaticConfigurationProvider}'s * components. * * @since 4.0 */ public final class ConfigurationProviderMetadataAdapter extends StaticConfigurationProvider implements MetadataKeyProvider { private final MuleMetadataService metadataService; protected final ConnectionManager connectionManager; public ConfigurationProviderMetadataAdapter(String name, ExtensionModel extensionModel, ConfigurationModel configurationModel, ConfigurationInstance configuration, MuleContext muleContext) { super(name, extensionModel, configurationModel, configuration, muleContext); this.metadataService = muleContext.getRegistry().get(OBJECT_METADATA_SERVICE); this.connectionManager = muleContext.getRegistry().get(OBJECT_CONNECTION_MANAGER); } public MetadataResult<MetadataKeysContainer> getMetadataKeys() throws MetadataResolvingException { MetadataKeysContainerBuilder keysBuilder = MetadataKeysContainerBuilder.getInstance(); try { MetadataContext metadataContext = getMetadataContext(); addComponentKeys(getConfigurationModel().getOperationModels(), metadataContext, keysBuilder); addComponentKeys(getConfigurationModel().getSourceModels(), metadataContext, keysBuilder); metadataContext.dispose(); } catch (Exception e) { return failure(newFailure(e).onKeys()); } return success(keysBuilder.build()); } private void addComponentKeys(List<? extends ComponentModel> components, MetadataContext metadataContext, MetadataKeysContainerBuilder keysBuilder) throws MetadataResolvingException, ConnectionException { for (ComponentModel component : components) { TypeKeysResolver keysResolver = getMetadataResolverFactory(component).getKeyResolver(); String categoryName = keysResolver.getCategoryName(); if (!NULL_CATEGORY_NAME.equals(categoryName) && !keysBuilder.containsCategory(categoryName)) { keysBuilder.add(categoryName, keysResolver.getKeys(metadataContext)); } } } private MetadataContext getMetadataContext() throws MetadataResolvingException, ConnectionException { Event fakeEvent = getInitialiserEvent(muleContext); return new DefaultMetadataContext(Optional.of(get(fakeEvent)), connectionManager, metadataService.getMetadataCache(getName()), ExtensionsTypeLoaderFactory.getDefault() .createTypeLoader(getClassLoader(getExtensionModel()))); } }