/******************************************************************************* * Copyright (c) 2000, 2009 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 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(); } public boolean existsInWorkspace() { return existsWorkspace; } /** * Returns an Iterator of UnifiedTreeNode. */ public Iterator 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; } public String toString() { String s= resource == null ? "null" : resource.getFullPath().toString(); //$NON-NLS-1$ return "Node: " + s; //$NON-NLS-1$ } }