package com.ibm.jactors.test; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import com.ibm.jactors.DefaultMessage; import com.ibm.jactors.Message; /** * An actor that can execute a command as a method on a supplied class. * * @author BFEIGENB * */ public class CommandActor extends TestableActor { @Override protected void loopBody(Message m) { String subject = m.getSubject(); if ("execute".equals(subject)) { excuteMethod(m, false); } else if ("executeStatic".equals(subject)) { excuteMethod(m, true); } else if ("init".equals(subject)) { // nothing to do } else { logger.warning("CommandActor:%s loopBody unknown subject: %s", getName(), subject); } } private void excuteMethod(Message m, boolean fstatic) { Object res = null; Object id = null; try { Object[] params = (Object[]) m.getData(); id = params[0]; String className = (String) params[1]; params = params.length > 2 ? (Object[]) params[2] : null; Class<?> clazz = Class.forName(className); Method method = clazz.getMethod(fstatic ? "executeStatic" : "execute", new Class[] { Object.class }); if (Modifier.isStatic(method.getModifiers()) == fstatic) { Object target = fstatic ? null : clazz.newInstance(); res = method.invoke(target, params); } } catch (Exception e) { res = e; } DefaultMessage dm = new DefaultMessage("executeComplete", new Object[] { id, res }); getManager().send(dm, this, m.getSource()); } }