]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/property/svg/SVGTextFactory.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / property / svg / SVGTextFactory.java
1 /*******************************************************************************\r
2  * Copyright (c) 2011 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.property.svg;\r
13 \r
14 import java.io.IOException;\r
15 import java.io.StringReader;\r
16 import java.io.StringWriter;\r
17 \r
18 import javax.xml.parsers.DocumentBuilder;\r
19 import javax.xml.parsers.DocumentBuilderFactory;\r
20 import javax.xml.parsers.ParserConfigurationException;\r
21 \r
22 import org.simantics.browsing.ui.swt.widgets.impl.ReadFactoryImpl;\r
23 import org.simantics.databoard.Bindings;\r
24 import org.simantics.db.ReadGraph;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.diagram.stubs.G2DResource;\r
28 import org.w3c.dom.Document;\r
29 import org.w3c.dom.bootstrap.DOMImplementationRegistry;\r
30 import org.w3c.dom.ls.DOMImplementationLS;\r
31 import org.w3c.dom.ls.LSOutput;\r
32 import org.w3c.dom.ls.LSSerializer;\r
33 import org.xml.sax.InputSource;\r
34 import org.xml.sax.SAXException;\r
35 \r
36 \r
37 /**\r
38  * @author Antti Villberg\r
39  */\r
40 public class SVGTextFactory extends ReadFactoryImpl<SVGInput, String> {\r
41 \r
42     @Override\r
43     public String perform(ReadGraph graph, SVGInput input) throws DatabaseException {\r
44         G2DResource G2D = G2DResource.getInstance(graph);\r
45         Resource element = input.getDatum();\r
46         String exp = graph.getPossibleRelatedValue(element, G2D.HasSVGDocument, Bindings.STRING);\r
47         return exp != null ? XMLPrettyPrinter.safePrettyPrint(exp) : "";\r
48     }\r
49 \r
50 }\r
51 \r
52 /**\r
53  * @author Antti Villberg\r
54  */\r
55 class XMLPrettyPrinter {\r
56 \r
57     private static DOMImplementationRegistry registry;\r
58 \r
59     static {\r
60         try {\r
61             registry = DOMImplementationRegistry.newInstance();\r
62         } catch (ClassCastException e) {\r
63             e.printStackTrace();\r
64         } catch (ClassNotFoundException e) {\r
65             e.printStackTrace();\r
66         } catch (InstantiationException e) {\r
67             e.printStackTrace();\r
68         } catch (IllegalAccessException e) {\r
69             e.printStackTrace();\r
70         }\r
71     }\r
72 \r
73     public static Document parseDocument(String document) throws IOException, SAXException, ParserConfigurationException {\r
74         InputSource xmlSource = new InputSource(new StringReader(document)); \r
75         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();\r
76         dbFactory.setExpandEntityReferences(false);\r
77         dbFactory.setValidating(false);\r
78 //        dbFactory.setFeature("http://xml.org/sax/features/validation", false);\r
79 //        dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);\r
80         dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);\r
81 //        dbFactory.setFeature("http://xml.org/sax/features/namespaces", false);\r
82 //        dbFactory.setFeature("http://apache.org/xml/features/validation/schema", false);\r
83 //        dbFactory.setFeature("http://apache.org/xml/features/validation/schema-full-checking", false);\r
84         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();\r
85         return dBuilder.parse(xmlSource);\r
86     }\r
87 \r
88     public static String prettyPrint(String document) throws IOException, SAXException, ParserConfigurationException {\r
89 //        long start = System.nanoTime();\r
90         Document doc = parseDocument(document);\r
91 \r
92         DOMImplementationLS impl = (DOMImplementationLS)registry.getDOMImplementation("LS");\r
93         LSSerializer serializer = impl.createLSSerializer();\r
94         serializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);\r
95         LSOutput lsOutput = impl.createLSOutput();\r
96         lsOutput.setEncoding("UTF-8");\r
97         StringWriter stringWriter = new StringWriter();\r
98         lsOutput.setCharacterStream(stringWriter);\r
99         serializer.setNewLine("\n");\r
100         serializer.write(doc, lsOutput);\r
101         String formatted = stringWriter.toString();\r
102 \r
103 //        long duration = System.nanoTime() - start;\r
104 //        System.out.println("Pretty print took " + 1e-9*duration + "s.");\r
105 //        System.out.println("original: " + document);\r
106 //        System.out.println("formatted: " + formatted);\r
107 \r
108         return formatted;\r
109     }\r
110 \r
111     public static String safePrettyPrint(String document) {\r
112         try {\r
113             return prettyPrint(document);\r
114         } catch (Exception e) {\r
115             e.printStackTrace();\r
116             return "";\r
117         }\r
118     }\r
119 \r
120 }