/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.ow2.choreos.ee.bus; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.ow2.choreos.chors.datamodel.Choreography; import org.ow2.choreos.chors.datamodel.LegacyService; import org.ow2.choreos.chors.datamodel.LegacyServiceInstance; import org.ow2.choreos.ee.bus.selector.ESBNodeSelector; import org.ow2.choreos.ee.bus.selector.ESBNodeSelectorFactory; import org.ow2.choreos.nodes.datamodel.ResourceImpact; import org.ow2.choreos.selectors.NotSelectedException; import org.ow2.choreos.services.datamodel.DeployableService; import org.ow2.choreos.services.datamodel.Proxification; import org.ow2.choreos.services.datamodel.ServiceInstance; /** * * @author leonardo * */ public class ESBNodesSelector { private static Logger logger = Logger.getLogger(ESBNodesSelector.class); private List<ProxificationTask> proxificationTasks = new ArrayList<ProxificationTask>(); private ESBNodeSelector selector; void setSelector(ESBNodeSelector selector) { this.selector = selector; } /** * Selects EasyESB nodes to each one of the service instances. EASY_ESB * services (CDs) will be not proxified. * * @param choreography * @return a list of proxification tasks, where nativeUri and easyEsbNode * are inputs, and the result of the task must be saved on the * provided proxification object; if it was not possible to select * an esb node to a specific instance, there will be not a key to * this instance. */ public List<ProxificationTask> selectESBNodes(Choreography choreography) { if (selector == null) selector = ESBNodeSelectorFactory.getFactoryInstance().getNodeSelectorInstance(); List<DeployableService> deployableServices = choreography.getDeployableServices(); if (deployableServices != null && !deployableServices.isEmpty()) createTasksForDeployableServices(choreography); List<LegacyService> legacyServices = choreography.getLegacyServices(); if (legacyServices != null && !legacyServices.isEmpty()) createTasksForLegacyServices(choreography); return proxificationTasks; } private void createTasksForDeployableServices(Choreography choreography) { InstancesFilter filter = new InstancesFilter(); List<ServiceInstance> instancesToBeProxified = filter.filterDeployableServiceInstances(choreography.getDeployableServices()); for (ServiceInstance serviceInstance : instancesToBeProxified) { ResourceImpact resourceImpact = serviceInstance.getServiceSpec().getResourceImpact(); try { EasyESBNode esbNode = selector.select(resourceImpact, 1).get(0); ProxificationTask proxTask = createProxificationTask(serviceInstance, esbNode); proxificationTasks.add(proxTask); } catch (NotSelectedException e) { logger.error("Could not select ESB node to an instance of " + serviceInstance.getServiceSpec().getName()); } } } private ProxificationTask createProxificationTask(ServiceInstance serviceInstance, EasyESBNode esbNode) { String svcName = serviceInstance.getServiceSpec().getName(); String nativeUri = serviceInstance.getNativeUri(); Proxification prox = new Proxification(); serviceInstance.setProxification(prox); ProxificationTask proxTask = new ProxificationTask(svcName, nativeUri, prox, esbNode); return proxTask; } private void createTasksForLegacyServices(Choreography choreography) { InstancesFilter filter = new InstancesFilter(); List<LegacyServiceInstance> instancesToBeProxified = filter.filterLegacyInstances(choreography.getLegacyServices()); for (LegacyServiceInstance legacyInstance : instancesToBeProxified) { try { EasyESBNode esbNode = selector.select(new ResourceImpact(), 1).get(0); ProxificationTask proxTask = createProxificationTaskForLegacy(legacyInstance, esbNode); proxificationTasks.add(proxTask); } catch (NotSelectedException e) { logger.error("Could not select ESB node to an instance of " + legacyInstance.getSpec().getName()); } } } private ProxificationTask createProxificationTaskForLegacy(LegacyServiceInstance legacyInstance, EasyESBNode esbNode) { String svcName = legacyInstance.getSpec().getName(); String nativeUri = legacyInstance.getUri(); Proxification prox = new Proxification(); legacyInstance.setProxification(prox); ProxificationTask proxTask = new ProxificationTask(svcName, nativeUri, prox, esbNode); return proxTask; } }