blob: f2799bb87ab3afa3d13a9e5e4284133393acfcc9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.filesystem.core.model;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.tcf.filesystem.core.activator.CorePlugin;
import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
/**
* The file system model implementation.
*/
public final class FSModel implements ITreeNodeModel {
/* default */static final String FSMODEL_KEY = CorePlugin.getUniqueIdentifier() + ".file.system"; //$NON-NLS-1$
/**
* Get the file system model of the peer model. If it does not
* exist yet, create a new instance and store it.
*
* @param peerNode The peer model
* @return The file system model connected this peer model.
*/
public static FSModel getFSModel(final IPeerNode peerNode) {
final AtomicReference<FSModel> model = new AtomicReference<FSModel>();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (peerNode != null) {
model.set((FSModel) peerNode.getProperty(FSMODEL_KEY));
if (model.get() == null) {
model.set(new FSModel(peerNode));
peerNode.setProperty(FSMODEL_KEY, model.get());
}
}
}
};
if (Protocol.isDispatchThread()) runnable.run();
else Protocol.invokeAndWait(runnable);
return model.get();
}
// The root node of the peer model
private FSTreeNode root;
private IPeerNode peerNode;
/**
* Create a File System ModelManager.
*/
/* default */ FSModel(IPeerNode peerNode) {
this.peerNode = peerNode;
}
/**
* Get the root node of the peer model.
*
* @return The root node.
*/
@Override
public FSTreeNode getRoot() {
if(root == null) {
root = createRoot();
}
return root;
}
/**
* Create a root node for the specified peer.
*
* @param peerNode The peer.
*/
/* default */ FSTreeNode createRoot() {
if (Protocol.isDispatchThread()) {
return createRootNode(peerNode);
}
else {
final AtomicReference<FSTreeNode> ref = new AtomicReference<FSTreeNode>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
ref.set(createRoot());
}
});
return ref.get();
}
}
/**
* Create a root node for the peer.
*
* @param peerNode The peer.
* @return The root file system node.
*/
public static FSTreeNode createRootNode(IPeerNode peerNode) {
FSTreeNode node = new FSTreeNode();
node.type = "FSRootNode"; //$NON-NLS-1$
node.peerNode = peerNode;
node.name = Messages.FSTreeNodeContentProvider_rootNode_label;
return node;
}
/**
* Create a file node under the folder specified folder using the new name.
*
* @param name The file's name.
* @param folder The parent folder.
* @return The file tree node.
*/
public static FSTreeNode createFileNode(String name, FSTreeNode folder) {
return createTreeNode(name, "FSFileNode", folder); //$NON-NLS-1$
}
/**
* Create a folder node under the folder specified folder using the new name.
*
* @param name The folder's name.
* @param folder The parent folder.
* @return The folder tree node.
*/
public static FSTreeNode createFolderNode(String name, FSTreeNode folder) {
return createTreeNode(name, "FSDirNode", folder); //$NON-NLS-1$
}
/**
* Create a tree node under the folder specified folder using the new name.
*
* @param name The tree node's name.
* @param type The new node's type.
* @param folder The parent folder.
* @return The tree node.
*/
private static FSTreeNode createTreeNode(String name, String type, FSTreeNode folder) {
FSTreeNode node = new FSTreeNode();
node.name = name;
node.parent = folder;
node.peerNode = folder.peerNode;
node.type = type;
return node;
}
}