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.ext.locationserver;
00032 
00033 import org.apache.log4j.Logger;
00034 import org.objectweb.proactive.Body;
00035 import org.objectweb.proactive.ProActive;
00036 import org.objectweb.proactive.core.UniqueID;
00037 import org.objectweb.proactive.core.body.LocalBodyStore;
00038 import org.objectweb.proactive.core.body.UniversalBody;
00039 import org.objectweb.proactive.core.body.ft.protocols.FTManager;
00040 import org.objectweb.proactive.core.body.future.FutureProxy;
00041 import org.objectweb.proactive.core.body.reply.Reply;
00042 import org.objectweb.proactive.core.body.request.RequestImpl;
00043 import org.objectweb.proactive.core.body.request.ServeException;
00044 import org.objectweb.proactive.core.mop.MethodCall;
00045 import org.objectweb.proactive.core.mop.StubObject;
00046 import org.objectweb.proactive.core.util.log.Loggers;
00047 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00048 
00049 
00050 public class RequestWithLocationServer extends RequestImpl
00051     implements java.io.Serializable {
00052     private static final int MAX_TRIES = 30;
00053     static Logger logger = ProActiveLogger.getLogger(Loggers.MIGRATION);
00054 
00058     private int tries;
00059     private transient LocationServer server;
00060 
00061     public RequestWithLocationServer(MethodCall methodCall,
00062         UniversalBody sender, boolean isOneWay, long nextSequenceID,
00063         LocationServer server) {
00064         super(methodCall, sender, isOneWay, nextSequenceID);
00065         this.server = server;
00066     }
00067 
00068     public Reply serve(Body targetBody) throws ServeException {
00069         Reply r = super.serve(targetBody);
00070         return r;
00071     }
00072 
00073     protected int sendRequest(UniversalBody destinationBody)
00074         throws java.io.IOException {
00075         int ftres = FTManager.NON_FT;
00076         try {
00077             
00078             ftres = destinationBody.receiveRequest(this);
00079 
00080             
00081         } catch (Exception e) {
00082             this.backupSolution(destinationBody);
00083         }
00084         return ftres;
00085     }
00086 
00090     protected void backupSolution(UniversalBody destinationBody)
00091         throws java.io.IOException {
00092         boolean ok = false;
00093         tries = 0;
00094         
00095         UniqueID bodyID = destinationBody.getID();
00096         while (!ok && (tries < MAX_TRIES)) {
00097             UniversalBody remoteBody = null;
00098             UniversalBody mobile = queryServer(bodyID);
00099 
00100             
00101             remoteBody = (UniversalBody) ((FutureProxy) ((StubObject) mobile).getProxy()).getResult();
00102             try {
00103                 remoteBody.receiveRequest(this);
00104 
00105                 
00106                 
00107                 if (sender != null) {
00108                     sender.updateLocation(bodyID, remoteBody);
00109                 } else {
00110                     LocalBodyStore.getInstance().getLocalBody(getSourceBodyID())
00111                                   .updateLocation(bodyID, remoteBody);
00112                 }
00113                 ok = true;
00114             } catch (Exception e) {
00115                 logger.debug(
00116                     "RequestWithLocationServer:  .............. FAILED = " +
00117                     " for method " + methodName);
00118                 tries++;
00119             }
00120         }
00121     }
00122 
00123     protected UniversalBody queryServer(UniqueID bodyID) {
00124         if (server == null) {
00125             server = LocationServerFactory.getLocationServer();
00126         }
00127         UniversalBody mobile = (UniversalBody) server.searchObject(bodyID);
00128 
00129         logger.debug(
00130             "RequestWithLocationServer: backupSolution() server has sent an answer");
00131 
00132         ProActive.waitFor(mobile);
00133         return mobile;
00134     }
00135 }