Merge code

This commit is contained in:
Zhen Tang 2013-06-27 15:40:13 +08:00
commit b2b754c429
9 changed files with 178 additions and 49 deletions

View File

@ -1,4 +1,4 @@
Bench4Q-Agent
=============
Agent Node of Bench4Q
Bench4Q-Agent
=============
Agent Node of Bench4Q

View File

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

View File

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

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;
@ -74,6 +74,77 @@ public class PluginManager {
}
}
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,
Map<String, String> parameters) {
try {
@ -92,24 +163,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() {
}
@Behavior("Sleep")
public void sleep(int time) {
System.out.println("sleep:" + time);
}
}

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="org.bench4q" />
<mvc:annotation-driven />
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="org.bench4q" />
<mvc:annotation-driven />
</beans>