Copyright (c) 2005, 2015 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
Martin Oberhuber (Wind River) - [170317] add symbolic link support to API
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Martin Oberhuber (Wind River) - [170317] add symbolic link support to API
*******************************************************************************/
package org.eclipse.core.filesystem.provider;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.internal.filesystem.local.LocalFileNativesManager;
This class should be used by file system providers in their implementation of API methods that return IFileInfo
objects. Since: org.eclipse.core.filesystem 1.0 @noextend This class is not intended to be subclassed by clients.
/**
* This class should be used by file system providers in their implementation
* of API methods that return {@link IFileInfo} objects.
*
* @since org.eclipse.core.filesystem 1.0
* @noextend This class is not intended to be subclassed by clients.
*/
public class FileInfo implements IFileInfo {
Internal attribute indicating if the file is a directory
/**
* Internal attribute indicating if the file is a directory
*/
private static final int ATTRIBUTE_DIRECTORY = 1 << 0;
Internal attribute indicating if the file exists.
/**
* Internal attribute indicating if the file exists.
*/
private static final int ATTRIBUTE_EXISTS = 1 << 16;
Bit field of file attributes. Initialized to specify a writable resource.
/**
* Bit field of file attributes. Initialized to specify a writable resource.
*/
private int attributes = EFS.ATTRIBUTE_OWNER_WRITE | EFS.ATTRIBUTE_OWNER_READ;
private int errorCode = NONE;
The last modified time.
/**
* The last modified time.
*/
private long lastModified = EFS.NONE;
The file length.
/**
* The file length.
*/
private long length = EFS.NONE;
The file name.
/**
* The file name.
*/
private String name = ""; //$NON-NLS-1$
The target file name if this is a symbolic link
/**
* The target file name if this is a symbolic link
*/
private String linkTarget = null;
Creates a new file information object with default values.
/**
* Creates a new file information object with default values.
*/
public FileInfo() {
super();
}
Creates a new file information object. All values except the file name
will have default values.
Params: - name – The name of this file
/**
* Creates a new file information object. All values except the file name
* will have default values.
*
* @param name The name of this file
*/
public FileInfo(String name) {
super();
this.name = name;
}
Convenience method to clear a masked region of the attributes bit field.
Params: - mask – The mask to be cleared
/**
* Convenience method to clear a masked region of the attributes bit field.
*
* @param mask The mask to be cleared
*/
private void clear(int mask) {
attributes &= ~mask;
}
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// We know this object is cloneable.
return null;
}
}
Since: 1.5
/**
* @since 1.5
*/
@Override
public int compareTo(IFileInfo o) {
return name.compareTo(o.getName());
}
@Override
public boolean exists() {
return getAttribute(ATTRIBUTE_EXISTS);
}
Since: 1.4
/**
* @since 1.4
*/
@Override
public int getError() {
return errorCode;
}
@Override
public boolean getAttribute(int attribute) {
if (attribute == EFS.ATTRIBUTE_READ_ONLY && isAttributeSuported(EFS.ATTRIBUTE_OWNER_WRITE))
return (!isSet(EFS.ATTRIBUTE_OWNER_WRITE)) || isSet(EFS.ATTRIBUTE_IMMUTABLE);
else if (attribute == EFS.ATTRIBUTE_EXECUTABLE && isAttributeSuported(EFS.ATTRIBUTE_OWNER_EXECUTE))
return isSet(EFS.ATTRIBUTE_OWNER_EXECUTE);
else
return isSet(attribute);
}
@Override
public String getStringAttribute(int attribute) {
if (attribute == EFS.ATTRIBUTE_LINK_TARGET)
return this.linkTarget;
return null;
}
@Override
public long getLastModified() {
return lastModified;
}
@Override
public long getLength() {
return length;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isDirectory() {
return isSet(ATTRIBUTE_DIRECTORY);
}
private boolean isSet(long mask) {
return (attributes & mask) != 0;
}
private void set(int mask) {
attributes |= mask;
}
@Override
public void setAttribute(int attribute, boolean value) {
if (attribute == EFS.ATTRIBUTE_READ_ONLY && isAttributeSuported(EFS.ATTRIBUTE_OWNER_WRITE)) {
if (value) {
clear(EFS.ATTRIBUTE_OWNER_WRITE | EFS.ATTRIBUTE_OTHER_WRITE | EFS.ATTRIBUTE_GROUP_WRITE);
set(EFS.ATTRIBUTE_IMMUTABLE);
} else {
set(EFS.ATTRIBUTE_OWNER_WRITE | EFS.ATTRIBUTE_OWNER_READ);
clear(EFS.ATTRIBUTE_IMMUTABLE);
}
} else if (attribute == EFS.ATTRIBUTE_EXECUTABLE && isAttributeSuported(EFS.ATTRIBUTE_OWNER_EXECUTE)) {
if (value)
set(EFS.ATTRIBUTE_OWNER_EXECUTE);
else
clear(EFS.ATTRIBUTE_OWNER_EXECUTE | EFS.ATTRIBUTE_GROUP_EXECUTE | EFS.ATTRIBUTE_OTHER_EXECUTE);
} else {
if (value)
set(attribute);
else
clear(attribute);
}
}
private static boolean isAttributeSuported(int value) {
return (LocalFileNativesManager.getSupportedAttributes() & value) != 0;
}
Sets whether this is a file or directory.
Params: - value –
true
if this is a directory, and false
if this is a file.
/**
* Sets whether this is a file or directory.
*
* @param value <code>true</code> if this is a directory, and <code>false</code>
* if this is a file.
*/
public void setDirectory(boolean value) {
if (value)
set(ATTRIBUTE_DIRECTORY);
else
clear(ATTRIBUTE_DIRECTORY);
}
Sets whether this file or directory exists.
Params: - value –
true
if this file exists, and false
otherwise.
/**
* Sets whether this file or directory exists.
*
* @param value <code>true</code> if this file exists, and <code>false</code>
* otherwise.
*/
public void setExists(boolean value) {
if (value)
set(ATTRIBUTE_EXISTS);
else
clear(ATTRIBUTE_EXISTS);
}
Sets the error code indicating whether an I/O error was encountered when accessing the file.
Params: - errorCode –
IFileInfo.IO_ERROR
if this file has an I/O error, and IFileInfo.NONE
otherwise.
Since: 1.4
/**
* Sets the error code indicating whether an I/O error was encountered when accessing the file.
*
* @param errorCode {@link IFileInfo#IO_ERROR} if this file has an I/O error,
* and {@link IFileInfo#NONE} otherwise.
* @since 1.4
*/
public void setError(int errorCode) {
this.errorCode = errorCode;
}
@Override
public void setLastModified(long value) {
lastModified = value;
}
Sets the length of this file. A value of EFS.NONE
indicates the file does not exist, is a directory, or the length could not be computed. Params: - value – the length of this file, or
EFS.NONE
/**
* Sets the length of this file. A value of {@link EFS#NONE}
* indicates the file does not exist, is a directory, or the length could not be computed.
*
* @param value the length of this file, or {@link EFS#NONE}
*/
public void setLength(long value) {
this.length = value;
}
Sets the name of this file.
Params: - name – The file name
/**
* Sets the name of this file.
*
* @param name The file name
*/
public void setName(String name) {
if (name == null)
throw new IllegalArgumentException();
this.name = name;
}
Sets or clears a String attribute, e.g. symbolic link target.
Params: - attribute – The kind of attribute to set. Currently only
EFS.ATTRIBUTE_LINK_TARGET
is supported. - value – The String attribute, or
null
to clear
the attribute
Since: org.eclipse.core.filesystem 1.1
/**
* Sets or clears a String attribute, e.g. symbolic link target.
*
* @param attribute The kind of attribute to set. Currently only
* {@link EFS#ATTRIBUTE_LINK_TARGET} is supported.
* @param value The String attribute, or <code>null</code> to clear
* the attribute
* @since org.eclipse.core.filesystem 1.1
*/
public void setStringAttribute(int attribute, String value) {
if (attribute == EFS.ATTRIBUTE_LINK_TARGET)
this.linkTarget = value;
}
For debugging purposes only.
/**
* For debugging purposes only.
*/
@Override
public String toString() {
return name;
}
}