package org.cytoscape.rest.internal.datamapper;
import java.util.ArrayList;
import java.util.List;
import org.cytoscape.group.CyGroup;
import org.cytoscape.group.CyGroupFactory;
import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
import org.cytoscape.model.CyRow;
import org.cytoscape.model.subnetwork.CyRootNetwork;
import org.cytoscape.model.subnetwork.CySubNetwork;
import com.fasterxml.jackson.databind.JsonNode;
public class GroupMapper {
/**
* Create a new group from a list of nodes.
*
* @param rootNode
* @param factory
* @param network
* @return
*/
public CyGroup createGroup(final JsonNode rootNode, final CyGroupFactory factory, final CyNetwork network) {
// Extract required fields: member nodes and name of new node.
final String groupName = rootNode.get(CyNetwork.NAME).textValue();
final JsonNode memberNodes = rootNode.get("nodes");
// This is optional.
final JsonNode memberEdges = rootNode.get("edges");
if(groupName == null || groupName.isEmpty()) {
throw new IllegalArgumentException("Group name is missing.");
}
if(memberNodes.isArray() == false) {
throw new IllegalArgumentException("Invalid parameter.");
}
if(memberNodes.size() == 0) {
throw new IllegalArgumentException("Group member list is empty.");
}
// Phase 1: Create list of member nodes.
final List<CyNode> nodes = new ArrayList<CyNode>();
for (final JsonNode node : memberNodes) {
final CyNode n = network.getNode(node.asLong());
if (n != null) {
nodes.add(n);
}
}
// Phase 2: Create group from the list of nodes.
final CyGroup group = factory.createGroup(network, nodes, null, true);
final CyRow groupRow = ((CySubNetwork)network).getRootNetwork().getRow(group.getGroupNode(), CyRootNetwork.SHARED_ATTRS);
groupRow.set(CyRootNetwork.SHARED_NAME, groupName);
// Add edges if necessary...
if (memberEdges != null && memberEdges.isArray()) {
final List<CyEdge> edges = new ArrayList<CyEdge>();
for (final JsonNode edge : memberEdges) {
final CyEdge e = network.getEdge(edge.asLong());
if (e != null) {
edges.add(e);
}
}
group.addEdges(edges);
}
return group;
}
}