package org.ow2.choreos.ee; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ow2.choreos.chors.datamodel.Choreography; import org.ow2.choreos.chors.datamodel.ChoreographySpec; import org.ow2.choreos.services.datamodel.DeployableService; import org.ow2.choreos.services.datamodel.DeployableServiceSpec; public class ChorDiffer { private Choreography chor; private List<DeployableServiceSpec> toCreate; private Map<DeployableService, DeployableServiceSpec> toUpdate; private List<DeployableService> notModify; public ChorDiffer(Choreography chor) { this.chor = chor; } public List<DeployableServiceSpec> getNewServiceSpecs() { if (toCreate == null) diff(); return toCreate; } public Map<DeployableService, DeployableServiceSpec> getServicesToUpdate() { if (toUpdate == null) diff(); return toUpdate; } public List<DeployableService> getNotModifiedServices() { if (notModify == null) diff(); return notModify; } private void diff() { toCreate = new ArrayList<DeployableServiceSpec>(); toUpdate = new HashMap<DeployableService, DeployableServiceSpec>(); notModify = new ArrayList<DeployableService>(); ChorRegistry reg = ChorRegistry.getInstance(); ChoreographySpec requestedChoreographySpec = reg.getRequestedChoreographySpec(chor.getId()); List<DeployableServiceSpec> specsList = requestedChoreographySpec.getDeployableServiceSpecs(); Map<String, DeployableServiceSpec> requestedSpecMap = makeMapFromServiceList(specsList); Map<String, DeployableService> currentServices = getServicesForChor(); for (Map.Entry<String, DeployableService> currentServiceEntry : currentServices.entrySet()) { DeployableServiceSpec requestedSpec = requestedSpecMap.get(currentServiceEntry.getKey()); DeployableService currentService = currentServiceEntry.getValue(); if (requestedSpec != null) { if (!requestedSpec.equals(currentService.getSpec())) { toUpdate.put(currentService, requestedSpec); } else { notModify.add(currentService); } } } for (Map.Entry<String, DeployableServiceSpec> specEntry : requestedSpecMap.entrySet()) { if (!currentServices.containsKey(specEntry.getKey())) { toCreate.add(specEntry.getValue()); } } } private Map<String, DeployableServiceSpec> makeMapFromServiceList(List<DeployableServiceSpec> list) { Map<String, DeployableServiceSpec> result = new HashMap<String, DeployableServiceSpec>(); for (DeployableServiceSpec spec : list) result.put(spec.getName(), spec); return result; } private Map<String, DeployableService> getServicesForChor() { Map<String, DeployableService> currentServices = new HashMap<String, DeployableService>(); if (chor.getDeployableServices() != null) { for (DeployableService s : chor.getDeployableServices()) { currentServices.put(s.getSpec().getName(), s); } } return currentServices; } }