/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.controller.update;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jgrapht.graph.DirectedWeightedMultigraph;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.config.UIConfiguration;
import edu.isi.karma.config.UIConfigurationRegistry;
import edu.isi.karma.modeling.alignment.Alignment;
import edu.isi.karma.modeling.alignment.AlignmentManager;
import edu.isi.karma.modeling.alignment.LinkIdFactory;
import edu.isi.karma.rep.ColumnMetadata;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.rep.alignment.ColumnNode;
import edu.isi.karma.rep.alignment.DataPropertyOfColumnLink;
import edu.isi.karma.rep.alignment.DisplayModel;
import edu.isi.karma.rep.alignment.LabeledLink;
import edu.isi.karma.rep.alignment.LinkType;
import edu.isi.karma.rep.alignment.LiteralNode;
import edu.isi.karma.rep.alignment.Node;
import edu.isi.karma.rep.alignment.NodeType;
import edu.isi.karma.rep.alignment.ObjectPropertySpecializationLink;
import edu.isi.karma.view.VHNode;
import edu.isi.karma.view.VWorksheet;
import edu.isi.karma.view.VWorkspace;
public class AlignmentSVGVisualizationUpdate extends AbstractUpdate {
private final String worksheetId;
private DirectedWeightedMultigraph<Node, LabeledLink> alignmentGraph;
private Alignment alignment;
private static Logger logger = LoggerFactory
.getLogger(AlignmentSVGVisualizationUpdate.class);
private enum JsonKeys {
worksheetId, alignmentId, label, rdfsLabel, rdfsComment, id, hNodeId, nodeType, source,
target, linkType, sourceNodeId, targetNodeId, height, hNodesCovered,
nodes, links, maxTreeHeight, linkStatus, linkUri, nodeDomain, isForcedByUser,
isUri, nodeId, column, anchors, edgeLinks, alignObject, tableLayout, columnName, hasNestedTable, columns, isProvenance,
}
private enum JsonValues {
key, holderLink, objPropertyLink, Unassigned, FakeRoot, FakeRootLink, Add_Parent, DataPropertyOfColumnHolder, horizontalDataPropertyLink
}
public AlignmentSVGVisualizationUpdate(String worksheetId) {
super();
this.worksheetId = worksheetId;
}
private JSONObject getForceLayoutNodeJsonObject(int id, String label, String rdfsLabel, String rdfsComment,
String nodeId, String nodeType, boolean isForcedByUser,
String nodeDomain, boolean isUri) throws JSONException {
JSONObject nodeObj = new JSONObject();
nodeObj.put(JsonKeys.label.name(), label);
nodeObj.put(JsonKeys.rdfsLabel.name(), rdfsLabel);
nodeObj.put(JsonKeys.rdfsComment.name(), rdfsComment);
nodeObj.put(JsonKeys.id.name(), id);
nodeObj.put(JsonKeys.nodeId.name(), nodeId);
nodeObj.put(JsonKeys.nodeType.name(), nodeType);
nodeObj.put(JsonKeys.isForcedByUser.name(), isForcedByUser);
nodeObj.put(JsonKeys.nodeDomain.name(), nodeDomain);
nodeObj.put(JsonKeys.isUri.name(), isUri);
return nodeObj;
}
private JSONObject getForceLayoutColumnJsonObject(int id, String label, String rdfsLabel, String rdfsComment,
String nodeId, String nodeType, boolean isForcedByUser,
String hNodeId, String nodeDomain, int columnIndex)
throws JSONException {
JSONObject nodeObj = getForceLayoutNodeJsonObject(id, label, rdfsLabel, rdfsComment, nodeId,
nodeType, isForcedByUser, nodeDomain, false);
nodeObj.put(JsonKeys.hNodeId.name(), hNodeId);
nodeObj.put(JsonKeys.column.name(), columnIndex);
return nodeObj;
}
public boolean equals(Object o) {
if (o instanceof AlignmentSVGVisualizationUpdate) {
AlignmentSVGVisualizationUpdate t = (AlignmentSVGVisualizationUpdate) o;
return t.worksheetId.equals(worksheetId);
}
return false;
}
@Override
public int hashCode() {
int result = this.worksheetId != null ? this.worksheetId.hashCode() : 0;
result = 31 * result + (this.alignmentGraph != null ? this.alignmentGraph.hashCode() : 0);
result = 31 * result + (this.alignment != null ? this.alignment.hashCode() : 0);
return result;
}
@Override
public void generateJson(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
Workspace workspace = vWorkspace.getWorkspace();
alignment = AlignmentManager.Instance().getAlignment(workspace.getId(), worksheetId);
this.alignmentGraph = alignment.getSteinerTree();
UIConfiguration uiConfiguration = UIConfigurationRegistry.getInstance().getUIConfiguration(vWorkspace.getWorkspace().getContextId());
if (uiConfiguration.isForceModelLayoutEnabled())
generateJsonForForceLayout(prefix, pw, vWorkspace);
else
generateJsonForNormalLayout(prefix, pw, vWorkspace);
}
public void generateJsonForForceLayout(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
VWorksheet vWorksheet = vWorkspace.getViewFactory()
.getVWorksheetByWorksheetId(worksheetId);
List<String> hNodeIdList = vWorksheet.getHeaderVisibleLeafNodes();
String alignmentId = AlignmentManager.Instance().constructAlignmentId(
vWorkspace.getWorkspace().getId(), vWorksheet.getWorksheetId());
JSONObject topObj = new JSONObject();
try {
topObj.put(GenericJsonKeys.updateType.name(),
AlignmentSVGVisualizationUpdate.class.getSimpleName());
topObj.put(JsonKeys.alignmentId.name(), alignmentId);
topObj.put(JsonKeys.worksheetId.name(), worksheetId);
/*** Add the nodes and the links from the Steiner tree ***/
JSONArray nodesArr = new JSONArray();
JSONArray anchorsArr = new JSONArray();
JSONArray linksArr = new JSONArray();
JSONArray edgeLinksArr = new JSONArray();
Map<Node, Integer> verticesIndex = new HashMap<>();
Map<String, ColumnNode> columnNodes = new HashMap<>();
if (alignmentGraph != null
&& !alignmentGraph.vertexSet().isEmpty()) {
Set<Node> nodes = alignmentGraph.vertexSet();
for (Node node : nodes) {
if (node instanceof ColumnNode) {
columnNodes.put(((ColumnNode) node).getHNodeId(),
(ColumnNode) node);
}
}
}
HTable headers = vWorksheet.getWorksheet().getHeaders();
for (int columnNum = 0; columnNum < hNodeIdList.size(); columnNum++) {
String hNodeId = hNodeIdList.get(columnNum);
ColumnNode node = columnNodes.get(hNodeId);
JSONObject anchorObj;
HNode hNode = headers.getHNode(hNodeId, true);
if (node != null) {
anchorObj = getForceLayoutColumnJsonObject(columnNum,
hNode.getColumnName(),
node.getLabel().getRdfsLabel(),
node.getLabel().getRdfsComment(),
node.getId(),
node.getType().name(),
node.isForced(),
hNodeId,
node.getUri(),
columnNum);
} else {
anchorObj = getForceLayoutColumnJsonObject(columnNum,
hNode.getColumnName(),
"", "",
hNode.getId(),
"ColumnNode",
false,
hNodeId,
"",
columnNum);
}
anchorsArr.put(anchorObj);
verticesIndex.put(node, columnNum);
}
int nodesIndexcounter = hNodeIdList.size();
if (alignmentGraph != null
&& !alignmentGraph.vertexSet().isEmpty()) {
/** Add the nodes **/
Set<Node> nodes = alignmentGraph.vertexSet();
for (Node node : nodes) {
/** Add the semantic type information **/
if (node instanceof ColumnNode) {
// Already handled
} else {
boolean isUri = false;
if(node instanceof LiteralNode && ((LiteralNode)node).isUri())
isUri = true;
JSONObject nodeObj = getForceLayoutNodeJsonObject(
nodesIndexcounter,
node.getLocalId(),
node.getLabel().getRdfsLabel(),
node.getLabel().getRdfsComment(),
node.getId(),
node.getType().name(),
node.isForced(),
node.getUri(),
isUri);
nodesArr.put(nodeObj);
verticesIndex.put(node, nodesIndexcounter++);
}
}
/*** Add the links ***/
Set<LabeledLink> links = alignmentGraph.edgeSet();
for (LabeledLink link : links) {
Node source = link.getSource();
Integer sourceIndex = verticesIndex.get(source);
Node target = link.getTarget();
Integer targetIndex = verticesIndex.get(target);
Set<LabeledLink> outEdges = alignmentGraph
.outgoingEdgesOf(target);
if (sourceIndex == null || targetIndex == null) {
logger.error("Edge vertex index not found!");
continue;
}
JSONObject linkObj = new JSONObject();
linkObj.put(JsonKeys.source.name(), sourceIndex);
linkObj.put(JsonKeys.target.name(), targetIndex);
linkObj.put(JsonKeys.sourceNodeId.name(), source.getId());
linkObj.put(JsonKeys.targetNodeId.name(), target.getId());
linkObj.put(JsonKeys.label.name(), link.getLabel().getLocalName());
linkObj.put(JsonKeys.rdfsLabel.name(), link.getLabel().getRdfsLabel());
linkObj.put(JsonKeys.rdfsComment.name(), link.getLabel().getRdfsComment());
linkObj.put(JsonKeys.isProvenance.name(), link.isProvenance());
linkObj.put(JsonKeys.id.name(), link.getId() + "");
linkObj.put(JsonKeys.linkStatus.name(), link.getStatus()
.name());
linkObj.put(JsonKeys.linkUri.name(), link.getLabel()
.getUri());
if (target.getType() == NodeType.ColumnNode
&& outEdges.isEmpty()) {
linkObj.put(JsonKeys.linkType.name(),
JsonValues.holderLink.name());
}
linkObj.put(JsonKeys.linkType.name(), link.getType());
if (link.getType() == LinkType.ObjectPropertySpecializationLink) {
ObjectPropertySpecializationLink spLink = (ObjectPropertySpecializationLink) link;
String linkId = spLink.getSpecializedLinkId();
linkObj.put(JsonKeys.source.name(), linkId);
edgeLinksArr.put(linkObj);
} else if (link.getType() == LinkType.DataPropertyOfColumnLink) {
DataPropertyOfColumnLink spLink = (DataPropertyOfColumnLink) link;
String linkId = spLink.getSpecializedLinkId();
linkObj.put(JsonKeys.source.name(), linkId);
edgeLinksArr.put(linkObj);
} else {
linksArr.put(linkObj);
}
}
}
JSONObject alignObject = new JSONObject();
alignObject.put(JsonKeys.anchors.name(), anchorsArr);
alignObject.put(JsonKeys.tableLayout.name(), getTableLayout(vWorkspace));
alignObject.put(JsonKeys.nodes.name(), nodesArr);
alignObject.put(JsonKeys.links.name(), linksArr);
alignObject.put(JsonKeys.edgeLinks.name(), edgeLinksArr);
topObj.put(JsonKeys.alignObject.name(), alignObject);
pw.write(topObj.toString());
} catch (JSONException e) {
logger.error("Error occured while writing JSON!", e);
}
}
public JSONArray getTableLayout(VWorkspace vWorkspace) {
VWorksheet vWorksheet = vWorkspace.getViewFactory()
.getVWorksheetByWorksheetId(worksheetId);
Worksheet wk = vWorksheet.getWorksheet();
ColumnMetadata colMeta = wk.getMetadataContainer().getColumnMetadata();
List<VHNode> viewHeaders = vWorksheet.getHeaderViewNodes();
return getColumnsJsonArray(viewHeaders, colMeta);
}
private JSONArray getColumnsJsonArray(List<VHNode> viewHeaders, ColumnMetadata colMeta) throws JSONException {
JSONArray colArr = new JSONArray();
for (VHNode hNode:viewHeaders) {
if(hNode.isVisible()) {
JSONObject hNodeObj = new JSONObject();
String columnName = hNode.getColumnName();
hNodeObj.put(JsonKeys.columnName.name(), columnName);
hNodeObj.put(JsonKeys.hNodeId.name(), hNode.getId());
if (hNode.hasNestedTable()) {
hNodeObj.put(JsonKeys.hasNestedTable.name(), true);
List<VHNode> nestedHeaders = hNode.getNestedNodes();
hNodeObj.put(JsonKeys.columns.name(), getColumnsJsonArray(nestedHeaders, colMeta));
} else {
hNodeObj.put(JsonKeys.hasNestedTable.name(), false);
}
colArr.put(hNodeObj);
}
}
return colArr;
}
public void generateJsonForNormalLayout(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
VWorksheet vWorksheet = vWorkspace.getViewFactory()
.getVWorksheetByWorksheetId(worksheetId);
List<String> hNodeIdList = vWorksheet.getHeaderVisibleLeafNodes();
String alignmentId = AlignmentManager.Instance().constructAlignmentId(
vWorkspace.getWorkspace().getId(), vWorksheet.getWorksheetId());
JSONObject topObj = new JSONObject();
try {
topObj.put(GenericJsonKeys.updateType.name(),
AlignmentSVGVisualizationUpdate.class.getSimpleName());
topObj.put(JsonKeys.alignmentId.name(), alignmentId);
topObj.put(JsonKeys.worksheetId.name(), worksheetId);
// Using Mohsen's GraphUtils method for graph traversal
DisplayModel dm = new DisplayModel(alignmentGraph, vWorksheet
.getWorksheet().getHeaders());
HashMap<Node, Integer> nodeHeightsMap = dm.getNodesLevel();
Map<Node, Set<ColumnNode>> nodeCoverage = dm.getNodesSpan();
/** Identify the max height **/
int maxTreeHeight = 0;
for (Map.Entry<Node, Integer> nodeIntegerEntry : nodeHeightsMap.entrySet()) {
if (nodeIntegerEntry.getValue() >= maxTreeHeight) {
maxTreeHeight = nodeIntegerEntry.getValue();
}
}
/*** Add the nodes and the links from the Steiner tree ***/
List<String> hNodeIdsAdded = new ArrayList<>();
JSONArray nodesArr = new JSONArray();
JSONArray linksArr = new JSONArray();
if (alignmentGraph != null
&& !alignmentGraph.vertexSet().isEmpty()) {
/** Add the nodes **/
Set<Node> nodes = alignmentGraph.vertexSet();
Map<Node, Integer> verticesIndex = new HashMap<>();
int nodesIndexcounter = 0;
for (Node node : nodes) {
/**
* Get info about the nodes that this node covers or sits
* above
**/
int height = nodeHeightsMap.get(node);
/** Add the hnode ids of the columns that this vertex covers **/
JSONArray hNodeIdsCoveredByVertex = new JSONArray();
for (Node v : nodeCoverage.get(node)) {
if (v instanceof ColumnNode) {
ColumnNode cNode = (ColumnNode) v;
hNodeIdsCoveredByVertex.put(cNode.getHNodeId());
}
}
String hNodeId = "";
/** Add the semantic type information **/
if (node instanceof ColumnNode) {
ColumnNode cNode = (ColumnNode) node;
hNodeId = cNode.getHNodeId();
hNodeIdsAdded.add(cNode.getHNodeId());
}
boolean isUri = false;
if(node instanceof LiteralNode)
isUri = ((LiteralNode)node).isUri();
JSONObject nodeObj = getNormalLayoutNodeJsonObject(node.getLocalId(),
node.getLabel().getRdfsLabel(), node.getLabel().getRdfsComment(),
node.getId(), node.getType().name(), height,
node.isForced(), hNodeIdsCoveredByVertex,
hNodeId, node.getUri(), isUri);
nodesArr.put(nodeObj);
verticesIndex.put(node, nodesIndexcounter++);
}
/*** Add the links ***/
Set<LabeledLink> links = alignmentGraph.edgeSet();
for (LabeledLink link : links) {
Node source = link.getSource();
Integer sourceIndex = verticesIndex.get(source);
Node target = link.getTarget();
Integer targetIndex = verticesIndex.get(target);
Set<LabeledLink> outEdges = alignmentGraph
.outgoingEdgesOf(target);
if (sourceIndex == null || targetIndex == null) {
logger.error("Edge vertex index not found!");
continue;
}
JSONObject linkObj = new JSONObject();
linkObj.put(JsonKeys.source.name(), sourceIndex);
linkObj.put(JsonKeys.target.name(), targetIndex);
linkObj.put(JsonKeys.sourceNodeId.name(), source.getId());
linkObj.put(JsonKeys.targetNodeId.name(), target.getId());
linkObj.put(JsonKeys.label.name(), link.getLabel().getLocalName());
linkObj.put(JsonKeys.rdfsLabel.name(), link.getLabel().getRdfsLabel());
linkObj.put(JsonKeys.rdfsComment.name(), link.getLabel().getRdfsComment());
linkObj.put(JsonKeys.id.name(), link.getId() + "");
linkObj.put(JsonKeys.linkStatus.name(), link.getStatus()
.name());
linkObj.put(JsonKeys.linkUri.name(), link.getLabel()
.getUri());
if (target.getType() == NodeType.ColumnNode
&& outEdges.isEmpty()) {
linkObj.put(JsonKeys.linkType.name(),
JsonValues.holderLink.name());
}
linksArr.put(linkObj);
if (link.getType() == LinkType.ClassInstanceLink
&& target instanceof ColumnNode) {
ColumnNode cNode = (ColumnNode) target;
// Add the holder vertex object and the link that
// attaches nodes to the columns
JSONArray hNodeIdsCoveredByVertex_holder = new JSONArray();
hNodeIdsCoveredByVertex_holder.put(cNode.getHNodeId());
JSONObject vertObj_holder = getNormalLayoutNodeJsonObject(
JsonValues.key.name(), source.getLabel().getRdfsLabel(),
source.getLabel().getRdfsComment(),
source.getId() + "_holder",
NodeType.ColumnNode.name(), 0, false,
hNodeIdsCoveredByVertex_holder,
cNode.getHNodeId(), cNode.getLabel().getUri(), false);
nodesArr.put(vertObj_holder);
nodesIndexcounter++;
// Add the holder link
JSONObject linkObj_holder = getNormalLayoutLinkJsonObject(
JsonValues.key.name(), "", "", "", nodesIndexcounter,
nodesIndexcounter - 1, "", "", "", "");
linksArr.put(linkObj_holder);
}
if (link.getType() == LinkType.DataPropertyOfColumnLink) {
DataPropertyOfColumnLink dpLink = (DataPropertyOfColumnLink) link;
String startHNodeId = dpLink
.getSpecializedColumnHNodeId();
// Get height of the class instance node
int height = maxTreeHeight
- nodeHeightsMap.get(link.getSource());
// Add 2 more holder nodes
// Start node
JSONArray hNodeIdsCoveredByVertex_holder = new JSONArray();
boolean isSUri = false;
if(source instanceof LiteralNode) {
isSUri = ((LiteralNode)source).isUri();
}
hNodeIdsCoveredByVertex_holder.put(startHNodeId);
JSONObject startNode = getNormalLayoutNodeJsonObject("", "", "",
source.getId() + "_holder",
JsonValues.DataPropertyOfColumnHolder.name(),
height - 0.35, false,
hNodeIdsCoveredByVertex_holder, startHNodeId,
source.getLabel().getUri(), isSUri);
nodesArr.put(startNode);
nodesIndexcounter++;
// End node
String endHNodeId = ((ColumnNode) link.getTarget())
.getHNodeId();
JSONArray hNodeIdsCoveredByVertex_holder_2 = new JSONArray();
hNodeIdsCoveredByVertex_holder_2.put(endHNodeId);
boolean isTUri = false;
if(target instanceof LiteralNode) {
isTUri = ((LiteralNode)target).isUri();
}
JSONObject endNode = getNormalLayoutNodeJsonObject("", "", "",
target.getId() + "_holder",
JsonValues.DataPropertyOfColumnHolder.name(),
height - 0.35, false,
hNodeIdsCoveredByVertex_holder_2, endHNodeId,
target.getLabel().getUri(), isTUri);
nodesArr.put(endNode);
nodesIndexcounter++;
// Add the horizontal link
JSONObject linkObj_holder = getNormalLayoutLinkJsonObject("", "", "", "",
nodesIndexcounter - 2, nodesIndexcounter - 1,
JsonValues.horizontalDataPropertyLink.name(),
"", "", "");
linksArr.put(linkObj_holder);
} else if (link.getType() == LinkType.ObjectPropertySpecializationLink) {
ObjectPropertySpecializationLink opLink = (ObjectPropertySpecializationLink) link;
String specializedLinkId = opLink
.getSpecializedLinkId();
// Get height of the class instance node
Node specializedLinkTarget = this.alignment
.getNodeById(LinkIdFactory
.getLinkTargetId(specializedLinkId));
int height = nodeHeightsMap.get(specializedLinkTarget);
// Add 2 more holder nodes
// Start node
JSONArray hNodeIdsCoveredByVertex_holder = new JSONArray();
for (Node v : nodeCoverage.get(specializedLinkTarget)) {
if (v instanceof ColumnNode) {
ColumnNode cNode = (ColumnNode) v;
hNodeIdsCoveredByVertex_holder.put(cNode
.getHNodeId());
}
}
boolean isSUri = false;
if(source instanceof LiteralNode) {
isSUri = ((LiteralNode)source).isUri();
}
JSONObject startNode = getNormalLayoutNodeJsonObject("", "", "",
source.getId() + "_holder",
JsonValues.DataPropertyOfColumnHolder.name(),
height + 0.65, false,
hNodeIdsCoveredByVertex_holder, "", source
.getLabel().getUri(), isSUri);
nodesArr.put(startNode);
nodesIndexcounter++;
// End node
String endHNodeId = ((ColumnNode) link.getTarget())
.getHNodeId();
JSONArray hNodeIdsCoveredByVertex_holder_2 = new JSONArray();
hNodeIdsCoveredByVertex_holder_2.put(endHNodeId);
boolean isTUri = false;
if(source instanceof LiteralNode) {
isTUri = ((LiteralNode)target).isUri();
}
JSONObject endNode = getNormalLayoutNodeJsonObject("", "", "",
target.getId() + "_holder",
JsonValues.DataPropertyOfColumnHolder.name(),
height + 0.65, false,
hNodeIdsCoveredByVertex_holder_2, endHNodeId,
target.getLabel().getUri(), isTUri);
nodesArr.put(endNode);
nodesIndexcounter++;
// Add the horizontal link
JSONObject linkObj_holder = getNormalLayoutLinkJsonObject("", "", "", "",
nodesIndexcounter - 2, nodesIndexcounter - 1,
JsonValues.horizontalDataPropertyLink.name(),
"", "", "");
linksArr.put(linkObj_holder);
}
linkObj.put(JsonKeys.linkType.name(), link.getType());
}
}
// Add the vertices for the columns that were not in Steiner tree
hNodeIdList.removeAll(hNodeIdsAdded);
for (String hNodeId : hNodeIdList) {
JSONArray hNodeIdsCoveredByVertex = new JSONArray();
hNodeIdsCoveredByVertex.put(hNodeId);
JSONObject vertObj = getNormalLayoutNodeJsonObject("", "", "", hNodeId,
JsonValues.Unassigned.name(), 0, false,
hNodeIdsCoveredByVertex, hNodeId, "", false);
nodesArr.put(vertObj);
}
topObj.put(JsonKeys.maxTreeHeight.name(), maxTreeHeight);
topObj.put(JsonKeys.nodes.name(), nodesArr);
topObj.put(JsonKeys.links.name(), linksArr);
pw.write(topObj.toString());
} catch (JSONException e) {
logger.error("Error occured while writing JSON!", e);
}
}
private JSONObject getNormalLayoutNodeJsonObject(String label, String rdfsLabel, String rdfsComment,
String id,
String nodeType, double height, boolean isForcedByUser,
JSONArray hNodeIdsCoveredByVertex, String hNodeId, String nodeDomain,
boolean isUri) throws JSONException {
JSONObject nodeObj = new JSONObject();
nodeObj.put(JsonKeys.label.name(), label);
nodeObj.put(JsonKeys.rdfsLabel.name(), rdfsLabel);
nodeObj.put(JsonKeys.rdfsComment.name(), rdfsComment);
nodeObj.put(JsonKeys.id.name(), id);
nodeObj.put(JsonKeys.nodeType.name(), nodeType);
nodeObj.put(JsonKeys.height.name(), height);
nodeObj.put(JsonKeys.isForcedByUser.name(), isForcedByUser);
nodeObj.put(JsonKeys.hNodesCovered.name(), hNodeIdsCoveredByVertex);
if (!hNodeId.equals(""))
nodeObj.put(JsonKeys.hNodeId.name(), hNodeId);
nodeObj.put(JsonKeys.nodeDomain.name(), nodeDomain);
nodeObj.put(JsonKeys.isUri.name(), isUri);
return nodeObj;
}
private JSONObject getNormalLayoutLinkJsonObject(String label, String rdfsLabel, String rdfsComment,
String id,
int sourceIndex, int targetIndex, String linkType,
String sourceNodeId, String targetNodeId, String linkStatus)
throws JSONException {
JSONObject linkObj = new JSONObject();
linkObj.put(JsonKeys.label.name(), label);
linkObj.put(JsonKeys.rdfsLabel.name(), rdfsLabel);
linkObj.put(JsonKeys.rdfsComment.name(), rdfsComment);
linkObj.put(JsonKeys.id.name(), id);
linkObj.put(JsonKeys.source.name(), sourceIndex);
linkObj.put(JsonKeys.target.name(), targetIndex);
linkObj.put(JsonKeys.linkType.name(), linkType);
if (!sourceNodeId.equals(""))
linkObj.put(JsonKeys.sourceNodeId.name(), sourceNodeId);
if (!targetNodeId.equals(""))
linkObj.put(JsonKeys.targetNodeId.name(), targetNodeId);
if (!linkStatus.equals(""))
linkObj.put(JsonKeys.linkStatus.name(), linkStatus);
return linkObj;
}
}