1 23 24 package protoactive.core.body.metaobject; 25 26 import org.objectweb.fractal.api.control.LifeCycleController; 27 import org.objectweb.fractal.api.Fractal; 28 import org.objectweb.fractal.api.Component; 29 30 import org.objectweb.fractal.julia.loader.Loader; 31 import org.objectweb.fractal.julia.loader.Tree; 32 33 import protoactive.core.body.future.LocalFuture; 34 import protoactive.core.mop.MetaObject; 35 36 import java.lang.reflect.Method ; 37 import java.util.List ; 38 import java.util.ArrayList ; 39 40 45 46 public class BodyMetaObject 47 implements LifeCycleController, MetaObject, Runnable 48 { 49 50 private List requests; 51 52 private boolean running; 53 54 private boolean requestStop; 55 56 67 68 public Object handleMethodCall ( 69 final String itf, 70 final Object target, 71 final Method m, 72 final Object [] args) 73 { 74 Request r = new Request(); 75 r.target = target; 76 r.m = m; 77 r.args = args; 78 79 Class c = m.getReturnType(); 80 if (c == Void.TYPE) { 81 r.future = null; 82 } else { 83 try { 84 Component boot = Fractal.getBootstrapComponent(); 85 Loader loader = (Loader)boot.getFcInterface("loader"); 86 r.future = (LocalFuture)loader.newObject( 87 new Tree(new Tree[] { 88 new Tree(new Tree[] { 89 new Tree("protoactive.core.body.future.FutureClassGenerator"), 90 new Tree("protoactive.core.body.future.LocalFuture"), 91 new Tree(new Tree[] { new Tree(c.getName()) }) 92 }) 93 }), null 94 ); 95 } catch (Exception e) { 96 e.printStackTrace(); 97 throw new Error (); 98 } 99 } 100 101 synchronized (this) { 103 if (requests == null) { 104 requests = new ArrayList (); 105 } 106 requests.add(r); 107 notifyAll(); 108 } 109 110 return r.future; 112 } 113 114 public boolean isReflectedCall () { 115 Class [] stack = Helper.INSTANCE.getClassContext(); 116 return 117 stack.length > 3 && 118 stack[3].getName().equals("protoactive.core.body.metaobject.Request"); 119 } 120 121 public String getFcState () { 122 return (running ? STARTED : STOPPED); 123 } 124 125 public void startFc () { 126 synchronized (this) { 127 if (!running) { 128 running = true; 130 requestStop = false; 131 new Thread (this).start(); 132 } 133 } 134 } 135 136 public void stopFc () { 137 synchronized (this) { 138 requestStop = true; 140 notifyAll(); 141 while (running) { 143 try { 144 wait(); 145 } catch (InterruptedException e) { 146 } 147 } 148 } 149 } 150 151 158 159 public void run () { 160 while (true) { 161 Request r; 163 synchronized (this) { 164 while ((requests == null || requests.size() == 0) && !requestStop) { 167 try { 168 wait(); 169 } catch (InterruptedException e) { 170 } 171 } 172 if (!requestStop) { 173 r = (Request)requests.remove(0); 174 } else { 175 running = false; 178 notifyAll(); 179 return; 180 } 181 } 182 System.err.println( 184 Thread.currentThread() + " HANDLE REQUEST " + r); 185 Object reply = r.invoke(); 186 if (r.future != null) { 187 r.future.receiveReply(reply); 188 } 189 } 190 } 191 192 public static class Helper extends SecurityManager { 193 194 public final static Helper INSTANCE = new Helper(); 195 196 public Class [] getClassContext() { 197 return super.getClassContext(); 198 } 199 } 200 } 201 | Popular Tags |