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.Field;
00035
00036 import org.apache.log4j.Logger;
00037 import org.objectweb.proactive.core.ProActiveRuntimeException;
00038 import org.objectweb.proactive.core.body.LocalBodyStore;
00039 import org.objectweb.proactive.core.body.UniversalBody;
00040 import org.objectweb.proactive.core.body.proxy.UniversalBodyProxy;
00041 import org.objectweb.proactive.core.mop.MethodCall;
00042 import org.objectweb.proactive.core.mop.Proxy;
00043 import org.objectweb.proactive.core.util.log.Loggers;
00044 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00045
00046
00070 public class FunctionalInterfaceProxyImpl implements FunctionalInterfaceProxy,
00071 Serializable {
00072 protected transient final static Logger logger = ProActiveLogger.getLogger(Loggers.COMPONENTS_REQUESTS);
00073 private static Field universalBodyField;
00074 private static Field bodyIDField;
00075 Proxy bodyProxyDelegatee = null;
00076 Proxy nonShortcutProxy = null;
00077 String fcItfName;
00078
00079 static {
00080 try {
00081 universalBodyField = UniversalBodyProxy.class.getDeclaredField(
00082 "universalBody");
00083 universalBodyField.setAccessible(true);
00084 bodyIDField = UniversalBodyProxy.class.getSuperclass()
00085 .getDeclaredField("bodyID");
00086 bodyIDField.setAccessible(true);
00087 } catch (NoSuchFieldException e) {
00088 logger.error(e.getMessage());
00089 }
00090 }
00091
00092 private FunctionalInterfaceProxyImpl() {
00093 }
00094
00095 public FunctionalInterfaceProxyImpl(Proxy bodyProxyDelegatee,
00096 String fcItfName) {
00097 nonShortcutProxy = this.bodyProxyDelegatee = bodyProxyDelegatee;
00098 this.fcItfName = fcItfName;
00099 }
00100
00101 private void changeRefOnBody(UniversalBody body) {
00102 try {
00103 if (logger.isDebugEnabled()) {
00104 logger.debug("changing reference on body");
00105 }
00106 UniversalBodyProxy proxy = (UniversalBodyProxy) UniversalBodyProxy.class.newInstance();
00107 universalBodyField.set(proxy, body);
00108 bodyIDField.set(proxy, body.getID());
00109 bodyProxyDelegatee = proxy;
00110 } catch (InstantiationException e) {
00111 throw new ProActiveRuntimeException(e);
00112 } catch (IllegalAccessException e) {
00113 throw new ProActiveRuntimeException(e);
00114 }
00115 }
00116
00117 public Object reify(MethodCall c) throws Throwable {
00118
00119
00120 UniversalBody newDestinationBody = LocalBodyStore.getInstance()
00121 .getCurrentThreadBody()
00122 .getShortcutTargetBody(new ItfID(
00123 c.getComponentMetadata().getComponentInterfaceName(),
00124 ((UniversalBodyProxy) bodyProxyDelegatee).getBody().getID()));
00125 if (newDestinationBody != null) {
00126 changeRefOnBody(newDestinationBody);
00127 }
00128 return bodyProxyDelegatee.reify(c);
00129 }
00130
00131 public void setBodyProxy(Proxy proxy) {
00132 bodyProxyDelegatee = proxy;
00133 }
00134
00135 public Proxy getBodyProxy() {
00136 return bodyProxyDelegatee;
00137 }
00138
00139
00140 }