/* * Copyright (c) 2008, the JUNG Project and the Regents of the University * of California * All rights reserved. * * This software is open-source under the BSD license; see either * "license.txt" or * http://jung.sourceforge.net/license.txt for a description. */ package edu.uci.ics.jung.io.graphml; import java.util.HashMap; import java.util.Map; /** * Metadata structure for the 'graph' GraphML element. * * @author Nathan Mittler - nathan.mittler@gmail.com * * @see "http://graphml.graphdrawing.org/specification.html" */ public class GraphMetadata extends AbstractMetadata { public enum EdgeDefault { DIRECTED, UNDIRECTED } private String id; private EdgeDefault edgeDefault; private String description; private Object graph; final private Map<Object, NodeMetadata> nodes = new HashMap<Object, NodeMetadata>(); final private Map<Object, EdgeMetadata> edges = new HashMap<Object, EdgeMetadata>(); final private Map<Object, HyperEdgeMetadata> hyperEdges = new HashMap<Object, HyperEdgeMetadata>(); public String getId() { return id; } public void setId(String id) { this.id = id; } public EdgeDefault getEdgeDefault() { return edgeDefault; } public void setEdgeDefault(EdgeDefault edgeDefault) { this.edgeDefault = edgeDefault; } public String getDescription() { return description; } public void setDescription(String desc) { this.description = desc; } public void addNodeMetadata(Object vertex, NodeMetadata metadata) { nodes.put(vertex, metadata); } public NodeMetadata getNodeMetadata(Object vertex) { return nodes.get(vertex); } public Map<Object, NodeMetadata> getNodeMap() { return nodes; } public void addEdgeMetadata(Object edge, EdgeMetadata metadata) { edges.put(edge, metadata); } public EdgeMetadata getEdgeMetadata(Object edge) { return edges.get(edge); } public Map<Object, EdgeMetadata> getEdgeMap() { return edges; } public void addHyperEdgeMetadata(Object edge, HyperEdgeMetadata metadata) { hyperEdges.put(edge, metadata); } public HyperEdgeMetadata getHyperEdgeMetadata(Object edge) { return hyperEdges.get(edge); } public Map<Object, HyperEdgeMetadata> getHyperEdgeMap() { return hyperEdges; } public Object getGraph() { return graph; } public void setGraph(Object graph) { this.graph = graph; } public MetadataType getMetadataType() { return MetadataType.GRAPH; } /** * Gets the property for the given vertex object. * * @param vertex * the subject vertex * @param key * the property key * @return the property value * @throws IllegalArgumentException * thrown if there is no metadata associated with the provided * vertex object. */ public String getVertexProperty(Object vertex, String key) throws IllegalArgumentException { NodeMetadata metadata = getNodeMetadata(vertex); if (metadata == null) { throw new IllegalArgumentException( "Metadata does not exist for provided vertex"); } return metadata.getProperty(key); } /** * Gets the property for the given edge object. * * @param edge * the subject edge. * @param key * the property key * @return the property value * @throws IllegalArgumentException * thrown if there is no metadata associated with the provided * edge object. */ public String getEdgeProperty(Object edge, String key) throws IllegalArgumentException { // First, try standard edges. EdgeMetadata em = getEdgeMetadata(edge); if (em != null) { return em.getProperty(key); } // Next, try hyperedges. HyperEdgeMetadata hem = getHyperEdgeMetadata(edge); if (hem != null) { return hem.getProperty(key); } // Couldn't find the edge. throw new IllegalArgumentException( "Metadata does not exist for provided edge"); } }