diff --git a/README.md b/README.md index 5f85d5cd..136b0464 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Bench4Q-Agent -============= - -Agent Node of Bench4Q +Bench4Q-Agent +============= + +Agent Node of Bench4Q diff --git a/src/main/java/org/bench4q/agent/Main.java b/src/main/java/org/bench4q/agent/Main.java index 4ce89fc6..43ca4fee 100644 --- a/src/main/java/org/bench4q/agent/Main.java +++ b/src/main/java/org/bench4q/agent/Main.java @@ -1,9 +1,9 @@ -package org.bench4q.agent; - -public class Main { - - public static void main(String[] args) { - AgentServer agentServer = new AgentServer(6565); - agentServer.start(); - } -} +package org.bench4q.agent; + +public class Main { + + public static void main(String[] args) { + AgentServer agentServer = new AgentServer(6565); + agentServer.start(); + } +} diff --git a/src/main/java/org/bench4q/agent/api/HomeController.java b/src/main/java/org/bench4q/agent/api/HomeController.java index 69fdd854..999c1306 100644 --- a/src/main/java/org/bench4q/agent/api/HomeController.java +++ b/src/main/java/org/bench4q/agent/api/HomeController.java @@ -79,8 +79,8 @@ public class HomeController { scenario.getUserBehaviors()[2].getParameters()[0] = new Parameter(); scenario.getUserBehaviors()[2].getParameters()[0].setKey("time"); scenario.getUserBehaviors()[2].getParameters()[0].setValue("1000"); - - this.getScenarioEngine().runScenario(scenario, 100); + + this.getScenarioEngine().runScenario(scenario, 100); 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 a39dc8db..3dcce486 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; @@ -74,6 +74,77 @@ public class PluginManager { } } + 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, Map parameters) { try { @@ -92,24 +163,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 f78d857f..222eafa5 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() { - + } @Behavior("Sleep") public void sleep(int time) { - + System.out.println("sleep:" + time); } } diff --git a/src/main/resources/application-context.xml b/src/main/resources/application-context.xml index 6c72d7ff..909a7298 100644 --- a/src/main/resources/application-context.xml +++ b/src/main/resources/application-context.xml @@ -1,10 +1,10 @@ - - - - - + + + + +