// Copyright � 2002-2007 Canoo Engineering AG, Switzerland. Released under the Canoo Webtest license. package com.canoo.webtest.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.canoo.webtest.boundary.StreamBoundary; import com.canoo.webtest.engine.StepExecutionException; import com.canoo.webtest.steps.Step; import com.gargoylesoftware.htmlunit.WebResponse; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; /** * Utility class for working with files. * * @author Paul King */ public class FileUtil { private static final Logger LOG = Logger.getLogger(FileUtil.class); /** * Reads a file into a String. * * @param file * @param step * @return the resulting String */ public static String readFileToString(final File file, final Step step) { String canonicalPath = null; String result = null; InputStream inputStream = null; try { canonicalPath = file.getCanonicalPath(); inputStream = new FileInputStream(file); result = IOUtils.toString(inputStream); } catch (IOException e) { throw new StepExecutionException("Could not find/read \"" + canonicalPath + "\".", step); } finally { IOUtils.closeQuietly(inputStream); } return result; } /** * Reads a file into a byte[]. * * @param file * @param step * @return the resulting byte[] */ public static byte[] readFileToByteArray(final File file, final Step step) { String canonicalPath = null; byte[] result = null; InputStream inputStream = null; try { canonicalPath = file.getCanonicalPath(); inputStream = new FileInputStream(file); result = IOUtils.toByteArray(inputStream); } catch (IOException e) { throw new StepExecutionException("Could not find/read \"" + canonicalPath + "\".", step); } finally { IOUtils.closeQuietly(inputStream); } return result; } /** * Writes a String to a file. * * @param file * @param content * @param step * @throws StepExecutionException if something goes wrong */ public static void writeStringToFile(final File file, final String content, final Step step) { String canonicalPath = null; FileOutputStream outputStream = null; try { canonicalPath = file.getCanonicalPath(); outputStream = new FileOutputStream(file); IOUtils.write(content, outputStream); } catch (IOException e) { throw new StepExecutionException("Could not find/write \"" + canonicalPath + "\".", step); } finally { IOUtils.closeQuietly(outputStream); } } /** * Writes a Stream to a file. * * @param inputResponse * @param destfile * @param step * @throws StepExecutionException if something goes wrong */ public static void writeResponseStreamToFile(final WebResponse inputResponse, final File destfile, final Step step) { String canonicalPath = null; FileOutputStream outputStream = null; try { canonicalPath = destfile.getCanonicalPath(); outputStream = new FileOutputStream(destfile); IOUtils.copy(inputResponse.getContentAsStream(), outputStream); } catch (IOException e) { throw new StepExecutionException("Could not find/write \"" + canonicalPath + "\".", step); } finally { IOUtils.closeQuietly(outputStream); } } /** * Creates parent directory for file if required. * * @param file */ public static void prepareDirs(final File file) { if (file.getParentFile() != null && !file.getParentFile().exists()) { prepareDirs(file.getParentFile()); file.getParentFile().mkdirs(); } } /** * Helper method for reading objects from a file. * * @param file the file to read from * @param step step requesting the operation * @return the object from the file if everything worked correctly */ public static Object tryReadObjectFromFile(final File file, final Step step) { FileInputStream fis = null; ObjectInputStream ois = null; String message="finding"; try { fis = new FileInputStream(file); ois = new ObjectInputStream(fis); message = "reading from"; return StreamBoundary.tryReadObject(ois, step); } catch (IOException e) { LOG.error(e.getMessage(), e); throw new StepExecutionException("Error " + message + " file: " + e.getMessage(), step); } finally { IOUtils.closeQuietly(ois); IOUtils.closeQuietly(fis); } } /** * Helper method for writing objects to a file. * * @param file the file to write to * @param object the object to write * @param step step requesting the operation */ public static boolean tryWriteObjectToFile(final File file, final Object object, final Step step) { FileOutputStream fos = null; ObjectOutputStream oos = null; String message = "creating"; boolean success = false; try { fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); message = "filling"; oos.writeObject(object); success = true; } catch (IOException e) { LOG.error("Error during write: " + e.getMessage(), e); if (step != null) { throw new StepExecutionException("Error " + message + " file: " + e.getMessage(), step); } } finally { StreamBoundary.closeOutputStream(oos); StreamBoundary.closeOutputStream(fos); } return success; } /** * Creates a temporary file using a prefix and suffix and marks it for deletion on exit. * * @param prefix * @param suffix * @param step * @throws StepExecutionException if an error occurs while creating the file * @return the newly created temp file */ public static File tryCreateTempFile(final String prefix, final String suffix, final Step step) { final File tmpFile; try { tmpFile = File.createTempFile(prefix, suffix); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new StepExecutionException("Error creating temporary file " + e.getMessage(), step); } tmpFile.deleteOnExit(); return tmpFile; } }