001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.util;
018
019import java.io.File;
020import java.io.FileInputStream;
021import java.io.FileOutputStream;
022import java.io.IOException;
023import java.io.InputStream;
024import java.io.OutputStream;
025
026/**
027 * 
028 */
029public final class IOHelper {
030    protected static final int MAX_DIR_NAME_LENGTH;
031    protected static final int MAX_FILE_NAME_LENGTH;
032    private static final int DEFAULT_BUFFER_SIZE = 4096;
033    private IOHelper() {
034    }
035
036    public static String getDefaultDataDirectory() {
037        return getDefaultDirectoryPrefix() + "activemq-data";
038    }
039
040    public static String getDefaultStoreDirectory() {
041        return getDefaultDirectoryPrefix() + "amqstore";
042    }
043
044    /**
045     * Allows a system property to be used to overload the default data
046     * directory which can be useful for forcing the test cases to use a target/
047     * prefix
048     */
049    public static String getDefaultDirectoryPrefix() {
050        try {
051            return System.getProperty("org.apache.activemq.default.directory.prefix", "");
052        } catch (Exception e) {
053            return "";
054        }
055    }
056    
057    public static boolean deleteFile(File fileToDelete) {
058        if (fileToDelete == null || !fileToDelete.exists()) {
059            return true;
060        }
061        boolean result = deleteChildren(fileToDelete);
062        result &= fileToDelete.delete();
063        return result;
064    }
065    
066    public static boolean deleteChildren(File parent) {
067        if (parent == null || !parent.exists()) {
068            return false;
069        }
070        boolean result = true;
071        if (parent.isDirectory()) {
072            File[] files = parent.listFiles();
073            if (files == null) {
074                result = false;
075            } else {
076                for (int i = 0; i < files.length; i++) {
077                    File file = files[i];
078                    if (file.getName().equals(".")
079                            || file.getName().equals("..")) {
080                        continue;
081                    }
082                    if (file.isDirectory()) {
083                        result &= deleteFile(file);
084                    } else {
085                        result &= file.delete();
086                    }
087                }
088            }
089        }
090       
091        return result;
092    }
093    
094    
095    public static void moveFile(File src, File targetDirectory) throws IOException {
096        if (!src.renameTo(new File(targetDirectory, src.getName()))) {
097            throw new IOException("Failed to move " + src + " to " + targetDirectory);
098        }
099    }
100    
101    public static void copyFile(File src, File dest) throws IOException {
102        FileInputStream fileSrc = new FileInputStream(src);
103        FileOutputStream fileDest = new FileOutputStream(dest);
104        copyInputStream(fileSrc, fileDest);
105    }
106    
107    public static void copyInputStream(InputStream in, OutputStream out) throws IOException {
108        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
109        int len = in.read(buffer);
110        while (len >= 0) {
111            out.write(buffer, 0, len);
112            len = in.read(buffer);
113        }
114        in.close();
115        out.close();
116    }
117    
118    static {
119        MAX_DIR_NAME_LENGTH = Integer.valueOf(System.getProperty("MaximumDirNameLength","200")).intValue();  
120        MAX_FILE_NAME_LENGTH = Integer.valueOf(System.getProperty("MaximumFileNameLength","64")).intValue();             
121    }
122
123    
124    public static void mkdirs(File dir) throws IOException {
125        if (dir.exists()) {
126            if (!dir.isDirectory()) {
127                throw new IOException("Failed to create directory '" + dir +"', regular file already existed with that name");
128            }
129            
130        } else {
131            if (!dir.mkdirs()) {
132                throw new IOException("Failed to create directory '" + dir+"'");
133            }
134        }
135    }
136}