blob: 3e45ecd5ce5a97017f4055230fc116ce52dd2053 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 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) - [292267] OutOfMemoryError due to leak in UnifiedTree
*******************************************************************************/
package org.eclipse.core.internal.localstore;
import java.util.Iterator;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.internal.resources.Resource;
import org.eclipse.core.resources.IResource;
/**
* A node in a {@link UnifiedTree}. A node usually represents a file/folder
* in the workspace, the file system, or both. There are also special node
* instances to act as child and level markers in the tree.
*/
public class UnifiedTreeNode implements ILocalStoreConstants {
protected UnifiedTreeNode child;
protected boolean existsWorkspace;
protected IFileInfo fileInfo;
protected IResource resource;
protected IFileStore store;
protected UnifiedTree tree;
public UnifiedTreeNode(UnifiedTree tree, IResource resource, IFileStore store, IFileInfo fileInfo, boolean existsWorkspace) {
this.tree = tree;
this.resource = resource;
this.store = store;
this.fileInfo = fileInfo;
this.existsWorkspace = existsWorkspace;
}
public boolean existsInFileSystem() {
return fileInfo != null && fileInfo.exists();
}
/**
* Returns <code>true</code> if an I/O error was encountered while accessing
* the file or the directory in the file system.
*/
public boolean isErrorInFileSystem() {
return fileInfo != null && fileInfo.getError() != IFileInfo.NONE;
}
public boolean existsInWorkspace() {
return existsWorkspace;
}
/**
* Returns an iterator of this node's children.
*/
public Iterator<UnifiedTreeNode> getChildren() {
return tree.getChildren(this);
}
protected UnifiedTreeNode getFirstChild() {
return child;
}
public long getLastModified() {
return fileInfo == null ? 0 : fileInfo.getLastModified();
}
public int getLevel() {
return tree.getLevel();
}
/**
* Gets the name of this node in the local file system.
* @return Returns a String
*/
public String getLocalName() {
return fileInfo == null ? null : fileInfo.getName();
}
public IResource getResource() {
return resource;
}
/**
* Returns the local store of this resource. May be null.
*/
public IFileStore getStore() {
//initialize store lazily, because it is not always needed
if (store == null)
store = ((Resource) resource).getStore();
return store;
}
public boolean isFolder() {
return fileInfo == null ? false : fileInfo.isDirectory();
}
public boolean isSymbolicLink() {
return fileInfo == null ? false : fileInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK);
}
public void removeChildrenFromTree() {
tree.removeNodeChildrenFromQueue(this);
}
/**
* Reuses this object by assigning all new values for the fields.
*/
public void reuse(UnifiedTree aTree, IResource aResource, IFileStore aStore, IFileInfo info, boolean existsInWorkspace) {
this.tree = aTree;
this.child = null;
this.resource = aResource;
this.store = aStore;
this.fileInfo = info;
this.existsWorkspace = existsInWorkspace;
}
/**
* Releases elements that won't be needed any more for garbage collection.
* Should be called before adding a node to the free list.
*/
public void releaseForGc() {
this.child = null;
this.resource = null;
this.store = null;
this.fileInfo = null;
}
public void setExistsWorkspace(boolean exists) {
this.existsWorkspace = exists;
}
protected void setFirstChild(UnifiedTreeNode child) {
this.child = child;
}
public void setResource(IResource resource) {
this.resource = resource;
}
@Override
public String toString() {
String s = resource == null ? "null" : resource.getFullPath().toString(); //$NON-NLS-1$
return "Node: " + s; //$NON-NLS-1$
}
}