Plugin manager updated.

This commit is contained in:
Zhen Tang 2013-06-27 00:07:49 +08:00
parent 147c40166d
commit 33c09a2de6
7 changed files with 157 additions and 28 deletions

View File

@ -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!";
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<String, Class<?>> getPlugins() {
return this.findPlugins("org.bench4q.agent.plugin");
}
public List<PluginInfo> getPluginInfo() {
try {
Map<String, Class<?>> plugins = this.getPlugins();
List<PluginInfo> ret = new ArrayList<PluginInfo>();
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<CtMethod> ret = new ArrayList<CtMethod>();
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<String, String> 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<String, String> 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,

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -49,8 +49,8 @@ public class ScenarioEngine {
scenarioContext.setPlugins(new HashMap<String, Object>());
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<String, String> initParameters = new HashMap<String, String>();
for (Parameter parameter : usePlugin.getParameters()) {
initParameters.put(parameter.getKey(), parameter.getValue());