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
/******************************************************************************* * 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 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.
/** * 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 true if an I/O error was encountered while accessing the file or the directory in the file system.
/** * 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.
/** * 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.
Returns:Returns a String
/** * 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.
/** * 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.
/** * 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.
/** * 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$ } }