org/objectweb/proactive/core/body/request/NonFunctionalRequestsProcessor.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.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         // --------------- FILTERS -----------------//
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 //  --------------- END OF FILTERS -----------------//
00243     
00244     
00245   
00246 
00247 
00248 
00249     
00250     
00251 }

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