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.Serializable;
00034 import java.util.AbstractList;
00035 import java.util.Vector;
00036 
00037 
00059 public class NonFunctionalRequestsProcessor implements RequestProcessor, Serializable {
00060 
00061         
00062         private static final long serialVersionUID = 1L;
00063         private AbstractList<Request> nfRequestsQueue;
00064         private RequestFilter immediateNFResquestFilter;
00065     private RequestFilter priorityNFRequestFilter;
00066     private int immediateNFReqNumber, priorityNFReqNumber;
00067     
00068     
00069         public NonFunctionalRequestsProcessor() {
00070                 nfRequestsQueue = new Vector<Request>();
00071                 this.immediateNFResquestFilter = new ImmediateNFRequestFilter();
00072         this.priorityNFRequestFilter = new PriorityNFRequestFilter();
00073         immediateNFReqNumber = 0;
00074         priorityNFReqNumber = 0;
00075         }
00076         
00077 
00078 
00084         public synchronized void  addToNFRequestsQueue(Request request) {
00085                 if(immediateNFResquestFilter.acceptRequest(request)) {
00086                         nfRequestsQueue.add(immediateNFReqNumber,request);
00087                         immediateNFReqNumber ++;
00088                 } else if (priorityNFRequestFilter.acceptRequest(request)){
00089                         nfRequestsQueue.add(immediateNFReqNumber + priorityNFReqNumber, request);
00090                         priorityNFReqNumber ++;
00091                 }
00092         }
00093         
00099         public synchronized Request getOldestPriorityNFRequest(boolean remove) {
00100                 Request request;
00101                 if(nfRequestsQueue.isEmpty()) {
00102                         return null;
00103                 }else if (remove){                      
00104                         request = nfRequestsQueue.remove(0);
00105                         if(immediateNFReqNumber > 0){
00106                                 immediateNFReqNumber --;
00107                         }else {
00108                                 priorityNFReqNumber --;
00109                         }
00110                         return request;
00111                 }else {
00112                         return nfRequestsQueue.get(0);
00113                 }               
00114         }
00115         
00116         
00122         public synchronized Request getYoungestPriorityNFRequest(boolean remove) {
00123                 Request request;
00124                 
00125                 if(nfRequestsQueue.isEmpty()) {
00126                         return null;
00127                 }else if (remove){
00128                         if(immediateNFReqNumber != 0){
00129                                 request = nfRequestsQueue.remove(immediateNFReqNumber);
00130                                 immediateNFReqNumber --;
00131                                 return request;
00132                         }else {
00133                                 request = nfRequestsQueue.remove(priorityNFReqNumber);
00134                                 priorityNFReqNumber --;
00135                                 return request;
00136                         }
00137                 }else {
00138                         if(immediateNFReqNumber != 0){
00139                                 return nfRequestsQueue.get(immediateNFReqNumber);
00140                         }else {
00141                                 return nfRequestsQueue.get(priorityNFReqNumber);
00142                         }
00143                 }                       
00144         }
00145         
00146         
00147         public synchronized boolean isEmpty() {
00148                 return (immediateNFReqNumber == 0 && priorityNFReqNumber == 0);
00149         }
00150         
00151 
00152         public synchronized String toString() {
00153                 StringBuffer sb = new StringBuffer("NFRequests Queue : ");
00154                 sb.append("--- NonFunctionalRequestQueue n=").append(nfRequestsQueue.size()).append("   requests --- ->\n");
00155                 int count = 0;
00156                 java.util.Iterator<Request> iterator = nfRequestsQueue.iterator();
00157                 while (iterator.hasNext()) {
00158                         Request currentrequest = iterator.next();
00159                         sb.append(count).append("--> ")
00160                         .append(currentrequest.getMethodName()).append("\n");
00161                         count++;
00162                 }
00163                 sb.append("--- End NonFunctionalRequestQueue ---");
00164                 return sb.toString();
00165         }
00166         
00167         public int processRequest(Request request) {
00168                 if((request.getNFRequestPriority() == Request.NFREQUEST_IMMEDIATE_PRIORITY )|| (request.getNFRequestPriority() == Request.NFREQUEST_PRIORITY)){
00169                         nfRequestsQueue.add(request);
00170                 }
00171                 return RequestProcessor.KEEP;
00172         }
00173           
00174         
00175         
00176         
00186     protected class ImmediateNFRequestFilter implements RequestFilter, Serializable {           
00190                 private static final long serialVersionUID = 1L;
00191 
00192                 public boolean acceptRequest(Request request) {
00193                 return (request.isFunctionalRequest() 
00194                                 && (request.getNFRequestPriority() == Request.NFREQUEST_IMMEDIATE_PRIORITY));
00195         } 
00196     }
00197     
00198     
00208     protected class PriorityNFRequestFilter implements RequestFilter, Serializable {            
00212                 private static final long serialVersionUID = 1L;
00213 
00214                 public boolean acceptRequest(Request request) {
00215                 return (request.isFunctionalRequest() 
00216                                 && (request.getNFRequestPriority() == Request.NFREQUEST_PRIORITY));
00217         } 
00218     }
00219     
00229     protected class NoPriorityNFRequestFilter implements RequestFilter, Serializable {          
00233                 private static final long serialVersionUID = 1L;
00234 
00235                 public boolean acceptRequest(Request request) {
00236                 return (request.isFunctionalRequest() 
00237                                 && (request.getNFRequestPriority() == Request.NFREQUEST_NO_PRIORITY));
00238         } 
00239         
00240     }   
00241  
00242 
00243     
00244     
00245   
00246 
00247 
00248 
00249     
00250     
00251 }