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.identity;
00032
00033 import java.io.Serializable;
00034 import java.lang.reflect.Constructor;
00035 import java.util.ArrayList;
00036 import java.util.HashMap;
00037 import java.util.Iterator;
00038 import java.util.List;
00039 import java.util.Map;
00040 import java.util.Vector;
00041
00042 import org.apache.log4j.Logger;
00043 import org.objectweb.fractal.api.Component;
00044 import org.objectweb.fractal.api.Interface;
00045 import org.objectweb.fractal.api.NoSuchInterfaceException;
00046 import org.objectweb.fractal.api.Type;
00047 import org.objectweb.fractal.api.control.BindingController;
00048 import org.objectweb.fractal.api.control.ContentController;
00049 import org.objectweb.fractal.api.control.NameController;
00050 import org.objectweb.fractal.api.factory.InstantiationException;
00051 import org.objectweb.fractal.api.type.ComponentType;
00052 import org.objectweb.fractal.api.type.InterfaceType;
00053 import org.objectweb.proactive.Body;
00054 import org.objectweb.proactive.core.ProActiveRuntimeException;
00055 import org.objectweb.proactive.core.UniqueID;
00056 import org.objectweb.proactive.core.body.migration.MigrationException;
00057 import org.objectweb.proactive.core.component.ComponentParameters;
00058 import org.objectweb.proactive.core.component.Constants;
00059 import org.objectweb.proactive.core.component.ControllerDescription;
00060 import org.objectweb.proactive.core.component.ProActiveInterface;
00061 import org.objectweb.proactive.core.component.config.ComponentConfigurationHandler;
00062 import org.objectweb.proactive.core.component.controller.AbstractProActiveController;
00063 import org.objectweb.proactive.core.component.controller.AbstractRequestHandler;
00064 import org.objectweb.proactive.core.component.controller.ComponentParametersController;
00065 import org.objectweb.proactive.core.component.controller.ProActiveController;
00066 import org.objectweb.proactive.core.component.controller.RequestHandler;
00067 import org.objectweb.proactive.core.component.exceptions.InterfaceGenerationFailedException;
00068 import org.objectweb.proactive.core.component.gen.MetaObjectInterfaceClassGenerator;
00069 import org.objectweb.proactive.core.component.interception.InputInterceptor;
00070 import org.objectweb.proactive.core.component.interception.OutputInterceptor;
00071 import org.objectweb.proactive.core.component.representative.ProActiveComponentRepresentativeFactory;
00072 import org.objectweb.proactive.core.component.type.ProActiveInterfaceType;
00073 import org.objectweb.proactive.core.group.ProActiveComponentGroup;
00074 import org.objectweb.proactive.core.mop.MOP;
00075 import org.objectweb.proactive.core.mop.StubObject;
00076 import org.objectweb.proactive.core.node.Node;
00077 import org.objectweb.proactive.core.util.log.Loggers;
00078 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00079
00080
00087 public class ProActiveComponentImpl extends AbstractRequestHandler
00088 implements ProActiveComponent, Interface, Serializable {
00089 protected static final Logger logger = ProActiveLogger.getLogger(Loggers.COMPONENTS);
00090 private transient ProActiveComponent representativeOnMyself = null;
00091
00092 private Map<String, Interface> functionalItfs = new HashMap<String, Interface>();
00093 private Map<String, ProActiveController> controlItfs = new HashMap<String, ProActiveController>();
00094 private Map<String, Interface> collectionItfsMembers = new HashMap<String, Interface>();
00095 private Body body;
00096 private RequestHandler firstControllerRequestHandler;
00097
00098
00099 private Vector<AbstractProActiveController> inputInterceptors = new Vector<AbstractProActiveController>();
00100 private Vector<AbstractProActiveController> outputInterceptors = new Vector<AbstractProActiveController>();
00101
00102 public ProActiveComponentImpl() {
00103 }
00104
00115 public ProActiveComponentImpl(ComponentParameters componentParameters,
00116 Body myBody) {
00117 this.body = myBody;
00118 boolean component_is_primitive = componentParameters.getHierarchicalType()
00119 .equals(Constants.PRIMITIVE);
00120
00121
00122 ArrayList<Interface> interface_references_list = new ArrayList<Interface>(4);
00123
00124
00125 interface_references_list.add(this);
00126
00127
00128 addControllers(componentParameters, component_is_primitive);
00129
00130
00131 addFunctionalInterfaces(componentParameters, component_is_primitive);
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 if (logger.isDebugEnabled()) {
00142 logger.debug("created component : " +
00143 componentParameters.getControllerDescription().getName());
00144 }
00145 }
00146
00151 private void addFunctionalInterfaces(
00152 ComponentParameters componentParameters, boolean component_is_primitive) {
00153
00154
00155
00156 InterfaceType[] tmp = componentParameters.getComponentType()
00157 .getFcInterfaceTypes();
00158 ProActiveInterfaceType[] interface_types = new ProActiveInterfaceType[tmp.length];
00159 System.arraycopy(tmp, 0, interface_types, 0, tmp.length);
00160
00161 try {
00162 for (int i = 0; i < interface_types.length; i++) {
00163 ProActiveInterface itf_ref = null;
00164
00165 if (interface_types[i].isFcCollectionItf()) {
00166
00167 continue;
00168 }
00169 if (interface_types[i].isFcMulticastItf()) {
00170 itf_ref = createInterfaceOnGroupOfDelegatees(interface_types[i]);
00171
00172
00173 } else {
00174
00175
00176 if (!(interface_types[i].isFcClientItf() &&
00177 component_is_primitive)) {
00178
00179 itf_ref = MetaObjectInterfaceClassGenerator.instance()
00180 .generateFunctionalInterface(interface_types[i].getFcItfName(),
00181 this, interface_types[i]);
00182
00183
00184
00185
00186 if (componentParameters.getHierarchicalType()
00187 .equals(Constants.PRIMITIVE)) {
00188 if (!interface_types[i].isFcCollectionItf()) {
00189 if (!interface_types[i].isFcClientItf()) {
00190 (itf_ref).setFcItfImpl(getReferenceOnBaseObject());
00191 } else if (interface_types[i].isFcClientItf()) {
00192 (itf_ref).setFcItfImpl(null);
00193 }
00194 }
00195 }
00196 }
00197
00198
00199 }
00200
00201 functionalItfs.put(interface_types[i].getFcItfName(), itf_ref);
00202 }
00203 } catch (Exception e) {
00204 if (logger.isDebugEnabled()) {
00205 logger.debug("cannot create interface references : " +
00206 e.getMessage());
00207 }
00208
00209 throw new RuntimeException("cannot create interface references : " +
00210 e.getMessage());
00211 }
00212 }
00213
00214 private void addControllers(ComponentParameters componentParameters,
00215 boolean isPrimitive) {
00216 ComponentConfigurationHandler componentConfiguration = ProActiveComponentImpl.loadControllerConfiguration(componentParameters.getControllerDescription()
00217 .getControllersConfigFileLocation());
00218 Map controllers = componentConfiguration.getControllers();
00219 List inputInterceptorsSignatures = componentConfiguration.getInputInterceptors();
00220 inputInterceptors.setSize(inputInterceptorsSignatures.size());
00221 List outputInterceptorsSignatures = componentConfiguration.getOutputInterceptors();
00222 outputInterceptors.setSize(outputInterceptorsSignatures.size());
00223
00224
00225
00226 Iterator iteratorOnControllers = controllers.keySet().iterator();
00227 AbstractProActiveController lastController = null;
00228
00229 while (iteratorOnControllers.hasNext()) {
00230 Class<?> controllerClass = null;
00231 AbstractProActiveController currentController;
00232 String controllerItfName = (String) iteratorOnControllers.next();
00233
00234 try {
00235 Class<?> controllerItf = Class.forName(controllerItfName);
00236 controllerClass = Class.forName((String) controllers.get(
00237 controllerItf.getName()));
00238 Constructor<?> controllerClassConstructor = controllerClass.getConstructor(new Class[] {
00239 Component.class
00240 });
00241 currentController = (AbstractProActiveController) controllerClassConstructor.newInstance(new Object[] {
00242 this
00243 });
00244
00245
00246 if (InputInterceptor.class.isAssignableFrom(controllerClass)) {
00247
00248 inputInterceptors.setElementAt(currentController,
00249 inputInterceptorsSignatures.indexOf(
00250 controllerClass.getName()));
00251 } else if (inputInterceptorsSignatures.contains(
00252 controllerClass.getName())) {
00253 logger.error(controllerClass.getName() +
00254 " was specified as input interceptor in the configuration file, but it is not an input interceptor since it does not implement the InputInterceptor interface");
00255 }
00256
00257 if (OutputInterceptor.class.isAssignableFrom(controllerClass)) {
00258 outputInterceptors.setElementAt(currentController,
00259 outputInterceptorsSignatures.indexOf(
00260 controllerClass.getName()));
00261 } else if (outputInterceptorsSignatures.contains(
00262 controllerClass.getName())) {
00263 logger.error(controllerClass.getName() +
00264 " was specified as output interceptor in the configuration file, but it is not an output interceptor since it does not implement the OutputInterceptor interface");
00265 }
00266 } catch (Exception e) {
00267 e.printStackTrace();
00268 throw new ProActiveRuntimeException(
00269 "could not create controller " +
00270 controllers.get(controllerItfName) + " : " +
00271 e.getMessage(), e);
00272 }
00273
00274
00275 if (ComponentParametersController.class.isAssignableFrom(
00276 controllerClass)) {
00277 ((ComponentParametersController) currentController).setComponentParameters(componentParameters);
00278 }
00279
00280 if (BindingController.class.isAssignableFrom(controllerClass)) {
00281 if ((componentParameters.getHierarchicalType()
00282 .equals(Constants.PRIMITIVE) &&
00283 (componentParameters.getClientInterfaceTypes().length == 0))) {
00284
00285 if (logger.isDebugEnabled()) {
00286 logger.debug("user component class of '" +
00287 componentParameters.getName() +
00288 "' does not have any client interface. It will have no BindingController");
00289 }
00290
00291 continue;
00292 }
00293
00294 }
00295
00296 if (ContentController.class.isAssignableFrom(controllerClass)) {
00297 if (isPrimitive) {
00298
00299 continue;
00300 }
00301 }
00302
00303 if (NameController.class.isAssignableFrom(controllerClass)) {
00304 ((NameController) currentController).setFcName(componentParameters.getName());
00305 }
00306
00307 if (lastController != null) {
00308 lastController.setNextHandler(currentController);
00309 } else {
00310 firstControllerRequestHandler = currentController;
00311 }
00312
00313 lastController = currentController;
00314 controlItfs.put(currentController.getFcItfName(), currentController);
00315 }
00316
00317
00318 lastController.setNextHandler(this);
00319 }
00320
00326 public static ComponentConfigurationHandler loadControllerConfiguration(
00327 String controllerConfigFileLocation) {
00328 try {
00329 return ComponentConfigurationHandler.createComponentConfigurationHandler(controllerConfigFileLocation);
00330 } catch (Exception e) {
00331 logger.error("could not load controller config file : " +
00332 controllerConfigFileLocation +
00333 ". Reverting to default controllers configuration.");
00334
00335 try {
00336 return ComponentConfigurationHandler.createComponentConfigurationHandler(ControllerDescription.DEFAULT_COMPONENT_CONFIG_FILE_LOCATION);
00337 } catch (Exception e1) {
00338 logger.error(
00339 "could not load default controller config file either. Check that the default controller config file is available in your classpath at : " +
00340 ControllerDescription.DEFAULT_COMPONENT_CONFIG_FILE_LOCATION);
00341 throw new ProActiveRuntimeException(
00342 "could not load default controller config file either. Check that the default controller config file is available on your system at : " +
00343 ControllerDescription.DEFAULT_COMPONENT_CONFIG_FILE_LOCATION,
00344 e1);
00345 }
00346 }
00347 }
00348
00349
00350
00351 private ProActiveInterface createInterfaceOnGroupOfDelegatees(
00352 ProActiveInterfaceType itfType) throws Exception {
00353 ProActiveInterface itf_ref = MetaObjectInterfaceClassGenerator.instance()
00354 .generateFunctionalInterface(itfType.getFcItfName(),
00355 this, itfType);
00356
00357
00358 ProActiveInterface itf_ref_group = ProActiveComponentGroup.newComponentInterfaceGroup(itfType,
00359 this);
00360 itf_ref.setFcItfImpl(itf_ref_group);
00361 return itf_ref;
00362 }
00363
00364
00365
00366
00367 public Object getFcInterface(String interfaceName)
00368 throws NoSuchInterfaceException {
00369 if (!("attribute-controller".equals(interfaceName)) &&
00370 (interfaceName.endsWith("-controller") ||
00371 interfaceName.equals("component"))) {
00372 if (!controlItfs.containsKey(interfaceName)) {
00373 throw new NoSuchInterfaceException(interfaceName);
00374 }
00375 return (controlItfs.get(interfaceName));
00376 }
00377 if (functionalItfs.containsKey(interfaceName)) {
00378 return functionalItfs.get(interfaceName);
00379 }
00380
00381
00382 InterfaceType[] itfTypes = ((ComponentType) getFcType()).getFcInterfaceTypes();
00383 for (int i = 0; i < itfTypes.length; i++) {
00384 InterfaceType type = itfTypes[i];
00385 if (type.isFcCollectionItf()) {
00386 if ((interfaceName.startsWith(type.getFcItfName()) &&
00387 !type.getFcItfName().equals(interfaceName))) {
00388 if (collectionItfsMembers.containsKey(interfaceName)) {
00389 return collectionItfsMembers.get(interfaceName);
00390 } else {
00391
00392 try {
00393 Interface clientItf = MetaObjectInterfaceClassGenerator.instance()
00394 .generateFunctionalInterface(interfaceName,
00395 this, (ProActiveInterfaceType) itfTypes[i]);
00396 collectionItfsMembers.put(interfaceName, clientItf);
00397 return clientItf;
00398 } catch (InterfaceGenerationFailedException e1) {
00399
00400 e1.printStackTrace();
00401 }
00402 }
00403 }
00404 }
00405 }
00406
00407 throw new NoSuchInterfaceException(interfaceName);
00408 }
00409
00410
00411
00412
00413 public Object[] getFcInterfaces() {
00414 return functionalItfs.values().toArray();
00415 }
00416
00417
00418
00419
00420 public Type getFcType() {
00421 try {
00422 return ((ComponentParametersController) getFcInterface(Constants.COMPONENT_PARAMETERS_CONTROLLER)).getComponentParameters()
00423 .getComponentType();
00424 } catch (NoSuchInterfaceException nsie) {
00425 throw new ProActiveRuntimeException("cannot retreive the type of the component",
00426 nsie);
00427 }
00428 }
00429
00433 public String getFcItfName() {
00434 return Constants.COMPONENT;
00435 }
00436
00440 public Component getFcItfOwner() {
00441 return (Component) this;
00442 }
00443
00447 public Type getFcItfType() {
00448 return getFcType();
00449 }
00450
00454 public boolean isFcInternalItf() {
00455 return true;
00456 }
00457
00464 public Object getReferenceOnBaseObject() {
00465 return getBody().getReifiedObject();
00466 }
00467
00472 public ComponentParameters getComponentParameters()
00473 throws NoSuchInterfaceException {
00474
00475 return ((ComponentParametersController) getFcInterface(Constants.COMPONENT_PARAMETERS_CONTROLLER)).getComponentParameters();
00476 }
00477
00481 public Body getBody() {
00482 return body;
00483 }
00484
00489 public UniqueID getID() {
00490 return getBody().getID();
00491 }
00492
00498 public ProActiveComponent getRepresentativeOnThis() {
00499
00500 if (representativeOnMyself != null) {
00501 return representativeOnMyself;
00502 }
00503
00504 try {
00505 return representativeOnMyself = ProActiveComponentRepresentativeFactory.instance()
00506 .createComponentRepresentative((ComponentType) getFcType(),
00507 getComponentParameters().getHierarchicalType(),
00508 ((StubObject) MOP.turnReified(body.getReifiedObject()
00509 .getClass().getName(),
00510 org.objectweb.proactive.core.Constants.DEFAULT_BODY_PROXY_CLASS_NAME,
00511 new Object[] { body }, body.getReifiedObject(), null)).getProxy(),
00512 getComponentParameters().getControllerDescription()
00513 .getControllersConfigFileLocation());
00514 } catch (Exception e) {
00515 throw new ProActiveRuntimeException("This component could not generate a reference on itself",
00516 e);
00517 }
00518 }
00519
00523 public RequestHandler getControllerRequestHandler() {
00524 return firstControllerRequestHandler;
00525 }
00526
00527 public List<AbstractProActiveController> getInputInterceptors() {
00528 return inputInterceptors;
00529 }
00530
00531 public List<AbstractProActiveController> getOutputInterceptors() {
00532 return outputInterceptors;
00533 }
00534
00535 public void migrateControllersDependentActiveObjectsTo(Node node)
00536 throws MigrationException {
00537 for (Iterator iter = controlItfs.values().iterator(); iter.hasNext();) {
00538 ProActiveController controller = (ProActiveController) iter.next();
00539 controller.migrateDependentActiveObjectsTo(node);
00540 }
00541 }
00542
00543 private void writeObject(java.io.ObjectOutputStream out)
00544 throws java.io.IOException {
00545
00546 out.defaultWriteObject();
00547 }
00548
00549 private void readObject(java.io.ObjectInputStream in)
00550 throws java.io.IOException, ClassNotFoundException {
00551
00552 in.defaultReadObject();
00553 }
00554 }