org.zeroturnaround.jrebel.gradle.RebelXmlWriter Maven / Gradle / Ivy
package org.zeroturnaround.jrebel.gradle;
import static org.apache.commons.lang.StringEscapeUtils.escapeXml;
import static org.apache.commons.lang.StringUtils.repeat;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import org.zeroturnaround.jrebel.gradle.model.RebelClasspathResource;
import org.zeroturnaround.jrebel.gradle.model.RebelResource;
import org.zeroturnaround.jrebel.gradle.model.RebelWar;
import org.zeroturnaround.jrebel.gradle.model.RebelWebResource;
import org.zeroturnaround.jrebel.gradle.model.RebelMainModel;
/**
* Generate XML based on the in-memory model (RebelMainModel instance).
*
* XXX - jesus christ, there must be tens of better ways to generate xml! why....????? [sander]
*
* @author Igor Bljahhin (or maybe just a copy-paste from the Maven plugin?)
*/
public class RebelXmlWriter {
/**
* The main method generating the XML output.
*/
public String toXmlString(RebelMainModel model) {
Writer writer = new StringWriter();
try {
writeHeader(writer);
writeId(model, writer);
writeClasspath(model, writer);
writeWar(model, writer);
writeWeb(model, writer);
writeFooter(writer);
writer.flush();
return writer.toString();
}
// can't see it happening
catch (IOException e) {
return null;
}
finally {
// close the stream
if (writer != null) {
try {
writer.close();
}
catch (IOException e) {
}
}
}
}
private void writeHeader(Writer writer) throws IOException {
writer.write("\n");
writer.write("\n\n" +
"\n");
writer.write("\n");
}
private void writeId(RebelMainModel model, Writer writer) throws IOException {
writer.write(" " + model.getRemoteId() + " \n");
writer.write("\n");
}
/**
* Write the element.
*/
private void writeClasspath(RebelMainModel model, Writer writer) throws IOException {
writer.write(" \n");
// Classpath dirs
for (RebelClasspathResource resource : model.getClasspathDirs()) {
writer.write(" \n");
writeExcludeInclude(writer, resource);
writer.write(" \n");
}
// Classpath jars
for (RebelClasspathResource resource : model.getClasspathJars()) {
writer.write(" \n");
writeExcludeInclude(writer, resource);
writer.write(" \n");
}
// Classpath jarsets
for (RebelClasspathResource resource : model.getClasspathJarsets()) {
writer.write(" \n");
writeExcludeInclude(writer, resource);
writer.write(" \n");
}
// Classpath dirsets
for (RebelClasspathResource resource : model.getClasspathDirsets()) {
writer.write(" \n");
writeExcludeInclude(writer, resource);
writer.write(" \n");
}
writer.write(" \n");
writer.write("\n");
}
/**
* Write the element.
*/
private void writeWeb(RebelMainModel model, Writer writer) throws IOException {
// web resources
if (model.getWebResources().size() > 0) {
writer.write(" \n");
for (RebelWebResource r : model.getWebResources()) {
writer.write(" \n");
writer.write(" \n");
writeExcludeInclude(writer, r);
writer.write(" \n");
writer.write(" \n");
}
writer.write(" \n");
writer.write("\n");
}
}
/**
* Write the element.
*/
private void writeWar(RebelMainModel model, Writer writer) throws IOException {
RebelWar war = model.getWar();
if (war != null) {
if (war.getDir()!= null) {
writer.write(" \n");
} else if (war.getFile()!= null) {
writer.write(" \n");
}
writer.write("\n");
}
}
private void writeFooter(Writer writer) throws IOException {
writer.write(" \n");
}
private void writeExcludeInclude(Writer writer, RebelClasspathResource r) throws IOException {
writeExcludeIncludeImpl(writer, r, 3);
}
private void writeExcludeInclude(Writer writer, RebelWebResource r) throws IOException {
writeExcludeIncludeImpl(writer, r, 4);
}
/**
* Write and elements. This code is shared between writing multiple resources.
*/
private void writeExcludeIncludeImpl(Writer writer, RebelResource r, int indent) throws IOException {
String indention = repeat(" ", indent);
if (r.getExcludes() != null) {
for (String exclude : r.getExcludes()) {
writer.write(indention + " \n");
}
}
if (r.getIncludes() != null) {
for (String include : r.getIncludes()) {
writer.write(indention + " \n");
}
}
}
}