From 33c09a2de66fef3f05606d3747c971b7462a7bd4 Mon Sep 17 00:00:00 2001 From: Zhen Tang Date: Thu, 27 Jun 2013 00:07:49 +0800 Subject: [PATCH] Plugin manager updated. --- .../org/bench4q/agent/api/HomeController.java | 2 +- .../bench4q/agent/plugin/BehaviorInfo.java | 23 ++++ .../org/bench4q/agent/plugin/PluginInfo.java | 32 +++++ .../bench4q/agent/plugin/PluginManager.java | 109 ++++++++++++++---- .../bench4q/agent/plugin/http/HttpPlugin.java | 11 +- .../plugin/timer/ConstantTimerPlugin.java | 4 +- .../agent/scenario/ScenarioEngine.java | 4 +- 7 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 src/main/java/org/bench4q/agent/plugin/BehaviorInfo.java create mode 100644 src/main/java/org/bench4q/agent/plugin/PluginInfo.java diff --git a/src/main/java/org/bench4q/agent/api/HomeController.java b/src/main/java/org/bench4q/agent/api/HomeController.java index cb4fedb0..2ef18060 100644 --- a/src/main/java/org/bench4q/agent/api/HomeController.java +++ b/src/main/java/org/bench4q/agent/api/HomeController.java @@ -80,7 +80,7 @@ public class HomeController { scenario.getUserBehaviors()[2].getParameters()[0].setKey("time"); scenario.getUserBehaviors()[2].getParameters()[0].setValue("1000"); - this.getScenarioEngine().runScenario(scenario, 1000); + this.getScenarioEngine().runScenario(scenario); return "It works!"; } } \ No newline at end of file diff --git a/src/main/java/org/bench4q/agent/plugin/BehaviorInfo.java b/src/main/java/org/bench4q/agent/plugin/BehaviorInfo.java new file mode 100644 index 00000000..96317ac3 --- /dev/null +++ b/src/main/java/org/bench4q/agent/plugin/BehaviorInfo.java @@ -0,0 +1,23 @@ +package org.bench4q.agent.plugin; + +public class BehaviorInfo { + private String name; + private String[] parameters; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String[] getParameters() { + return parameters; + } + + public void setParameters(String[] parameters) { + this.parameters = parameters; + } + +} diff --git a/src/main/java/org/bench4q/agent/plugin/PluginInfo.java b/src/main/java/org/bench4q/agent/plugin/PluginInfo.java new file mode 100644 index 00000000..d3c8aa39 --- /dev/null +++ b/src/main/java/org/bench4q/agent/plugin/PluginInfo.java @@ -0,0 +1,32 @@ +package org.bench4q.agent.plugin; + +public class PluginInfo { + private String name; + private String parameters[]; + private BehaviorInfo[] behaviors; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String[] getParameters() { + return parameters; + } + + public void setParameters(String[] parameters) { + this.parameters = parameters; + } + + public BehaviorInfo[] getBehaviors() { + return behaviors; + } + + public void setBehaviors(BehaviorInfo[] behaviors) { + this.behaviors = behaviors; + } + +} diff --git a/src/main/java/org/bench4q/agent/plugin/PluginManager.java b/src/main/java/org/bench4q/agent/plugin/PluginManager.java index 4fdd1cc6..8a9f758d 100644 --- a/src/main/java/org/bench4q/agent/plugin/PluginManager.java +++ b/src/main/java/org/bench4q/agent/plugin/PluginManager.java @@ -1,6 +1,7 @@ package org.bench4q.agent.plugin; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -11,7 +12,6 @@ import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; import javassist.Modifier; -import javassist.NotFoundException; import javassist.bytecode.CodeAttribute; import javassist.bytecode.LocalVariableAttribute; import javassist.bytecode.MethodInfo; @@ -60,8 +60,79 @@ public class PluginManager { } } - public Class getPlugin(String name) { - return this.findPlugins("org.bench4q.agent.plugin").get(name); + public Map> getPlugins() { + return this.findPlugins("org.bench4q.agent.plugin"); + } + + public List getPluginInfo() { + try { + Map> plugins = this.getPlugins(); + List ret = new ArrayList(); + for (Class plugin : plugins.values()) { + PluginInfo pluginInfo = new PluginInfo(); + ClassPool classPool = ClassPool.getDefault(); + CtClass ctClass = classPool.get(plugin.getCanonicalName()); + pluginInfo.setName(((Plugin) ctClass + .getAnnotation(Plugin.class)).value()); + pluginInfo.setParameters(this.getParameterNames(ctClass + .getConstructors()[0])); + CtMethod[] behaviors = this.getBehaviors(ctClass); + pluginInfo.setBehaviors(new BehaviorInfo[behaviors.length]); + int i = 0; + for (i = 0; i < behaviors.length; i++) { + BehaviorInfo behaviorInfo = new BehaviorInfo(); + CtMethod behaviorMethod = behaviors[i]; + behaviorInfo.setName(((Behavior) behaviorMethod + .getAnnotation(Behavior.class)).value()); + behaviorInfo.setParameters(this + .getParameterNames(behaviorMethod)); + pluginInfo.getBehaviors()[i] = behaviorInfo; + } + ret.add(pluginInfo); + } + return ret; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private String[] getParameterNames(CtBehavior behavior) { + try { + MethodInfo methodInfo = behavior.getMethodInfo(); + CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); + LocalVariableAttribute localVariableAttribute = (LocalVariableAttribute) codeAttribute + .getAttribute(LocalVariableAttribute.tag); + int parameterCount = behavior.getParameterTypes().length; + String parameterNames[] = new String[parameterCount]; + int i; + int pos = Modifier.isStatic(behavior.getModifiers()) ? 0 : 1; + for (i = 0; i < parameterCount; i++) { + parameterNames[i] = localVariableAttribute + .variableName(i + pos); + } + return parameterNames; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private CtMethod[] getBehaviors(CtClass plugin) { + try { + CtMethod[] ctMethods = plugin.getMethods(); + List ret = new ArrayList(); + int i = 0; + for (i = 0; i < ctMethods.length; i++) { + if (ctMethods[i].hasAnnotation(Behavior.class)) { + ret.add(ctMethods[i]); + } + } + return ret.toArray(new CtMethod[0]); + } catch (Exception e) { + e.printStackTrace(); + return null; + } } public Object initializePlugin(Class plugin, @@ -82,24 +153,22 @@ public class PluginManager { } } - private Object[] prepareParameters(CtBehavior constructor, - Map parameters) throws NotFoundException { - MethodInfo methodInfo = constructor.getMethodInfo(); - CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); - LocalVariableAttribute localVariableAttribute = (LocalVariableAttribute) codeAttribute - .getAttribute(LocalVariableAttribute.tag); - int parameterCount = constructor.getParameterTypes().length; - String parameterNames[] = new String[parameterCount]; - Object values[] = new Object[parameterCount]; - int i; - int pos = Modifier.isStatic(constructor.getModifiers()) ? 0 : 1; - for (i = 0; i < parameterCount; i++) { - parameterNames[i] = localVariableAttribute.variableName(i + pos); - values[i] = this.getTypeConverter().convert( - parameters.get(parameterNames[i]), - constructor.getParameterTypes()[i].getName()); + private Object[] prepareParameters(CtBehavior behavior, + Map parameters) { + try { + String[] parameterNames = this.getParameterNames(behavior); + Object values[] = new Object[parameterNames.length]; + int i = 0; + for (i = 0; i < parameterNames.length; i++) { + values[i] = this.getTypeConverter().convert( + parameters.get(parameterNames[i]), + behavior.getParameterTypes()[i].getName()); + } + return values; + } catch (Exception e) { + e.printStackTrace(); + return null; } - return values; } public Object doBehavior(Object plugin, String behaviorName, diff --git a/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java b/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java index 27467cb4..7703736b 100644 --- a/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java +++ b/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java @@ -6,16 +6,21 @@ import org.bench4q.agent.plugin.Plugin; @Plugin("Http") public class HttpPlugin { public HttpPlugin() { - + System.out.println("init http plugin"); } @Behavior("Get") public void get(String url, String content) { - + System.out.println("get"); + System.out.println("url:" + url); + System.out.println("content:" + content); } @Behavior("Post") public void post(String url, String content, int code) { - + System.out.println("get"); + System.out.println("url:" + url); + System.out.println("content:" + content); + System.out.println("code:" + code); } } diff --git a/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java b/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java index 010b021c..0ef601fc 100644 --- a/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java +++ b/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java @@ -6,11 +6,11 @@ import org.bench4q.agent.plugin.Plugin; @Plugin("ConstantTimer") public class ConstantTimerPlugin { public ConstantTimerPlugin(int time) { - + System.out.println("init timer plugin: " + time); } @Behavior("Sleep") public void sleep(int time) { - + System.out.println("sleep:" + time); } } diff --git a/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java b/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java index f6b51eb2..a1062483 100644 --- a/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java +++ b/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java @@ -49,8 +49,8 @@ public class ScenarioEngine { scenarioContext.setPlugins(new HashMap()); for (UsePlugin usePlugin : scenario.getUsePlugins()) { String pluginId = usePlugin.getId(); - Class pluginClass = this.getPluginManager().getPlugin( - usePlugin.getName()); + Class pluginClass = this.getPluginManager().getPlugins() + .get(usePlugin.getName()); Map initParameters = new HashMap(); for (Parameter parameter : usePlugin.getParameters()) { initParameters.put(parameter.getKey(), parameter.getValue());