org/objectweb/proactive/core/runtime/ProActiveRuntimeImpl.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.runtime;
00032 
00033 import java.io.File;
00034 import java.io.IOException;
00035 import java.io.Serializable;
00036 import java.lang.reflect.InvocationTargetException;
00037 import java.lang.reflect.Method;
00038 import java.security.PublicKey;
00039 import java.security.SecureRandom;
00040 import java.security.cert.X509Certificate;
00041 import java.util.ArrayList;
00042 import java.util.Enumeration;
00043 
00044 import org.apache.log4j.MDC;
00045 import org.objectweb.proactive.ActiveObjectCreationException;
00046 import org.objectweb.proactive.Body;
00047 import org.objectweb.proactive.ProActive;
00048 import org.objectweb.proactive.core.ProActiveException;
00049 import org.objectweb.proactive.core.UniqueID;
00050 import org.objectweb.proactive.core.body.AbstractBody;
00051 import org.objectweb.proactive.core.body.ActiveBody;
00052 import org.objectweb.proactive.core.body.BodyAdapter;
00053 import org.objectweb.proactive.core.body.LocalBodyStore;
00054 import org.objectweb.proactive.core.body.UniversalBody;
00055 import org.objectweb.proactive.core.body.ft.checkpointing.Checkpoint;
00056 import org.objectweb.proactive.core.body.proxy.UniversalBodyProxy;
00057 import org.objectweb.proactive.core.config.ProActiveConfiguration;
00058 import org.objectweb.proactive.core.descriptor.data.ProActiveDescriptor;
00059 import org.objectweb.proactive.core.descriptor.data.VirtualNode;
00060 import org.objectweb.proactive.core.descriptor.data.VirtualNodeImpl;
00061 import org.objectweb.proactive.core.descriptor.util.RefactorPAD;
00062 import org.objectweb.proactive.core.event.RuntimeRegistrationEvent;
00063 import org.objectweb.proactive.core.event.RuntimeRegistrationEventProducerImpl;
00064 import org.objectweb.proactive.core.gc.GarbageCollector;
00065 import org.objectweb.proactive.core.mop.ConstructorCall;
00066 import org.objectweb.proactive.core.mop.ConstructorCallExecutionFailedException;
00067 import org.objectweb.proactive.core.mop.JavassistByteCodeStubBuilder;
00068 import org.objectweb.proactive.core.mop.MOPClassLoader;
00069 import org.objectweb.proactive.core.mop.Utils;
00070 import org.objectweb.proactive.core.node.NodeException;
00071 import org.objectweb.proactive.core.process.ExternalProcess;
00072 import org.objectweb.proactive.core.process.UniversalProcess;
00073 import org.objectweb.proactive.core.rmi.FileProcess;
00074 import org.objectweb.proactive.core.util.ClassDataCache;
00075 import org.objectweb.proactive.core.util.UrlBuilder;
00076 import org.objectweb.proactive.core.util.log.Loggers;
00077 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00078 import org.objectweb.proactive.ext.security.Communication;
00079 import org.objectweb.proactive.ext.security.PolicyServer;
00080 import org.objectweb.proactive.ext.security.ProActiveSecurity;
00081 import org.objectweb.proactive.ext.security.ProActiveSecurityManager;
00082 import org.objectweb.proactive.ext.security.SecurityContext;
00083 import org.objectweb.proactive.ext.security.SecurityEntity;
00084 import org.objectweb.proactive.ext.security.crypto.KeyExchangeException;
00085 import org.objectweb.proactive.ext.security.domain.SecurityDomain;
00086 import org.objectweb.proactive.ext.security.exceptions.InvalidPolicyFile;
00087 import org.objectweb.proactive.ext.security.exceptions.RenegotiateSessionException;
00088 import org.objectweb.proactive.ext.security.exceptions.SecurityNotAvailableException;
00089 import org.objectweb.proactive.ext.security.securityentity.Entity;
00090 import org.objectweb.proactive.ext.security.securityentity.EntityCertificate;
00091 import org.objectweb.proactive.ext.security.securityentity.EntityVirtualNode;
00092 
00093 
00104 public class ProActiveRuntimeImpl extends RuntimeRegistrationEventProducerImpl
00105     implements ProActiveRuntime, LocalProActiveRuntime {
00106     //
00107     // -- STATIC MEMBERS -----------------------------------------------------------
00108     //
00109     //the Unique instance of ProActiveRuntime
00110     private static ProActiveRuntime proActiveRuntime;
00111 
00112     static {
00113         if (ProActiveConfiguration.isForwarder()) {
00114             proActiveRuntime = new ProActiveRuntimeForwarderImpl();
00115         } else {
00116             proActiveRuntime = new ProActiveRuntimeImpl();
00117         }
00118     }
00119 
00120     private static SecureRandom prng = null; // new Random();
00121 
00122     // runtime security manager 
00123     private static ProActiveSecurityManager runtimeSecurityManager;
00124 
00125     // map of local nodes, key is node name
00126     private java.util.Hashtable<String,LocalNode> nodeMap;
00127     private String defaultNodeVirtualNode = null;
00128 
00129     //
00130     // -- PRIVATE MEMBERS -----------------------------------------------------------
00131     //
00132     private VMInformation vmInformation;
00133 
00134     //map VirtualNodes and their names
00135     private java.util.Hashtable<String, VirtualNode> virtualNodesMap;
00136 
00137     //map descriptor and their url
00138     private java.util.Hashtable<String, ProActiveDescriptor> descriptorMap;
00139 
00140     // map proActiveRuntime registered on this VM and their names
00141     private java.util.Hashtable<String, ProActiveRuntime> proActiveRuntimeMap;
00142     private java.util.Hashtable proActiveRuntimeForwarderMap;
00143 
00144     // synchronized set of URL to runtimes in which we are registered
00145     private java.util.Set<String> runtimeAcquaintancesURL;
00146     private ProActiveRuntime parentRuntime;
00147 
00148     //
00149     // -- CONSTRUCTORS -----------------------------------------------------------
00150     //
00151     // singleton
00152     protected ProActiveRuntimeImpl() {
00153         try {
00154             this.vmInformation = new VMInformationImpl();
00155             this.proActiveRuntimeMap = new java.util.Hashtable<String, ProActiveRuntime>();
00156             this.proActiveRuntimeForwarderMap = new java.util.Hashtable();
00157             this.runtimeAcquaintancesURL = java.util.Collections.synchronizedSortedSet(new java.util.TreeSet<String>());
00158             this.virtualNodesMap = new java.util.Hashtable<String, VirtualNode>();
00159             this.descriptorMap = new java.util.Hashtable<String, ProActiveDescriptor>();
00160             this.nodeMap = new java.util.Hashtable<String,LocalNode>();
00161 
00162             try {
00163                 String file = System.getProperties()
00164                                     .getProperty("proactive.runtime.security");
00165                 ProActiveSecurity.loadProvider();
00166 
00167                 if ((file != null) && new File(file).exists()) {
00168                     // loading security from a file
00169                     ProActiveRuntimeImpl.runtimeSecurityManager = new ProActiveSecurityManager(file);
00170                     logger.info(
00171                         "ProActive Security Policy (proactive.runtime.security) using " +
00172                         file);
00173 
00174                     // Is the runtime included within a Domain ?
00175                     String domainURL = System.getProperties()
00176                                              .getProperty("proactive.runtime.domain.url");
00177 
00178                     if (domainURL != null) {
00179                         SecurityEntity domain = (SecurityDomain) ProActive.lookupActive("org.objectweb.proactive.ext.security.domain.SecurityDomain",
00180                                 domainURL);
00181                         ProActiveRuntimeImpl.runtimeSecurityManager.setParent(domain);
00182                     }
00183                 } else {
00184                     logger.debug(
00185                         "ProActive Security Policy (proactive.runtime.security) not set. Runtime Security disabled ");
00186                 }
00187             } catch (InvalidPolicyFile e) {
00188                 e.printStackTrace();
00189             } catch (ActiveObjectCreationException e) {
00190                 e.printStackTrace();
00191             }
00192 
00193             //System.out.println(vmInformation.getVMID().toString());
00194         } catch (java.net.UnknownHostException e) {
00195             //System.out.println();
00196             logger.fatal(" !!! Cannot do a reverse lookup on that host");
00197 
00198             // System.out.println();
00199             e.printStackTrace();
00200             System.exit(1);
00201         } catch (IOException e) {
00202             e.printStackTrace();
00203         }
00204 
00205         // logging info
00206         MDC.remove("runtime");
00207         MDC.put("runtime", getURL());
00208     }
00209 
00210     public static synchronized int getNextInt() {
00211         if (prng == null) {
00212             prng = new SecureRandom();
00213         }
00214 
00215         return prng.nextInt();
00216     }
00217 
00218     //
00219     // -- PUBLIC METHODS -----------------------------------------------------------
00220     //
00221     public static ProActiveRuntime getProActiveRuntime() {
00222         return proActiveRuntime;
00223     }
00224 
00225     //
00226     // -- Implements LocalProActiveRuntime  -----------------------------------------------
00227     //
00228 
00232     public void registerLocalVirtualNode(VirtualNode vn, String vnName) {
00233         //System.out.println("vn "+vnName+" registered");
00234         virtualNodesMap.put(vnName, vn);
00235     }
00236 
00240     public void setParent(ProActiveRuntime parentPARuntime) {
00241         if (parentRuntime == null) {
00242             parentRuntime = parentPARuntime;
00243             runtimeAcquaintancesURL.add(parentPARuntime.getURL());
00244         } else {
00245             runtimeLogger.error("Parent runtime already set!");
00246         }
00247     }
00248 
00249     public void registerDescriptor(String url, ProActiveDescriptor pad) {
00250         descriptorMap.put(url, pad);
00251     }
00252 
00253     public ProActiveDescriptor getDescriptor(String url,
00254         boolean isHierarchicalSearch) throws IOException, ProActiveException {
00255         ProActiveDescriptor pad = descriptorMap.get(url);
00256 
00257         // hierarchical search or not, look if we know the pad
00258         if (pad != null) {
00259             // if pad found and hierarchy search return pad with no main
00260             if (isHierarchicalSearch) {
00261                 return RefactorPAD.buildNoMainPAD(pad);
00262             } else {
00263                 // if not hierarchy search, return the normal pad
00264                 return pad;
00265             }
00266         } else if (!isHierarchicalSearch) {
00267             return null; // pad == null
00268         } else { // else search pad in parent runtime
00269             if (parentRuntime == null) {
00270                 throw new IOException(
00271                     "Descriptor cannot be found hierarchically since this runtime has no parent");
00272             }
00273 
00274             return parentRuntime.getDescriptor(url, true);
00275         }
00276     }
00277 
00278     public void removeDescriptor(String url) {
00279         descriptorMap.remove(url);
00280     }
00281 
00282     //
00283     // -- Implements ProActiveRuntime  -----------------------------------------------
00284     //
00285 
00289     public String createLocalNode(String nodeName,
00290         boolean replacePreviousBinding,
00291         ProActiveSecurityManager nodeSecurityManager, String vnName,
00292         String jobId) throws NodeException {
00293         if (!replacePreviousBinding && (nodeMap.get(nodeName) != null)) {
00294             throw new NodeException("Node " + nodeName +
00295                 " already created on this ProActiveRuntime. To overwrite this node, use true for replacePreviousBinding");
00296         }
00297 
00298         if (nodeSecurityManager != null) {
00299             // setting the current runtime as parent entity of the node 
00300             nodeSecurityManager.setParent(this);
00301         }
00302 
00303         LocalNode newNode = new LocalNode(nodeName, jobId, nodeSecurityManager,
00304                 vnName);
00305 
00306         if (replacePreviousBinding && (nodeMap.get(nodeName) != null)) {
00307             newNode.setActiveObjects(nodeMap.get(nodeName).getActiveObjectsId());
00308             nodeMap.remove(nodeName);
00309         }
00310 
00311         nodeMap.put(nodeName, newNode);
00312 
00313         return nodeName;
00314     }
00315 
00319     public void killAllNodes() {
00320         for (Enumeration<String> e = nodeMap.keys(); e.hasMoreElements();) {
00321             String nodeName = e.nextElement();
00322             killNode(nodeName);
00323         }
00324     }
00325 
00329     public void killNode(String nodeName) {
00330         LocalNode localNode = nodeMap.get(nodeName);
00331         localNode.terminate();
00332         nodeMap.remove(nodeName);
00333     }
00334 
00338     public void createVM(UniversalProcess remoteProcess)
00339         throws java.io.IOException {
00340         remoteProcess.startProcess();
00341     }
00342 
00346     public String[] getLocalNodeNames() {
00347         int i = 0;
00348         String[] nodeNames;
00349 
00350         synchronized (nodeMap) {
00351             nodeNames = new String[nodeMap.size()];
00352 
00353             for (java.util.Enumeration<String> e = nodeMap.keys(); e.hasMoreElements();) {
00354                 nodeNames[i] = e.nextElement();
00355                 i++;
00356             }
00357         }
00358 
00359         return nodeNames;
00360     }
00361 
00365     public VMInformation getVMInformation() {
00366         return vmInformation;
00367     }
00368 
00372     public void register(ProActiveRuntime proActiveRuntimeDist,
00373         String proActiveRuntimeName, String creatorID, String creationProtocol,
00374         String vmName) {
00375         //System.out.println("register in Impl");
00376         //System.out.println("thread"+Thread.currentThread().getName());
00377         //System.out.println(vmInformation.getVMID().toString());
00378         proActiveRuntimeMap.put(proActiveRuntimeName, proActiveRuntimeDist);
00379         notifyListeners(this, RuntimeRegistrationEvent.RUNTIME_REGISTERED,
00380             proActiveRuntimeDist, creatorID, creationProtocol, vmName);
00381     }
00382 
00386     public void unregister(ProActiveRuntime proActiveRuntimeDist,
00387         String proActiveRuntimeUrl, String creatorID, String creationProtocol,
00388         String vmName) {
00389         this.proActiveRuntimeMap.remove(proActiveRuntimeUrl);
00390         notifyListeners(this, RuntimeRegistrationEvent.RUNTIME_UNREGISTERED,
00391             proActiveRuntimeDist, creatorID, creationProtocol, vmName);
00392     }
00393 
00397     public ProActiveRuntime[] getProActiveRuntimes() {
00398         int i = 0;
00399         ProActiveRuntime[] runtimeArray;
00400 
00401         synchronized (proActiveRuntimeMap) {
00402             runtimeArray = new ProActiveRuntime[proActiveRuntimeMap.size()];
00403 
00404             for (java.util.Enumeration<ProActiveRuntime> e = proActiveRuntimeMap.elements();
00405                     e.hasMoreElements();) {
00406                 runtimeArray[i] = e.nextElement();
00407                 i++;
00408             }
00409         }
00410 
00411         return runtimeArray;
00412     }
00413 
00417     public ProActiveRuntime getProActiveRuntime(String proActiveRuntimeName) {
00418         return proActiveRuntimeMap.get(proActiveRuntimeName);
00419     }
00420 
00424     public void addAcquaintance(String proActiveRuntimeName) {
00425         runtimeAcquaintancesURL.add(proActiveRuntimeName);
00426     }
00427 
00431     public String[] getAcquaintances() {
00432         String[] urls;
00433 
00434         synchronized (runtimeAcquaintancesURL) {
00435             urls = new String[runtimeAcquaintancesURL.size()];
00436 
00437             java.util.Iterator<String> iter = runtimeAcquaintancesURL.iterator();
00438 
00439             for (int i = 0; i < urls.length; i++)
00440                 urls[i] = iter.next();
00441         }
00442 
00443         return urls;
00444     }
00445 
00449     public void rmAcquaintance(String proActiveRuntimeName) {
00450         runtimeAcquaintancesURL.remove(proActiveRuntimeName);
00451     }
00452 
00456     public void killRT(boolean softly) {
00457         killAllNodes();
00458         System.exit(0);
00459     }
00460 
00464     public String getURL() {
00465         return "//" +
00466         UrlBuilder.getHostNameorIP(vmInformation.getInetAddress()) + "/" +
00467         vmInformation.getName();
00468     }
00469 
00470     public ArrayList<ArrayList<Serializable>> getActiveObjects(String nodeName) {
00471         //the array to return
00472         ArrayList<ArrayList<Serializable>> localBodies = new ArrayList<ArrayList<Serializable>>();
00473         LocalBodyStore localBodystore = LocalBodyStore.getInstance();
00474         ArrayList<UniqueID> bodyList = nodeMap.get(nodeName).getActiveObjectsId();
00475 
00476         if (bodyList == null) {
00477             // Probably the node is killed
00478             return localBodies;
00479         }
00480 
00481         synchronized (bodyList) {
00482             for (int i = 0; i < bodyList.size(); i++) {
00483                 UniqueID bodyID = bodyList.get(i);
00484 
00485                 //check if the body is still on this vm
00486                 Body body = localBodystore.getLocalBody(bodyID);
00487 
00488                 if (body == null) {
00489                     //runtimeLogger.warn("body null");
00490                     // the body with the given ID is not any more on this ProActiveRuntime
00491                     // unregister it from this ProActiveRuntime
00492                     unregisterBody(nodeName, bodyID);
00493                 } else {
00494                     //the body is on this runtime then return adapter and class name of the reified
00495                     //object to enable the construction of stub-proxy couple.
00496                     ArrayList<Serializable> bodyAndObjectClass = new ArrayList<Serializable>(2);
00497 
00498                     //adapter
00499                     bodyAndObjectClass.add(0, body.getRemoteAdapter());
00500 
00501                     //className
00502                     bodyAndObjectClass.add(1,
00503                         body.getReifiedObject().getClass().getName());
00504                     localBodies.add(bodyAndObjectClass);
00505                 }
00506             }
00507 
00508             return localBodies;
00509         }
00510     }
00511 
00512     public VirtualNode getVirtualNode(String virtualNodeName) {
00513         //      System.out.println("i am in get vn ");
00514         return virtualNodesMap.get(virtualNodeName);
00515     }
00516 
00517     public void registerVirtualNode(String virtualNodeName,
00518         boolean replacePreviousBinding) {
00519         //This method has no effect here since the virtualNode has been registered in some registry
00520         //like RMI or JINI
00521     }
00522 
00523     public void unregisterVirtualNode(String virtualNodeName) {
00524         removeRuntimeRegistrationEventListener((VirtualNodeImpl) virtualNodesMap.get(
00525                 virtualNodeName));
00526         virtualNodesMap.remove(virtualNodeName);
00527     }
00528 
00529     public void unregisterAllVirtualNodes() {
00530         virtualNodesMap.clear();
00531     }
00532 
00536     public String getJobID(String nodeUrl) {
00537         String name = UrlBuilder.getNameFromUrl(nodeUrl);
00538 
00539         LocalNode localNode = nodeMap.get(name);
00540         return localNode.getJobId();
00541     }
00542 
00543     public ArrayList<BodyAdapter> getActiveObjects(String nodeName, String className) {
00544         //the array to return
00545         ArrayList<BodyAdapter> localBodies = new ArrayList<BodyAdapter>();
00546         LocalBodyStore localBodystore = LocalBodyStore.getInstance();
00547         ArrayList<UniqueID> bodyList = nodeMap.get(nodeName).getActiveObjectsId();
00548 
00549         if (bodyList == null) {
00550             // Probably the node is killed
00551             return localBodies;
00552         }
00553 
00554         synchronized (bodyList) {
00555             for (int i = 0; i < bodyList.size(); i++) {
00556                 UniqueID bodyID = bodyList.get(i);
00557 
00558                 //check if the body is still on this vm
00559                 Body body = localBodystore.getLocalBody(bodyID);
00560 
00561                 if (body == null) {
00562                     //runtimeLogger.warn("body null");
00563                     // the body with the given ID is not any more on this ProActiveRuntime
00564                     // unregister it from this ProActiveRuntime
00565                     unregisterBody(nodeName, bodyID);
00566                 } else {
00567                     String objectClass = body.getReifiedObject().getClass()
00568                                              .getName();
00569 
00570                     // if the reified object is of the specified type
00571                     // return the body adapter 
00572                     if (objectClass.equals((String) className)) {
00573                         localBodies.add(body.getRemoteAdapter());
00574                     }
00575                 }
00576             }
00577 
00578             return localBodies;
00579         }
00580     }
00581 
00585     public UniversalBody createBody(String nodeName,
00586         ConstructorCall bodyConstructorCall, boolean isLocal)
00587         throws ConstructorCallExecutionFailedException,
00588             java.lang.reflect.InvocationTargetException {
00589         Body localBody = (Body) bodyConstructorCall.execute();
00590 
00591         // SECURITY
00592         try {
00593             ProActiveSecurityManager objectSecurityManager = ((AbstractBody) localBody).getProActiveSecurityManager();
00594 
00595             if (objectSecurityManager != null) {
00596                 ProActiveSecurityManager nodeSecurityManager = this.nodeMap.get(nodeName).getSecurityManager();
00597                 objectSecurityManager.setParent(nodeSecurityManager);
00598             }
00599         } catch (SecurityNotAvailableException e) {
00600             // well nothing to do
00601         } catch (IOException e) {
00602             // should never happen normally
00603             e.printStackTrace();
00604         }
00605 
00606         ProActiveLogger.getLogger(Loggers.RUNTIME).debug("nodeName " +
00607             nodeName);
00608         registerBody(nodeName, localBody);
00609 
00610         if (GarbageCollector.isBuildingTopology()) {
00611                 ((AbstractBody) localBody).updateReferences(UniversalBodyProxy.getIncomingReferences());
00612         }
00613         
00614         if (isLocal) {
00615             // if the body and proxy are on the same vm, returns the local view
00616             //System.out.println("body and proxy on the same vm");
00617             //System.out.println(localBody.getReifiedObject().getClass().getName());
00618             //register the body in the nodemap
00619             return (UniversalBody) localBody;
00620         } else {
00621             //otherwise return the adapter
00622             //System.out.println ("RemoteProActiveImpl.createBody "+vmInformation.getInetAddress().getHostName() +" -> new "+bodyConstructorCall.getTargetClassName()+" on node "+nodeName);
00623             //System.out.println ("RemoteProActiveRuntimeImpl.localBody created localBody="+localBody+" on node "+nodeName);
00624             return localBody.getRemoteAdapter();
00625         }
00626     }
00627 
00631     public UniversalBody receiveBody(String nodeName, Body body) {
00632         try {
00633             ((AbstractBody) body).getProActiveSecurityManager()
00634              .setParent(this.nodeMap.get(nodeName).getSecurityManager());
00635         } catch (SecurityNotAvailableException e) {
00636             // an exception here means that the body and its associated application
00637             // have not been started with a security policy
00638         } catch (IOException e) {
00639             e.printStackTrace();
00640         }
00641 
00642         registerBody(nodeName, body);
00643 
00644         return body.getRemoteAdapter();
00645     }
00646 
00650     public UniversalBody receiveCheckpoint(String nodeURL, Checkpoint ckpt,
00651         int inc) {
00652         runtimeLogger.debug("Receive a checkpoint for recovery");
00653 
00654         // the recovered body
00655         Body ret = ckpt.recover();
00656 
00657         // update node url
00658         ret.updateNodeURL(nodeURL);
00659 
00660         String nodeName = UrlBuilder.getNameFromUrl(nodeURL);
00661 
00662         // need to register as thread of the corresponding active object: this thread
00663         // may send looged requests or logged replies
00664         LocalBodyStore.getInstance().setCurrentThreadBody(ret);
00665         ((AbstractBody) ret).getFTManager()
00666          .beforeRestartAfterRecovery(ckpt.getCheckpointInfo(), inc);
00667         LocalBodyStore.getInstance().setCurrentThreadBody(null);
00668 
00669         // register the body
00670         this.registerBody(nodeName, ret);
00671 
00672         // restart actvity
00673         if (runtimeLogger.isDebugEnabled()) {
00674             runtimeLogger.debug(ret.getID() + " is restarting activity...");
00675         }
00676 
00677         ((ActiveBody) ret).startBody();
00678 
00679         // no more need to return the recovered body
00680         return null;
00681     }
00682 
00689     private void registerBody(String nodeName, Body body) {
00690         UniqueID bodyID = body.getID();
00691         ArrayList<UniqueID> bodyList = nodeMap.get(nodeName).getActiveObjectsId();
00692 
00693         synchronized (bodyList) {
00694             if (!bodyList.contains(bodyID)) {
00695                 //System.out.println("in registerbody id = "+ bodyID.toString());
00696                 bodyList.add(bodyID);
00697             }
00698         }
00699     }
00700 
00707     private void unregisterBody(String nodeName, UniqueID bodyID) {
00708         //System.out.println("in remove id= "+ bodyID.toString());
00709         //System.out.println("array size "+((ArrayList)nodeMap.get(nodeName)).size());
00710         ArrayList<UniqueID> bodyList = nodeMap.get(nodeName).getActiveObjectsId();
00711 
00712         synchronized (bodyList) {
00713             bodyList.remove(bodyID);
00714 
00715             //System.out.println("array size "+((ArrayList)nodeMap.get(nodeName)).size());
00716         }
00717     }
00718 
00719     //  SECURITY
00720 
00724     public static void setProActiveSecurityManager(
00725         ProActiveSecurityManager server) {
00726         if (runtimeSecurityManager != null) {
00727             return;
00728         }
00729 
00730         runtimeSecurityManager = server;
00731     }
00732 
00733     /* (non-Javadoc)
00734      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#setDefaultNodeVirtualNodeName(java.lang.String)
00735      */
00736     public void setDefaultNodeVirtualNodeName(String s) {
00737         ProActiveLogger.getLogger(Loggers.SECURITY)
00738                        .debug(" setting current node as currentJVM tag " + s);
00739         defaultNodeVirtualNode = s;
00740     }
00741 
00742     /* (non-Javadoc)
00743      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getEntities(java.lang.String)
00744      */
00745     public ArrayList<Entity> getEntities(String nodeName) {
00746         ProActiveSecurityManager nodeSecurityManager = null;
00747         Entity nodeEntity = null;
00748         String nodeVirtualName = nodeMap.get(nodeName).getVirtualNodeName();
00749         nodeSecurityManager = nodeMap.get(nodeName).getSecurityManager();
00750 
00751         if (nodeSecurityManager != null) {
00752             nodeEntity = new EntityVirtualNode(nodeVirtualName,
00753                     nodeSecurityManager.getPolicyServer()
00754                                        .getApplicationCertificate(),
00755                     nodeSecurityManager.getCertificate());
00756         }
00757 
00758         ArrayList<Entity> entities = null;
00759 
00760         //entities = getEntities();
00761         if (entities == null) {
00762             entities = new ArrayList<Entity>();
00763         }
00764 
00765         entities.add(nodeEntity);
00766 
00767         return entities;
00768     }
00769 
00775     public ArrayList getEntities(SecurityEntity securityEntity) {
00776         if (true) {
00777             throw new RuntimeException();
00778         }
00779 
00780         return null;
00781 
00782         //nodeMap.
00783         //      try {
00784         //        System.out.println(" testing for securityentityID " + securityEntity);
00785         //        for (Enumeration e = nodeMap.keys(); e.hasMoreElements();) {
00786         //            String node = (String) e.nextElement();
00787         //
00788         //            System.out.println("testing for node " + node);
00789         //            ArrayList listAO = (ArrayList) nodeMap.get(node);
00790         //
00791         //            for (int i = 0; i < listAO.size(); i++) {
00792         //                UniqueID localBodyID = (UniqueID) listAO.get(i);
00793         //                System.out.println(" testing against localBbodyID " +
00794         //                    localBodyID);
00795         //                
00796         //                                      if (securityEntity.getCertificate().equals(localBodyID)) {
00797         //                                          ArrayList a = new ArrayList();
00798         //
00799         //                                          ProActiveSecurityManager nodeSecurityManager = (ProActiveSecurityManager) nodeSecurityManagerMap.get(node);
00800         //                                          PolicyServer nodePolicyServer = nodeSecurityManager.getPolicyServer();
00801         //
00802         //                                          if (nodePolicyServer != null) {
00803         //                                              EntityVirtualNode entityVirtualNode = new EntityVirtualNode(nodeSecurityManager.getVNName(),
00804         //                                                      nodePolicyServer.getApplicationCertificate(),
00805         //                                                      nodeSecurityManager.getCertificate());
00806         //                                              a.add(entityVirtualNode);
00807         //                                              return a;
00808         //                                          }
00809         //                                      }
00810         //                              
00811         //            }
00812         //        }
00813         //      } catch (SecurityNotAvailableException e1) {
00814         //                      e1.printStackTrace();
00815         //              } catch (IOException e1) {
00816         //                      e1.printStackTrace();
00817         //              }
00818         //        return new ArrayList();
00819     }
00820 
00821     /* (non-Javadoc)
00822      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getEntities()
00823      */
00824     public ArrayList<Entity> getEntities() {
00825         PolicyServer policyServer = null;
00826 
00827         if ((runtimeSecurityManager != null) &&
00828                 ((policyServer = runtimeSecurityManager.getPolicyServer()) != null)) {
00829             Entity e = new EntityCertificate(policyServer.getApplicationCertificate(),
00830                     runtimeSecurityManager.getCertificate());
00831             ArrayList<Entity> array = new ArrayList<Entity>();
00832             array.add(e);
00833 
00834             return array;
00835         }
00836 
00837         return null;
00838     }
00839 
00843     public SecurityContext getPolicy(SecurityContext sc)
00844         throws SecurityNotAvailableException {
00845         if (runtimeSecurityManager == null) {
00846             return sc;
00847         }
00848 
00849         PolicyServer policyServer = runtimeSecurityManager.getPolicyServer();
00850 
00851         return policyServer.getPolicy(sc);
00852     }
00853 
00857     public String getJobID() {
00858         return vmInformation.getJobID();
00859     }
00860 
00861     public byte[] getClassDataFromParentRuntime(String className)
00862         throws ProActiveException {
00863         byte[] classData = null;
00864 
00865         if (parentRuntime != null) {
00866             classData = parentRuntime.getClassDataFromThisRuntime(className);
00867 
00868             if (classData == null) {
00869                 // continue searching
00870                 classData = parentRuntime.getClassDataFromParentRuntime(className);
00871             }
00872 
00873             if (classData != null) {
00874                 // caching class
00875                 ClassDataCache.instance().addClassData(className, classData);
00876 
00877                 if (runtimeLogger.isDebugEnabled()) {
00878                     runtimeLogger.debug(getURL() + " -- > Returning class " +
00879                         className + " found in " + parentRuntime.getURL());
00880                 }
00881 
00882                 return classData;
00883             }
00884         }
00885 
00886         return null;
00887     }
00888 
00889     public synchronized byte[] getClassDataFromThisRuntime(String className)
00890         throws ProActiveException {
00891         byte[] classData = null;
00892 
00893         // 1. look in class cache
00894         // this can be redundant if not looking in a parent
00895         classData = ClassDataCache.instance().getClassData(className);
00896 
00897         // found something in classloader or cache...
00898         if (classData != null) {
00899             return classData;
00900         }
00901 
00902         try {
00903             // 2. look in classpath
00904             classData = FileProcess.getBytesFromResource(className);
00905         } catch (IOException e2) {
00906             e2.printStackTrace();
00907         }
00908 
00909         if (classData != null) {
00910             ClassDataCache.instance().addClassData(className, classData);
00911 
00912             return classData;
00913         }
00914 
00915         if (parentRuntime == null) {
00916             // top of hierarchy of runtimes
00917             classData = generateStub(className);
00918 
00919             if (classData != null) {
00920                 return classData;
00921             }
00922         }
00923 
00924         return null;
00925     }
00926 
00927     public void launchMain(String className, String[] parameters)
00928         throws ClassNotFoundException, NoSuchMethodException, ProActiveException {
00929         Class mainClass = Class.forName(className);
00930         Method mainMethod = mainClass.getMethod("main",
00931                 new Class[] { String[].class });
00932         new LauncherThread(mainMethod, parameters).start();
00933     }
00934 
00935     public void newRemote(String className)
00936         throws ClassNotFoundException, ProActiveException {
00937         Class remoteClass = Class.forName(className);
00938         new LauncherThread(remoteClass).start();
00939     }
00940 
00941     // tries to generate a stub without using MOP methods
00942     public byte[] generateStub(String className) {
00943         byte[] classData = null;
00944 
00945         if (Utils.isStubClassName(className)) {
00946             //            try {
00947             // do not use directly MOP methods (avoid classloader cycles)
00948             //                /Logger.getLogger(Loggers.CLASSLOADING).debug("Generating class : " + className);
00949             //    e.printStackTrace();
00950             String classname = Utils.convertStubClassNameToClassName(className);
00951 
00952             //ASM is now the default bytecode manipulator
00953             //                if (MOPClassLoader.BYTE_CODE_MANIPULATOR.equals("ASM")) {
00954             //                    ASMBytecodeStubBuilder bsb = new ASMBytecodeStubBuilder(classname);
00955             //                    classData = bsb.create();
00956             //                } else 
00957             if (MOPClassLoader.BYTE_CODE_MANIPULATOR.equals("javassist")) {
00958                 classData = JavassistByteCodeStubBuilder.create(classname, null);
00959             } else {
00960                 // that shouldn't happen, unless someone manually sets the BYTE_CODE_MANIPULATOR static variable
00961                 System.err.println(
00962                     "byteCodeManipulator argument is optionnal. If specified, it can only be set to javassist (ASM is no longer supported).");
00963                 System.err.println(
00964                     "Any other setting will result in the use of javassist, the default bytecode manipulator framework");
00965             }
00966 
00967             //            } catch (ClassNotFoundException ignored) {
00968             //            }
00969         }
00970 
00971         if (classData != null) {
00972             ClassDataCache.instance().addClassData(className, classData);
00973 
00974             return classData;
00975         }
00976 
00977         // try to get the class as a generated component interface reference
00978         classData = org.objectweb.proactive.core.component.gen.Utils.getClassData(className);
00979 
00980         if (classData != null) {
00981             ClassDataCache.instance().addClassData(className, classData);
00982 
00983             return classData;
00984         }
00985 
00986         return null;
00987     }
00988 
00989     /* (non-Javadoc)
00990      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#terminateSession(long)
00991      */
00992     public void terminateSession(long sessionID)
00993         throws SecurityNotAvailableException {
00994         runtimeSecurityManager.terminateSession(sessionID);
00995     }
00996 
00997     /* (non-Javadoc)
00998      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getCertificate()
00999      */
01000     public X509Certificate getCertificate()
01001         throws SecurityNotAvailableException {
01002         return runtimeSecurityManager.getCertificate();
01003     }
01004 
01005     /* (non-Javadoc)
01006      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getProActiveSecurityManager()
01007      */
01008     public ProActiveSecurityManager getProActiveSecurityManager() {
01009         return runtimeSecurityManager;
01010     }
01011 
01012     /* (non-Javadoc)
01013      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#startNewSession(org.objectweb.proactive.ext.security.Communication)
01014      */
01015     public long startNewSession(Communication policy)
01016         throws SecurityNotAvailableException, RenegotiateSessionException {
01017         return runtimeSecurityManager.startNewSession(policy);
01018     }
01019 
01020     /* (non-Javadoc)
01021      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getPublicKey()
01022      */
01023     public PublicKey getPublicKey() throws SecurityNotAvailableException {
01024         return runtimeSecurityManager.getPublicKey();
01025     }
01026 
01027     /* (non-Javadoc)
01028      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#randomValue(long, byte[])
01029      */
01030     public byte[] randomValue(long sessionID, byte[] clientRandomValue)
01031         throws SecurityNotAvailableException {
01032         try {
01033             return runtimeSecurityManager.randomValue(sessionID,
01034                 clientRandomValue);
01035         } catch (Exception e) {
01036             e.printStackTrace();
01037         }
01038 
01039         return null;
01040     }
01041 
01042     /* (non-Javadoc)
01043      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#publicKeyExchange(long, org.objectweb.proactive.core.body.UniversalBody, byte[], byte[], byte[])
01044      */
01045     public byte[][] publicKeyExchange(long sessionID, byte[] myPublicKey,
01046         byte[] myCertificate, byte[] signature)
01047         throws SecurityNotAvailableException, RenegotiateSessionException {
01048         if (runtimeSecurityManager != null) {
01049             try {
01050                 return runtimeSecurityManager.publicKeyExchange(sessionID,
01051                     myPublicKey, myCertificate, signature);
01052             } catch (KeyExchangeException e) {
01053                 e.printStackTrace();
01054             }
01055         } else {
01056             throw new SecurityNotAvailableException();
01057         }
01058 
01059         return null;
01060     }
01061 
01062     /* (non-Javadoc)
01063      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#secretKeyExchange(long, byte[], byte[], byte[], byte[], byte[])
01064      */
01065     public byte[][] secretKeyExchange(long sessionID, byte[] encodedAESKey,
01066         byte[] encodedIVParameters, byte[] encodedClientMacKey,
01067         byte[] encodedLockData, byte[] parametersSignature)
01068         throws SecurityNotAvailableException, RenegotiateSessionException {
01069         return runtimeSecurityManager.secretKeyExchange(sessionID,
01070             encodedAESKey, encodedIVParameters, encodedClientMacKey,
01071             encodedLockData, parametersSignature);
01072     }
01073 
01074     /* (non-Javadoc)
01075      * @see org.objectweb.proactive.core.runtime.ProActiveRuntime#getCertificateEncoded()
01076      */
01077     public byte[] getCertificateEncoded() throws SecurityNotAvailableException {
01078         return runtimeSecurityManager.getCertificateEncoded();
01079     }
01080 
01081     public ExternalProcess getProcessToDeploy(
01082         ProActiveRuntime proActiveRuntimeDist, String creatorID, String vmName,
01083         String padURL) throws ProActiveException {
01084         ProActiveDescriptor pad = descriptorMap.get(padURL);
01085 
01086         if (pad == null) {
01087             logger.info("Cannot find descriptor, " + padURL);
01088 
01089             return null;
01090         }
01091 
01092         notifyListeners(this,
01093             RuntimeRegistrationEvent.FORWARDER_RUNTIME_REGISTERED,
01094             proActiveRuntimeDist, creatorID, null, vmName);
01095 
01096         return pad.getHierarchicalProcess(vmName);
01097     }
01098 
01099     public String getVNName(String nodename) throws ProActiveException {
01100         return nodeMap.get(nodename).getVirtualNodeName();
01101     }
01102 
01103     //
01104     // -- INNER CLASSES  -----------------------------------------------
01105     //
01106     protected static class VMInformationImpl implements VMInformation,
01107         java.io.Serializable {
01108         private java.net.InetAddress hostInetAddress;
01109 
01110         //the Unique ID of the JVM
01111         private java.rmi.dgc.VMID uniqueVMID;
01112         private String name;
01113         private String processCreatorId;
01114         private String jobId;
01115         private String hostName;
01116         private DeployerTag deployerTag;
01117 
01118         public VMInformationImpl() throws java.net.UnknownHostException {
01119             this.uniqueVMID = UniqueID.getCurrentVMID();
01120             hostInetAddress = java.net.InetAddress.getLocalHost();
01121             hostName = UrlBuilder.getHostNameorIP(hostInetAddress);
01122             this.processCreatorId = "jvm";
01123 
01124             //            this.name = "PA_JVM" +
01125             //                Integer.toString(new java.security.SecureRandom().nextInt()) +
01126             //                "_" + hostName;
01127             String random = Integer.toString(ProActiveRuntimeImpl.getNextInt());
01128 
01129             if (System.getProperty("proactive.runtime.name") != null) {
01130                 this.name = System.getProperty("proactive.runtime.name");
01131 
01132                 if (this.name.indexOf("PA_JVM") < 0) {
01133                     runtimeLogger.warn(
01134                         "WARNING !!! The name of a ProActiveRuntime MUST contain PA_JVM string \n" +
01135                         "WARNING !!! Property proactive.runtime.name does not contain PA_JVM. This name is not adapted to IC2D tool");
01136                 }
01137             } else {
01138                 this.name = "PA_JVM" + random + "_" + hostName;
01139             }
01140 
01141             if (System.getProperty("proactive.jobid") != null) {
01142                 this.jobId = System.getProperty("proactive.jobid");
01143             } else {
01144                 //if the property is null, no need to generate another random, take the one in name
01145                 this.jobId = "JOB-" + random;
01146             }
01147 
01148             deployerTag = new DeployerTag(ProActiveConfiguration.getGroupInformation());
01149         }
01150 
01151         //
01152         // -- PUBLIC METHODS  -----------------------------------------------
01153         //
01154         //
01155         // -- implements VMInformation  -----------------------------------------------
01156         //
01157         public java.rmi.dgc.VMID getVMID() {
01158             return uniqueVMID;
01159         }
01160 
01161         public String getName() {
01162             return name;
01163         }
01164 
01165         public java.net.InetAddress getInetAddress() {
01166             return hostInetAddress;
01167         }
01168 
01169         public String getCreationProtocolID() {
01170             return this.processCreatorId;
01171         }
01172 
01173         public void setCreationProtocolID(String protocolId) {
01174             this.processCreatorId = protocolId;
01175         }
01176 
01180         public String getJobID() {
01181             return this.jobId;
01182         }
01183 
01187         public String getHostName() {
01188             return this.hostName;
01189         }
01190 
01194         public String getDescriptorVMName() {
01195             return name;
01196         }
01197 
01201         public DeployerTag getDeployerTag() {
01202             return deployerTag;
01203         }
01204     }
01205 
01206     //
01207     // ----------------- INNER CLASSES --------------------------------
01208     //
01209 
01213     private class LauncherThread extends Thread {
01214         private boolean launchMain;
01215         private Method mainMethod;
01216         private Class remoteClass;
01217         private String[] parameters;
01218 
01219         public LauncherThread(Class remoteClass) {
01220             this.remoteClass = remoteClass;
01221             launchMain = false;
01222         }
01223 
01224         public LauncherThread(Method mainMethod, String[] parameters) {
01225             this.mainMethod = mainMethod;
01226             this.parameters = parameters;
01227             launchMain = true;
01228         }
01229 
01230         public void run() {
01231             if (launchMain) {
01232                 try {
01233                     mainMethod.invoke(null, new Object[] { parameters });
01234                 } catch (InvocationTargetException e) {
01235                     e.printStackTrace();
01236                 } catch (IllegalAccessException e) {
01237                     e.printStackTrace();
01238                 }
01239             } else {
01240                 try {
01241                     remoteClass.newInstance();
01242                 } catch (IllegalAccessException e) {
01243                     e.printStackTrace();
01244                 } catch (InstantiationException e) {
01245                     e.printStackTrace();
01246                 }
01247             }
01248         }
01249     }
01250 
01254     public Object setLocalNodeProperty(String nodeName, String key, String value) {
01255         return this.nodeMap.get(nodeName).setProperty(key, value);
01256     }
01257 
01261     public String getLocalNodeProperty(String nodeName, String key) {
01262         return this.nodeMap.get(nodeName).getProperty(key);
01263     }
01264 }

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