001    package org.apache.maven.artifact.testutils;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *  http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    /*
023     * Licensed to the Apache Software Foundation (ASF) under one
024     * or more contributor license agreements.  See the NOTICE file
025     * distributed with this work for additional information
026     * regarding copyright ownership.  The ASF licenses this file
027     * to you under the Apache License, Version 2.0 (the
028     * "License"); you may not use this file except in compliance
029     * with the License.  You may obtain a copy of the License at
030     *
031     *  http://www.apache.org/licenses/LICENSE-2.0
032     *
033     * Unless required by applicable law or agreed to in writing,
034     * software distributed under the License is distributed on an
035     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
036     * KIND, either express or implied.  See the License for the
037     * specific language governing permissions and limitations
038     * under the License.
039     */
040    
041    import java.io.File;
042    import java.io.IOException;
043    import java.util.ArrayList;
044    import java.util.Iterator;
045    import java.util.List;
046    
047    import junit.framework.Assert;
048    
049    import org.codehaus.plexus.util.FileUtils;
050    
051    public class TestFileManager
052    {
053    
054        public static final String TEMP_DIR_PATH = System.getProperty( "java.io.tmpdir" );
055    
056        private List<File> filesToDelete = new ArrayList<File>();
057    
058        private final String baseFilename;
059    
060        private final String fileSuffix;
061    
062        private StackTraceElement callerInfo;
063    
064        private Thread cleanupWarning;
065    
066        private boolean warnAboutCleanup = false;
067    
068        public TestFileManager( String baseFilename, String fileSuffix )
069        {
070            this.baseFilename = baseFilename;
071            this.fileSuffix = fileSuffix;
072    
073            initializeCleanupMonitoring();
074        }
075    
076        private void initializeCleanupMonitoring()
077        {
078            callerInfo = new NullPointerException().getStackTrace()[2];
079    
080            Runnable warning = new Runnable()
081            {
082    
083                public void run()
084                {
085                    maybeWarnAboutCleanUp();
086                }
087    
088            };
089    
090            cleanupWarning = new Thread( warning );
091    
092            Runtime.getRuntime().addShutdownHook( cleanupWarning );
093        }
094    
095        private void maybeWarnAboutCleanUp()
096        {
097            if ( warnAboutCleanup )
098            {
099                System.out.println( "[WARNING] TestFileManager from: " + callerInfo.getClassName() + " not cleaned up!" );
100            }
101        }
102    
103        public void markForDeletion( File toDelete )
104        {
105            filesToDelete.add( toDelete );
106            warnAboutCleanup = true;
107        }
108    
109        public synchronized File createTempDir()
110        {
111            try
112            {
113                Thread.sleep( 20 );
114            }
115            catch ( InterruptedException e )
116            {
117                // ignore
118            }
119    
120            File dir = new File( TEMP_DIR_PATH, baseFilename + System.currentTimeMillis() );
121    
122            dir.mkdirs();
123            markForDeletion( dir );
124    
125            return dir;
126        }
127    
128        public synchronized File createTempFile()
129            throws IOException
130        {
131            File tempFile = File.createTempFile( baseFilename, fileSuffix );
132            tempFile.deleteOnExit();
133            markForDeletion( tempFile );
134    
135            return tempFile;
136        }
137    
138        public void cleanUp()
139            throws IOException
140        {
141            for ( Iterator it = filesToDelete.iterator(); it.hasNext(); )
142            {
143                File file = (File) it.next();
144    
145                if ( file.exists() )
146                {
147                    if ( file.isDirectory() )
148                    {
149                        FileUtils.deleteDirectory( file );
150                    }
151                    else
152                    {
153                        file.delete();
154                    }
155                }
156    
157                it.remove();
158            }
159    
160            warnAboutCleanup = false;
161        }
162    
163        public void assertFileExistence( File dir, String filename, boolean shouldExist )
164        {
165            File file = new File( dir, filename );
166    
167            if ( shouldExist )
168            {
169                Assert.assertTrue( file.exists() );
170            }
171            else
172            {
173                Assert.assertFalse( file.exists() );
174            }
175        }
176    
177        public void assertFileContents( File dir, String filename, String contentsTest, String encoding )
178            throws IOException
179        {
180            assertFileExistence( dir, filename, true );
181    
182            File file = new File( dir, filename );
183    
184            String contents = FileUtils.fileRead( file, encoding );
185    
186            Assert.assertEquals( contentsTest, contents );
187        }
188    
189        public File createFile( File dir, String filename, String contents, String encoding )
190            throws IOException
191        {
192            File file = new File( dir, filename );
193    
194            file.getParentFile().mkdirs();
195    
196            FileUtils.fileWrite( file.getPath(), encoding, contents );
197    
198            markForDeletion( file );
199    
200            return file;
201        }
202    
203        public String getFileContents( File file, String encoding )
204            throws IOException
205        {
206            return FileUtils.fileRead( file, encoding );
207        }
208    
209        protected void finalize()
210            throws Throwable
211        {
212            maybeWarnAboutCleanUp();
213    
214            super.finalize();
215        }
216    
217        public File createFile( String filename, String content, String encoding )
218            throws IOException
219        {
220            File dir = createTempDir();
221            return createFile( dir, filename, content, encoding );
222        }
223    
224    }