/* * 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.core.internal.metadata; import static java.util.Collections.unmodifiableCollection; import static org.mule.runtime.api.util.Preconditions.checkArgument; import org.mule.runtime.api.metadata.resolving.AttributesTypeResolver; import org.mule.runtime.api.metadata.resolving.InputTypeResolver; 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 org.mule.runtime.extension.api.metadata.NullMetadataResolver; import org.mule.runtime.extension.api.metadata.NullQueryMetadataResolver; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; /** * Default implementation of the {@link MetadataResolverFactory}, it provides initialized instances of * {@link TypeKeysResolver}, {@link TypeKeysResolver} and {@link OutputTypeResolver} of the classes passed in the * constructor. * * @since 4.0 */ public final class DefaultMetadataResolverFactory implements MetadataResolverFactory { private final OutputTypeResolver outputTypeResolver; private final AttributesTypeResolver attributesTypeResolver; private final Map<String, InputTypeResolver> inputResolvers = new HashMap<>(); private final TypeKeysResolver keysResolver; public DefaultMetadataResolverFactory(Supplier<? extends TypeKeysResolver> keyResolver, Map<String, Supplier<? extends InputTypeResolver>> typeResolvers, Supplier<? extends OutputTypeResolver> outputResolver, Supplier<? extends AttributesTypeResolver> attributesResolver) { checkArgument(keyResolver != null, "MetadataKeyResolver type cannot be null"); checkArgument(typeResolvers != null, "InputTypeResolvers cannot be null"); checkArgument(outputResolver != null, "OutputTypeResolver type cannot be null"); checkArgument(attributesResolver != null, "AttributesTypeResolver type cannot be null"); typeResolvers.forEach((k, v) -> inputResolvers.put(k, v.get())); keysResolver = keyResolver.get(); outputTypeResolver = outputResolver.get(); attributesTypeResolver = attributesResolver.get(); checkArgument(keysResolver != null, "MetadataKeyResolver type cannot be null"); inputResolvers.values().forEach(resolver -> checkArgument(resolver != null, "Input Type Resolver cannot be null")); checkArgument(outputTypeResolver != null, "OutputTypeResolver type cannot be null"); checkArgument(attributesTypeResolver != null, "AttributesTypeResolver type cannot be null"); } /** * {@inheritDoc} */ @Override public TypeKeysResolver getKeyResolver() { return keysResolver; } /** * {@inheritDoc} */ @Override public <T> InputTypeResolver<T> getInputResolver(String parameterName) { return inputResolvers.getOrDefault(parameterName, new NullMetadataResolver()); } /** * {@inheritDoc} */ public Collection<InputTypeResolver> getInputResolvers() { return unmodifiableCollection(inputResolvers.values()); } /** * {@inheritDoc} */ @Override public <T> OutputTypeResolver<T> getOutputResolver() { return outputTypeResolver; } /** * {@inheritDoc} */ @Override public <T> AttributesTypeResolver<T> getOutputAttributesResolver() { return attributesTypeResolver; } /** * {@inheritDoc} */ @Override public QueryEntityResolver getQueryEntityResolver() { return new NullQueryMetadataResolver(); } }