eu.esdihumboldt.hale.ui.cst.debug.metadata.internal.TreeGraphMLProvider.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.cst.debug.metadata.internal.TreeGraphMLProvider.java

Source

/*
 * Copyright (c) 2012 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.ui.cst.debug.metadata.internal;

import java.util.Set;

import com.google.common.collect.Iterables;
import com.google.common.collect.SetMultimap;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;

import eu.esdihumboldt.hale.common.align.extension.function.FunctionUtil;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.CellNode;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.SourceNode;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.TargetNode;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.TransformationNode;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.TransformationTree;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.visitor.TreeToGraphVisitor;
import eu.esdihumboldt.hale.common.instance.model.Group;
import eu.esdihumboldt.hale.common.instance.model.Instance;

/**
 * Provider for converting TransformationTrees into the graphML-format
 * 
 * @author SebastianReinhardt
 */
public class TreeGraphMLProvider implements TreeGraphProvider {

    TransformationTree tree;
    TreeToGraphVisitor graphVisitor;

    /**
     * @param tree The Tree to get the graph from
     */
    public TreeGraphMLProvider(TransformationTree tree) {
        this.tree = tree;
        graphVisitor = new TreeToGraphVisitor(null);
    }

    /**
     * @see eu.esdihumboldt.hale.ui.cst.debug.metadata.internal.TreeGraphProvider#generateGraph()
     */
    @Override
    public Graph generateGraph() {

        tree.accept(graphVisitor);

        SetMultimap<String, String> connections = graphVisitor.getAllConnections();
        Set<String> ids = graphVisitor.getAllIds();

        TinkerGraph graph = new TinkerGraph();

        // add nodes to the graph
        for (String key : ids) {
            TransformationNode node = graphVisitor.getNode(key);
            Vertex vertex = graph.addVertex(key);
            setVertexProperty(node, vertex);
        }

        for (String key : connections.keySet()) {
            for (String value : connections.get(key)) {
                graph.addEdge(null, graph.getVertex(key), graph.getVertex(value), " ");
            }
        }
        return graph;
    }

    /**
     * sets the property of a [@link]Vertex from a [@link]TransformationNode
     * 
     * @param node the node-object to get the name from
     * @param vertex the vertex to set the property
     */
    private void setVertexProperty(TransformationNode node, Vertex vertex) {

        if (node instanceof TransformationTree) {
            vertex.setProperty("name", ((TransformationTree) node).getType().getDisplayName());
            vertex.setProperty("type", "root");
        }

        if (node instanceof TargetNode) {
            vertex.setProperty("name", ((TargetNode) node).getDefinition().getDisplayName());
            vertex.setProperty("type", "target");
        }

        if (node instanceof SourceNode) {
            SourceNode snode = (SourceNode) node;
            Object value = snode.getValue();
            String name = ((SourceNode) node).getDefinition().getDisplayName();

            if (value instanceof Group) {
                vertex.setProperty("name", name);
                vertex.setProperty("group", getChildrencountString(value));
                vertex.setProperty("type", "source");
            }
            if (value instanceof Instance) {
                if (((Instance) value).getValue() != null) {
                    vertex.setProperty("group", getChildrencountString(value));
                    vertex.setProperty("value", ((Instance) value).getValue().toString());
                    vertex.setProperty("type", "source");
                }
            } else {
                vertex.setProperty("name", name);
                vertex.setProperty("type", "source");
                if (value instanceof String) {
                    vertex.setProperty("value", value);
                }

            }

        }

        if (node instanceof CellNode) {
            vertex.setProperty("name", FunctionUtil
                    .getFunction(((CellNode) node).getCell().getTransformationIdentifier(), null).getDisplayName());
            vertex.setProperty("type", "cell");
        }
    }

    /**
     * method for gathering the string of a node value
     * 
     * @param value the node value
     * @return the dot-format-string
     */
    private String getChildrencountString(Object value) {

        if (value instanceof Instance) {
            String ivalue = "Instance(" + Iterables.size(((Instance) value).getPropertyNames()) + ")";
            return ivalue;

        }
        if (value instanceof Group) {
            return "Group(" + Iterables.size(((Group) value).getPropertyNames()) + ")";
        }

        return value.toString();

    }
}