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;
00032 
00033 import org.objectweb.fractal.api.NoSuchInterfaceException;
00034 import org.objectweb.fractal.api.control.LifeCycleController;
00035 import org.objectweb.fractal.util.Fractal;
00036 import org.objectweb.proactive.core.ProActiveRuntimeException;
00037 import org.objectweb.proactive.core.body.request.BlockingRequestQueue;
00038 import org.objectweb.proactive.core.body.request.Request;
00039 import org.objectweb.proactive.core.body.request.RequestFilter;
00040 import org.objectweb.proactive.core.body.request.RequestProcessor;
00041 import org.objectweb.proactive.core.component.body.ComponentBody;
00042 
00043 
00082 public class Service {
00083     
00084     
00085     
00086     protected Body body;
00087     protected BlockingRequestQueue requestQueue;
00088 
00089     protected LifeCycleController lifeCycleController = null;
00090 
00091     
00092     
00093     
00094     
00095 
00100     public Service(Body body) {
00101         this.body = body;
00102         this.requestQueue = body.getRequestQueue();
00103         if (((ComponentBody) body).isComponent()) {
00104             try {
00105                 lifeCycleController = Fractal.getLifeCycleController(((ComponentBody) body).getProActiveComponentImpl());
00106             } catch (NoSuchInterfaceException e) {
00107                 throw new ProActiveRuntimeException("could not find the life cycle controller for this component");
00108             }
00109         }
00110     }
00111 
00112     
00113     
00114     
00115     public String toString() {
00116         return "Service\n  Body=" + body.toString() + "\n  RequestQueue=" +
00117         requestQueue.toString();
00118     }
00119 
00124     public void serve(Request request) {
00125         body.serve(request);
00126     }
00127 
00133     public void fifoServing() {
00134         if (((ComponentBody) body).isComponent()) {
00135             while (LifeCycleController.STARTED.equals(
00136                         lifeCycleController.getFcState())) {
00137                 blockingServeOldest();
00138             }
00139         } else {
00140             while (body.isActive()) {
00141                 blockingServeOldest();
00142             }
00143         }
00144     }
00145 
00151     public void lifoServing() {
00152         while (body.isActive()) {
00153             blockingServeYoungest();
00154         }
00155     }
00156 
00157     
00158 
00164     public void blockingServeOldest() {
00165         blockingServeOldest(null, 0);
00166     }
00167 
00175     public void blockingServeOldest(long timeout) {
00176         blockingServeOldest(null, timeout);
00177     }
00178 
00187     public void blockingServeOldest(RequestFilter requestFilter, long timeout) {
00188         body.serve(requestQueue.blockingRemoveOldest(requestFilter, timeout));
00189     }
00190 
00197     public void blockingServeOldest(String methodName) {
00198         blockingServeOldest(new RequestFilterOnMethodName(methodName));
00199     }
00200 
00207     public void blockingServeOldest(RequestFilter requestFilter) {
00208         blockingServeOldest(requestFilter, 0);
00209     }
00210 
00215     public void serveOldest() {
00216         body.serve(requestQueue.removeOldest());
00217     }
00218 
00224     public void serveOldest(String methodName) {
00225         body.serve(requestQueue.removeOldest(methodName));
00226     }
00227 
00233     public void serveOldest(RequestFilter requestFilter) {
00234         body.serve(requestQueue.removeOldest(requestFilter));
00235     }
00236 
00237     
00238 
00244     public void blockingServeYoungest() {
00245         blockingServeYoungest(null, 0);
00246     }
00247 
00255     public void blockingServeYoungest(long timeout) {
00256         blockingServeYoungest(null, timeout);
00257     }
00258 
00265     public void blockingServeYoungest(String methodName) {
00266         blockingServeYoungest(new RequestFilterOnMethodName(methodName));
00267     }
00268 
00275     public void blockingServeYoungest(RequestFilter requestFilter) {
00276         blockingServeYoungest(requestFilter, 0);
00277     }
00278 
00287     public void blockingServeYoungest(RequestFilter requestFilter, long timeout) {
00288         body.serve(requestQueue.blockingRemoveYoungest(requestFilter, timeout));
00289     }
00290 
00295     public void serveYoungest() {
00296         body.serve(requestQueue.removeYoungest());
00297     }
00298 
00304     public void serveYoungest(String methodName) {
00305         body.serve(requestQueue.removeYoungest(methodName));
00306     }
00307 
00313     public void serveYoungest(RequestFilter requestFilter) {
00314         body.serve(requestQueue.removeYoungest(requestFilter));
00315     }
00316 
00317     
00318 
00326     public void serveAll(String methodName) {
00327         serveAll(new RequestFilterOnMethodName(methodName));
00328     }
00329 
00335     public void serveAll(RequestFilter requestFilter) {
00336         requestQueue.processRequests(new ServingRequestProcessor(requestFilter),
00337             body);
00338     }
00339 
00340     
00341 
00349     public void flushingServeYoungest() {
00350         flushingServeYoungest(new AcceptAllRequestFilter());
00351     }
00352 
00362     public void flushingServeYoungest(String methodName) {
00363         flushingServeYoungest(new RequestFilterOnMethodName(methodName));
00364     }
00365 
00374     public void flushingServeYoungest(RequestFilter requestFilter) {
00375         requestQueue.processRequests(new FlushingServeYoungestRequestProcessor(
00376                 requestFilter), body);
00377     }
00378 
00379     
00380 
00388     public void flushingServeOldest() {
00389         flushingServeOldest(new AcceptAllRequestFilter());
00390     }
00391 
00401     public void flushingServeOldest(String methodName) {
00402         flushingServeOldest(new RequestFilterOnMethodName(methodName));
00403     }
00404 
00413     public void flushingServeOldest(RequestFilter requestFilter) {
00414         requestQueue.processRequests(new FlushingServeOldestRequestProcessor(
00415                 requestFilter), body);
00416     }
00417 
00418     
00419 
00423     public void waitForRequest() {
00424         requestQueue.waitForRequest();
00425     }
00426 
00431     public boolean hasRequestToServe() {
00432         return !requestQueue.isEmpty();
00433     }
00434 
00439     public boolean hasRequestToServe(String methodName) {
00440         return requestQueue.hasRequest(methodName);
00441     }
00442 
00447     public int getRequestCount() {
00448         return requestQueue.size();
00449     }
00450 
00454     public void flushAll() {
00455         requestQueue.clear();
00456     }
00457 
00458     
00459     
00460     
00461 
00467     public Request getOldest() {
00468         return requestQueue.getOldest();
00469     }
00470 
00477     public Request getOldest(String methodName) {
00478         return requestQueue.getOldest(methodName);
00479     }
00480 
00487     public Request getOldest(RequestFilter requestFilter) {
00488         return requestQueue.getOldest(requestFilter);
00489     }
00490 
00497     public Request blockingGetOldest() {
00498         Request request = null;
00499         while ((request == null) && !requestQueue.isDestroyed()) {
00500             waitForRequest();
00501             request = requestQueue.getOldest();
00502         }
00503         return request;
00504     }
00505 
00506     
00507     
00508     
00509 
00515     public Request getYoungest() {
00516         return requestQueue.getYoungest();
00517     }
00518 
00525     public Request getYoungest(String methodName) {
00526         return requestQueue.getYoungest(methodName);
00527     }
00528 
00535     public Request getYoungest(RequestFilter requestFilter) {
00536         return requestQueue.getYoungest(requestFilter);
00537     }
00538 
00545     public Request blockingGetYoungest() {
00546         Request request = null;
00547         while ((request == null) && !requestQueue.isDestroyed()) {
00548             waitForRequest();
00549             request = requestQueue.getYoungest();
00550         }
00551         return request;
00552     }
00553 
00554     
00555     
00556     
00557 
00566     public Request blockingRemoveOldest(RequestFilter requestFilter) {
00567         return blockingRemoveOldest(requestFilter, 0);
00568     }
00569 
00579     public Request blockingRemoveOldest(RequestFilter requestFilter,
00580         long timeout) {
00581         return requestQueue.blockingRemoveOldest(requestFilter, timeout);
00582     }
00583 
00591     public Request blockingRemoveOldest(String methodName) {
00592         return blockingRemoveOldest(new RequestFilterOnMethodName(methodName), 0);
00593     }
00594 
00601     public Request blockingRemoveOldest() {
00602         return blockingRemoveOldest(null, 0);
00603     }
00604 
00613     public Request blockingRemoveOldest(long timeout) {
00614         return blockingRemoveOldest(null, timeout);
00615     }
00616 
00617     
00618     
00619     
00620 
00629     public Request blockingRemoveYoungest(RequestFilter requestFilter) {
00630         return blockingRemoveYoungest(requestFilter, 0);
00631     }
00632 
00643     public Request blockingRemoveYoungest(RequestFilter requestFilter,
00644         long timeout) {
00645         return requestQueue.blockingRemoveYoungest(requestFilter, timeout);
00646     }
00647 
00655     public Request blockingRemoveYoungest(String methodName) {
00656         return blockingRemoveYoungest(new RequestFilterOnMethodName(methodName),
00657             0);
00658     }
00659 
00666     public Request blockingRemoveYoungest() {
00667         return blockingRemoveYoungest(null, 0);
00668     }
00669 
00678     public Request blockingRemoveYoungest(long timeout) {
00679         return blockingRemoveYoungest(null, timeout);
00680     }
00681 
00682     
00683     
00684     
00685 
00696     protected class ServingRequestProcessor implements RequestProcessor {
00697 
00699         private RequestFilter selectorRequestFilter;
00700 
00701         public ServingRequestProcessor(RequestFilter selectorRequestFilter) {
00702             this.selectorRequestFilter = selectorRequestFilter;
00703         }
00704 
00712         public int processRequest(Request request) {
00713             if (selectorRequestFilter.acceptRequest(request)) {
00714                 return REMOVE_AND_SERVE;
00715             } else {
00716                 return KEEP;
00717             }
00718         }
00719     } 
00720 
00732     protected class FlushingServeYoungestRequestProcessor
00733         implements RequestProcessor {
00734         private RequestFilter selectorRequestFilter;
00735         private Request requestToServe;
00736         private int counter;
00737         private int numberOfRequests;
00738 
00739         public FlushingServeYoungestRequestProcessor(
00740             RequestFilter selectorRequestFilter) {
00741             this.selectorRequestFilter = selectorRequestFilter;
00742         }
00743 
00751         public int processRequest(Request request) {
00752             if (counter == 0) {
00753                 
00754                 numberOfRequests = requestQueue.size();
00755             }
00756             counter++;
00757             int shouldRemove;
00758             if (selectorRequestFilter.acceptRequest(request)) {
00759                 requestToServe = request;
00760                 shouldRemove = REMOVE;
00761             } else {
00762                 shouldRemove = KEEP;
00763             }
00764             if ((counter == numberOfRequests) && (requestToServe != null)) {
00765                 if (request == requestToServe) {
00766                     return REMOVE_AND_SERVE; 
00767                 } else {
00768                     body.serve(requestToServe); 
00769                 }
00770             }
00771             return shouldRemove;
00772         }
00773     } 
00774 
00786     protected class FlushingServeOldestRequestProcessor
00787         implements RequestProcessor {
00788         private RequestFilter selectorRequestFilter;
00789         private boolean hasServed;
00790 
00791         public FlushingServeOldestRequestProcessor(
00792             RequestFilter selectorRequestFilter) {
00793             this.selectorRequestFilter = selectorRequestFilter;
00794         }
00795 
00803         public int processRequest(Request request) {
00804             if (selectorRequestFilter.acceptRequest(request)) {
00805                 if (!hasServed) {
00806                     hasServed = true;
00807                     return REMOVE_AND_SERVE;
00808                 }
00809                 return REMOVE;
00810             } else {
00811                 return KEEP;
00812             }
00813         }
00814     } 
00815 
00826     protected class RequestFilterOnMethodName implements RequestFilter,
00827         java.io.Serializable {
00828         private String methodName;
00829 
00830         public RequestFilterOnMethodName(String methodName) {
00831             this.methodName = methodName;
00832         }
00833 
00834         public boolean acceptRequest(Request request) {
00835             return methodName.equals(request.getMethodName());
00836         }
00837     }
00838 
00848     protected class AcceptAllRequestFilter implements RequestFilter {
00849 
00855         public boolean acceptRequest(Request request) {
00856             return true;
00857         }
00858     } 
00859 }