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.util.Arrays;
import static org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils.*;
/**
* Attributes that are read by legacy-style attribute parsing.
*/
public class FileAttributes
implements PlexusIoResourceAttributes
{
protected static final char VALUE_DISABLED_MODE = '-';
protected static final char VALUE_WRITABLE_MODE = 'w';
protected static final char VALUE_READABLE_MODE = 'r';
protected static final char VALUE_EXECUTABLE_MODE = 'x';
protected static final int INDEX_WORLD_EXECUTE = 9;
protected static final int INDEX_WORLD_WRITE = 8;
protected static final int INDEX_WORLD_READ = 7;
protected static final int INDEX_GROUP_EXECUTE = 6;
protected static final int INDEX_GROUP_WRITE = 5;
protected static final int INDEX_GROUP_READ = 4;
protected static final int INDEX_OWNER_EXECUTE = 3;
protected static final int INDEX_OWNER_WRITE = 2;
protected static final int INDEX_OWNER_READ = 1;
private Integer groupId;
private String groupName;
private Integer userId;
private String userName;
private char[] mode;
public FileAttributes(int mode){
this.mode = new char[10];
Arrays.fill( this.mode, VALUE_DISABLED_MODE );
setOctalMode( mode );
}
public FileAttributes(@Nonnull String lsMOdeLine)
{
mode = new char[10];
Arrays.fill( mode, VALUE_DISABLED_MODE );
setLsModeline( lsMOdeLine );
}
protected char[] getLsModeParts()
{
return mode;
}
private void setLsModeParts( @Nonnull char[] mode )
{
if ( mode.length < 10 )
{
this.mode = new char[10];
System.arraycopy( mode, 0, this.mode, 0, mode.length );
for ( int i = mode.length; i < 10; i++ )
{
this.mode[i] = VALUE_DISABLED_MODE;
}
}
else
{
this.mode = mode;
}
}
@Nullable public Integer getGroupId()
{
return groupId;
}
@Nullable public String getGroupName()
{
return groupName;
}
public Integer getUserId()
{
return userId;
}
public String getUserName()
{
return userName;
}
public boolean isGroupExecutable()
{
return checkFlag( '-', INDEX_GROUP_EXECUTE );
}
private boolean checkFlag( char disabledValue, int idx )
{
return mode != null && mode[idx] != disabledValue;
}
public boolean isGroupReadable()
{
return checkFlag( '-', INDEX_GROUP_READ );
}
public boolean isGroupWritable()
{
return checkFlag( '-', INDEX_GROUP_WRITE );
}
public boolean isOwnerExecutable()
{
return checkFlag( '-', INDEX_OWNER_EXECUTE );
}
public boolean isOwnerReadable()
{
return checkFlag( '-', INDEX_OWNER_READ );
}
public boolean isOwnerWritable()
{
return checkFlag( '-', INDEX_OWNER_WRITE );
}
public boolean isWorldExecutable()
{
return checkFlag( '-', INDEX_WORLD_EXECUTE );
}
public boolean isWorldReadable()
{
return checkFlag( '-', INDEX_WORLD_READ );
}
public boolean isWorldWritable()
{
return checkFlag( '-', INDEX_WORLD_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( userId != null ? userId.toString() : "");
sb.append( "\ngid: " );
sb.append( groupId != null ? groupId.toString() : "");
sb.append( "\nmode: " );
sb.append( mode == null ? "" : String.valueOf( mode ) );
return sb.toString();
}
public int getOctalMode()
{
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 PlexusIoResourceAttributes setGroupId( Integer gid )
{
this.groupId = gid;
return this;
}
public PlexusIoResourceAttributes setGroupName( String name )
{
this.groupName = name;
return this;
}
public PlexusIoResourceAttributes setUserId( Integer uid )
{
this.userId = uid;
return this;
}
public PlexusIoResourceAttributes setUserName( String name )
{
this.userName = name;
return this;
}
public PlexusIoResourceAttributes setLsModeline( @Nonnull String modeLine )
{
setLsModeParts( modeLine.toCharArray() );
return this;
}
private void setMode( char value, int modeIdx )
{
char[] mode = getLsModeParts();
mode[modeIdx] = value;
setLsModeParts( mode );
}
private void setOctalMode( int mode )
{
setExecutable( INDEX_OWNER_EXECUTE, isOwnerExecutableInOctal( mode ));
setExecutable( INDEX_GROUP_EXECUTE, isGroupExecutableInOctal( mode ) );
setExecutable( INDEX_WORLD_EXECUTE, isWorldExecutableInOctal( mode ));
setReadable( INDEX_OWNER_READ, isOwnerReadableInOctal( mode ));
setReadable( INDEX_GROUP_READ, isGroupReadableInOctal( mode ) );
setReadable( INDEX_WORLD_READ, isWorldReadableInOctal( mode ));
setWriteable( INDEX_OWNER_WRITE, isOwnerWritableInOctal( mode ));
setWriteable( INDEX_GROUP_WRITE, isGroupWritableInOctal( mode ) );
setWriteable( INDEX_WORLD_WRITE, isWorldWritableInOctal( mode ));
}
private void setExecutable( int index, boolean executable )
{
setMode( executable ? VALUE_EXECUTABLE_MODE : VALUE_DISABLED_MODE, index );
}
private void setReadable( int index, boolean readable )
{
setMode( readable ? VALUE_READABLE_MODE : VALUE_DISABLED_MODE, index );
}
private void setWriteable( int index, boolean writable )
{
setMode( writable ? VALUE_WRITABLE_MODE : VALUE_DISABLED_MODE, index );
}
// Legacy mode does not support symlinks
public boolean isSymbolicLink()
{
return false;
}
}