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 }