package org.codehaus.plexus.components.io.resources; /* * 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 org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes; import org.codehaus.plexus.components.io.functions.ContentSupplier; import org.codehaus.plexus.components.io.functions.InputStreamTransformer; import org.codehaus.plexus.components.io.functions.PlexusIoResourceConsumer; import javax.annotation.Nonnull; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.Iterator; /** * Abstract base class for compressed files, aka singleton * resource collections. */ public abstract class PlexusIoCompressedFileResourceCollection implements PlexusIoArchivedResourceCollection, Iterable<PlexusIoResource> { private File file; private String path; private InputStreamTransformer streamTransformers = AbstractPlexusIoResourceCollection.identityTransformer; public File getFile() { return file; } public void setFile( File file ) { this.file = file; } public String getPath() { return path; } public void setPath( String path ) { this.path = path; } // return the file attributes of the uncompressed file // may be null. protected abstract PlexusIoResourceAttributes getAttributes( File f ) throws IOException; public void setStreamTransformer( InputStreamTransformer streamTransformers ) { this.streamTransformers = streamTransformers; } public Stream stream() { return new Stream() { public void forEach( PlexusIoResourceConsumer resourceConsumer ) throws IOException { final Iterator<PlexusIoResource> it = getResources(); while( it.hasNext()) { resourceConsumer.accept( it.next() ); } if (it instanceof Closeable ) { ((Closeable)it).close(); } } }; } public Iterator<PlexusIoResource> getResources() throws IOException { final File f = getFile(); final String p = ( getPath() == null ? getName( f ) : getPath() ).replace( '\\', '/' ); if ( f == null ) { throw new IOException( "No archive file is set." ); } if ( !f.isFile() ) { throw new IOException( "The archive file " + f.getPath() + " does not exist or is no file." ); } final PlexusIoResourceAttributes attributes = getAttributes( f ); final ContentSupplier contentSupplier = new ContentSupplier() { @Nonnull public InputStream getContents() throws IOException { return getInputStream( f ); } }; final PlexusIoResource resource = ResourceFactory.createResource( f, p, contentSupplier, attributes ); return Collections.singleton( resource ).iterator(); } protected String getName( File file ) throws IOException { final String name = file.getPath(); final String ext = getDefaultExtension(); if ( ext != null && ext.length() > 0 && name.endsWith( ext ) ) { return name.substring( 0, name.length() - ext.length() ); } return name; } protected abstract String getDefaultExtension(); protected abstract @Nonnull InputStream getInputStream( File file ) throws IOException; public InputStream getInputStream( PlexusIoResource resource ) throws IOException { InputStream contents = resource.getContents(); return new ClosingInputStream( streamTransformers.transform( resource, contents ), contents ); } public PlexusIoResource resolve( final PlexusIoResource resource ) throws IOException { final Deferred deferred = new Deferred( resource, this, streamTransformers != AbstractPlexusIoResourceCollection.identityTransformer ); return deferred.asResource(); } public Iterator<PlexusIoResource> iterator() { try { return getResources(); } catch ( IOException e ) { throw new RuntimeException( e ); } } public String getName( PlexusIoResource resource ) { return resource.getName(); } public long getLastModified() throws IOException { File f = getFile(); return f == null ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : f.lastModified(); } }