001 package org.shiftone.jrat.core.output;
002
003
004 import org.shiftone.jrat.core.Environment;
005 import org.shiftone.jrat.util.Assert;
006 import org.shiftone.jrat.util.AtomicLong;
007 import org.shiftone.jrat.util.io.Dir;
008 import org.shiftone.jrat.util.io.IOUtil;
009 import org.shiftone.jrat.util.log.Logger;
010
011 import java.io.File;
012 import java.io.OutputStream;
013 import java.io.PrintWriter;
014 import java.io.Writer;
015 import java.text.DecimalFormat;
016 import java.text.Format;
017 import java.text.NumberFormat;
018 import java.text.SimpleDateFormat;
019 import java.util.ArrayList;
020 import java.util.Date;
021 import java.util.List;
022
023
024 /**
025 * @author jeff@shiftone.org (Jeff Drost)
026 */
027 public class OutputDirectory {
028
029 private static final Logger LOG = Logger.getLogger(OutputDirectory.class);
030
031 private final List fileList = new ArrayList(10);
032 private final NumberFormat fileSeqFormat = new DecimalFormat("000");
033 private final AtomicLong fileSequence = new AtomicLong();
034 private final FileOutputFactory outputFactory;
035 private final Dir outputDir;
036
037 public OutputDirectory(FileOutputFactory outputFactory, Dir outputDir) {
038
039 Assert.assertTrue(outputDir + ".exists()", outputDir.exists());
040 Assert.assertTrue(outputDir + ".isDirectory()", outputDir.isDirectory());
041
042 this.outputFactory = outputFactory;
043 this.outputDir = outputDir;
044 }
045
046
047 public static OutputDirectory create(FileOutputFactory outputFactory) {
048 return new OutputDirectory(outputFactory, createOutputDir());
049 }
050
051
052 private static Dir createOutputDir() {
053
054 String applicationName = Environment.getSettings().getApplicationName();
055 Format format = new SimpleDateFormat("yyyy-MM-dd_a-hh-mm-ss");
056 Dir parent = Environment.getSettings().getBaseDirectory();
057
058 if (applicationName != null) {
059 parent = parent.createChildDir(applicationName);
060 }
061
062 parent.make();
063
064 Dir outputDir = null;
065 int maxAttempts = 100;
066
067 while ((outputDir == null) && (maxAttempts > 0)) {
068 try {
069 Dir dir = parent.createChildDir(format.format(new Date()));
070
071 dir.make();
072
073 outputDir = dir;
074 }
075 catch (Exception e) {
076 pause();
077 }
078
079 maxAttempts--;
080 }
081
082 LOG.info("output DIR = " + outputDir);
083
084 return outputDir;
085 }
086
087
088 private static void pause() {
089
090 try {
091 Thread.sleep(50);
092 }
093 catch (Exception e) {
094 }
095 }
096
097 public synchronized File createFile(String fileName) {
098
099 Assert.assertNotNull("fileName", fileName);
100
101 File file = outputDir.createChild(fileName);
102
103 int i = 2;
104 while (file.exists()) {
105 file = outputDir.createChild(i + "_" + fileName);
106 i++;
107 }
108
109 IOUtil.createNewFile(file);
110
111 fileList.add(file);
112
113 return file;
114 }
115
116
117 public PrintWriter createPrintWriter(String fileName) {
118 return outputFactory.createPrintWriterSafely(createFile(fileName));
119 }
120
121
122 public OutputStream createOutputStream(String fileName) {
123 return outputFactory.createOutputStreamSafely(createFile(fileName));
124 }
125
126
127 public Writer createWriter(String fileName) {
128 return outputFactory.createWriterSafely(createFile(fileName));
129 }
130 }