CustomNodeRealizerSerializer.java |
1 /**************************************************************************** 2 * This demo file is part of yFiles for Java 2.14. 3 * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28, 4 * 72070 Tuebingen, Germany. All rights reserved. 5 * 6 * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution 7 * of demo files in source code or binary form, with or without 8 * modification, is not permitted. 9 * 10 * Owners of a valid software license for a yFiles for Java version that this 11 * demo is shipped with are allowed to use the demo source code as basis 12 * for their own yFiles for Java powered applications. Use of such programs is 13 * governed by the rights and conditions as set out in the yFiles for Java 14 * license agreement. 15 * 16 * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 19 * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 ***************************************************************************/ 28 package demo.io.graphml; 29 30 import org.w3c.dom.NamedNodeMap; 31 import org.w3c.dom.Node; 32 import y.io.graphml.graph2d.ShapeNodeRealizerSerializer; 33 import y.io.graphml.input.GraphMLParseException; 34 import y.io.graphml.input.GraphMLParseContext; 35 import y.io.graphml.output.GraphMLWriteException; 36 import y.io.graphml.output.GraphMLWriteContext; 37 import y.io.graphml.output.XmlWriter; 38 import y.view.NodeRealizer; 39 40 /** 41 * Serializer for instances of class {@link demo.io.graphml.CustomNodeRealizer}. 42 * <p> 43 * Generates XML markup nested within a node's GraphML <code><data></code> 44 * element similar to the following: 45 * </p> 46 * <pre> 47 * <custom:CustomNode customAttribute="v1.0"> 48 * <custom:CustomElement value="333"/> 49 * </custom:CustomNode> 50 * </pre> 51 * Note that for presentation purposes the content of the XML markup is used as 52 * the node's label. 53 * 54 * @see <a href="http://docs.yworks.com/yfiles/doc/api/index.html#/dguide/graphml#graphml_custom_realizer_serializer" target="_blank">Section Support for Custom Realizer</a> in the yFiles for Java Developer's Guide 55 */ 56 public class CustomNodeRealizerSerializer extends ShapeNodeRealizerSerializer { 57 /** 58 * Returns the string <tt>CustomNode</tt>. 59 */ 60 public String getName() { 61 return "CustomNode"; 62 } 63 64 65 public String getNamespaceURI() { 66 return "demo.io.graphml.CustomNodeRealizer"; 67 } 68 69 70 public String getNamespacePrefix() { 71 return "custom"; 72 } 73 74 /** 75 * Returns class {@link CustomNodeRealizer}. 76 */ 77 public Class getRealizerClass() { 78 return CustomNodeRealizer.class; 79 } 80 81 /** 82 * Writes the <code>customElement</code> field of a CustomNodeRealizer object 83 * as an additional XML element. 84 * (This XML element is nested within the GraphML <data> element of nodes.) 85 */ 86 public void write(NodeRealizer realizer, XmlWriter writer, GraphMLWriteContext context) throws GraphMLWriteException { 87 super.write(realizer, writer, context); 88 CustomNodeRealizer fnr = (CustomNodeRealizer) realizer; 89 writer.writeStartElement(getNamespacePrefix(), "CustomElement", getNamespaceURI()) 90 .writeAttribute("value", fnr.getCustomValue()) 91 .writeEndElement(); 92 } 93 94 /** 95 * For demonstration purposes this method writes an additional <code>customAttribute</code> value as an XML attribute of a CustomNodeRealizer's 96 * XML markup. 97 * (This XML attribute enhances the GraphML <data> element of nodes.) 98 */ 99 public void writeAttributes(NodeRealizer realizer, XmlWriter writer, GraphMLWriteContext context) { 100 super.writeAttributes(realizer, writer, context); 101 CustomNodeRealizer fnr = (CustomNodeRealizer) realizer; 102 writer.writeAttribute("customAttribute", fnr.getCustomAttribute()); 103 } 104 105 /** 106 * Parses parts of the content of a GraphML file by processing its DOM structure. 107 */ 108 public void parse(NodeRealizer realizer, Node domNode, GraphMLParseContext context) throws GraphMLParseException { 109 super.parse(realizer, domNode, context); 110 111 CustomNodeRealizer result = (CustomNodeRealizer) realizer; 112 113 //parse attributes 114 NamedNodeMap nm = domNode.getAttributes(); 115 Node a = nm.getNamedItem("customAttribute"); 116 if (a != null) { 117 result.setCustomAttribute(a.getNodeValue()); 118 } 119 120 //parse elements 121 for (Node child = domNode.getFirstChild(); child != null; child = child.getNextSibling()) { 122 if (child.getNodeType() == Node.ELEMENT_NODE && 123 "CustomElement".equals(child.getLocalName())) { 124 nm = child.getAttributes(); 125 a = nm.getNamedItem("value"); 126 if (a != null) { 127 result.setCustomValue(Integer.parseInt(a.getNodeValue())); 128 } 129 } 130 } 131 } 132 } 133