package org.codehaus.plexus.components.io.filemappers;
/*
* Copyright 2007 The Codehaus Foundation.
*
* 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.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
import org.codehaus.plexus.components.io.resources.PlexusIoFileResource;
import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection;
import org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection;
import org.codehaus.plexus.util.FileUtils;
/**
* Test case for resource collections.
*/
public class ResourcesTest extends PlexusTestCase
{
private static final String X_PATH = "x";
private static final String A_PATH = X_PATH + "/a";
private static final String B_PATH = X_PATH + "/b";
private static final String Y_PATH = "y";
private File getTestDir() {
final String testDirPath = System.getProperty( "plexus.io.testDirPath" );
return new File( testDirPath == null ? "target/plexus.io.testDir" : testDirPath );
}
private File getFilesDir() {
return new File( getTestDir(), "files" );
}
private void createFiles() throws IOException {
final File baseDir = getFilesDir();
FileUtils.deleteDirectory( baseDir );
FileUtils.mkdir( baseDir.getPath() );
final File aFile = new File( baseDir, A_PATH );
FileUtils.mkdir( aFile.getParentFile().getPath() );
FileOutputStream fos = new FileOutputStream( aFile );
fos.write( "0123456789".getBytes( "US-ASCII" ) );
fos.close();
final File bFile = new File( baseDir, B_PATH );
fos = new FileOutputStream( bFile );
fos.write( "abcdefghijklmnopqrstuvwxyz".getBytes( "US-ASCII" ) );
fos.close();
final File yDir = new File( baseDir, Y_PATH );
FileUtils.mkdir( yDir.getPath() );
}
private void addDirToZipFile( ZipOutputStream zos, File dir, String path )
throws IOException
{
final String prefix = path == null ? "" : (path + "/");
File[] files = dir.listFiles();
for (File f : files) {
final String entryName = prefix + f.getName();
ZipEntry ze = new ZipEntry(entryName);
if (f.isFile()) {
ze.setSize(f.length());
zos.putNextEntry(ze);
FileInputStream fis = new FileInputStream(f);
byte[] buffer = new byte[1024];
for (; ; ) {
int res = fis.read(buffer);
if (res == -1) {
break;
}
if (res > 0) {
zos.write(buffer, 0, res);
}
}
fis.close();
ze.setTime(f.lastModified());
zos.closeEntry();
} else {
addDirToZipFile(zos, f, entryName);
}
}
}
private void createZipFile( File dest, File dir ) throws IOException
{
FileOutputStream fos = new FileOutputStream( dest );
ZipOutputStream zos = new ZipOutputStream( fos );
addDirToZipFile( zos, dir, null );
zos.close();
}
private void compare( InputStream in, File file )
throws IOException
{
InputStream fIn = new FileInputStream( file );
try
{
for ( ;; )
{
int i1 = in.read();
int i2 = fIn.read();
assertEquals( i2, i1 );
if ( i1 == -1 )
{
break;
}
}
}
finally
{
fIn.close();
}
}
private void compare( PlexusIoResource res, File file )
throws IOException
{
assertTrue( res.getLastModified() != PlexusIoResource.UNKNOWN_MODIFICATION_DATE );
if ( res instanceof PlexusIoFileResource )
{
assertEquals( res.getLastModified() / 1000, file.lastModified() / 1000 );
}
assertTrue( res.getSize() != PlexusIoResource.UNKNOWN_RESOURCE_SIZE );
assertEquals( res.getSize(), file.length() );
InputStream in = res.getContents();
compare( in, file );
in.close();
in = res.getURL().openStream();
compare( in, file );
in.close();
}
private void testPlexusIoResourceCollection( PlexusIoResourceCollection plexusIoResourceCollection )
throws IOException
{
boolean xPathSeen = false;
boolean yPathSeen = false;
boolean aFileSeen = false;
boolean bFileSeen = false;
for ( Iterator iter = plexusIoResourceCollection.getResources(); iter.hasNext(); )
{
PlexusIoResource res = (PlexusIoResource) iter.next();
final String resName = res.getName().replace( File.separatorChar, '/' );
if ( res.isDirectory() )
{
assertFalse( "The directory " + resName + " is a file.", res.isFile() );
if ( X_PATH.equals( resName ) )
{
xPathSeen = true;
}
else if ( Y_PATH.equals( resName ) )
{
yPathSeen = true;
}
else if ( "".equals( resName ) || ".".equals( resName ) )
{
// Ignore me
}
else
{
fail( "Unexpected directory entry: " + resName );
}
final File dir = new File( getFilesDir(), resName );
assertTrue( "The directory " + dir + " doesn't exist.", dir.isDirectory() );
}
else
{
assertTrue( "The file " + resName + " isn't reported to be a file.", res.isFile() );
assertTrue( "The file " + resName + " doesn't exist.", res.isExisting() );
final File f = new File( getFilesDir(), resName );
assertTrue( "A file " + f + " doesn't exist.", f.isFile() && f.exists() );
if ( A_PATH.equals( resName ) )
{
aFileSeen = true;
}
else if ( B_PATH.equals( resName ) )
{
bFileSeen = true;
}
else
{
fail( "Unexpected file entry: " + resName );
}
compare( res, f );
}
}
assertTrue( aFileSeen );
assertTrue( bFileSeen );
}
private void testFileResourceCollection( PlexusIoFileResourceCollection resourceCollection )
throws IOException
{
resourceCollection.setBaseDir( getFilesDir() );
testPlexusIoResourceCollection( resourceCollection );
}
public void testFileCollection() throws Exception
{
createFiles();
testFileResourceCollection( (PlexusIoFileResourceCollection) lookup( PlexusIoResourceCollection.ROLE, PlexusIoResourceCollection.DEFAULT_ROLE_HINT ) );
testFileResourceCollection( (PlexusIoFileResourceCollection) lookup( PlexusIoResourceCollection.ROLE, PlexusIoFileResourceCollection.ROLE_HINT ) );
}
private void testZipFileCollection( AbstractPlexusIoArchiveResourceCollection resourceCollection, File zipFile )
throws IOException
{
resourceCollection.setFile( zipFile );
testPlexusIoResourceCollection( resourceCollection );
}
public void testZipFileCollection() throws Exception
{
createFiles();
final File zipFile = new File( getTestDir(), "files.zip" );
createZipFile( zipFile, getFilesDir() );
testZipFileCollection( (AbstractPlexusIoArchiveResourceCollection) lookup( PlexusIoResourceCollection.ROLE, PlexusIoZipFileResourceCollection.ROLE_HINT ), zipFile );
testZipFileCollection( (AbstractPlexusIoArchiveResourceCollection) lookup( PlexusIoResourceCollection.ROLE, PlexusIoZipFileResourceCollection.JAR_ROLE_HINT ), zipFile );
}
}