/******************************************************************************* * Copyright (c) 2015 Wind River Systems, Inc. * 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: * Markus Schorn - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.tcf.filesystem.core.internal; import static java.text.MessageFormat.format; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.tcf.services.IFileSystem; import org.eclipse.tcf.services.IFileSystem.FileAttrs; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IOperation; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IWindowsFileAttributes; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNodeWorkingCopy; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IUserAccount; import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.AbstractOperation; import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCommitAttr; import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages; class FSTreeNodeWorkingCopy extends FSTreeNodeBase implements IFSTreeNodeWorkingCopy { private final FSTreeNodeBase fOriginal; private int fPermissions; private int fWin32Attributes; FSTreeNodeWorkingCopy(FSTreeNodeWorkingCopy original) { fOriginal = original; fPermissions = original.fPermissions; fWin32Attributes = original.fWin32Attributes; } FSTreeNodeWorkingCopy(FSTreeNode original) { fOriginal = original; fPermissions = original.getPermissions(); fWin32Attributes = original.getWin32Attrs(); } @Override protected int getWin32Attrs() { return fWin32Attributes; } @Override protected int getPermissions() { return fPermissions; } @Override public IFSTreeNodeWorkingCopy createWorkingCopy() { return new FSTreeNodeWorkingCopy(this); } @Override public void setWritable(boolean b) { IUserAccount account = getUserAccount(); if (account != null) { int bit; if (getUID() == account.getEUID()) { bit = IFileSystem.S_IWUSR; } else if (getGID() == account.getEGID()) { bit = IFileSystem.S_IWGRP; } else { bit = IFileSystem.S_IWOTH; } setPermission(bit, true); } } @Override public void setPermission(int bit, boolean value) { if (value) { fPermissions |= bit; } else { fPermissions &= ~bit; } } @Override public void setWin32Attr(int bit, boolean value) { if (value) { fWin32Attributes |= bit; } else { fWin32Attributes &= ~bit; } } @Override public void setHidden(boolean hidden) { setWin32Attr(IWindowsFileAttributes.FILE_ATTRIBUTE_HIDDEN, hidden); } @Override public void setReadOnly(boolean readOnly) { setWin32Attr(IWindowsFileAttributes.FILE_ATTRIBUTE_READONLY, readOnly); } @Override public boolean isDirty() { if (fOriginal.getPermissions() != getPermissions()) return true; if (fOriginal.getWin32Attrs() != getWin32Attrs()) return true; return false; } @Override public IOperation operationCommit() { return new AbstractOperation() { @Override public String getName() { return format(Messages.FSTreeNodeWorkingCopy_commitOperation_name, FSTreeNodeWorkingCopy.this.getName()); } @Override protected IStatus doRun(IProgressMonitor monitor) { monitor.beginTask(getName(), IProgressMonitor.UNKNOWN); return doCommit(monitor); } }; } protected IStatus doCommit(IProgressMonitor monitor) { try { if (fOriginal instanceof FSTreeNodeWorkingCopy) { return commit((FSTreeNodeWorkingCopy) fOriginal); } if (fOriginal instanceof FSTreeNode) { return commit((FSTreeNode) fOriginal, monitor); } return Status.CANCEL_STATUS; } finally { monitor.done(); } } private IStatus commit(FSTreeNodeWorkingCopy original) { original.fPermissions = fPermissions; original.fWin32Attributes = fWin32Attributes; return Status.OK_STATUS; } private IStatus commit(FSTreeNode original, IProgressMonitor monitor) { if (!isDirty()) return Status.OK_STATUS; FileAttrs attrs = original.getAttributes(); if (attrs != null) { Map<String, Object> attributes = new HashMap<String, Object>(attrs.attributes); if (fWin32Attributes != original.getWin32Attrs()) { attrs.attributes.put(FSTreeNode.KEY_WIN32_ATTRS, Integer.valueOf(fWin32Attributes)); } attrs = new FileAttrs(attrs.flags, attrs.size, attrs.uid, attrs.gid, fPermissions, attrs.atime, attrs.mtime, attributes); return new OpCommitAttr(original, attrs).run(monitor); } return Status.OK_STATUS; } @Override public String getName() { return fOriginal.getName(); } @Override public Type getType() { return fOriginal.getType(); } @Override public String getFileTypeLabel() { return fOriginal.getFileTypeLabel(); } @Override public IUserAccount getUserAccount() { return fOriginal.getUserAccount(); } @Override public String getLocation() { return fOriginal.getLocation(); } @Override public boolean isFileSystem() { return fOriginal.isFileSystem(); } @Override public boolean isRootDirectory() { return fOriginal.isRootDirectory(); } @Override public boolean isDirectory() { return fOriginal.isDirectory(); } @Override public boolean isFile() { return fOriginal.isFile(); } @Override public long getAccessTime() { return fOriginal.getAccessTime(); } @Override public long getModificationTime() { return fOriginal.getModificationTime(); } @Override public long getSize() { return fOriginal.getSize(); } @Override public boolean isWindowsNode() { return fOriginal.isWindowsNode(); } @Override public int getUID() { return fOriginal.getUID(); } @Override public int getGID() { return fOriginal.getGID(); } @Override protected boolean checkPermission(int user, int group, int other) { return fOriginal.checkPermission(user, group, other); } }