/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.karaf.itest.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.util.UUID; import org.drools.core.util.StringUtils; public class FileManager { //private Set<File> files; private File root; public FileManager setUp() { this.root = getRootDirectory(); return this; } public void tearDown() { deleteDir( root ); } public File newFile(String name) { File file = new File( getRootDirectory(), name ); //files.add( file ); return file; } private File newFile(String path, String fileName) { File file = new File( getRootDirectory(), path ); file.mkdir(); //files.add( file ); return new File( file, fileName ); } public File newFile(File dir, String name) { File file = new File( dir, name ); //files.add( file ); return file; } public File getRootDirectory() { if ( this.root != null ) { return this.root; } File tmp = new File( System.getProperty( "java.io.tmpdir" ) ); File f = new File( tmp, "__drools__" + UUID.randomUUID().toString() ); //files.add( f ); if ( f.exists() ) { if ( f.isFile() ) { throw new IllegalStateException( "The temp directory exists as a file. Nuke it now !" ); } deleteDir( f ); f.mkdir(); } else { f.mkdir(); } this.root = f; return this.root; } public void deleteDir(File dir) { // Will throw RuntimeException is anything fails to delete String[] children = dir.list(); for ( String child : children ) { File file = new File( dir, child ); if ( file.isFile() ) { deleteFile( file ); } else { deleteDir( file ); } } deleteFile( dir ); } public void deleteFile(File file) { // This will attempt to delete a file 5 times, calling GC and Sleep between each iteration // Sometimes windows takes a while to release a lock on a file. // Throws an exception if it fails to delete if ( !file.delete() ) { int count = 0; while ( !file.delete() && count++ < 5 ) { System.gc(); try { Thread.sleep( 250 ); } catch ( InterruptedException e ) { throw new RuntimeException( "This should never happen" ); } } } if ( file.exists() ) { try { if ( System.getProperty( "os.name" ).toLowerCase().contains( "win" ) ) { // on windows platforms with JDK 6 or lower, a known bug will prevent // the files from being released until the JVM terminates // http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4950148 } else { throw new RuntimeException("Unable to delete file:" + file.getCanonicalPath()); } } catch ( IOException e ) { throw new RuntimeException( "Unable to delete file", e); } } } public void write(File f, String text) throws IOException { if ( f.exists() ) { // we want to make sure there is a time difference for lastModified and lastRead checks as Linux and http often round to seconds // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789 try { Thread.sleep( 1000 ); } catch ( Exception e ) { throw new RuntimeException( "Unable to sleep" ); } } else { // ensure that the directory structures exists new File(f.getParent()).mkdirs(); } // Attempt to write the file BufferedWriter output = new BufferedWriter( new FileWriter( f ) ); output.write( text ); output.close(); // Now check the file was written and re-attempt if it was not // Need to do this for testing, to ensure the texts are read the same way, otherwise sometimes you get tail \n sometimes you don't String t1 = StringUtils.toString( new StringReader( text ) ); int count = 0; while ( !t1.equals( StringUtils.toString( new BufferedReader( new FileReader( f ) ) ) ) && count < 5 ) { // The file failed to write, try 5 times, calling GC and sleep between each iteration // Sometimes windows takes a while to release a lock on a file System.gc(); try { Thread.sleep( 250 ); } catch ( InterruptedException e ) { throw new RuntimeException( "This should never happen" ); } output = new BufferedWriter( new FileWriter( f ) ); output.write( text ); output.close(); count++; } if ( count == 5 ) { throw new IOException( "Unable to write to file:" + f.getCanonicalPath() ); } } public File write(String fileName, String text) throws IOException { File f = newFile( fileName ); write( f, text ); return f; } public File write(String path, String fileName, String text) throws IOException { File f = newFile( path, fileName ); write( f, text ); return f; } public String readInputStreamReaderAsString(InputStreamReader in) throws IOException { StringBuffer fileData = new StringBuffer(1000); BufferedReader reader = new BufferedReader(in); char[] buf = new char[1024]; int numRead = 0; while ((numRead = reader.read(buf)) != -1) { String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } reader.close(); return fileData.toString(); } }