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.body.request;
00032 
00033 import java.io.IOException;
00034 import java.util.ArrayList;
00035 import java.util.Arrays;
00036 import java.util.Hashtable;
00037 import java.util.Iterator;
00038 import java.util.List;
00039 
00040 import org.apache.log4j.Logger;
00041 import org.objectweb.proactive.Body;
00042 import org.objectweb.proactive.core.body.ft.protocols.FTManager;
00043 import org.objectweb.proactive.core.util.log.Loggers;
00044 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00045 
00046 
00047 public class RequestReceiverImpl implements RequestReceiver,
00048     java.io.Serializable {
00049     public static Logger logger = ProActiveLogger.getLogger(Loggers.REQUESTS);
00050     private static final String ANY_PARAMETERS = "any-parameters";
00051 
00052     
00053     
00054     
00055     private java.util.Map<String, Object> immediateServices;
00056 
00057     public RequestReceiverImpl() {
00058         immediateServices = new Hashtable<String, Object>(2);
00059         immediateServices.put("toString", ANY_PARAMETERS);
00060         immediateServices.put("hashCode", ANY_PARAMETERS);
00061         immediateServices.put("_terminateAOImmediately", ANY_PARAMETERS);
00062     }
00063 
00064     public int receiveRequest(Request request, Body bodyReceiver)
00065         throws java.io.IOException {
00066         try {
00067             if (immediateExecution(request)) {
00068                 if (logger.isDebugEnabled()) {
00069                     logger.debug("immediately serving " +
00070                         request.getMethodName());
00071                 }
00072                 bodyReceiver.serve(request);
00073                 if (logger.isDebugEnabled()) {
00074                     logger.debug("end of service for " +
00075                         request.getMethodName());
00076                 }
00077 
00078                 
00079                 return FTManager.IMMEDIATE_SERVICE;
00080             } else {
00081                 request.notifyReception(bodyReceiver);
00082                 return bodyReceiver.getRequestQueue().add(request);
00083             }
00084         } catch (Exception e) {
00085             e.printStackTrace();
00086             return 0;
00087         }
00088     }
00089 
00090     private boolean immediateExecution(Request request) {
00091         if ((request == null) || (request.getMethodCall() == null) ||
00092                 (request.getMethodCall().getReifiedMethod() == null)) {
00093             return false;
00094         } else {
00095             String methodName = request.getMethodName();
00096             if (immediateServices.containsKey(methodName)) {
00097                 if (ANY_PARAMETERS.equals(immediateServices.get(methodName))) {
00098                     
00099                     return true;
00100                 } else {
00101                     Iterator it = ((List) immediateServices.get(methodName)).iterator();
00102                     while (it.hasNext()) {
00103                         Class[] next = (Class[]) it.next();
00104                         if (Arrays.equals(next,
00105                                     request.getMethodCall().getReifiedMethod()
00106                                                .getParameterTypes())) {
00107                             return true;
00108                         }
00109                     }
00110 
00111                     
00112                     return false;
00113                 }
00114             } else {
00115                 return false;
00116             }
00117         }
00118     }
00119 
00120     public void setImmediateService(String methodName) {
00121         this.immediateServices.put(methodName, ANY_PARAMETERS);
00122     }
00123 
00124     public void removeImmediateService(String methodName,
00125         Class[] parametersTypes) throws IOException {
00126         if (immediateServices.containsKey(methodName)) {
00127             if (!ANY_PARAMETERS.equals(immediateServices.get(methodName))) {
00128                 List<Class[]> list = (List<Class[]>) immediateServices.get(methodName);
00129                 List<Class[]> elementsToRemove = new ArrayList<Class[]>(list.size());
00130                 Iterator<Class[]> it = list.iterator();
00131                 while (it.hasNext()) {
00132                     Class[] element = it.next();
00133                     if (Arrays.equals(element, parametersTypes)) {
00134                         
00135                         
00136                         elementsToRemove.add(element);
00137                     }
00138                 }
00139                 it = elementsToRemove.iterator();
00140                 while (it.hasNext()) {
00141                     list.remove(it.next());
00142                 }
00143             } else {
00144                 immediateServices.remove(methodName);
00145             }
00146         } else {
00147             
00148         }
00149     }
00150 
00151     public void setImmediateService(String methodName, Class[] parametersTypes)
00152         throws IOException {
00153         if (immediateServices.containsKey(methodName)) {
00154             if (ANY_PARAMETERS.equals(immediateServices.get(methodName))) {
00155                 
00156                 return;
00157             } else {
00158                 ((List<Class[]>) immediateServices.get(methodName)).add(parametersTypes);
00159             }
00160         } else {
00161             List<Class[]> list = new ArrayList<Class[]>();
00162             list.add(parametersTypes);
00163             immediateServices.put(methodName, list);
00164         }
00165     }
00166 }