xml parse
This commit is contained in:
parent
088bf06f0d
commit
586ef458ab
|
@ -24,6 +24,7 @@ public class JmeterDocumentParser implements DocumentParser {
|
||||||
private final static String COLLECTION_PROP = "collectionProp";
|
private final static String COLLECTION_PROP = "collectionProp";
|
||||||
private final static String CONCURRENCY_THREAD_GROUP = "com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup";
|
private final static String CONCURRENCY_THREAD_GROUP = "com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup";
|
||||||
private final static String VARIABLE_THROUGHPUT_TIMER = "kg.apc.jmeter.timers.VariableThroughputTimer";
|
private final static String VARIABLE_THROUGHPUT_TIMER = "kg.apc.jmeter.timers.VariableThroughputTimer";
|
||||||
|
private final static String THREAD_GROUP = "ThreadGroup";
|
||||||
private EngineContext context;
|
private EngineContext context;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -77,14 +78,101 @@ public class JmeterDocumentParser implements DocumentParser {
|
||||||
parseHashTree(ele);
|
parseHashTree(ele);
|
||||||
} else if (nodeNameEquals(ele, CONCURRENCY_THREAD_GROUP)) {
|
} else if (nodeNameEquals(ele, CONCURRENCY_THREAD_GROUP)) {
|
||||||
processConcurrencyThreadGroup(ele);
|
processConcurrencyThreadGroup(ele);
|
||||||
|
processTimer(ele);
|
||||||
} else if (nodeNameEquals(ele, VARIABLE_THROUGHPUT_TIMER)) {
|
} else if (nodeNameEquals(ele, VARIABLE_THROUGHPUT_TIMER)) {
|
||||||
processVariableThroughputTimer(ele);
|
processVariableThroughputTimer(ele);
|
||||||
|
} else if (nodeNameEquals(ele, THREAD_GROUP)) {
|
||||||
|
processThreadGroup(ele);
|
||||||
|
//
|
||||||
|
processConcurrencyThreadGroup(ele);
|
||||||
|
processTimer(ele);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void processThreadGroup(Element threadGroup) {
|
||||||
|
// 重命名 tagName
|
||||||
|
Document document = threadGroup.getOwnerDocument();
|
||||||
|
document.renameNode(threadGroup, threadGroup.getNamespaceURI(), CONCURRENCY_THREAD_GROUP);
|
||||||
|
threadGroup.setAttribute("guiclass", CONCURRENCY_THREAD_GROUP + "Gui");
|
||||||
|
threadGroup.setAttribute("testclass", CONCURRENCY_THREAD_GROUP);
|
||||||
|
/*
|
||||||
|
<elementProp name="ThreadGroup.main_controller" elementType="com.blazemeter.jmeter.control.VirtualUserController"/>
|
||||||
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
||||||
|
<stringProp name="TargetLevel">2</stringProp>
|
||||||
|
<stringProp name="RampUp">12</stringProp>
|
||||||
|
<stringProp name="Steps">2</stringProp>
|
||||||
|
<stringProp name="Hold">3</stringProp>
|
||||||
|
<stringProp name="LogFilename"></stringProp>
|
||||||
|
<stringProp name="Iterations">1</stringProp>
|
||||||
|
<stringProp name="Unit">S</stringProp>
|
||||||
|
*/
|
||||||
|
removeChildren(threadGroup);
|
||||||
|
// elementProp
|
||||||
|
Element elementProp = document.createElement("elementProp");
|
||||||
|
elementProp.setAttribute("name", "ThreadGroup.main_controller");
|
||||||
|
elementProp.setAttribute("elementType", "com.blazemeter.jmeter.control.VirtualUserController");
|
||||||
|
threadGroup.appendChild(elementProp);
|
||||||
|
|
||||||
|
|
||||||
|
threadGroup.appendChild(createStringProp(document, "ThreadGroup.on_sample_error", "continue"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "TargetLevel", "2"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "RampUp", "12"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Steps", "2"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Hold", "12"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "LogFilename", ""));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Iterations", "1"));
|
||||||
|
// todo 单位是S 要修改 成M
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Unit", "S"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processTimer(Element element) {
|
||||||
|
/*
|
||||||
|
<kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer" enabled="true">
|
||||||
|
<collectionProp name="load_profile">
|
||||||
|
<collectionProp name="140409499">
|
||||||
|
<stringProp name="49">1</stringProp>
|
||||||
|
<stringProp name="49">1</stringProp>
|
||||||
|
<stringProp name="1570">13</stringProp>
|
||||||
|
</collectionProp>
|
||||||
|
</collectionProp>
|
||||||
|
</kg.apc.jmeter.timers.VariableThroughputTimer>
|
||||||
|
*/
|
||||||
|
Document document = element.getOwnerDocument();
|
||||||
|
|
||||||
|
|
||||||
|
Node timerParent = element.getNextSibling();
|
||||||
|
while (!(timerParent instanceof Element)) {
|
||||||
|
timerParent = timerParent.getNextSibling();
|
||||||
|
}
|
||||||
|
|
||||||
|
Element timer = document.createElement(VARIABLE_THROUGHPUT_TIMER);
|
||||||
|
timer.setAttribute("guiclass", VARIABLE_THROUGHPUT_TIMER + "Gui");
|
||||||
|
timer.setAttribute("testclass", VARIABLE_THROUGHPUT_TIMER);
|
||||||
|
timer.setAttribute("testname", "jp@gc - Throughput Shaping Timer");
|
||||||
|
timer.setAttribute("enabled", "true");
|
||||||
|
|
||||||
|
Element collectionProp = document.createElement("collectionProp");
|
||||||
|
collectionProp.setAttribute("name", "load_profile");
|
||||||
|
Element childCollectionProp = document.createElement("collectionProp");
|
||||||
|
childCollectionProp.setAttribute("name", "140409499");
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "49", "1"));
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "49", "1"));
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "1570", "10"));
|
||||||
|
collectionProp.appendChild(childCollectionProp);
|
||||||
|
timer.appendChild(collectionProp);
|
||||||
|
timerParent.appendChild(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Element createStringProp(Document document, String name, String value) {
|
||||||
|
Element unit = document.createElement(STRING_PROP);
|
||||||
|
unit.setAttribute("name", name);
|
||||||
|
unit.appendChild(document.createTextNode(value));
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
|
||||||
private void processConcurrencyThreadGroup(Element concurrencyThreadGroup) {
|
private void processConcurrencyThreadGroup(Element concurrencyThreadGroup) {
|
||||||
if (concurrencyThreadGroup.getChildNodes().getLength() > 0) {
|
if (concurrencyThreadGroup.getChildNodes().getLength() > 0) {
|
||||||
final NodeList childNodes = concurrencyThreadGroup.getChildNodes();
|
final NodeList childNodes = concurrencyThreadGroup.getChildNodes();
|
||||||
|
@ -159,4 +247,10 @@ public class JmeterDocumentParser implements DocumentParser {
|
||||||
private boolean invalid(Element ele) {
|
private boolean invalid(Element ele) {
|
||||||
return !StringUtils.isBlank(ele.getAttribute("enabled")) && !Boolean.parseBoolean(ele.getAttribute("enabled"));
|
return !StringUtils.isBlank(ele.getAttribute("enabled")) && !Boolean.parseBoolean(ele.getAttribute("enabled"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeChildren(Node node) {
|
||||||
|
while (node.hasChildNodes()) {
|
||||||
|
node.removeChild(node.getFirstChild());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,10 +22,12 @@ public class JmxFileParseTest {
|
||||||
private final static String HASH_TREE_ELEMENT = "hashTree";
|
private final static String HASH_TREE_ELEMENT = "hashTree";
|
||||||
private final static String STRING_PROP = "stringProp";
|
private final static String STRING_PROP = "stringProp";
|
||||||
private final static String CONCURRENCY_THREAD_GROUP = "com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup";
|
private final static String CONCURRENCY_THREAD_GROUP = "com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup";
|
||||||
|
private final static String VARIABLE_THROUGHPUT_TIMER = "kg.apc.jmeter.timers.VariableThroughputTimer";
|
||||||
|
private final static String THREAD_GROUP = "ThreadGroup";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void parse() throws Exception {
|
public void parse() throws Exception {
|
||||||
File file = new File("/Users/dhf/Desktop/Concurrency Thread Group.jmx");
|
File file = new File("/Users/liuruibin/Downloads/blaze_meter_dev2.jmx");
|
||||||
|
|
||||||
final FileInputStream inputStream = new FileInputStream(file);
|
final FileInputStream inputStream = new FileInputStream(file);
|
||||||
final InputSource inputSource = new InputSource(inputStream);
|
final InputSource inputSource = new InputSource(inputStream);
|
||||||
|
@ -78,12 +80,99 @@ public class JmxFileParseTest {
|
||||||
parseHashTree(ele);
|
parseHashTree(ele);
|
||||||
} else if (nodeNameEquals(ele, CONCURRENCY_THREAD_GROUP)) {
|
} else if (nodeNameEquals(ele, CONCURRENCY_THREAD_GROUP)) {
|
||||||
processConcurrencyThreadGroup(ele);
|
processConcurrencyThreadGroup(ele);
|
||||||
|
processTimer(ele);
|
||||||
|
} else if (nodeNameEquals(ele, THREAD_GROUP)) {
|
||||||
|
processThreadGroup(ele);
|
||||||
|
processConcurrencyThreadGroup(ele);
|
||||||
|
processTimer(ele);
|
||||||
|
} else if (nodeNameEquals(ele, VARIABLE_THROUGHPUT_TIMER)) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void processThreadGroup(Element threadGroup) {
|
||||||
|
// 重命名 tagName
|
||||||
|
Document document = threadGroup.getOwnerDocument();
|
||||||
|
document.renameNode(threadGroup, threadGroup.getNamespaceURI(), CONCURRENCY_THREAD_GROUP);
|
||||||
|
threadGroup.setAttribute("guiclass", CONCURRENCY_THREAD_GROUP + "Gui");
|
||||||
|
threadGroup.setAttribute("testclass", CONCURRENCY_THREAD_GROUP);
|
||||||
|
/*
|
||||||
|
<elementProp name="ThreadGroup.main_controller" elementType="com.blazemeter.jmeter.control.VirtualUserController"/>
|
||||||
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
||||||
|
<stringProp name="TargetLevel">2</stringProp>
|
||||||
|
<stringProp name="RampUp">12</stringProp>
|
||||||
|
<stringProp name="Steps">2</stringProp>
|
||||||
|
<stringProp name="Hold">3</stringProp>
|
||||||
|
<stringProp name="LogFilename"></stringProp>
|
||||||
|
<stringProp name="Iterations">1</stringProp>
|
||||||
|
<stringProp name="Unit">S</stringProp>
|
||||||
|
*/
|
||||||
|
removeChildren(threadGroup);
|
||||||
|
// elementProp
|
||||||
|
Element elementProp = document.createElement("elementProp");
|
||||||
|
elementProp.setAttribute("name", "ThreadGroup.main_controller");
|
||||||
|
elementProp.setAttribute("elementType", "com.blazemeter.jmeter.control.VirtualUserController");
|
||||||
|
threadGroup.appendChild(elementProp);
|
||||||
|
|
||||||
|
|
||||||
|
threadGroup.appendChild(createStringProp(document, "ThreadGroup.on_sample_error", "continue"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "TargetLevel", "2"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "RampUp", "12"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Steps", "2"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Hold", "12"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "LogFilename", ""));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Iterations", "1"));
|
||||||
|
threadGroup.appendChild(createStringProp(document, "Unit", "S"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processTimer(Element element) {
|
||||||
|
/*
|
||||||
|
<kg.apc.jmeter.timers.VariableThroughputTimer guiclass="kg.apc.jmeter.timers.VariableThroughputTimerGui" testclass="kg.apc.jmeter.timers.VariableThroughputTimer" testname="jp@gc - Throughput Shaping Timer" enabled="true">
|
||||||
|
<collectionProp name="load_profile">
|
||||||
|
<collectionProp name="140409499">
|
||||||
|
<stringProp name="49">1</stringProp>
|
||||||
|
<stringProp name="49">1</stringProp>
|
||||||
|
<stringProp name="1570">13</stringProp>
|
||||||
|
</collectionProp>
|
||||||
|
</collectionProp>
|
||||||
|
</kg.apc.jmeter.timers.VariableThroughputTimer>
|
||||||
|
*/
|
||||||
|
Document document = element.getOwnerDocument();
|
||||||
|
|
||||||
|
|
||||||
|
Node timerParent = element.getNextSibling();
|
||||||
|
while (!(timerParent instanceof Element)) {
|
||||||
|
timerParent = timerParent.getNextSibling();
|
||||||
|
}
|
||||||
|
|
||||||
|
Element timer = document.createElement(VARIABLE_THROUGHPUT_TIMER);
|
||||||
|
timer.setAttribute("guiclass", VARIABLE_THROUGHPUT_TIMER + "Gui");
|
||||||
|
timer.setAttribute("testclass", VARIABLE_THROUGHPUT_TIMER);
|
||||||
|
timer.setAttribute("testname", "jp@gc - Throughput Shaping Timer");
|
||||||
|
timer.setAttribute("enabled", "true");
|
||||||
|
|
||||||
|
Element collectionProp = document.createElement("collectionProp");
|
||||||
|
collectionProp.setAttribute("name", "load_profile");
|
||||||
|
Element childCollectionProp = document.createElement("collectionProp");
|
||||||
|
childCollectionProp.setAttribute("name", "140409499");
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "49", "1"));
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "49", "1"));
|
||||||
|
childCollectionProp.appendChild(createStringProp(document, "1570", "10"));
|
||||||
|
collectionProp.appendChild(childCollectionProp);
|
||||||
|
timer.appendChild(collectionProp);
|
||||||
|
timerParent.appendChild(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Element createStringProp(Document document, String name, String value) {
|
||||||
|
Element unit = document.createElement(STRING_PROP);
|
||||||
|
unit.setAttribute("name", name);
|
||||||
|
unit.appendChild(document.createTextNode(value));
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
|
||||||
private void processConcurrencyThreadGroup(Element concurrencyThreadGroup) {
|
private void processConcurrencyThreadGroup(Element concurrencyThreadGroup) {
|
||||||
if (concurrencyThreadGroup.getChildNodes().getLength() > 0) {
|
if (concurrencyThreadGroup.getChildNodes().getLength() > 0) {
|
||||||
final NodeList childNodes = concurrencyThreadGroup.getChildNodes();
|
final NodeList childNodes = concurrencyThreadGroup.getChildNodes();
|
||||||
|
@ -116,4 +205,10 @@ public class JmxFileParseTest {
|
||||||
private boolean valid(Element ele) {
|
private boolean valid(Element ele) {
|
||||||
return StringUtils.isBlank(ele.getAttribute("enabled")) || Boolean.parseBoolean(ele.getAttribute("enabled"));
|
return StringUtils.isBlank(ele.getAttribute("enabled")) || Boolean.parseBoolean(ele.getAttribute("enabled"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeChildren(Node node) {
|
||||||
|
while (node.hasChildNodes()) {
|
||||||
|
node.removeChild(node.getFirstChild());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue