/* * 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.metadata; import static org.mule.runtime.api.metadata.resolving.FailureCode.INVALID_METADATA_KEY; 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.module.extension.internal.util.MuleExtensionUtils.getMetadataResolverFactory; import org.mule.metadata.api.model.MetadataType; import org.mule.runtime.api.meta.model.operation.OperationModel; import org.mule.runtime.api.metadata.MetadataContext; import org.mule.runtime.api.metadata.MetadataKey; import org.mule.runtime.api.metadata.MetadataKeysContainer; import org.mule.runtime.api.metadata.MetadataKeysContainerBuilder; import org.mule.runtime.api.metadata.descriptor.ComponentMetadataDescriptor; import org.mule.runtime.api.metadata.descriptor.OutputMetadataDescriptor; import org.mule.runtime.api.metadata.descriptor.TypeMetadataDescriptor; import org.mule.runtime.api.metadata.resolving.InputTypeResolver; import org.mule.runtime.api.metadata.resolving.MetadataResult; import org.mule.runtime.api.metadata.resolving.OutputTypeResolver; import org.mule.runtime.api.metadata.resolving.QueryEntityResolver; import org.mule.runtime.api.metadata.resolving.TypeKeysResolver; import org.mule.runtime.extension.api.metadata.MetadataResolverFactory; import java.util.Set; /** * Resolves a Component's Metadata by coordinating the several moving parts that are affected by the Metadata fetching process, so * that such pieces can remain decoupled. * <p/> * This mediator will coordinate the resolvers: {@link MetadataResolverFactory}, {@link TypeKeysResolver}, * {@link InputTypeResolver} and {@link OutputTypeResolver}, and the descriptors that represent their results: * {@link ComponentMetadataDescriptor}, {@link OutputMetadataDescriptor} and {@link TypeMetadataDescriptor} * * @since 4.0 */ public class EntityMetadataMediator { private final MetadataResolverFactory resolverFactory; public EntityMetadataMediator(OperationModel operationModel) { this.resolverFactory = getMetadataResolverFactory(operationModel); } public MetadataResult<MetadataKeysContainer> getEntityKeys(MetadataContext context) { try { QueryEntityResolver queryEntityResolver = resolverFactory.getQueryEntityResolver(); Set<MetadataKey> entityKeys = queryEntityResolver.getEntityKeys(context); final MetadataKeysContainerBuilder keyBuilder = MetadataKeysContainerBuilder.getInstance(); if (entityKeys.stream().anyMatch(key -> key.getChilds().size() > 0)) { return failure(newFailure() .withMessage("Error retrieving entity keys, Only single level keys are supported for entity metadata") .withReason("There are at least one key that contains childs") .withFailureCode(INVALID_METADATA_KEY).onKeys()); } return success(keyBuilder.add(queryEntityResolver.getResolverName(), entityKeys).build()); } catch (Exception e) { return failure(newFailure(e).onKeys()); } } public MetadataResult<TypeMetadataDescriptor> getEntityMetadata(MetadataContext context, MetadataKey entityKey) { try { MetadataType entityMetadata = resolverFactory.getQueryEntityResolver().getEntityMetadata(context, entityKey.getId()); return success(TypeMetadataDescriptor.builder().withType(entityMetadata).build()); } catch (Exception e) { return failure(newFailure(e).onEntity()); } } }