00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030  
00031 package org.objectweb.proactive.core.descriptor.data;
00032 
00033 import java.util.Collection;
00034 import java.util.HashMap;
00035 import java.util.Iterator;
00036 import java.util.Map;
00037 import java.util.Set;
00038 
00039 import org.apache.log4j.Logger;
00040 import org.objectweb.proactive.ProActive;
00041 import org.objectweb.proactive.core.ProActiveException;
00042 import org.objectweb.proactive.core.body.ProActiveMetaObjectFactory;
00043 import org.objectweb.proactive.core.descriptor.services.ServiceUser;
00044 import org.objectweb.proactive.core.descriptor.services.TechnicalService;
00045 import org.objectweb.proactive.core.descriptor.services.TechnicalServiceWrapper;
00046 import org.objectweb.proactive.core.descriptor.services.TechnicalServiceXmlType;
00047 import org.objectweb.proactive.core.descriptor.services.UniversalService;
00048 import org.objectweb.proactive.core.process.AbstractSequentialListProcessDecorator;
00049 import org.objectweb.proactive.core.process.ExternalProcess;
00050 import org.objectweb.proactive.core.process.ExternalProcessDecorator;
00051 import org.objectweb.proactive.core.process.HierarchicalProcess;
00052 import org.objectweb.proactive.core.process.JVMProcess;
00053 import org.objectweb.proactive.core.process.JVMProcessImpl;
00054 import org.objectweb.proactive.core.process.filetransfer.FileTransferDefinition;
00055 import org.objectweb.proactive.core.runtime.ProActiveRuntimeImpl;
00056 import org.objectweb.proactive.core.util.log.Loggers;
00057 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00058 import org.objectweb.proactive.core.xml.VariableContract;
00059 import org.objectweb.proactive.ext.security.PolicyServer;
00060 import org.objectweb.proactive.ext.security.ProActiveSecurityDescriptorHandler;
00061 import org.objectweb.proactive.ext.security.ProActiveSecurityManager;
00062 import org.objectweb.proactive.ext.security.exceptions.InvalidPolicyFile;
00063 
00064 
00078 public class ProActiveDescriptorImpl implements ProActiveDescriptor {
00079     
00080     
00081     
00082     protected static Logger logger = ProActiveLogger.getLogger(Loggers.DEPLOYMENT);
00083     private String lastMainDefinitionID;
00084 
00086     private Map<String, MainDefinition> mainDefinitionMapping;
00087 
00089     private java.util.HashMap<String, VirtualNode> virtualNodeMapping;
00090 
00092     private java.util.HashMap<String, VirtualMachine> virtualMachineMapping;
00093 
00095     private java.util.HashMap processMapping;
00096 
00098     private java.util.HashMap<String, ProcessUpdater> pendingProcessMapping;
00099 
00101     private java.util.HashMap<String, UniversalService> serviceMapping;
00102 
00104     private java.util.HashMap pendingServiceMapping;
00105 
00107     private java.util.HashMap<String, FileTransferDefinition> fileTransferMapping;
00108 
00110     private VariableContract variableContract;
00111 
00113     private String url;
00114     private String jobID;
00115     private String descriptorURL;
00116     private boolean mainDefined;
00117 
00119     protected ProActiveSecurityManager proactiveSecurityManager;
00120     public PolicyServer policyServer;
00121 
00122     
00123     public String securityFile;
00124     private HashMap<String, TechnicalService> technicalServiceMapping;
00125 
00126     
00127     
00128     
00129     public ProActiveDescriptorImpl(String url) {
00130         mainDefinitionMapping = new HashMap<String, MainDefinition>();
00131         virtualNodeMapping = new java.util.HashMap<String, VirtualNode>();
00132         virtualMachineMapping = new java.util.HashMap<String, VirtualMachine>();
00133         processMapping = new java.util.HashMap();
00134         pendingProcessMapping = new java.util.HashMap<String, ProcessUpdater>();
00135         serviceMapping = new java.util.HashMap<String, UniversalService>();
00136         pendingServiceMapping = new java.util.HashMap();
00137         fileTransferMapping = new java.util.HashMap<String, FileTransferDefinition>();
00138         variableContract = new VariableContract();
00139         this.url = url;
00140         this.descriptorURL = url;
00141         mainDefined = false;
00142         this.technicalServiceMapping = new HashMap<String, TechnicalService>();
00143     }
00144 
00145     
00146     
00147     
00148     public String getUrl() {
00149         return this.url;
00150     }
00151     
00152     public String getProActiveDescriptorURL() {
00153         return descriptorURL;
00154     }
00155 
00160     public void createMainDefinition(String id) {
00161         lastMainDefinitionID = id;
00162         mainDefinitionMapping.put(id, new MainDefinition());
00163     }
00164 
00169     public void mainDefinitionSetMainClass(String mainClass) {
00170         getMainDefinition().setMainClass(mainClass);
00171     }
00172 
00178     public void mainDefinitionAddParameter(String parameter) {
00179         getMainDefinition().addParameter(parameter);
00180     }
00181 
00188     public String[] mainDefinitionGetParameters(String mainDefinitionId) {
00189         return getMainDefinition(mainDefinitionId).getParameters();
00190     }
00191 
00196     public void mainDefinitionAddVirtualNode(VirtualNode virtualNode) {
00197         getMainDefinition().addVirtualNode(virtualNode);
00198     }
00199 
00204     public boolean isMainDefined() {
00205         return mainDefined;
00206     }
00207 
00208     public void setMainDefined(boolean mainDefined) {
00209         this.mainDefined = mainDefined;
00210     }
00211 
00216     public void activateMains() {
00217         if (!isMainDefined()) {
00218             return;
00219         }
00220 
00221         for (String id : mainDefinitionMapping.keySet()) {
00222                 activateMain(id);
00223         }
00224     }
00225 
00230     public void activateMain(String mainDefinitionId) {
00231         MainDefinition mainDefinition = getMainDefinition(mainDefinitionId);
00232 
00233         if (mainDefinition != null) {
00234             mainDefinition.activateMain();
00235         }
00236     }
00237 
00242     public Map getMainDefinitionMapping() {
00243         return mainDefinitionMapping;
00244     }
00245 
00246     public void setMainDefinitionMapping(HashMap<String, MainDefinition> newMapping) {
00247         mainDefinitionMapping = newMapping;
00248     }
00249 
00254     public Map<String, VirtualNode> getVirtualNodeMapping() {
00255         return virtualNodeMapping;
00256     }
00257 
00258     public void setVirtualNodeMapping(HashMap<String, VirtualNode> newMapping) {
00259         virtualNodeMapping = newMapping;
00260     }
00261 
00266     public MainDefinition[] getMainDefinitions() {
00267         MainDefinition[] mainDefinitions = new MainDefinition[mainDefinitionMapping.size()];
00268         Set<String> mainsId = mainDefinitionMapping.keySet();
00269         Iterator it = mainsId.iterator();
00270         int i = 0;
00271 
00272         while (it.hasNext()) {
00273             String id = (String) it.next();
00274             mainDefinitions[i] = getMainDefinition(id);
00275             i++;
00276         }
00277 
00278         return mainDefinitions;
00279     }
00280 
00281     public VirtualNode[] getVirtualNodes() {
00282         int i = 0;
00283         VirtualNode[] virtualNodeArray = new VirtualNode[virtualNodeMapping.size()];
00284         Collection collection = virtualNodeMapping.values();
00285 
00286         for (Iterator iter = collection.iterator(); iter.hasNext();) {
00287             virtualNodeArray[i] = (VirtualNode) iter.next();
00288             i++;
00289         }
00290 
00291         return virtualNodeArray;
00292     }
00293 
00294     public VirtualNode getVirtualNode(String name) {
00295         return virtualNodeMapping.get(name);
00296     }
00297 
00298     public VirtualMachine getVirtualMachine(String name) {
00299         return virtualMachineMapping.get(name);
00300     }
00301 
00302     public ExternalProcess getProcess(String name) {
00303         return (ExternalProcess) processMapping.get(name);
00304     }
00305 
00306     public ExternalProcess getHierarchicalProcess(String vmname) {
00307         VirtualMachine vm = getVirtualMachine(vmname);
00308 
00309         if (vm == null) {
00310             logger.warn("" + vmname + "cannot be found");
00311 
00312             return null;
00313         }
00314 
00315         if (vm.getProcess() instanceof HierarchicalProcess) {
00316             return ((HierarchicalProcess) vm.getProcess()).getHierarchicalProcess();
00317         } else {
00318             logger.warn("" + vmname +
00319                 " does not contain a hierarchical process !");
00320 
00321             return null;
00322         }
00323     }
00324 
00325     public UniversalService getService(String serviceID) {
00326         return serviceMapping.get(serviceID);
00327     }
00328 
00338     protected FileTransferDefinition createFileTransferDefinition(
00339         String fileTransferID) {
00340         FileTransferDefinition ft = new FileTransferDefinition(fileTransferID);
00341         fileTransferMapping.put(fileTransferID, ft);
00342 
00343         if (logger.isDebugEnabled()) {
00344             logger.debug("created FileTransfer id=" + fileTransferID);
00345         }
00346 
00347         return ft;
00348     }
00349 
00350     public VirtualNode createVirtualNode(String vnName, boolean lookup) {
00351         return createVirtualNode(vnName, lookup, false);
00352     }
00353 
00354     public VirtualNode createVirtualNode(String vnName, boolean lookup,
00355         boolean isMainNode) {
00356         VirtualNode vn = getVirtualNode(vnName);
00357 
00358         if (jobID == null) {
00359             if (isMainDefined()) {
00360                 this.jobID = generateNewJobID();
00361 
00362                 
00363             } else {
00364                 this.jobID = ProActive.getJobId();
00365 
00366                 
00367             }
00368 
00369             this.url = url + this.jobID;
00370         }
00371 
00372         if (vn == null) {
00373             if (lookup) {
00374                 vn = new VirtualNodeLookup(vnName);
00375             } else {
00376                 vn = new VirtualNodeImpl(vnName, proactiveSecurityManager,
00377                         this.url, isMainNode, this);
00378                 ((VirtualNodeImpl) vn).jobID = this.jobID;
00379 
00380                 
00381             }
00382 
00383             virtualNodeMapping.put(vnName, vn);
00384 
00385             if (logger.isInfoEnabled()) {
00386                 logger.info("created VirtualNode name=" + vnName);
00387             }
00388         }
00389 
00390         return vn;
00391     }
00392 
00393     public VirtualMachine createVirtualMachine(String vmName) {
00394         VirtualMachine vm = getVirtualMachine(vmName);
00395 
00396         if (vm == null) {
00397             vm = new VirtualMachineImpl();
00398             vm.setName(vmName);
00399             virtualMachineMapping.put(vmName, vm);
00400         }
00401 
00402         if (logger.isDebugEnabled()) {
00403             logger.debug("created virtualMachine name=" + vmName);
00404         }
00405 
00406         return vm;
00407     }
00408 
00409     public ExternalProcess createProcess(String processID,
00410         String processClassName) throws ProActiveException {
00411         ExternalProcess process = getProcess(processID);
00412 
00413         if (process == null) {
00414             process = createProcess(processClassName);
00415             addExternalProcess(processID, process);
00416         }
00417 
00418         return process;
00419     }
00420 
00421     public ExternalProcess createProcess(String processClassName)
00422         throws ProActiveException {
00423         try {
00424             Class processClass = Class.forName(processClassName);
00425             ExternalProcess process = (ExternalProcess) processClass.newInstance();
00426 
00427             return process;
00428         } catch (ClassNotFoundException e) {
00429             throw new ProActiveException(e);
00430         } catch (InstantiationException e) {
00431             throw new ProActiveException(e);
00432         } catch (IllegalAccessException e) {
00433             throw new ProActiveException(e);
00434         }
00435     }
00436 
00437     public void registerProcess(VirtualMachine virtualMachine, String processID) {
00438         ExternalProcess process = getProcess(processID);
00439 
00440         if (process == null) {
00441             addPendingProcess(processID, virtualMachine);
00442         } else {
00443             virtualMachine.setProcess(process);
00444         }
00445     }
00446 
00447     public synchronized FileTransferDefinition getFileTransfer(
00448         String fileTransferID) {
00449         
00450         
00451         FileTransferDefinition ft = fileTransferMapping.get(fileTransferID);
00452 
00453         if (ft == null) {
00454             ft = createFileTransferDefinition(fileTransferID);
00455             fileTransferMapping.put(fileTransferID, ft);
00456 
00457             if (logger.isDebugEnabled()) {
00458                 logger.debug("created FileTransfer id=" + fileTransferID);
00459             }
00460         }
00461 
00462         return ft;
00463     }
00464 
00465     public void registerProcess(ExternalProcessDecorator compositeProcess,
00466         String processID) {
00467         ExternalProcess process = getProcess(processID);
00468 
00469         if (process == null) {
00470             addPendingProcess(processID, compositeProcess);
00471         } else {
00472             compositeProcess.setTargetProcess(process);
00473         }
00474     }
00475 
00476     public void addProcessToSequenceList(
00477         AbstractSequentialListProcessDecorator sequentialListProcess,
00478         String processID) {
00479         ExternalProcess process = (ExternalProcess) getProcess(processID);
00480         if (process == null) {
00481             addSequentialPendingProcess(processID, sequentialListProcess);
00482         } else {
00483             sequentialListProcess.addProcessToList(process);
00484         }
00485     }
00486 
00487     public void addServiceToSequenceList(
00488         AbstractSequentialListProcessDecorator sequentialListProcess,
00489         String processID) {
00490         UniversalService service = (UniversalService) processMapping.get(processID);
00491         if (service == null) {
00492             addSequentialPendingService(processID, sequentialListProcess);
00493             sequentialListProcess.setFirstElementIsService(true);
00494         } else {
00495             sequentialListProcess.addServiceToList(service);
00496             sequentialListProcess.setFirstElementIsService(true);
00497         }
00498     }
00499 
00500     public void mapToExtendedJVM(JVMProcess jvmProcess, String processID)
00501         throws ProActiveException {
00502         try {
00503             JVMProcessImpl process = (JVMProcessImpl) getProcess(processID);
00504 
00505             if (process == null) {
00506                 throw new ProActiveException("The jvmProcess with id " +
00507                     processID +
00508                     " is not yet defined in the descriptor. The extended jvmProcess must be defined before all jvmProcesses that extend it");
00509 
00510                 
00511             } else {
00512                 jvmProcess.setExtendedJVM(process);
00513             }
00514         } catch (ClassCastException e) {
00515             logger.fatal(
00516                 "ERROR: a jvmProcess can only extend another jvmProcess. Correct the Descriptor");
00517             e.printStackTrace();
00518         }
00519     }
00520 
00521     public void registerHierarchicalProcess(HierarchicalProcess hp,
00522         String processID) {
00523         ExternalProcess process = getProcess(processID);
00524 
00525         if (process == null) {
00526             addHierarchicalPendingProcess(processID, hp);
00527         } else {
00528             hp.setHierarchicalProcess(process);
00529         }
00530     }
00531 
00532     public void addService(String serviceID, UniversalService service) {
00533         ServiceUpdater serviceUpdater = (ServiceUpdater) pendingServiceMapping.remove(serviceID);
00534 
00535         if (serviceUpdater != null) {
00536             if (logger.isDebugEnabled()) {
00537                 logger.debug("Updating Service name=" + serviceID);
00538             }
00539 
00540             serviceUpdater.updateService(service);
00541         }
00542 
00543         processMapping.put(serviceID, service);
00544     }
00545 
00546     public void registerService(ServiceUser serviceUser, String serviceID) {
00547         UniversalService service = getService(serviceID);
00548 
00549         if (service == null) {
00550             addPendingService(serviceID, serviceUser);
00551         } else {
00552             try {
00553                 serviceUser.setService(service);
00554             } catch (ProActiveException e) {
00555                 e.printStackTrace();
00556                 logger.error("the given service " + service.getServiceName() +
00557                     " cannot be set for class " + serviceUser.getUserClass());
00558             }
00559         }
00560     }
00561 
00562     public void activateMappings() {
00563         VirtualNode[] virtualNodeArray = getVirtualNodes();
00564 
00565         for (int i = 0; i < virtualNodeArray.length; i++) {
00566             virtualNodeArray[i].activate();
00567         }
00568     }
00569 
00570     public void activateMapping(String virtualNodeName) {
00571         VirtualNode virtualNode = getVirtualNode(virtualNodeName);
00572         virtualNode.activate();
00573     }
00574 
00575     public void killall(boolean softly) throws ProActiveException {
00576         ProActiveRuntimeImpl part = (ProActiveRuntimeImpl) ProActiveRuntimeImpl.getProActiveRuntime();
00577 
00578         part.removeDescriptor(this.url);
00579 
00580         VirtualNode[] vnArray = getVirtualNodes();
00581 
00582         for (int i = 0; i < vnArray.length; i++) {
00583             vnArray[i].killAll(softly);
00584             virtualNodeMapping.remove(vnArray[i].getName());
00585 
00586             
00587         }
00588     }
00589 
00594     public int getVirtualNodeMappingSize() {
00595         return virtualNodeMapping.size();
00596     }
00597 
00598     
00599 
00604     public void createProActiveSecurityManager(String file) {
00605         securityFile = file;
00606 
00607         try {
00608             policyServer = ProActiveSecurityDescriptorHandler.createPolicyServer(file);
00609             proactiveSecurityManager = new ProActiveSecurityManager(policyServer);
00610 
00611             
00612             
00613             
00614             ProActiveSecurityManager psm = proactiveSecurityManager.generateSiblingCertificate(
00615                     "HalfBody");
00616             ProActiveMetaObjectFactory.newInstance()
00617                                       .setProActiveSecurityManager(psm);
00618         } catch (InvalidPolicyFile e) {
00619             e.printStackTrace();
00620         }
00621     }
00622 
00623     public PolicyServer getPolicyServer() {
00624         return policyServer;
00625     }
00626 
00627     
00628 
00629 
00630     public String getSecurityFilePath() {
00631         return securityFile;
00632     }
00633 
00634     
00635     
00636     
00637     
00638     
00639     
00640     private MainDefinition getMainDefinition(String mainDefinitionID) {
00641         return mainDefinitionMapping.get(mainDefinitionID);
00642     }
00643 
00648     private MainDefinition getMainDefinition() {
00649         return getMainDefinition(lastMainDefinitionID);
00650     }
00651 
00652     private void addExternalProcess(String processID, ExternalProcess process) {
00653         ProcessUpdater processUpdater = (ProcessUpdater) pendingProcessMapping.remove(processID);
00654 
00655         if (processUpdater != null) {
00656             if (logger.isDebugEnabled()) {
00657                 logger.debug("Updating Process name=" + processID);
00658             }
00659 
00660             processUpdater.updateProcess(process);
00661         }
00662 
00663         processMapping.put(processID, process);
00664     }
00665 
00666     private void addPendingProcess(String processID,
00667         VirtualMachine virtualMachine) {
00668         ProcessUpdater updater = new VirtualMachineUpdater(virtualMachine);
00669 
00670         
00671         addProcessUpdater(processID, updater);
00672     }
00673 
00674     private void addPendingProcess(String processID,
00675         ExternalProcessDecorator compositeProcess) {
00676         ProcessUpdater updater = new CompositeExternalProcessUpdater(compositeProcess);
00677 
00678         
00679         addProcessUpdater(processID, updater);
00680     }
00681 
00682     private void addHierarchicalPendingProcess(String processID,
00683         HierarchicalProcess hp) {
00684         ProcessUpdater updater = new HierarchicalProcessUpdater(hp);
00685         addProcessUpdater(processID, updater);
00686     }
00687 
00688     private void addSequentialPendingProcess(String processID,
00689         AbstractSequentialListProcessDecorator sp) {
00690         ProcessUpdater updater = new SequentialProcessUpdater(sp);
00691         addProcessUpdater(processID, updater);
00692     }
00693 
00694     private void addSequentialPendingService(String processID,
00695         AbstractSequentialListProcessDecorator sp) {
00696         ServiceUpdater updater = new SequentialServiceUpdater(sp);
00697         addServiceUpdater(processID, updater);
00698     }
00699 
00700     
00701     
00702     
00703     
00704     
00705     
00706     
00707     private void addProcessUpdater(String processID,
00708         ProcessUpdater processUpdater) {
00709         CompositeProcessUpdater compositeProcessUpdater = (CompositeProcessUpdater) pendingProcessMapping.get(processID);
00710 
00711         if (compositeProcessUpdater == null) {
00712             compositeProcessUpdater = new CompositeProcessUpdater();
00713 
00714             
00715             pendingProcessMapping.put(processID, compositeProcessUpdater);
00716         }
00717 
00718         compositeProcessUpdater.addProcessUpdater(processUpdater);
00719     }
00720 
00721     private void addPendingService(String serviceID, ServiceUser serviceUser) {
00722         ServiceUpdater updater = null;
00723 
00724         if (serviceUser instanceof VirtualMachine) {
00725             updater = new VirtualMachineUpdater((VirtualMachine) serviceUser);
00726         } else {
00727             updater = new ServiceUpdaterImpl(serviceUser);
00728         }
00729 
00730         addServiceUpdater(serviceID, updater);
00731     }
00732 
00733     private void addServiceUpdater(String serviceID,
00734         ServiceUpdater serviceUpdater) {
00735         CompositeServiceUpdater compositeServiceUpdater = (CompositeServiceUpdater) pendingServiceMapping.get(serviceID);
00736 
00737         if (compositeServiceUpdater == null) {
00738             compositeServiceUpdater = new CompositeServiceUpdater();
00739 
00740             
00741             pendingServiceMapping.put(serviceID, compositeServiceUpdater);
00742         }
00743 
00744         compositeServiceUpdater.addServiceUpdater(serviceUpdater);
00745     }
00746 
00752     private String generateNewJobID() {
00753         return "JOB-" + System.currentTimeMillis();
00754     }
00755 
00756     
00757     
00758     
00759     private interface ServiceUpdater {
00760         public void updateService(UniversalService service);
00761     }
00762 
00763     private interface ProcessUpdater {
00764         public void updateProcess(ExternalProcess p);
00765     }
00766 
00767     private class CompositeServiceUpdater implements ServiceUpdater {
00768         private java.util.ArrayList<ServiceUpdater> updaterList;
00769 
00770         public CompositeServiceUpdater() {
00771             updaterList = new java.util.ArrayList<ServiceUpdater>();
00772         }
00773 
00774         public void addServiceUpdater(ServiceUpdater s) {
00775             updaterList.add(s);
00776         }
00777 
00778         public void updateService(UniversalService s) {
00779 
00780             for (ServiceUpdater serviceUpdater : updaterList) {
00781                 serviceUpdater.updateService(s);
00782             }
00783 
00784             updaterList.clear();
00785         }
00786     }
00787 
00788     private class CompositeProcessUpdater implements ProcessUpdater {
00789         private java.util.ArrayList<ProcessUpdater> updaterList;
00790 
00791         public CompositeProcessUpdater() {
00792             updaterList = new java.util.ArrayList<ProcessUpdater>();
00793         }
00794 
00795         public void addProcessUpdater(ProcessUpdater p) {
00796             updaterList.add(p);
00797         }
00798 
00799         public void updateProcess(ExternalProcess p) {
00800            
00801                 for (ProcessUpdater processUpdater : updaterList) {
00802                         processUpdater.updateProcess(p);
00803             }
00804 
00805             updaterList.clear();
00806         }
00807     }
00808 
00809     private class CompositeExternalProcessUpdater implements ProcessUpdater {
00810         private ExternalProcessDecorator compositeExternalProcess;
00811 
00812         public CompositeExternalProcessUpdater(
00813             ExternalProcessDecorator compositeExternalProcess) {
00814             this.compositeExternalProcess = compositeExternalProcess;
00815         }
00816 
00817         public void updateProcess(ExternalProcess p) {
00818             if (logger.isDebugEnabled()) {
00819                 logger.debug("Updating CompositeExternal Process");
00820             }
00821 
00822             compositeExternalProcess.setTargetProcess(p);
00823         }
00824     }
00825 
00826     private class HierarchicalProcessUpdater implements ProcessUpdater {
00827         private HierarchicalProcess hp;
00828 
00829         public HierarchicalProcessUpdater(HierarchicalProcess hp) {
00830             this.hp = hp;
00831         }
00832 
00833         public void updateProcess(ExternalProcess p) {
00834             if (logger.isDebugEnabled()) {
00835                 logger.debug("Updating Hierarchical Process");
00836             }
00837 
00838             hp.setHierarchicalProcess(p);
00839         }
00840     }
00841 
00842     private class SequentialProcessUpdater implements ProcessUpdater {
00843         private AbstractSequentialListProcessDecorator spd;
00844 
00845         public SequentialProcessUpdater(
00846             AbstractSequentialListProcessDecorator spd) {
00847             this.spd = spd;
00848         }
00849 
00850         public void updateProcess(ExternalProcess p) {
00851             if (logger.isDebugEnabled()) {
00852                 logger.debug("Updating Sequential Process");
00853             }
00854 
00855             
00856             spd.addProcessToList(0, (ExternalProcessDecorator) p);
00857         }
00858     }
00859 
00860     private class SequentialServiceUpdater implements ServiceUpdater {
00861         private AbstractSequentialListProcessDecorator spd;
00862 
00863         public SequentialServiceUpdater(
00864             AbstractSequentialListProcessDecorator spd) {
00865             this.spd = spd;
00866         }
00867 
00868         public void updateService(UniversalService s) {
00869             if (logger.isDebugEnabled()) {
00870                 logger.debug("Updating Sequential Service");
00871             }
00872 
00873             
00874             spd.addServiceToList(0, (UniversalService) s);
00875         }
00876     }
00877 
00878     
00879     
00880     
00881     
00882     
00883     
00884     
00885     
00886     
00887     
00888     
00889     
00890     private class VirtualMachineUpdater implements ProcessUpdater,
00891         ServiceUpdater {
00892         private VirtualMachine virtualMachine;
00893 
00894         public VirtualMachineUpdater(VirtualMachine virtualMachine) {
00895             this.virtualMachine = virtualMachine;
00896         }
00897 
00898         public void updateProcess(ExternalProcess p) {
00899             if (logger.isDebugEnabled()) {
00900                 logger.debug("Updating VirtualMachine Process");
00901             }
00902 
00903             virtualMachine.setProcess(p);
00904         }
00905 
00906         public void updateService(UniversalService s) {
00907             if (logger.isDebugEnabled()) {
00908                 logger.debug("Updating VirtualMachine Service");
00909             }
00910 
00911             virtualMachine.setService(s);
00912         }
00913     }
00914 
00915     private class ServiceUpdaterImpl implements ServiceUpdater {
00916         private ServiceUser serviceUser;
00917 
00918         public ServiceUpdaterImpl(ServiceUser serviceUser) {
00919             this.serviceUser = serviceUser;
00920         }
00921 
00922         public void updateService(UniversalService s) {
00923             if (logger.isDebugEnabled()) {
00924                 logger.debug("Updating VirtualMachine Service");
00925             }
00926 
00927             try {
00928                 serviceUser.setService(s);
00929             } catch (ProActiveException e) {
00930                 e.printStackTrace();
00931                 logger.error("the given service " + s.getServiceName() +
00932                     " cannot be set for class " + serviceUser.getUserClass());
00933             }
00934         }
00935     }
00936 
00940     public void setVariableContract(VariableContract variableContract) {
00941         this.variableContract = variableContract;
00942     }
00943 
00947     public VariableContract getVariableContract() {
00948         return this.variableContract;
00949     }
00950 
00951     public void addTechnicalService(TechnicalServiceXmlType tsParsed)
00952         throws Exception {
00953         TechnicalService ts = (TechnicalService) tsParsed.getType().newInstance();
00954         ((TechnicalService) ts).init(tsParsed.getArgs());
00955         ((TechnicalServiceWrapper) this.technicalServiceMapping.get(tsParsed.getId())).setTs(ts);
00956     }
00957 
00958     public TechnicalService getTechnicalService(
00959         String technicalServiceId) {
00960         TechnicalService ts =  this.technicalServiceMapping.get(technicalServiceId);
00961 
00962         if (ts == null) {
00963             ts = new TechnicalServiceWrapper();
00964             this.technicalServiceMapping.put(technicalServiceId, ts);
00965         }
00966 
00967         return ts;
00968     }
00969 }