org/objectweb/proactive/core/descriptor/data/ProActiveDescriptorImpl.java

00001 /* 
00002  * ################################################################
00003  * 
00004  * ProActive: The Java(TM) library for Parallel, Distributed, 
00005  *            Concurrent computing with Security and Mobility
00006  * 
00007  * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
00008  * Contact: proactive@objectweb.org
00009  * 
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or any later version.
00014  *  
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  * 
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00023  * USA
00024  *  
00025  *  Initial developer(s):               The ProActive Team
00026  *                        http://www.inria.fr/oasis/ProActive/contacts.html
00027  *  Contributor(s): 
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     //  ----- PRIVATE MEMBERS -----------------------------------------------------------------------------------
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     //  public X509Certificate creatorCertificate;
00123     public String securityFile;
00124     private HashMap<String, TechnicalService> technicalServiceMapping;
00125 
00126     //
00127     //  ----- CONSTRUCTORS -----------------------------------------------------------------------------------
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     //  ----- PUBLIC METHODS -----------------------------------------------------------------------------------
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                 //System.out.println("new id generated : " + jobID);
00363             } else {
00364                 this.jobID = ProActive.getJobId();
00365 
00366                 //System.out.println("using runtime id : " + jobID);
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                 //System.out.println("vn created with url: " + padURL + " and jobid : " + ((VirtualNodeImpl) vn).jobID);
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         //TODO throw new ProActiveException 
00450         //if(fileTransferID.equalsIgnoreCase("implicit")) throw new ProActiveException();
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                 //addPendingJVMProcess(processID, jvmProcess);
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             //vnArray[i] = null;                
00587         }
00588     }
00589 
00594     public int getVirtualNodeMappingSize() {
00595         return virtualNodeMapping.size();
00596     }
00597 
00598     // SECURITY
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             // set the security policyserver to the default proactive meta object
00612             // by the way, the HalfBody will be associated to a security manager
00613             // derivated from this one.
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     /* (non-Javadoc)
00628      * @see org.objectweb.proactive.core.descriptor.data.ProActiveDescriptor#getSecurityFilePath()
00629      */
00630     public String getSecurityFilePath() {
00631         return securityFile;
00632     }
00633 
00634     //
00635     //  ----- PROTECTED METHODS -----------------------------------------------------------------------------------
00636     //
00637     //
00638     //  ----- PRIVATE METHODS -----------------------------------------------------------------------------------
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         //pendingProcessMapping.put(processID, updater);
00671         addProcessUpdater(processID, updater);
00672     }
00673 
00674     private void addPendingProcess(String processID,
00675         ExternalProcessDecorator compositeProcess) {
00676         ProcessUpdater updater = new CompositeExternalProcessUpdater(compositeProcess);
00677 
00678         //pendingProcessMapping.put(processID, updater);
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     //Commented in the fist version of jvm extension
00701     //    private void addPendingJVMProcess(String processID, JVMProcess jvmProcess) {
00702     //        ProcessUpdater updater = new ExtendedJVMProcessUpdater(jvmProcess);
00703     //
00704     //        //pendingProcessMapping.put(processID, updater);
00705     //        addProcessUpdater(processID, updater);
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             //pendingProcessMapping.put(processID, processUpdater);
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             //pendingProcessMapping.put(processID, processUpdater);
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     //  ----- INNER CLASSES -----------------------------------------------------------------------------------
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             // add the process in head of list
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             // add the process in head of list
00874             spd.addServiceToList(0, (UniversalService) s);
00875         }
00876     }
00877 
00878     //  Commented in the fist version of jvm extension
00879     //    private class ExtendedJVMProcessUpdater implements ProcessUpdater {
00880     //        private JVMProcess jvmProcess;
00881     //
00882     //        public ExtendedJVMProcessUpdater(JVMProcess jvmProcess) {
00883     //            this.jvmProcess = jvmProcess;
00884     //        }
00885     //
00886     //        public void updateProcess(ExternalProcess p) {
00887     //            jvmProcess.setExtendedJVM((JVMProcessImpl) p);
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 }

Generated on Mon Jan 22 15:16:07 2007 for ProActive by  doxygen 1.5.1