001 package railo.commons.io; 002 003 import java.io.IOException; 004 import java.io.InputStream; 005 006 import railo.commons.io.res.Resource; 007 import railo.commons.lang.StringUtil; 008 009 public class FileRotation { 010 public static void checkFile(Resource res, long maxFileSize, int maxFiles, byte[] header) throws IOException { 011 boolean writeHeader=false; 012 // create file 013 if(!res.exists()) { 014 res.createFile(true); 015 writeHeader=true; 016 } 017 else if(res.length()==0) { 018 writeHeader=true; 019 } 020 021 022 // create new file 023 else if(res.length()>maxFileSize) { 024 Resource parent = res.getParentResource(); 025 String name = res.getName(); 026 int lenMaxFileSize=(""+maxFiles).length(); 027 for(int i=maxFiles;i>0;i--) { 028 029 Resource to=parent.getRealResource(name+"."+StringUtil.addZeros(i, lenMaxFileSize)+".bak"); 030 Resource from=parent.getRealResource(name+"."+StringUtil.addZeros(i-1,lenMaxFileSize)+".bak"); 031 if(from.exists()) { 032 if(to.exists())to.delete(); 033 from.renameTo(to); 034 } 035 } 036 res.renameTo(parent.getRealResource(name+"."+StringUtil.addZeros(1,lenMaxFileSize)+".bak")); 037 res=parent.getRealResource(name);//new File(parent,name); 038 res.createNewFile(); 039 writeHeader=true; 040 } 041 else if(header!=null && header.length>0) { 042 byte[] buffer = new byte[header.length]; 043 int len; 044 InputStream in = null; 045 try{ 046 in = res.getInputStream(); 047 boolean headerOK = true; 048 len = in.read(buffer); 049 if(len==header.length){ 050 for(int i=0;i<header.length;i++) { 051 if(header[i]!=buffer[i]){ 052 headerOK=false; 053 break; 054 } 055 } 056 } 057 else headerOK=false; 058 if(!headerOK)writeHeader=true; 059 } 060 finally { 061 IOUtil.closeEL(in); 062 } 063 } 064 065 066 if(writeHeader) { 067 if(header==null)header=new byte[0]; 068 IOUtil.write(res, header,false); 069 070 } 071 } 072 }