package org.radargun.config;
import java.lang.reflect.Type;
/**
* Converts definition back to XML. This is particularly useful when we want to inline
* configuration from external schema into benchmark config, as e.g.:
*
* <setup plugin="my-plugin">
* <my-service xmlns="urn:radargun:plugins:my-plugin:2.1" ...>
* <external-configuration>
* <foo-bar xmlns="urn:foo:bar:1.0" />
* </external-configuration>
* </my-service>
* </setup>
*
* where external-configuration is a String property with {@link Property#complexConverter()} set to {@link XmlConverter}.
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class XmlConverter implements ComplexConverter<String> {
@Override
public String convert(ComplexDefinition definition, Type type) {
StringBuilder sb = new StringBuilder();
appendDefinition(definition, sb, 0);
return sb.toString();
}
private void appendDefinition(ComplexDefinition definition, StringBuilder sb, int indent) {
for (ComplexDefinition.Entry entry : definition.getAttributes()) {
if (entry.definition instanceof SimpleDefinition) {
SimpleDefinition simpleDefinition = (SimpleDefinition) entry.definition;
if (simpleDefinition.source == SimpleDefinition.Source.TEXT) {
appendIndent(sb, indent);
if (!entry.name.isEmpty()) sb.append('<').append(entry.name).append('>');
sb.append(simpleDefinition.value);
if (!entry.name.isEmpty()) sb.append("</").append(entry.name).append(">\n");
}
} else if (entry.definition instanceof ComplexDefinition) {
ComplexDefinition complexDefinition = (ComplexDefinition) entry.definition;
appendIndent(sb, indent).append('<').append(entry.name);
if (complexDefinition.getNamespace() != null) {
sb.append(" xlmns=\"").append(complexDefinition.getNamespace()).append('"');
}
for (ComplexDefinition.Entry e2 : complexDefinition.getAttributes()) {
if (e2.definition instanceof SimpleDefinition) {
SimpleDefinition sd2 = (SimpleDefinition) e2.definition;
if (sd2.source == SimpleDefinition.Source.ATTRIBUTE) {
sb.append(' ').append(e2.name).append("=\"").append(sd2.value).append('"');
}
}
}
sb.append(">\n");
appendDefinition(complexDefinition, sb, indent + 4);
appendIndent(sb, indent).append("</").append(entry.name).append(">\n");
}
}
}
private StringBuilder appendIndent(StringBuilder sb, int indent) {
for (; indent > 0; --indent) sb.append(' ');
return sb;
}
@Override
public String convertToString(String value) {
return value;
}
}