now i can compile the param in the way of DFA support
now i can compile the param in the way of DFA support
This commit is contained in:
parent
f2863281f6
commit
8271bb8478
|
@ -1,8 +1,14 @@
|
||||||
package org.bench4q.agent.scenario;
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.dfa.DFA;
|
||||||
|
import org.bench4q.agent.scenario.dfa.ParamPart;
|
||||||
|
|
||||||
public class Parameter {
|
public class Parameter {
|
||||||
private String key;
|
private String key;
|
||||||
private String value;
|
private String value;
|
||||||
|
private ParamPart[] paramParts;
|
||||||
|
|
||||||
public String getKey() {
|
public String getKey() {
|
||||||
return key;
|
return key;
|
||||||
|
@ -20,4 +26,17 @@ public class Parameter {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ParamPart[] getParamParts() {
|
||||||
|
return paramParts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setParamParts(ParamPart[] paramParts) {
|
||||||
|
this.paramParts = paramParts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void compileToGenerateParts() {
|
||||||
|
List<ParamPart> paramParts = DFA.resolveMaltipleParamPart(this
|
||||||
|
.getValue());
|
||||||
|
this.setParamParts(paramParts.toArray(new ParamPart[paramParts.size()]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,11 +153,16 @@ public class VUser implements Runnable {
|
||||||
private Map<String, String> prepareBehaviorParameters(Behavior behavior) {
|
private Map<String, String> prepareBehaviorParameters(Behavior behavior) {
|
||||||
Map<String, String> behaviorParameters = new HashMap<String, String>();
|
Map<String, String> behaviorParameters = new HashMap<String, String>();
|
||||||
for (Parameter parameter : behavior.getParameters()) {
|
for (Parameter parameter : behavior.getParameters()) {
|
||||||
|
compile(parameter.getValue());
|
||||||
behaviorParameters.put(parameter.getKey(), parameter.getValue());
|
behaviorParameters.put(parameter.getKey(), parameter.getValue());
|
||||||
}
|
}
|
||||||
return behaviorParameters;
|
return behaviorParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void compile(String value) {
|
||||||
|
// TODO: Add the state pattern to this and parse the value
|
||||||
|
}
|
||||||
|
|
||||||
private void preparePlugins(Scenario scenario, Map<String, Object> plugins) {
|
private void preparePlugins(Scenario scenario, Map<String, Object> plugins) {
|
||||||
for (UsePlugin usePlugin : scenario.getUsePlugins()) {
|
for (UsePlugin usePlugin : scenario.getUsePlugins()) {
|
||||||
String pluginId = usePlugin.getId();
|
String pluginId = usePlugin.getId();
|
||||||
|
|
|
@ -59,6 +59,12 @@ public abstract class Behavior {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void compile() {
|
||||||
|
for (Parameter parameter : this.getParameters()) {
|
||||||
|
parameter.compileToGenerateParts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void distillParams(SessionObject session) {
|
public void distillParams(SessionObject session) {
|
||||||
for (Parameter parameter : this.getParameters()) {
|
for (Parameter parameter : this.getParameters()) {
|
||||||
String s = parameter.getValue();
|
String s = parameter.getValue();
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
package org.bench4q.agent.scenario.dfa;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.dfa.ParamPart.ParamPartType;
|
||||||
|
import org.bench4q.agent.utils.ParameterParser;
|
||||||
|
|
||||||
|
public class DFA {
|
||||||
|
|
||||||
|
public static List<ParamPart> resolveMaltipleParamPart(
|
||||||
|
String paramOriginValue) {
|
||||||
|
List<ParamPart> result;
|
||||||
|
StringBuilder buf1;
|
||||||
|
StringBuilder buf2;
|
||||||
|
int state;
|
||||||
|
ParamPart part;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
result = new LinkedList<ParamPart>();
|
||||||
|
buf1 = new StringBuilder();
|
||||||
|
buf2 = new StringBuilder();
|
||||||
|
state = 0;
|
||||||
|
loop: for (int i = 0, len = paramOriginValue.length(); i < len; i++) {
|
||||||
|
c = paramOriginValue.charAt(i);
|
||||||
|
switch (state) {
|
||||||
|
case 0: /* Literal string */
|
||||||
|
switch (c) {
|
||||||
|
case '$':
|
||||||
|
if (buf1.length() > 0) {
|
||||||
|
part = new ParamPart();
|
||||||
|
part.setType(ParamPartType.STRING);
|
||||||
|
part.setContentForStringType(buf1.toString());
|
||||||
|
result.add(part);
|
||||||
|
buf1.setLength(0);
|
||||||
|
}
|
||||||
|
state = 2;
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
buf1.append(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// no more state == 1 (irrelevantly used for "escape sequence")
|
||||||
|
case 2: /* Context call */
|
||||||
|
switch (c) {
|
||||||
|
case '#':
|
||||||
|
part = new ParamPart();
|
||||||
|
part.setType(ParamPartType.SESSION_ID);
|
||||||
|
result.add(part);
|
||||||
|
state = 0;
|
||||||
|
continue;
|
||||||
|
case '{':
|
||||||
|
state = 3;
|
||||||
|
continue;
|
||||||
|
case '$': /* $$ is the escape sequence for $ */
|
||||||
|
buf1.append(c);
|
||||||
|
state = 0;
|
||||||
|
continue;
|
||||||
|
default: /* Syntax error */
|
||||||
|
break loop;
|
||||||
|
}
|
||||||
|
case 3: /* plugInId */
|
||||||
|
switch (c) {
|
||||||
|
case ':':
|
||||||
|
state = 4;
|
||||||
|
continue;
|
||||||
|
case '{':
|
||||||
|
break loop;
|
||||||
|
case '}': /* no ':' means system property */
|
||||||
|
part = new ParamPart();
|
||||||
|
part.setType(ParamPartType.PROPERTY);
|
||||||
|
part.setPluginIdForContextCallType(null);
|
||||||
|
part.setVariableForContextCallAndProperty(ParameterParser
|
||||||
|
.unescape(buf1.toString()));
|
||||||
|
result.add(part);
|
||||||
|
buf1.setLength(0);
|
||||||
|
state = 0;
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
buf1.append(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
case 4: /* Variable */
|
||||||
|
switch (c) {
|
||||||
|
case '}':
|
||||||
|
part = new ParamPart();
|
||||||
|
part.setType(ParamPartType.CONTEXT_CALL);
|
||||||
|
part.setPluginIdForContextCallType(ParameterParser
|
||||||
|
.unescape(buf1.toString()));
|
||||||
|
part.setVariableForContextCallAndProperty(ParameterParser
|
||||||
|
.unescape(buf2.toString()));
|
||||||
|
result.add(part);
|
||||||
|
buf1.setLength(0);
|
||||||
|
buf2.setLength(0);
|
||||||
|
state = 0;
|
||||||
|
continue;
|
||||||
|
case '{': /* Syntax error */
|
||||||
|
break loop;
|
||||||
|
default:
|
||||||
|
buf2.append(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state == 0 && buf1.length() > 0) {
|
||||||
|
part = new ParamPart();
|
||||||
|
part.setType(ParamPartType.STRING);
|
||||||
|
part.setContentForStringType(buf1.toString());
|
||||||
|
result.add(part);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package org.bench4q.agent.scenario.dfa;
|
||||||
|
|
||||||
|
public class ParamPart {
|
||||||
|
public static enum ParamPartType {
|
||||||
|
STRING, SESSION_ID, CONTEXT_CALL, PROPERTY
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParamPartType type;
|
||||||
|
private String contentForStringType;
|
||||||
|
private String pluginIdForContextCallType;
|
||||||
|
private String variableForContextCallAndProperty;
|
||||||
|
|
||||||
|
public ParamPartType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(ParamPartType type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentForStringType() {
|
||||||
|
return contentForStringType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContentForStringType(String contentForStringType) {
|
||||||
|
this.contentForStringType = contentForStringType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPluginIdForContextCallType() {
|
||||||
|
return pluginIdForContextCallType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluginIdForContextCallType(String pluginIdForContextCallType) {
|
||||||
|
this.pluginIdForContextCallType = pluginIdForContextCallType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVariableForContextCallAndProperty() {
|
||||||
|
return variableForContextCallAndProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVariableForContextCallAndProperty(
|
||||||
|
String variableForContextCallAndProperty) {
|
||||||
|
this.variableForContextCallAndProperty = variableForContextCallAndProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
switch (type) {
|
||||||
|
case STRING:
|
||||||
|
return this.contentForStringType;
|
||||||
|
case SESSION_ID:
|
||||||
|
return "$#";
|
||||||
|
case CONTEXT_CALL:
|
||||||
|
return "${" + this.pluginIdForContextCallType + ":"
|
||||||
|
+ this.variableForContextCallAndProperty + "}";
|
||||||
|
case PROPERTY:
|
||||||
|
return "${" + this.variableForContextCallAndProperty + "}";
|
||||||
|
default:
|
||||||
|
return "Plug-in parameter part " + this.contentForStringType + "/"
|
||||||
|
+ this.pluginIdForContextCallType + "/"
|
||||||
|
+ this.variableForContextCallAndProperty
|
||||||
|
+ " has an unspecified type " + type.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -101,7 +101,7 @@ public abstract class ParameterParser {
|
||||||
* the string where some characters are escaped by '\' character
|
* the string where some characters are escaped by '\' character
|
||||||
* @return the unescaped string
|
* @return the unescaped string
|
||||||
*/
|
*/
|
||||||
static String unescape(String value) {
|
public static String unescape(String value) {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
char c;
|
char c;
|
||||||
boolean escape = false; // escape sequence
|
boolean escape = false; // escape sequence
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
package org.bench4q.agent.test.scenario;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.dfa.DFA;
|
||||||
|
import org.bench4q.agent.scenario.dfa.ParamPart;
|
||||||
|
import org.bench4q.agent.scenario.dfa.ParamPart.ParamPartType;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Test_DFA {
|
||||||
|
private static final String TEST_CASE = "${csvProvider0:userName}";
|
||||||
|
private static final String TEST_CASE2 = "${csvProvider0:userName}$#";
|
||||||
|
private static final String TEST_CASE3 = "${csvProvider0:userName}$#okOrNot";
|
||||||
|
private static final String TEST_CASE4 = "${csvProvider0:userName}$#okOrNot${file.separator}";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_resolveMaltipleParamPart_WithOnePluginIdVariable() {
|
||||||
|
List<ParamPart> result = DFA.resolveMaltipleParamPart(TEST_CASE);
|
||||||
|
assertEquals(1, result.size());
|
||||||
|
assertEquals("csvProvider0", result.get(0)
|
||||||
|
.getPluginIdForContextCallType());
|
||||||
|
assertEquals("userName", result.get(0)
|
||||||
|
.getVariableForContextCallAndProperty());
|
||||||
|
assertNull(result.get(0).getContentForStringType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_resolveMaltipleParamPart_WithOnePluginIdVariable_AND_OneSessionID() {
|
||||||
|
List<ParamPart> result = DFA.resolveMaltipleParamPart(TEST_CASE2);
|
||||||
|
assertEquals(2, result.size());
|
||||||
|
assertEquals("csvProvider0", result.get(0)
|
||||||
|
.getPluginIdForContextCallType());
|
||||||
|
assertEquals(ParamPartType.CONTEXT_CALL, result.get(0).getType());
|
||||||
|
assertEquals("userName", result.get(0)
|
||||||
|
.getVariableForContextCallAndProperty());
|
||||||
|
assertNull(result.get(0).getContentForStringType());
|
||||||
|
assertEquals(ParamPartType.SESSION_ID, result.get(1).getType());
|
||||||
|
assertNull(result.get(1).getContentForStringType());
|
||||||
|
assertNull(result.get(1).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(1).getVariableForContextCallAndProperty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_resolveMaltipleParamPart_WithOnePluginIdVariable_AND_OneSessionID_And_PlainString() {
|
||||||
|
List<ParamPart> result = DFA.resolveMaltipleParamPart(TEST_CASE3);
|
||||||
|
assertEquals(3, result.size());
|
||||||
|
assertEquals("csvProvider0", result.get(0)
|
||||||
|
.getPluginIdForContextCallType());
|
||||||
|
assertEquals(ParamPartType.CONTEXT_CALL, result.get(0).getType());
|
||||||
|
assertEquals("userName", result.get(0)
|
||||||
|
.getVariableForContextCallAndProperty());
|
||||||
|
assertNull(result.get(0).getContentForStringType());
|
||||||
|
|
||||||
|
assertEquals(ParamPartType.SESSION_ID, result.get(1).getType());
|
||||||
|
assertNull(result.get(1).getContentForStringType());
|
||||||
|
assertNull(result.get(1).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(1).getVariableForContextCallAndProperty());
|
||||||
|
|
||||||
|
assertEquals(ParamPartType.STRING, result.get(2).getType());
|
||||||
|
assertNull(result.get(2).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(2).getVariableForContextCallAndProperty());
|
||||||
|
assertEquals("okOrNot", result.get(2).getContentForStringType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_resolveMaltipleParamPart_WithOnePluginIdVariable_AND_OneSessionID_And_PlainString_AND_Property() {
|
||||||
|
List<ParamPart> result = DFA.resolveMaltipleParamPart(TEST_CASE4);
|
||||||
|
assertEquals(4, result.size());
|
||||||
|
assertEquals("csvProvider0", result.get(0)
|
||||||
|
.getPluginIdForContextCallType());
|
||||||
|
assertEquals(ParamPartType.CONTEXT_CALL, result.get(0).getType());
|
||||||
|
assertEquals("userName", result.get(0)
|
||||||
|
.getVariableForContextCallAndProperty());
|
||||||
|
assertNull(result.get(0).getContentForStringType());
|
||||||
|
|
||||||
|
assertEquals(ParamPartType.SESSION_ID, result.get(1).getType());
|
||||||
|
assertNull(result.get(1).getContentForStringType());
|
||||||
|
assertNull(result.get(1).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(1).getVariableForContextCallAndProperty());
|
||||||
|
|
||||||
|
assertEquals(ParamPartType.STRING, result.get(2).getType());
|
||||||
|
assertNull(result.get(2).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(2).getVariableForContextCallAndProperty());
|
||||||
|
assertEquals("okOrNot", result.get(2).getContentForStringType());
|
||||||
|
|
||||||
|
assertEquals(ParamPartType.PROPERTY, result.get(3).getType());
|
||||||
|
assertNull(result.get(3).getPluginIdForContextCallType());
|
||||||
|
assertNull(result.get(3).getContentForStringType());
|
||||||
|
assertEquals("file.separator", result.get(3)
|
||||||
|
.getVariableForContextCallAndProperty());
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Loading…
Reference in New Issue