/* * 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.api.client; import org.mule.runtime.core.api.MessageExchangePattern; import org.mule.runtime.core.api.DefaultMuleException; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.core.api.connector.ConnectorOperationProvider; import org.mule.runtime.core.api.context.MuleContextAware; import org.mule.runtime.api.lifecycle.Disposable; import org.mule.runtime.core.api.processor.Processor; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; /** * Base class for implementing {@link ConnectorOperationProvider} */ public abstract class AbstractConnectorMessageProcessorProvider implements ConnectorOperationProvider, MuleContextAware, Disposable { protected static final int CACHE_SIZE = 1000; protected static final int EXPIRATION_TIME_IN_MINUTES = 10; protected final LoadingCache<RequestCacheKey, Processor> cachedMessageProcessors; protected MuleContext muleContext; /** * Creates a new instance with a default message processors cache. */ public AbstractConnectorMessageProcessorProvider() { cachedMessageProcessors = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).expireAfterWrite(EXPIRATION_TIME_IN_MINUTES, TimeUnit.MINUTES) .build(new CacheLoader<RequestCacheKey, Processor>() { @Override public Processor load(RequestCacheKey cacheKey) throws MuleException { return buildMessageProcessor(cacheKey); } }); } /** * Builds a {@link Processor} for the given cache key * * @param cacheKey cache key defining the message processor to create. Non null. * @return a non null {@link Processor} */ protected abstract Processor buildMessageProcessor(RequestCacheKey cacheKey) throws MuleException; @Override public Processor getMessageProcessor(String url, OperationOptions operationOptions, MessageExchangePattern exchangePattern) throws MuleException { try { return cachedMessageProcessors.get(new RequestCacheKey(url, operationOptions, exchangePattern)); } catch (ExecutionException e) { throw new DefaultMuleException(e); } } @Override public void dispose() { cachedMessageProcessors.invalidateAll(); } @Override public void setMuleContext(MuleContext context) { this.muleContext = context; } }