package org.codehaus.plexus.components.io.attributes;
/*
* 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 javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileOwnerAttributeView;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* File attributes for a java7 file that are backed on disk by a file.
* Immutable
*/
public class Java7FileAttributes
implements PlexusIoResourceAttributes
{
@Nullable
private final Integer groupId;
@Nullable
private final String groupName;
@Nullable
private final Integer userId;
private final String userName;
private final boolean symbolicLink;
private final int octalMode;
private final Set<PosixFilePermission> permissions;
public Java7FileAttributes( @Nonnull File file, @Nonnull Map<Integer, String> userCache,
@Nonnull Map<Integer, String> groupCache )
throws IOException
{
BasicFileAttributes basicFileAttributes = Java7AttributeUtils.getFileAttributes( file );
if ( basicFileAttributes instanceof PosixFileAttributes )
{
this.permissions = ( (PosixFileAttributes) basicFileAttributes ).permissions();
groupId = (Integer) Files.readAttributes( file.toPath(), "unix:gid" ).get( "gid" );
String groupName = groupCache.get( groupId );
if ( groupName != null )
{
this.groupName = groupName;
}
else
{
this.groupName = ( (PosixFileAttributes) basicFileAttributes ).group().getName();
groupCache.put( groupId, this.groupName );
}
userId = (Integer) Files.readAttributes( file.toPath(), "unix:uid" ).get( "uid" );
String userName = userCache.get( userId );
if ( userName != null )
{
this.userName = userName;
}
else
{
this.userName = ( (PosixFileAttributes) basicFileAttributes ).owner().getName();
userCache.put( userId, this.userName );
}
octalMode = calculatePosixOctalMode();
} else {
FileOwnerAttributeView fa = Java7AttributeUtils.getFileOwnershipInfo( file );
this.userName = fa.getOwner().getName();
userId = null;
this.groupName = null;
this.groupId = null;
octalMode = -1;
permissions = Collections.emptySet();
}
symbolicLink = Files.isSymbolicLink( file.toPath() );
}
public static @Nonnull PlexusIoResourceAttributes uncached( @Nonnull File file )
throws IOException
{
return new Java7FileAttributes( file, new HashMap<Integer, String>(), new HashMap<Integer, String>() );
}
@Nullable public Integer getGroupId()
{
return groupId;
}
public boolean hasGroupId()
{
return false;
}
public boolean hasUserId()
{
return false;
}
@Nullable public String getGroupName()
{
return groupName;
}
public Integer getUserId()
{
return userId;
}
public String getUserName()
{
return userName;
}
public boolean isGroupExecutable()
{
return containsPermission( PosixFilePermission.GROUP_EXECUTE );
}
private boolean containsPermission( PosixFilePermission groupExecute )
{
return permissions.contains( groupExecute );
}
public boolean isGroupReadable()
{
return containsPermission( PosixFilePermission.GROUP_READ );
}
public boolean isGroupWritable()
{
return containsPermission( PosixFilePermission.GROUP_WRITE );
}
public boolean isOwnerExecutable()
{
return containsPermission( PosixFilePermission.OWNER_EXECUTE );
}
public boolean isOwnerReadable()
{
return containsPermission( PosixFilePermission.OWNER_READ );
}
public boolean isOwnerWritable()
{
return containsPermission( PosixFilePermission.OWNER_WRITE );
}
public boolean isWorldExecutable()
{
return containsPermission( PosixFilePermission.OTHERS_EXECUTE );
}
public boolean isWorldReadable()
{
return containsPermission( PosixFilePermission.OTHERS_READ );
}
public boolean isWorldWritable()
{
return containsPermission( PosixFilePermission.OTHERS_WRITE );
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "\nFile Attributes:\n------------------------------\nuser: " );
sb.append( userName == null ? "" : userName );
sb.append( "\ngroup: " );
sb.append( groupName == null ? "" : groupName );
sb.append( "\nuid: " );
sb.append( hasUserId() ? Integer.toString( userId ) : "" );
sb.append( "\ngid: " );
sb.append( hasGroupId() ? Integer.toString( groupId ) : "" );
return sb.toString();
}
public int getOctalMode()
{
return octalMode;
}
public int calculatePosixOctalMode()
{
int result = 0;
if ( isOwnerReadable() )
{
result |= AttributeConstants.OCTAL_OWNER_READ;
}
if ( isOwnerWritable() )
{
result |= AttributeConstants.OCTAL_OWNER_WRITE;
}
if ( isOwnerExecutable() )
{
result |= AttributeConstants.OCTAL_OWNER_EXECUTE;
}
if ( isGroupReadable() )
{
result |= AttributeConstants.OCTAL_GROUP_READ;
}
if ( isGroupWritable() )
{
result |= AttributeConstants.OCTAL_GROUP_WRITE;
}
if ( isGroupExecutable() )
{
result |= AttributeConstants.OCTAL_GROUP_EXECUTE;
}
if ( isWorldReadable() )
{
result |= AttributeConstants.OCTAL_WORLD_READ;
}
if ( isWorldWritable() )
{
result |= AttributeConstants.OCTAL_WORLD_WRITE;
}
if ( isWorldExecutable() )
{
result |= AttributeConstants.OCTAL_WORLD_EXECUTE;
}
return result;
}
public String getOctalModeString()
{
return Integer.toString( getOctalMode(), 8 );
}
public boolean isSymbolicLink()
{
return symbolicLink;
}
}