package won.matcher.protocol.impl; import org.apache.activemq.camel.component.ActiveMQComponent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import won.cryptography.service.RegistrationRestClientHttps; import won.protocol.exception.CamelConfigurationFailedException; import won.protocol.exception.NoSuchConnectionException; import won.protocol.jms.*; import java.net.URI; import java.util.Set; /** * User: ypanchenko * Date: 02.09.2015 */ public class MatcherProtocolCommunicationServiceImpl implements MatcherProtocolCommunicationService { private RegistrationRestClientHttps registrationClient; private MatcherProtocolCamelConfigurator matcherProtocolCamelConfigurator; private MatcherActiveMQService activeMQService; private Logger logger = LoggerFactory.getLogger(this.getClass()); public void setRegistrationClient(final RegistrationRestClientHttps registrationClient) { this.registrationClient = registrationClient; } @Override public synchronized CamelConfiguration configureCamelEndpoint(URI nodeUri, String startingEndpoint) throws Exception { String matcherProtocolQueueName; CamelConfiguration camelConfiguration = new CamelConfiguration(); URI needBrokerUri =activeMQService.getBrokerEndpoint(nodeUri); if (matcherProtocolCamelConfigurator.getBrokerComponentNameWithBrokerUri(needBrokerUri)!=null){ String endpoint = matcherProtocolCamelConfigurator.getEndpoint(nodeUri); if (endpoint!=null) { camelConfiguration.setEndpoint(endpoint); } else { matcherProtocolCamelConfigurator.addRouteForEndpoint(startingEndpoint,needBrokerUri); matcherProtocolQueueName = activeMQService.getProtocolQueueNameWithResource(nodeUri); // register with remote node. If at some point the same trust strategy will // be used when doing GET on won resource, we don't need this separate register step for node registrationClient.register(nodeUri.toString()); endpoint = matcherProtocolCamelConfigurator.configureCamelEndpointForNeedUri(nodeUri, needBrokerUri, matcherProtocolQueueName); camelConfiguration.setEndpoint(endpoint); } camelConfiguration.setBrokerComponentName(matcherProtocolCamelConfigurator.getBrokerComponentNameWithBrokerUri(needBrokerUri)); } else{ URI resourceUri = nodeUri; URI brokerUri = needBrokerUri; matcherProtocolQueueName = activeMQService.getProtocolQueueNameWithResource(resourceUri); camelConfiguration.setEndpoint(matcherProtocolCamelConfigurator.configureCamelEndpointForNeedUri(resourceUri, brokerUri, matcherProtocolQueueName)); matcherProtocolCamelConfigurator.addRouteForEndpoint(startingEndpoint,brokerUri); camelConfiguration.setBrokerComponentName(matcherProtocolCamelConfigurator.getBrokerComponentNameWithBrokerUri(brokerUri)); ActiveMQComponent activeMQComponent = (ActiveMQComponent)matcherProtocolCamelConfigurator.getCamelContext().getComponent(matcherProtocolCamelConfigurator.getBrokerComponentNameWithBrokerUri(brokerUri)); logger.info("ActiveMQ Service Status : {}",activeMQComponent.getStatus().toString()); activeMQComponent.start(); } return camelConfiguration; } @Override public synchronized Set<String> getMatcherProtocolOutTopics(URI wonNodeURI) { Set<String> matcherProtocolTopics = ((MatcherActiveMQService)activeMQService) .getMatcherProtocolTopicNamesWithResource(wonNodeURI); return matcherProtocolTopics; } @Override public synchronized void addRemoteTopicListeners(final Set<String> endpoints, final URI wonNodeUri) throws CamelConfigurationFailedException { try { registrationClient.register(wonNodeUri.toString()); URI remoteEndpoint = activeMQService.getBrokerEndpoint(wonNodeUri); String remoteComponentName = matcherProtocolCamelConfigurator.setupBrokerComponentName(remoteEndpoint); logger.debug("remoteComponentName: {}", remoteComponentName); matcherProtocolCamelConfigurator.addCamelComponentForWonNodeBrokerForTopics(remoteEndpoint, remoteComponentName); matcherProtocolCamelConfigurator.addRemoteTopicListeners(endpoints, remoteEndpoint); } catch (CamelConfigurationFailedException ex) { throw ex; } catch (Exception e) { logger.error("Error of security configuration for communication with " + wonNodeUri.toString()); throw new CamelConfigurationFailedException(e); } } @Override public URI getBrokerUri(URI resourceUri) throws NoSuchConnectionException { return activeMQService.getBrokerEndpoint(resourceUri); } @Override public ActiveMQService getActiveMQService() { return activeMQService; } @Override public void setActiveMQService(ActiveMQService activeMQService) { this.activeMQService = (MatcherActiveMQService) activeMQService; } @Override public CamelConfigurator getProtocolCamelConfigurator() { return this.matcherProtocolCamelConfigurator; } public void setMatcherProtocolCamelConfigurator(NeedProtocolCamelConfigurator matcherProtocolCamelConfigurator) { this.matcherProtocolCamelConfigurator = (MatcherProtocolCamelConfigurator) matcherProtocolCamelConfigurator; } }