@Override
  public Element build(Map<String, String> properties, Progress progress)
      throws CruiseControlException {
    final long startTime = System.currentTimeMillis();
    final Element status = new Element("writer");
    OutputStream out = null;
    java.io.File f;

    // Resolve properties in the settings. Fail. if they cannot be resolved
    final String fname =
        Util.parsePropertiesInString(properties, this.file.getAbsolutePath(), true);
    f = new java.io.File(fname);

    try {
      // The output file must not exist
      if (!this.overwrite && f.exists()) {
        throw new IOException("File " + f + " exists but overwrite=false");
      }
      // gzip compression is set on
      if (this.gzip) {
        if (!f.getName().endsWith(".gzip")) {
          f = new java.io.File(f.getAbsolutePath() + ".gzip");
        }
        out = new GZIPOutputStream(new FileOutputStream(f, this.append));
        // not-compressed file is required
      } else {
        out = new FileOutputStream(f, this.append);
      }

      // Pass content to the consumer
      for (Content message : this.messages) {
        new StreamPumper(message.getContent(properties), getStreamConsumer(out, encoding)).run();
      }

    } catch (Exception exc) {
      status.setAttribute("error", "build failed with exception: " + exc.getMessage());
    } finally {
      IO.close(out);
    }

    final long endTime = System.currentTimeMillis();
    status.setAttribute("time", DateUtil.getDurationAsString((endTime - startTime)));

    return status;
  }
  public void testWrite() throws Exception {
    FileWriter fw = null;
    File outFile = null;

    try {
      outFile = File.createTempFile("FeedTest", "tmp");
      filesToDelete.add(outFile);
      fw = new FileWriter(outFile);
      Feed feed = new Feed(tempFile);
      feed.write(fw);
      fw.close();

      // Feed feed2 = new Feed(outFile);
      assertEquals("CruiseControl Build Results", feed.getTitle());
      assertEquals("http://MyMachine.MyDomain.com/cruisecontrol/", feed.getLink());
      assertEquals(
          "Automated build results for CruiseControl project(s) VERSION_10", feed.getDescription());

      // validate the number of items and the contents of the first item.
      assertEquals(11, feed.getItems().size());
      Item item = (Item) feed.getItems().get(0);
      assertEquals("VERSION_10 build.7 Build Successful", item.getTitle());
      assertEquals(
          "http://MyMachine.MyDomain.com/cruisecontrol/buildresults/"
              + "VERSION_10?log=log20050817084109Lbuild.7",
          item.getLink());
      assertEquals(
          "<em>Build Time:</em> Wed Aug 17 08:41:09 MDT 2005<br/>"
              + "<em>Label:</em> build.7<br/><em>Modifications: </em>1<br/>"
              + "\n<ul><li>//depot/MyProduct/VERSION_10/dev/main/src/datacenter/"
              + "ApplicationServer/PlayTime/default.build"
              + "  by jefferson (deploy the mock object dll)</li></ul>",
          item.getDescription());
    } finally {
      IO.close(fw);
    }
  }