/* * 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.connector; import static java.util.Collections.sort; import org.mule.runtime.core.api.MessageExchangePattern; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.core.api.client.OperationOptions; import org.mule.runtime.core.api.connector.ConnectorOperationLocator; import org.mule.runtime.core.api.connector.ConnectorOperationProvider; import org.mule.runtime.core.api.context.MuleContextAware; import org.mule.runtime.api.lifecycle.Initialisable; import org.mule.runtime.api.lifecycle.InitialisationException; import org.mule.runtime.core.api.processor.Processor; import org.mule.runtime.core.api.client.AbstractPriorizableConnectorMessageProcessorProvider; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Default {@link org.mule.runtime.core.api.connector.ConnectorOperationLocator} that will search in the mule registry for * registered {@link org.mule.runtime.core.api.connector.ConnectorOperationLocator} to later provider operations through the use * of URLs. */ public class MuleConnectorOperationLocator implements ConnectorOperationLocator, MuleContextAware, Initialisable { private MuleContext muleContext; private Collection<ConnectorOperationProvider> connectorOperationProviders; @Override public void initialise() throws InitialisationException { final List<ConnectorOperationProvider> providers = new ArrayList<>(muleContext.getRegistry().lookupObjects(ConnectorOperationProvider.class)); sort(providers, (p1, p2) -> priority(p2) - priority(p1)); this.connectorOperationProviders = providers; } private int priority(ConnectorOperationProvider provider) { if (provider instanceof AbstractPriorizableConnectorMessageProcessorProvider) { return ((AbstractPriorizableConnectorMessageProcessorProvider) provider).priority(); } else { return 0; } } @Override public void setMuleContext(MuleContext context) { this.muleContext = context; } @Override public Processor locateConnectorOperation(String url, OperationOptions operationOptions, MessageExchangePattern exchangePattern) throws MuleException { for (ConnectorOperationProvider connectorOperationProvider : connectorOperationProviders) { if (connectorOperationProvider.supportsUrl(url)) { return connectorOperationProvider.getMessageProcessor(url, operationOptions, exchangePattern); } } return null; } }