All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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");
      }
    }
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy