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    }