Package org.shiftone.jrat.core.output

Source Code of org.shiftone.jrat.core.output.OutputDirectory

package org.shiftone.jrat.core.output;

import org.shiftone.jrat.core.Settings;
import org.shiftone.jrat.util.Assert;
import org.shiftone.jrat.util.AtomicLong;
import org.shiftone.jrat.util.io.Dir;
import org.shiftone.jrat.util.log.Logger;
import java.io.File;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* @author $Author: jeffdrost $
* @version $Revision: 1.3 $
*/
public class OutputDirectory {

  private static final Logger LOG = Logger.getLogger(OutputDirectory.class);
  private final NumberFormat fileSeqFormat = new DecimalFormat("000");
  private final AtomicLong fileSequence = new AtomicLong();
  private final FileOutputFactory outputFactory;
  private final Dir outputDir;

  public OutputDirectory(FileOutputFactory outputFactory, Dir outputDir) {

    Assert.assertTrue(outputDir + ".exists()", outputDir.exists());
    Assert.assertTrue(outputDir + ".isDirectory()", outputDir.isDirectory());
    this.outputFactory = outputFactory;
    this.outputDir = outputDir;
  }

  public static OutputDirectory create(FileOutputFactory outputFactory) {

    return new OutputDirectory(outputFactory, createOutputDir());
  }

  private static Dir createOutputDir() {

    String applicationName = Settings.getApplicationName();
    Format format = new SimpleDateFormat("yyyy-MM-dd_a-hh-mm-ss");
    Dir parent = Settings.getBaseDirectory();
    if (applicationName != null) {
      parent = parent.createChildDir(applicationName);
    }
    parent.make();
    Dir outputDir = null;
    int maxAttempts = 100;
    while ((outputDir == null) && (maxAttempts > 0)) {
      try {
        Dir dir = parent.createChildDir(format.format(new Date()));
        dir.make();
        outputDir = dir;
      } catch (Exception e) {
        pause();
      }
      maxAttempts--;
    }
    LOG.info("output DIR = " + outputDir);
    return outputDir;
  }

  private static void pause() {

    try {
      Thread.sleep(50);
    } catch (Exception e) {
    }
  }

  public synchronized File createFile(String fileName) {

    Assert.assertNotNull("fileName", fileName);
    long fileNumber = fileSequence.incrementAndGet();
    return outputDir.createChild(fileSeqFormat.format(fileNumber) + "_" + fileName);
  }

  public PrintWriter createPrintWriter(String fileName) {

    return outputFactory.createPrintWriterSafely(createFile(fileName));
  }

  public OutputStream createOutputStream(String fileName) {

    return outputFactory.createOutputStreamSafely(createFile(fileName));
  }

  public Writer createWriter(String fileName) {

    return outputFactory.createWriterSafely(createFile(fileName));
  }
}
TOP

Related Classes of org.shiftone.jrat.core.output.OutputDirectory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.