blob: e3e67c2e2075a311a0ceeb7ac9e774e7f0ffc121 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial Implementation
* Roland Schulz, University of Tennessee
*
*****************************************************************************/
package org.eclipse.ptp.remotetools.internal.ssh;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ptp.remotetools.core.IRemoteItem;
import org.eclipse.ptp.remotetools.exception.CancelException;
import org.eclipse.ptp.remotetools.exception.RemoteConnectionException;
import org.eclipse.ptp.remotetools.exception.RemoteOperationException;
import com.jcraft.jsch.SftpATTRS;
/**
* @author Richard Maciel
*
*/
class RemoteItem implements IRemoteItem {
protected String path;
protected boolean isReadable;
protected boolean isWritable;
protected boolean isExecutable;
protected boolean exist;
protected FileTools fileTools;
protected int userID;
protected int permissions;
protected long size;
protected int accessTime;
protected int modificationTime;
protected int groupID;
protected int changes;
protected boolean isDirectory;
protected final int PERMISSION = 1;
protected final int MODIFICATION_TIME = 2;
protected RemoteItem() {
}
RemoteItem(FileTools fileTools, String path) {
this.fileTools = fileTools;
this.path = path;
}
RemoteItem(FileTools fileTools, String path, SftpATTRS attrs) {
this.fileTools = fileTools;
this.path = path;
RemoteFileAttributes remoteAttrs = new RemoteFileAttributes(attrs);
parseAttrs(remoteAttrs);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#commitAttributes()
*/
public void commitAttributes(IProgressMonitor monitor) throws RemoteConnectionException, CancelException, RemoteOperationException {
fileTools.test();
if ((changes & PERMISSION) != 0) {
fileTools.chmod(permissions, path, monitor);
changes &= ~PERMISSION;
}
if ((changes & MODIFICATION_TIME) != 0) {
fileTools.setMtime(path, modificationTime, monitor);
changes &= ~MODIFICATION_TIME;
}
// changes = 0;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#exists()
*/
public boolean exists() {
return exist;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#getAccessTime()
*/
public long getAccessTime() {
return (long)accessTime*1000;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#getModificationTime()
*/
public long getModificationTime() {
return (long)modificationTime*1000;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItemProperties#getPathname()
*/
public String getPath() {
return path;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#getSize()
*/
public long getSize() {
return size;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#isDirectory()
*/
public boolean isDirectory() {
return isDirectory;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#isExecutable()
*/
public boolean isExecutable() {
return isExecutable;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItemProperties#isReadableByUser()
*/
public boolean isReadable() {
return isReadable;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItemProperties#isWritableByUser()
*/
public boolean isWritable() {
return isWritable;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#refreshAttributes()
*/
public void refreshAttributes(IProgressMonitor monitor) throws RemoteConnectionException, RemoteOperationException, CancelException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
fileTools.test();
RemoteFileAttributes attrs = fileTools.fetchRemoteAttr(path, monitor);
parseAttrs(attrs);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#setExecutable(boolean)
*/
public void setExecutable(boolean flag) {
int oldPermissions = permissions;
if (userID == fileTools.getCachedUserID()) {
if (flag) {
permissions |= 0100;
} else {
permissions &= ~0100;
}
}
if(fileTools.getCachedGroupIDSet().contains(new Integer(groupID))) {
if (flag) {
permissions |= 0010;
} else {
permissions &= ~0010;
}
}
if (flag) {
permissions |= 0001;
} else {
permissions &= ~0001;
}
if (oldPermissions != permissions) {
changes |= PERMISSION;
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#setModificationTime(long)
*/
public void setModificationTime(long time) {
int oldModificationTime = modificationTime;
modificationTime = (int)(time/1000);
if (oldModificationTime != modificationTime) {
changes |= MODIFICATION_TIME;
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#setReadable(boolean)
*/
public void setReadable(boolean flag) {
int oldPermissions = permissions;
if (userID == fileTools.getCachedUserID()) {
if (flag) {
permissions |= 0400;
} else {
permissions &= ~0400;
}
}
Set<Integer> groupIDSet = fileTools.getCachedGroupIDSet();
if(groupIDSet.contains(new Integer(groupID))) {
if (flag) {
permissions |= 0040;
} else {
permissions &= ~0040;
}
}
if (flag) {
permissions |= 0004;
} else {
permissions &= ~0004;
}
if (oldPermissions != permissions) {
changes |= PERMISSION;
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.core.IRemoteItem#setWriteable(boolean)
*/
public void setWriteable(boolean flag) {
int oldPermissions = permissions;
if (userID == fileTools.getCachedUserID()) {
if (flag) {
permissions |= 0200;
} else {
permissions &= ~0200;
}
}
Set<Integer> groupIDSet = fileTools.getCachedGroupIDSet();
if(groupIDSet.contains(new Integer(groupID))) {
if (flag) {
permissions |= 0020;
} else {
permissions &= ~0020;
}
}
if (flag) {
permissions |= 0002;
} else {
permissions &= ~0002;
}
if (oldPermissions != permissions) {
changes |= PERMISSION;
}
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
if (exist) {
return path + (isDirectory ? "(d)" : "(f)"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
return path + " does not exist"; //$NON-NLS-1$
}
}
private void parseAttrs(RemoteFileAttributes attrs) {
/*
* No file found.
*/
if (attrs == null) {
exist = false;
return;
}
exist = true;
changes = 0;
assert(isDirectory == attrs.isDir());
isDirectory = attrs.isDir();
userID = attrs.getUId();
groupID = attrs.getGId();
permissions = attrs.getPermissions();
isReadable = false;
isWritable = false;
isExecutable = false;
if(userID == fileTools.getCachedUserID()) {
if ((permissions & 0400) != 0) {
isReadable = true;
}
if ((permissions & 0200) != 0) {
isWritable = true;
}
if ((permissions & 0100) != 0) {
isExecutable = true;
}
}
Set<Integer> groupIDSet = fileTools.getCachedGroupIDSet();
if(groupIDSet.contains(new Integer(groupID))) {
if ((permissions & 0040) != 0) {
isReadable = true;
}
if ((permissions & 0020) != 0) {
isWritable = true;
}
if ((permissions & 0010) != 0) {
isExecutable = true;
}
}
if ((permissions & 0004) != 0) {
isReadable = true;
}
if ((permissions & 0002) != 0) {
isWritable = true;
}
if ((permissions & 0001) != 0) {
isExecutable = true;
}
size = attrs.getSize();
accessTime = attrs.getATime();
modificationTime = attrs.getMTime();
}
protected void copyAttributesFrom(RemoteItem other) {
this.path = other.path;
this.isReadable = other.isReadable;
this.isWritable = other.isWritable;
this.isExecutable = other.isExecutable;
this.exist = other.exist;
this.fileTools = other.fileTools;
this.userID = other.userID;
this.permissions = other.permissions;
this.size = other.size;
this.accessTime = other.accessTime;
this.modificationTime = other.modificationTime;
this.groupID = other.groupID;
this.changes = other.changes;
this.isDirectory = other.isDirectory;
}
}