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 }