001    /**
002     * Copyright 2010-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.codehaus.mojo.license;
017    
018    /* 
019     * Codehaus License Maven Plugin
020     *     
021     * This program is free software: you can redistribute it and/or modify
022     * it under the terms of the GNU Lesser General Public License as published by
023     * the Free Software Foundation, either version 3 of the License, or
024     * (at your option) any later version.
025     *
026     * This program is distributed in the hope that it will be useful,
027     * but WITHOUT ANY WARRANTY; without even the implied warranty of
028     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
029     * GNU Lesser General Public License for more details.
030     *
031     * You should have received a copy of the GNU Lesser General Public License
032     * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
033     */
034    
035    import org.codehaus.plexus.util.FileUtils;
036    import org.codehaus.plexus.util.IOUtil;
037    
038    import java.io.*;
039    
040    /**
041     * Some basic file io utilities
042     *
043     * @author pgier
044     * @author tchemit <chemit@codelutin.com>
045     * @since 1.0
046     */
047    public class FileUtil
048    {
049    
050        public static void tryClose( InputStream is )
051        {
052            if ( is == null )
053            {
054                return;
055            }
056            try
057            {
058                is.close();
059            }
060            catch ( IOException e )
061            {
062                // do nothing
063            }
064        }
065    
066        public static void tryClose( OutputStream os )
067        {
068            if ( os == null )
069            {
070                return;
071            }
072            try
073            {
074                os.close();
075            }
076            catch ( IOException e )
077            {
078                // do nothing
079            }
080        }
081    
082        /**
083         * Creates the directory (and his parents) if necessary.
084         *
085         * @param dir the directory to create if not exisiting
086         * @return {@code true} if directory was created, {@code false} if was no
087         *         need to create it
088         * @throws IOException if could not create directory
089         */
090        public static boolean createDirectoryIfNecessary( File dir )
091            throws IOException
092        {
093            if ( !dir.exists() )
094            {
095                boolean b = dir.mkdirs();
096                if ( !b )
097                {
098                    throw new IOException( "Could not create directory " + dir );
099                }
100                return true;
101            }
102            return false;
103        }
104    
105        public static boolean createNewFile( File file )
106            throws IOException
107        {
108            createDirectoryIfNecessary( file.getParentFile() );
109            if ( !file.exists() )
110            {
111                boolean b = file.createNewFile();
112                if ( !b )
113                {
114                    throw new IOException( "Could not create new file " + file );
115                }
116                return true;
117            }
118            return false;
119        }
120    
121        /**
122         * Delete the given file.
123         *
124         * @param file the file to delete
125         * @throws IOException if could not delete the file
126         */
127        public static void deleteFile( File file )
128            throws IOException
129        {
130            if ( !file.exists() )
131            {
132                // file does not exist, can not delete it
133                return;
134            }
135            boolean b = file.delete();
136            if ( !b )
137            {
138                throw new IOException( "could not delete file " + file );
139            }
140        }
141    
142        /**
143         * Rename the given file to a new destination.
144         *
145         * @param file        the file to rename
146         * @param destination the destination file
147         * @throws IOException if could not rename the file
148         */
149        public static void renameFile( File file, File destination )
150            throws IOException
151        {
152            boolean b = file.renameTo( destination );
153            if ( !b )
154            {
155                throw new IOException( "could not rename " + file + " to " + destination );
156            }
157        }
158    
159        /**
160         * Copy a file to a given locationand logging.
161         *
162         * @param source represents the file to copy.
163         * @param target file name of destination file.
164         * @throws IOException if could not copy file.
165         */
166        public static void copyFile( File source, File target )
167            throws IOException
168        {
169            createDirectoryIfNecessary( target.getParentFile() );
170            FileUtils.copyFile( source, target );
171        }
172    
173        public static File getFile( File base, String... paths )
174        {
175            StringBuilder buffer = new StringBuilder();
176            for ( String path : paths )
177            {
178                buffer.append( File.separator ).append( path );
179            }
180            return new File( base, buffer.substring( 1 ) );
181        }
182    
183        /**
184         * @param file the source file
185         * @return the backup file
186         */
187        public static File getBackupFile( File file )
188        {
189            return new File( file.getAbsolutePath() + "~" );
190        }
191    
192        /**
193         * Backups the given file using the {@link FileUtil#getBackupFile(File)} as
194         * destination file.
195         *
196         * @param f the file to backup
197         * @throws IOException if any pb while copying the file
198         */
199        public static void backupFile( File f )
200            throws IOException
201        {
202            File dst = FileUtil.getBackupFile( f );
203            copyFile( f, dst );
204        }
205    
206        /**
207         * Permet de lire un fichier et de retourner sont contenu sous forme d'une
208         * chaine de carateres
209         *
210         * @param file     le fichier a lire
211         * @param encoding encoding to read file
212         * @return the content of the file
213         * @throws IOException if IO pb
214         */
215        static public String readAsString( File file, String encoding )
216            throws IOException
217        {
218            FileInputStream inf = new FileInputStream( file );
219            BufferedReader in = new BufferedReader( new InputStreamReader( inf, encoding ) );
220            try
221            {
222                return IOUtil.toString( in );
223            }
224            finally
225            {
226                in.close();
227            }
228        }
229    
230        /**
231         * Sauvegarde un contenu dans un fichier.
232         *
233         * @param file     le fichier a ecrire
234         * @param content  le contenu du fichier
235         * @param encoding l'encoding d'ecriture
236         * @throws IOException if IO pb
237         */
238        public static void writeString( File file, String content, String encoding )
239            throws IOException
240        {
241            createDirectoryIfNecessary( file.getParentFile() );
242            BufferedWriter out;
243            out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), encoding ) );
244            try
245            {
246                IOUtil.copy( content, out );
247            }
248            finally
249            {
250                out.close();
251            }
252        }
253    }