/* * 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.connectivity; import static java.lang.Thread.currentThread; import static org.mule.runtime.api.connection.ConnectionValidationResult.failure; import static org.mule.runtime.api.i18n.I18nMessageFactory.createStaticMessage; import org.mule.runtime.api.component.location.Location; import org.mule.runtime.api.connection.ConnectionValidationResult; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.lifecycle.Initialisable; import org.mule.runtime.api.lifecycle.InitialisationException; import org.mule.runtime.api.meta.AnnotatedObject; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.connectivity.ConnectivityTestingService; import org.mule.runtime.core.api.connectivity.ConnectivityTestingStrategy; import org.mule.runtime.core.api.connectivity.UnsupportedConnectivityTestingObjectException; import org.mule.runtime.core.api.exception.ObjectNotFoundException; import org.mule.runtime.core.api.registry.ServiceRegistry; import org.mule.runtime.core.component.AbstractComponent; import org.mule.runtime.core.registry.SpiServiceRegistry; import java.util.Collection; import java.util.Optional; import javax.inject.Inject; /** * Default implementation of {@link ConnectivityTestingService}. * <p> * It searchs for the {@link ConnectivityTestingStrategy} instances registered in mule to find the possible strategies to do * connection testing over mule component instances * * @since 4.0 */ public class DefaultConnectivityTestingService implements ConnectivityTestingService, Initialisable { private ServiceRegistry serviceRegistry = new SpiServiceRegistry(); private Collection<ConnectivityTestingStrategy> connectivityTestingStrategies; @Inject private MuleContext muleContext; protected void setMuleContext(MuleContext muleContext) { this.muleContext = muleContext; } protected void setServiceRegistry(ServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; } @Override public void initialise() throws InitialisationException { connectivityTestingStrategies = serviceRegistry.lookupProviders(ConnectivityTestingStrategy.class, currentThread().getContextClassLoader()); for (ConnectivityTestingStrategy connectivityTestingStrategy : connectivityTestingStrategies) { try { muleContext.getInjector().inject(connectivityTestingStrategy); } catch (MuleException e) { throw new InitialisationException(createStaticMessage( "Could not initialise connectivity testing strategy of type " + connectivityTestingStrategy.getClass().getName()), e, this); } } } /** * {@inheritDoc} */ @Override public ConnectionValidationResult testConnection(Location location) { Optional<AnnotatedObject> foundObjectOptional = muleContext.getConfigurationComponentLocator().find(location); Object connectivityTestingObject = foundObjectOptional.orElseThrow((() -> new ObjectNotFoundException("No object found with path: " + location))); for (ConnectivityTestingStrategy connectivityTestingStrategy : connectivityTestingStrategies) { if (connectivityTestingStrategy.accepts(connectivityTestingObject)) { try { return connectivityTestingStrategy.testConnectivity(connectivityTestingObject); } catch (Exception e) { return failure(e.getMessage(), e); } } } throw new UnsupportedConnectivityTestingObjectException( createStaticMessage("Could not do connectivity testing over object of type " + connectivityTestingObject.getClass().getName())); } }