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    }