Package org.codehaus.plexus.archiver

Source Code of org.codehaus.plexus.archiver.ArchiveEntry

package org.codehaus.plexus.archiver;

/**
*
* Copyright 2004 The Apache Software 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.IOException;
import java.io.InputStream;

import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
import org.codehaus.plexus.components.io.resources.PlexusIoFileResource;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
import org.codehaus.plexus.components.io.resources.PlexusIoResourceWithAttributes;

/**
* @version $Revision: 1502 $ $Date: 2010-01-26 21:18:10 +0100 (Di, 26 Jan 2010) $
*/
public class ArchiveEntry
{
    public static final String ROLE = ArchiveEntry.class.getName();

    public static final int FILE = 1;

    public static final int DIRECTORY = 2;

    private PlexusIoResource resource;

    private String name;

    private int type;

    private int mode;

    private PlexusIoResourceAttributes attributes;

    /**
     * @param name     the filename as it will appear in the archive
     * @param original original filename
     * @param type     FILE or DIRECTORY
     * @param mode     octal unix style permissions
     */
    private ArchiveEntry( String name, PlexusIoResource resource, int type, int mode )
    {
        this.name = name;
        this.resource = resource;
        this.attributes =
            ( resource instanceof PlexusIoResourceWithAttributes ) ? ( (PlexusIoResourceWithAttributes) resource ).getAttributes()
                            : null;
        this.type = type;
        int permissions = mode;
       
        if ( mode == -1 && this.attributes == null )
        {
            permissions = resource.isFile() ? Archiver.DEFAULT_FILE_MODE : Archiver.DEFAULT_DIR_MODE;
        }
       
        this.mode = permissions == -1 ? permissions : ( permissions & UnixStat.PERM_MASK ) |
                    ( type == FILE ? UnixStat.FILE_FLAG : UnixStat.DIR_FLAG );
    }

    /**
     * @return the filename of this entry in the archive.
     */
    public String getName()
    {
        return name;
    }

    /**
     * @return The original file that will be stored in the archive.
     * @deprecated As of 1.0-alpha-10, file entries are no longer backed
     *   by files, but by instances of {@link PlexusIoResource}.
     *   Consequently, you should use {@link #getInputStream()}-
     */
    public File getFile()
    {
        if ( resource instanceof PlexusIoFileResource )
        {
            return ((PlexusIoFileResource) resource).getFile();
        }
        return null;
    }

    /**
     * @return The resource contents.
     */
    public InputStream getInputStream() throws IOException
    {
        return resource.getContents();
    }
   
    /**
     * TODO: support for SYMLINK?
     *
     * @return FILE or DIRECTORY
     */
    public int getType()
    {
        return type;
    }

    /**
     * @return octal user/group/other unix like permissions.
     */
    public int getMode()
    {
        if ( mode != -1 )
        {
            return mode;
        }
       
        if ( attributes != null && attributes.getOctalMode() > -1 )
        {
            return attributes.getOctalMode();
        }
       
        return ( ( type == FILE ? Archiver.DEFAULT_FILE_MODE : Archiver.DEFAULT_DIR_MODE ) & UnixStat.PERM_MASK ) |
                ( type == FILE ? UnixStat.FILE_FLAG : UnixStat.DIR_FLAG );
    }

    public static ArchiveEntry createFileEntry( String target, PlexusIoResource resource, int permissions )
        throws ArchiverException
    {
        if ( resource.isDirectory() )
        {
            throw new ArchiverException( "Not a file: " + resource.getName() );
        }
        return new ArchiveEntry( target, resource, FILE, permissions );
    }

    public static ArchiveEntry createFileEntry( String target, File file, int permissions )
        throws ArchiverException
    {
        if ( ! file.isFile() )
        {
            throw new ArchiverException( "Not a file: " + file );
        }
       
        PlexusIoResourceAttributes attrs;
        try
        {
            attrs = PlexusIoResourceAttributeUtils.getFileAttributes( file );
        }
        catch ( IOException e )
        {
            throw new ArchiverException( "Failed to read filesystem attributes for: " + file, e );
        }
       
        final PlexusIoFileResource res =  new PlexusIoFileResource( file, attrs );
        return new ArchiveEntry( target, res, FILE, permissions );
    }

    public static ArchiveEntry createDirectoryEntry( String target, PlexusIoResource resource, int permissions )
        throws ArchiverException
    {
        if ( ! resource.isDirectory() )
        {
            throw new ArchiverException( "Not a directory: " + resource.getName() );
        }
        return new ArchiveEntry( target, resource, DIRECTORY, permissions );
    }

    public static ArchiveEntry createDirectoryEntry( String target, final File file, int permissions )
        throws ArchiverException
    {
        if ( ! file.isDirectory() )
        {
            throw new ArchiverException( "Not a directory: " + file );
        }
       
        PlexusIoResourceAttributes attrs;
        try
        {
            attrs = PlexusIoResourceAttributeUtils.getFileAttributes( file );
        }
        catch ( IOException e )
        {
            throw new ArchiverException( "Failed to read filesystem attributes for: " + file, e );
        }
       
        final PlexusIoFileResource res = new PlexusIoFileResource( file, attrs );
        return new ArchiveEntry( target, res, DIRECTORY, permissions );
    }

    public static ArchiveEntry createEntry( String target, File file, int filePerm, int dirPerm )
        throws ArchiverException
    {
        if ( file.isDirectory() )
        {
            return createDirectoryEntry( target, file, dirPerm );
        }
        else if ( file.isFile() )
        {
            return createFileEntry( target, file, filePerm );
        }
        else // FIXME: handle symlinks?
        {
            throw new ArchiverException( "Neither a file nor a directory: " + file );
        }
    }
   
    public PlexusIoResourceAttributes getResourceAttributes()
    {
        return attributes;
    }
   
    public void setResourceAttributes( PlexusIoResourceAttributes attributes )
    {
        this.attributes = attributes;
    }

    public PlexusIoResource getResource()
    {
        return resource;
    }
}
TOP

Related Classes of org.codehaus.plexus.archiver.ArchiveEntry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.