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.component.body;
00032 
00033 import java.io.Serializable;
00034 
00035 import org.apache.log4j.Logger;
00036 import org.objectweb.fractal.api.NoSuchInterfaceException;
00037 import org.objectweb.fractal.api.control.LifeCycleController;
00038 import org.objectweb.fractal.util.Fractal;
00039 import org.objectweb.proactive.Active;
00040 import org.objectweb.proactive.Body;
00041 import org.objectweb.proactive.EndActive;
00042 import org.objectweb.proactive.InitActive;
00043 import org.objectweb.proactive.RunActive;
00044 import org.objectweb.proactive.Service;
00045 import org.objectweb.proactive.core.body.ActiveBody;
00046 import org.objectweb.proactive.core.util.log.Loggers;
00047 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00048 
00049 
00059 public class ComponentActivity implements RunActive, InitActive, EndActive, Serializable {
00060     private static Logger logger = ProActiveLogger.getLogger(Loggers.COMPONENTS_ACTIVITY);
00061     private transient InitActive componentInitActive; 
00062     private RunActive componentRunActive;
00063     private EndActive componentEndActive;
00064     private ActiveBody activeBody;
00065     private InitActive functionalInitActive;
00066     private RunActive functionalRunActive;
00067     private EndActive functionalEndActive;
00068 
00069     public ComponentActivity() {
00070         
00071         componentInitActive = null;
00072         componentRunActive = this;
00073         componentEndActive = null;
00074 
00075         functionalInitActive = new DefaultInitActive();
00076         functionalRunActive = new ComponentFIFORunActive();
00077         functionalEndActive = new DefaultEndActive();
00078     }
00079 
00080     public ComponentActivity(Active activity, Object reifiedObject) {
00081         
00082         if ((activity != null) && activity instanceof ComponentInitActive) {
00083             componentInitActive = new ComponentInitActiveWrapper((ComponentInitActive) activity);
00084         } else if (reifiedObject instanceof ComponentInitActive) {
00085             componentInitActive = new ComponentInitActiveWrapper((ComponentInitActive) reifiedObject);
00086         } else {
00087             componentInitActive = null;
00088         }
00089 
00090         
00091         if ((activity != null) && activity instanceof ComponentRunActive) {
00092             componentRunActive = new ComponentRunActiveWrapper((ComponentRunActive) activity);
00093         } else if (reifiedObject instanceof ComponentRunActive) {
00094             componentRunActive = new ComponentRunActiveWrapper((ComponentRunActive) reifiedObject);
00095         } else {
00096             componentRunActive = this;
00097         }
00098 
00099         
00100         if ((activity != null) && activity instanceof ComponentEndActive) {
00101             componentEndActive = new ComponentEndActiveWrapper((ComponentEndActive) activity);
00102         } else if (reifiedObject instanceof ComponentEndActive) {
00103             componentEndActive = new ComponentEndActiveWrapper((ComponentEndActive) reifiedObject);
00104         } else {
00105             componentEndActive = null;
00106         }
00107 
00108         if ((activity != null) && activity instanceof InitActive) {
00109             functionalInitActive = (InitActive) activity;
00110         } else if (reifiedObject instanceof InitActive) {
00111             functionalInitActive = (InitActive) reifiedObject;
00112         } else {
00113             functionalInitActive = new DefaultInitActive();
00114         }
00115 
00116         
00117         if ((activity != null) && activity instanceof RunActive) {
00118             functionalRunActive = (RunActive) activity;
00119         } else if (reifiedObject instanceof RunActive) {
00120             functionalRunActive = (RunActive) reifiedObject;
00121         } else {
00122             functionalRunActive = new ComponentFIFORunActive();
00123         }
00124 
00125         
00126         if ((activity != null) && activity instanceof EndActive) {
00127             functionalEndActive = (EndActive) activity;
00128         } else if (reifiedObject instanceof EndActive) {
00129             functionalEndActive = (EndActive) reifiedObject;
00130         } else {
00131             functionalEndActive = new DefaultEndActive();
00132         }
00133     }
00134 
00145     public void runActivity(Body body) {
00146         if ((componentRunActive != null) && (componentRunActive != this)) {
00147             componentRunActive.runActivity(body);
00148         } else {
00149             
00150             
00151             
00152             
00153             
00154             try {
00155                 Service componentService = new Service(body);
00156                 NFRequestFilterImpl nfRequestFilter = new NFRequestFilterImpl();
00157                 while (body.isActive()) {
00158                     ComponentBody componentBody = (ComponentBody) body;
00159                     while (LifeCycleController.STOPPED.equals(
00160                                 Fractal.getLifeCycleController(
00161                                     componentBody.getProActiveComponentImpl())
00162                                            .getFcState()) ) {
00163                         componentService.blockingServeOldest(nfRequestFilter);
00164                         if (!body.isActive()) {
00165                                 
00166                                 break;
00167                         }
00168                     }
00169                     if (!body.isActive()) {
00170                         
00171                         break;
00172                     }
00173 
00174                     
00175                     
00176                     if (functionalInitActive != null) {
00177                         functionalInitActive.initActivity(activeBody);
00178                         
00179                     }
00180 
00181                     ((ComponentBody) body).startingFunctionalActivity();
00182                     
00183                     
00184                     functionalRunActive.runActivity(body);
00185                     ((ComponentBody) body).finishedFunctionalActivity();
00186                     if (functionalEndActive != null) {
00187                         functionalEndActive.endActivity(body);
00188                     }
00189                 }
00190             } catch (NoSuchInterfaceException e) {
00191                 logger.error(
00192                     "could not retreive an interface, probably the life cycle controller of this component; terminating the component. Error message is : " +
00193                     e.getMessage());
00194             }
00195         }
00196     }
00197 
00198     
00199 
00200 
00201     public void initActivity(Body body) {
00202         if (componentInitActive != null) {
00203             componentInitActive.initActivity(body);
00204         } else {
00205             if (logger.isDebugEnabled()) {
00206                 logger.debug(
00207                     "initializing component activity ... (component will be active but not yet started)");
00208             }
00209         }
00210     }
00211 
00212     
00213 
00214 
00215     public void endActivity(Body body) {
00216         if (componentEndActive != null) {
00217             componentEndActive.endActivity(body);
00218         } else {
00219             if (logger.isDebugEnabled()) {
00220                 logger.debug(
00221                     "ending component activity ... (object is still active)");
00222             }
00223         }
00224     }
00225 
00226     private class ComponentFIFORunActive implements RunActive, Serializable {
00227         public void runActivity(Body body) {
00228             new Service(body).fifoServing();
00229         }
00230     }
00231 
00232     private class DefaultInitActive implements InitActive, Serializable {
00233         public void initActivity(Body body) {
00234             if (logger.isDebugEnabled()) {
00235                 logger.debug(
00236                     "initializing default functional activity of the component");
00237             }
00238         }
00239     }
00240 
00241     private class DefaultEndActive implements EndActive, Serializable {
00242         public void endActivity(Body body) {
00243             if (logger.isDebugEnabled()) {
00244                 logger.debug(
00245                     "ending default functional activity of this component");
00246             }
00247         }
00248     }
00249 
00250     private class ComponentInitActiveWrapper implements InitActive,
00251         Serializable {
00252         private ComponentInitActive wrappedComponentInitActive;
00253 
00254         public ComponentInitActiveWrapper(
00255             ComponentInitActive componentInitActive) {
00256             wrappedComponentInitActive = componentInitActive;
00257         }
00258 
00259         public void initActivity(Body body) {
00260             wrappedComponentInitActive.initComponentActivity(body);
00261         }
00262     }
00263 
00264     private class ComponentRunActiveWrapper implements RunActive, Serializable {
00265         private ComponentRunActive wrappedComponentRunActive;
00266 
00267         public ComponentRunActiveWrapper(ComponentRunActive componentRunActive) {
00268             wrappedComponentRunActive = componentRunActive;
00269         }
00270 
00271         public void runActivity(Body body) {
00272             wrappedComponentRunActive.runComponentActivity(body);
00273         }
00274     }
00275 
00276     private class ComponentEndActiveWrapper implements EndActive, Serializable {
00277         private ComponentEndActive wrappedComponentEndActive;
00278 
00279         public ComponentEndActiveWrapper(ComponentEndActive componentEndActive) {
00280             wrappedComponentEndActive = componentEndActive;
00281         }
00282 
00283         public void endActivity(Body body) {
00284             wrappedComponentEndActive.endComponentActivity(body);
00285         }
00286     }
00287 }