/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2011 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.util.browser;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.openmicroscopy.shoola.agents.util.EditorUtil;
import omero.gateway.model.DataObject;
import omero.gateway.model.DatasetData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
import omero.gateway.model.ProjectData;
import omero.gateway.model.ScreenData;
/**
* Hosts the node for display.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* @since 3.0-Beta4
*/
public class DataNode
{
/** The default text if no screen. */
static final String DEFAULT_SCREEN = "--No Screen--";
/** The default text if no dataset. */
static final String DEFAULT_DATASET = "--New From Folder--";
/** The default text if no project. */
private static final String DEFAULT_PROJECT = "--No Project--";
/** The default text if no dataset. */
private static final String NO_DATASET = "--No Dataset--";
/** The data to host. */
private DataObject data;
/** The node of reference. */
private TreeImageDisplay refNode;
/** Flag indicating that this node is to link the orphaned datasets. */
private boolean orphanParent;
/** The orphaned nodes. */
private List<DataNode> children;
/** The children of the parent node */
private List<DataNode> uiChildren;
/** The parent node. */
private DataNode parent;
/** The collection of nodes to add.*/
private List<DataNode> newNodes;
/**
* Creates a dataset with default name.
*
* @return See above.
*/
public static DatasetData createNoDataset()
{
DatasetData d = new DatasetData();
d.setName(NO_DATASET);
return d;
}
/**
* Creates a dataset with default name.
*
* @return See above.
*/
public static DatasetData createDefaultDataset()
{
DatasetData d = new DatasetData();
d.setName(DEFAULT_DATASET);
return d;
}
/**
* Creates a project with default name.
*
* @return See above.
*/
public static ProjectData createDefaultProject()
{
ProjectData d = new ProjectData();
d.setName(DEFAULT_PROJECT);
return d;
}
/**
* Creates a screen with default name.
*
* @return See above.
*/
public static ScreenData createDefaultScreen()
{
ScreenData d = new ScreenData();
d.setName(DEFAULT_SCREEN);
return d;
}
/**
* Creates a new instance.
*
* @param data The data to host.
*/
public DataNode(DataObject data)
{
if (data == null)
throw new IllegalArgumentException("No Object specified.");
this.data = data;
}
/**
* Creates a new instance.
*
* @param data The data to host.
* @param parent The parent of the node.
*/
public DataNode(DataObject data, DataNode parent)
{
if (data == null)
throw new IllegalArgumentException("No Object specified.");
this.data = data;
this.parent = parent;
}
/**
* Creates a new instance.
*
* @param children The orphaned nodes.
*/
public DataNode(List<DataNode> children)
{
orphanParent = true;
this.data = createDefaultProject();
this.children = children;
}
/**
* Sets the parent of the node.
*
* @param parent The value to set.
*/
public void setParent(DataNode parent) { this.parent = parent; }
/**
* Sets the data node.
*
* @param data The data to reset.
*/
public void setData(DataObject data)
{
this.data = data;
}
/**
* Sets the node of reference.
*
* @param refNode The node of reference.
*/
public void setRefNode(TreeImageDisplay refNode) { this.refNode = refNode; }
/**
* Returns the node of reference.
*
* @return See above.
*/
public TreeImageDisplay getRefNode() { return refNode; }
/**
* Returns the data object.
*
* @return See above.
*/
public DataObject getDataObject() { return data; }
/**
* Returns the user who owns the data.
*
* @return See above.
*/
public ExperimenterData getOwner()
{
if (data.getId() < 0) return null;
if (data instanceof GroupData || data instanceof ExperimenterData)
return null;
return data.getOwner();
}
/**
* Returns <code>true</code> if the object corresponding to the passed
* name is new, <code>false</code> otherwise.
*
* @param name The name to handle.
* @return See above.
*/
public boolean isNewDataObject(String name)
{
if (orphanParent) return false;
return toString().equals(name) && data.getId() <= 0;
}
/**
* Returns the collection of new nodes.
*
* @return See above.
*/
public List<DataNode> getNewNodes() { return newNodes; }
/**
* Adds the specified node.
*
* @param node The node to add.
*/
public void addNewNode(DataNode node)
{
if (newNodes == null) newNodes = new ArrayList<DataNode>();
if (node != null) {
if (!isDefaultNode() && children != null) {
Iterator<DataNode> i = children.iterator();
DataNode child;
DataNode toRemove = null;
while (i.hasNext()) {
child = i.next();
if (child.isDefaultNode()) {
toRemove = child;
break;
}
}
if (toRemove != null) children.remove(toRemove);
}
newNodes.add(node);
}
}
/**
* Returns the list of nodes hosted.
*
* @return See above.
*/
public List<DataNode> getDatasetNodes()
{
if (children != null) return children;
children = new ArrayList<DataNode>();
if (data instanceof ProjectData) {
if (refNode != null) {
List<?> l = refNode.getChildrenDisplay();
if (CollectionUtils.isNotEmpty(l)) {
Iterator<?> i = l.iterator();
TreeImageDisplay node;
DataNode n;
while (i.hasNext()) {
node = (TreeImageDisplay) i.next();
n = new DataNode((DataObject) node.getUserObject());
n.setRefNode(node);
n.parent = this;
children.add(n);
}
children.add(new DataNode(
DataNode.createDefaultDataset(), this));
} else {
children.add(new DataNode(DataNode.createDefaultDataset(),
this));
}
}
}
return children;
}
/**
* Returns the list of nodes hosted.
*
* @return See above.
*/
public List<DataNode> getUIDatasetNodes()
{
if (orphanParent) return children;
if (uiChildren != null) return uiChildren;
uiChildren = new ArrayList<DataNode>();
if (data instanceof ProjectData) {
ProjectData project= (ProjectData) data;
Set<DatasetData> datasets =project.getDatasets();
Iterator<DatasetData> i = datasets.iterator();
DataNode n;
while (i.hasNext()) {
n = new DataNode(i.next());
uiChildren.add(n);
n.parent = this;
}
}
return uiChildren;
}
/**
* Adds the new node.
*
* @param node The node to add.
*/
public void addNode(DataNode node)
{
if (node == null) return;
if (children == null) children = new ArrayList<DataNode>();
node.parent = this;
children.add(node);
}
/**
* Returns <code>true</code> if the node is a default node,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isDefaultNode()
{
return (isDefaultProject() || isDefaultScreen() || isDefaultDataset() ||
isNoDataset());
}
/**
* Returns <code>true</code> if the node is a default node for dataset,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isNoDataset()
{
return NO_DATASET.equals(toString().trim());
}
/**
* Returns <code>true</code> if the node is a default node for project,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isDefaultProject()
{
return DEFAULT_PROJECT.equals(toString().trim());
}
/**
* Returns <code>true</code> if the node is a default node for screen,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isDefaultScreen()
{
return DEFAULT_SCREEN.equals(toString().trim());
}
/**
* Returns <code>true</code> if the node is a default node for dataset,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isDefaultDataset()
{
return DEFAULT_DATASET.equals(toString().trim());
}
/**
* Returns the parent node.
*
* @return See above.
*/
public DataNode getParent() { return parent; }
/**
* Overridden to set the name of the object.
* @see #toString()
*/
public String toString()
{
return EditorUtil.truncate(getFullName(), 48);
}
/**
* Returns the full length name of the DataNode
*
* @return see above.
*/
public String getFullName()
{
if (data instanceof DatasetData)
return ((DatasetData) data).getName() + " ";
else if (data instanceof ProjectData)
return ((ProjectData) data).getName() + " ";
else if (data instanceof ScreenData)
return ((ScreenData) data).getName() + " ";
else if (data instanceof GroupData)
return ((GroupData) data).getName() + " ";
return "";
}
}