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.representative;
00032 
00033 import java.io.Serializable;
00034 import java.lang.reflect.Constructor;
00035 import java.lang.reflect.TypeVariable;
00036 import java.util.HashMap;
00037 import java.util.Iterator;
00038 import java.util.Map;
00039 
00040 import org.apache.log4j.Logger;
00041 import org.objectweb.fractal.api.Component;
00042 import org.objectweb.fractal.api.Interface;
00043 import org.objectweb.fractal.api.NoSuchInterfaceException;
00044 import org.objectweb.fractal.api.Type;
00045 import org.objectweb.fractal.api.control.BindingController;
00046 import org.objectweb.fractal.api.control.ContentController;
00047 import org.objectweb.fractal.api.type.ComponentType;
00048 import org.objectweb.fractal.api.type.InterfaceType;
00049 import org.objectweb.proactive.core.ProActiveRuntimeException;
00050 import org.objectweb.proactive.core.UniqueID;
00051 import org.objectweb.proactive.core.body.proxy.UniversalBodyProxy;
00052 import org.objectweb.proactive.core.component.ComponentParameters;
00053 import org.objectweb.proactive.core.component.Constants;
00054 import org.objectweb.proactive.core.component.Fractive;
00055 import org.objectweb.proactive.core.component.ProActiveInterface;
00056 import org.objectweb.proactive.core.component.Utils;
00057 import org.objectweb.proactive.core.component.config.ComponentConfigurationHandler;
00058 import org.objectweb.proactive.core.component.controller.AbstractProActiveController;
00059 import org.objectweb.proactive.core.component.controller.ComponentParametersController;
00060 import org.objectweb.proactive.core.component.gen.RepresentativeInterfaceClassGenerator;
00061 import org.objectweb.proactive.core.component.identity.ProActiveComponent;
00062 import org.objectweb.proactive.core.component.identity.ProActiveComponentImpl;
00063 import org.objectweb.proactive.core.component.request.ComponentRequest;
00064 import org.objectweb.proactive.core.component.type.ProActiveInterfaceType;
00065 import org.objectweb.proactive.core.group.ProxyForGroup;
00066 import org.objectweb.proactive.core.mop.MethodCall;
00067 import org.objectweb.proactive.core.mop.Proxy;
00068 import org.objectweb.proactive.core.mop.StubObject;
00069 import org.objectweb.proactive.core.util.log.Loggers;
00070 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00071 
00072 
00092 public class ProActiveComponentRepresentativeImpl
00093     implements ProActiveComponentRepresentative, Serializable {
00094     private static Logger logger = ProActiveLogger.getLogger(Loggers.COMPONENTS);
00095 
00096     private Map fcInterfaceReferences;
00097     private Map nfInterfaceReferences;
00098     private Proxy proxy;
00099 
00100     private ComponentType componentType = null; 
00101     private StubObject stubOnBaseObject = null;
00102     private String hierarchicalType = null;
00103     private String currentControllerInterface = null;
00104     private boolean useShortcuts;
00105 
00106     public ProActiveComponentRepresentativeImpl(ComponentType componentType,
00107         String hierarchicalType, String controllersConfigFileLocation) {
00108         this.componentType = componentType;
00109         useShortcuts = ("true".equals(System.getProperty(
00110                     "proactive.components.use_shortcuts")));
00111         this.hierarchicalType = hierarchicalType;
00112         addControllers(componentType, controllersConfigFileLocation);
00113 
00114         
00115         
00116         addFunctionalInterfaces(componentType);
00117     }
00118 
00122     private void addFunctionalInterfaces(ComponentType componentType) {
00123         fcInterfaceReferences = new HashMap(componentType.getFcInterfaceTypes().length);
00124         InterfaceType[] interface_types = componentType.getFcInterfaceTypes();
00125         try {
00126             for (int j = 0; j < interface_types.length; j++) {
00127                 if (!interface_types[j].isFcCollectionItf()) {
00128                         
00129                         
00130                 Interface interface_reference = RepresentativeInterfaceClassGenerator.instance()
00131                                                                                      .generateFunctionalInterface(interface_types[j].getFcItfName(),
00132                         this, (ProActiveInterfaceType)interface_types[j]);
00133 
00134                 
00135                 fcInterfaceReferences.put(interface_reference.getFcItfName(),
00136                     interface_reference);
00137                 } 
00138                 
00139             }
00140         } catch (Exception e) {
00141             e.printStackTrace();
00142             throw new RuntimeException("cannot create interface references : " +
00143                 e.getMessage());
00144         }
00145     }
00146 
00147     private void addControllers(ComponentType componentType,
00148         String controllersConfigFileLocation) {
00149         if (controllersConfigFileLocation == null) {
00150             return;
00151         }
00152         ComponentConfigurationHandler componentConfiguration = ProActiveComponentImpl.loadControllerConfiguration(controllersConfigFileLocation);
00153         Map controllersConfiguration = componentConfiguration.getControllers();
00154 
00155         addControllers(componentType, controllersConfiguration);
00156     }
00157 
00158     private void addControllers(ComponentType componentType,
00159         Map controllersConfiguration) {
00160         
00161         
00162         
00163         
00164         
00165         
00166         
00167         nfInterfaceReferences = new HashMap(1 +
00168                 controllersConfiguration.size());
00169 
00170         int i = 0;
00171 
00172         
00173         
00174         Iterator iteratorOnControllers = controllersConfiguration.keySet()
00175                                                                  .iterator();
00176         Class controllerClass = null;
00177         AbstractProActiveController currentController;
00178         ProActiveInterface currentInterface = null;
00179         Class controllerItf;
00180         while (iteratorOnControllers.hasNext()) {
00181             String controllerItfName = (String) iteratorOnControllers.next();
00182             try {
00183                 controllerItf = Class.forName(controllerItfName);
00184                 controllerClass = Class.forName((String) controllersConfiguration.get(
00185                             controllerItf.getName()));
00186                 Constructor controllerClassConstructor = controllerClass.getConstructor(new Class[] {
00187                             Component.class
00188                         });
00189                 currentController = (AbstractProActiveController) controllerClassConstructor.newInstance(new Object[] {
00190                             this
00191                         });
00192                 currentInterface = RepresentativeInterfaceClassGenerator.instance()
00193                                                                         .generateControllerInterface(currentController.getFcItfName(),
00194                         this, (ProActiveInterfaceType) currentController.getFcItfType());
00195                 ((StubObject)currentInterface).setProxy(proxy);
00196             } catch (Exception e) {
00197                 logger.error("could not create controller " +
00198                     controllersConfiguration.get(controllerItfName) + " : " +
00199                     e.getMessage());
00200                 continue;
00201             }
00202 
00203             if (BindingController.class.isAssignableFrom(controllerClass)) {
00204                 if ((hierarchicalType.equals(Constants.PRIMITIVE) &&
00205                         (Fractive.getClientInterfaceTypes(componentType).length == 0))) {
00206                     
00207                     if (logger.isDebugEnabled()) {
00208                         logger.debug(
00209                             "user component class of this component does not have any client interface. It will have no BindingController");
00210                     }
00211                     continue;
00212                 }
00213             }
00214             if (ContentController.class.isAssignableFrom(controllerClass)) {
00215                 if (Constants.PRIMITIVE.equals(hierarchicalType)) {
00216                     
00217                     continue;
00218                 }
00219             }
00220             if (currentInterface != null) {
00221                 nfInterfaceReferences.put(currentController.getFcItfName(),
00222                     currentInterface);
00223 
00224                 i++;
00225             }
00226         }
00227     }
00228 
00229     protected Object reifyCall(String className, String methodName,
00230         Class[] parameterTypes, Object[] effectiveParameters, short priority) {
00231         try {
00232             return proxy.reify((MethodCall) MethodCall.getComponentMethodCall(
00233                     Class.forName(className).getDeclaredMethod(methodName,
00234                         parameterTypes), effectiveParameters, null, (String) null, null,
00235                     priority));
00236 
00237             
00238         } catch (NoSuchMethodException e) {
00239             throw new ProActiveRuntimeException(e.toString());
00240         } catch (ClassNotFoundException e) {
00241             throw new ProActiveRuntimeException(e.toString());
00242         } catch (Throwable e) {
00243             throw new ProActiveRuntimeException(e.toString());
00244         }
00245     }
00246 
00247   
00248     
00249 
00250 
00251     public Object getFcInterface(String interfaceName)
00252         throws NoSuchInterfaceException {
00253         if (interfaceName.endsWith("-controller") &&
00254                 !("attribute-controller".equals(interfaceName))) {
00255             if (nfInterfaceReferences == null) {
00256                 
00257                 ComponentParameters params = (ComponentParameters) reifyCall(ComponentParametersController.class.getName(),
00258                         "getComponentParameters", new Class[] {  },
00259                         new Object[] {  }, ComponentRequest.STRICT_FIFO_PRIORITY);
00260                 hierarchicalType = params.getHierarchicalType();
00261                 addControllers(componentType,
00262                     params.getControllerDescription().getControllersSignatures());
00263             }
00264             if (nfInterfaceReferences.containsKey(interfaceName)) {
00265                 return nfInterfaceReferences.get(interfaceName);
00266             } else {                    
00267                 throw new NoSuchInterfaceException(interfaceName);
00268             }
00269         }
00270 
00271         if (fcInterfaceReferences.containsKey(interfaceName)) {
00272                 return fcInterfaceReferences.get(interfaceName);
00273         } else {
00274                 
00275                 InterfaceType itfType = Utils.getItfType(interfaceName, this);
00276                 if (itfType !=null && itfType.isFcCollectionItf()) {
00277                         
00278                         try {
00279 
00280                                         Interface interface_reference = RepresentativeInterfaceClassGenerator.instance()
00281                                                 .generateFunctionalInterface(interfaceName,
00282                                                                 this, (ProActiveInterfaceType)itfType);
00283 
00284                                         ((StubObject)interface_reference).setProxy(proxy);
00285                                         
00286                                         fcInterfaceReferences.put(interfaceName,interface_reference);
00287                                         return interface_reference;
00288                                  
00289                                 } catch (SecurityException e) {
00290                                         
00291                                         e.printStackTrace();
00292                                 } catch (Throwable e) {
00293                                         e.printStackTrace();
00294                                 }
00295                 }
00296         }
00297                 
00298         
00299 
00300         throw new NoSuchInterfaceException(interfaceName);
00301     }
00302 
00303     
00304 
00305 
00306     public Object[] getFcInterfaces() {
00307         Interface[] nfInterfaces = (Interface[]) (nfInterfaceReferences.values()
00308                                                                        .toArray(new Interface[nfInterfaceReferences.size()]));
00309         Interface[] fcInterfaces = (Interface[]) (fcInterfaceReferences.values()
00310                                                                        .toArray(new Interface[fcInterfaceReferences.size()]));
00311         Interface[] result = new Interface[nfInterfaces.length +
00312             fcInterfaces.length];
00313         System.arraycopy(nfInterfaces, 0, result, 0, nfInterfaces.length);
00314         System.arraycopy(fcInterfaces, 0, result, nfInterfaces.length,
00315             fcInterfaces.length);
00316         return result;
00317     }
00318 
00319     
00320 
00321 
00322     public Type getFcType() {
00323         return componentType;
00324     }
00325 
00326     
00327 
00328 
00329     public Proxy getProxy() {
00330         return proxy;
00331     }
00332 
00333     
00334 
00335 
00336     public void setProxy(Proxy proxy) {
00337         
00338         this.proxy = proxy;
00339         
00340         Object[] interfaces = getFcInterfaces();
00341         ProActiveInterface[] interface_references = new ProActiveInterface[interfaces.length];
00342         for (int i = 0; i < interfaces.length; i++) {
00343             interface_references[i] = (ProActiveInterface) interfaces[i];
00344         }
00345         for (int i = 0; i < interface_references.length; i++) {
00346             if (useShortcuts) {
00347                 
00348                 ((StubObject) interface_references[i]).setProxy(new FunctionalInterfaceProxyImpl(
00349                         proxy, interface_references[i].getFcItfName()));
00350             } else {
00351                 try {
00352                     ((StubObject) interface_references[i]).setProxy(proxy);
00353                 } catch (RuntimeException e) {
00354                     logger.error(e.getMessage());
00355                     throw new ProActiveRuntimeException(e);
00356                 }
00357             }
00358         }
00359     }
00360 
00365     public boolean equals(Object component) {
00366         Object result = reifyCall(Object.class.getName(), "equals",
00367                 new Class[] { Object.class }, new Object[] { component },
00368                 ComponentRequest.STRICT_FIFO_PRIORITY);
00369         return ((Boolean) result).booleanValue();
00370     }
00371 
00372     public int hashCode() {
00373         
00374         Object result;
00375                 try {
00376                         result = proxy.reify((MethodCall) MethodCall.getMethodCall(
00377                                  Class.forName(Object.class.getName()).getDeclaredMethod("hashCode",
00378                                      new Class[] {}), new Object[] {}, (Map<TypeVariable, Class>)null));
00379                 return ((Integer) result).intValue();
00380                 } catch (SecurityException e) {
00381                         throw new ProActiveRuntimeException(e.toString());
00382                 } catch (NoSuchMethodException e) {
00383                         throw new ProActiveRuntimeException(e.toString());
00384                 } catch (ClassNotFoundException e) {
00385                         throw new ProActiveRuntimeException(e.toString());
00386                 } catch (Throwable e) {
00387                         throw new ProActiveRuntimeException(e.toString());
00388                 }
00389 
00390     }
00391     
00392 
00396     public UniqueID getID() {
00397         if (!(getProxy() instanceof ProxyForGroup)) {
00398             return ((UniversalBodyProxy) getProxy()).getBodyID();
00399         } else {
00400             return null;
00401         }
00402     }
00403 
00404     
00405 
00406 
00407     public Object getReferenceOnBaseObject() {
00408         logger.error(
00409             "getReferenceOnBaseObject() method is not available in component representatives");
00410         return null;
00411     }
00412 
00413     
00414 
00415 
00416     public ProActiveComponent getRepresentativeOnThis() {
00417         return this;
00418     }
00419 
00420     
00421 
00422 
00423     public StubObject getStubOnBaseObject() {
00424         return stubOnBaseObject;
00425     }
00426 
00427     
00428 
00429 
00430     public void setStubOnBaseObject(StubObject stub) {
00431         stubOnBaseObject = stub;
00432     }
00433 
00434     private boolean isPrimitive() {
00435         return Constants.PRIMITIVE.equals(hierarchicalType);
00436     }
00437 
00438         public void _terminateAO(Proxy proxy) {
00439 
00440         }
00441 
00442         public void _terminateAOImmediatly(Proxy proxy) {
00443         }
00444         
00445 }