825751188b560e04ce16c0229b5253e8cab2bd63
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / io / codec / XcosCodec.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.io.codec;
15
16 import java.util.logging.Logger;
17
18 import org.scilab.modules.graph.io.ScilabObjectCodec;
19 import org.scilab.modules.types.ScilabList;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.Element;
22 import org.w3c.dom.Node;
23 import org.w3c.dom.NodeList;
24
25 import com.mxgraph.io.mxCodec;
26 import com.mxgraph.io.mxCodecRegistry;
27 import com.mxgraph.io.mxObjectCodec;
28
29 /**
30  * Root codec for Xcos diagram instance.
31  *
32  * This class register all packages used by Xcos for
33  * serialization/deserialization.
34  */
35 public class XcosCodec extends mxCodec {
36     /**
37      * Register packages for encoding/decoding diagrams
38      */
39     static {
40         // Add all xcos packages
41         mxCodecRegistry.addPackage("org.scilab.modules.graph");
42         mxCodecRegistry.addPackage("org.scilab.modules.xcos");
43         mxCodecRegistry.addPackage("org.scilab.modules.xcos.graph");
44         mxCodecRegistry.addPackage("org.scilab.modules.xcos.block");
45         mxCodecRegistry
46         .addPackage("org.scilab.modules.xcos.block.positionning");
47         mxCodecRegistry.addPackage("org.scilab.modules.xcos.link");
48         mxCodecRegistry
49         .addPackage("org.scilab.modules.xcos.link.commandcontrol");
50         mxCodecRegistry.addPackage("org.scilab.modules.xcos.link.explicit");
51         mxCodecRegistry.addPackage("org.scilab.modules.xcos.link.implicit");
52         mxCodecRegistry.addPackage("org.scilab.modules.xcos.port");
53         mxCodecRegistry.addPackage("org.scilab.modules.xcos.port.command");
54         mxCodecRegistry.addPackage("org.scilab.modules.xcos.port.control");
55         mxCodecRegistry.addPackage("org.scilab.modules.xcos.port.input");
56         mxCodecRegistry.addPackage("org.scilab.modules.xcos.port.output");
57         // Add 'types' package to have all scilab types known
58         mxCodecRegistry.addPackage("org.scilab.modules.types");
59     }
60
61     /**
62      * Install codecs for serializable instance
63      */
64     static {
65
66         // Types
67         ScilabObjectCodec.register();
68
69         // Diagram
70         XcosDiagramCodec.register();
71
72         // Blocks
73         BasicBlockCodec.register();
74
75         // Link
76         BasicLinkCodec.register();
77
78         // Ports
79         BasicPortCodec.register();
80
81         // Orientation
82         OrientationCodec.register();
83     }
84
85     /**
86      * Default constructor
87      */
88     public XcosCodec() {
89         super();
90     }
91
92     public XcosCodec(Document document) {
93         super(document);
94     }
95
96
97     /**
98      * Set the setIdAttribute for all node in the {@link Document}.
99      */
100     public void setElementIdAttributes () {
101         setElementIdAttributes(getDocument());
102     }
103
104     /**
105      * Set the setIdAttribute for all node in the {@link Node}.
106      *
107      * After this call the user can easily getElementById() on the DOM tree.
108      *
109      * @param n the root node to start with
110      */
111     public static void setElementIdAttributes (final Node root) {
112         for (Node next = root.getNextSibling(); next != null; next = next.getNextSibling()) {
113             if (next.getNodeType() == Node.ELEMENT_NODE) {
114                 final Element elem = (Element) next;
115
116                 if (elem.hasAttribute("id")) {
117                     elem.setIdAttribute("id", true);
118                 }
119             }
120         }
121
122         NodeList children = root.getChildNodes();
123         for (int i = 0; i < children.getLength(); i++) {
124             final Node child = children.item(i);
125             if (child.getNodeType() == Node.ELEMENT_NODE) {
126                 setElementIdAttributes(child);
127             }
128         }
129     }
130
131     /**
132      * As each node has an xml:id, use getElementById() instead of an xpath expression (through JGraphX).
133      *
134      * {@inheritDoc}
135      */
136     @Override
137     public Object lookup(String id) {
138         final Element element = getDocument().getElementById(id);
139         final mxObjectCodec decoder = mxCodecRegistry.getCodec(element.getNodeName());
140         return decoder.decode(this, element);
141     }
142
143     public static Object enableBinarySerialization(ScilabList dictionary) {
144         return ScilabObjectCodec.enableBinarySerialization(dictionary);
145     }
146
147     public static ScilabList disableBinarySerialization() {
148         return ScilabObjectCodec.disableBinarySerialization();
149     }
150 }