]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/svg/CreateSVGElement.java
Use UTF-8 charset in SVG byte[] to String conversion
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / svg / CreateSVGElement.java
1 package org.simantics.modeling.svg;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.nio.charset.StandardCharsets;
6
7 import org.simantics.databoard.Bindings;
8 import org.simantics.db.Resource;
9 import org.simantics.db.WriteGraph;
10 import org.simantics.db.common.utils.OrderedSetUtils;
11 import org.simantics.db.exception.DatabaseException;
12 import org.simantics.diagram.stubs.DiagramResource;
13 import org.simantics.diagram.stubs.G2DResource;
14 import org.simantics.diagram.synchronization.graph.AddElement;
15 import org.simantics.image2.ontology.ImageResource;
16 import org.simantics.layer0.Layer0;
17 import org.simantics.layer0.utils.direct.GraphUtils;
18 import org.simantics.utils.FileUtils;
19
20 public class CreateSVGElement {
21
22     public static void createSVGElement(WriteGraph g, Resource diagram, String suffix, byte[] data, double mposX, double mposY) throws DatabaseException {
23         createSVGElement(g, diagram, suffix, data, mposX, mposY);
24     }
25
26     public static Resource createSVGElementR(WriteGraph g, Resource diagram, String suffix, byte[] data, double mposX, double mposY) throws DatabaseException {
27
28         Layer0 L0 = Layer0.getInstance(g);
29         DiagramResource DIA = DiagramResource.getInstance(g);
30         ImageResource IMAGE = ImageResource.getInstance(g);
31         G2DResource G2D = G2DResource.getInstance(g);
32
33         Resource element;
34         if("svg".equals(suffix)) {
35             Resource transform = GraphUtils.create(g, L0.InstanceOf, G2D.Transform);
36             g.claimValue(transform, new double[] {1.0, 0.0, 0.0, 1.0, mposX, mposY}, Bindings.DOUBLE_ARRAY);
37             element = GraphUtils.create(g,
38                     L0.InstanceOf, DIA.SVGElement,
39                     G2D.HasSVGDocument, new String(data, StandardCharsets.UTF_8),
40                     DIA.HasTransform, transform);
41             AddElement.claimFreshElementName(g, diagram, element);
42         } else if ("png".equals(suffix)) {
43             Resource transform = GraphUtils.create(g, L0.InstanceOf, G2D.Transform);
44             g.claimValue(transform, new double[] {1.0, 0.0, 0.0, 1.0, mposX, mposY}, Bindings.DOUBLE_ARRAY);
45             Resource image = g.newResource();
46             g.claim(image, L0.InstanceOf, IMAGE.PngImage);
47             g.claimValue(image, data, Bindings.BYTE_ARRAY);
48             element = GraphUtils.create(g,
49                     L0.InstanceOf, DIA.RasterElement,
50                     G2D.HasRasterImage, image,
51                     DIA.HasTransform, transform);
52             AddElement.claimFreshElementName(g, diagram, element);
53         }
54         else
55             throw new DatabaseException("Unknown image format " + suffix);
56         OrderedSetUtils.addFirst(g, diagram, element);
57         g.claim(diagram, L0.ConsistsOf, element);
58         return element;
59     }
60
61     public static void importSVGElement(WriteGraph graph, Resource diagram, File file, double posX, double posY) throws DatabaseException, IOException {
62         importSVGElementR(graph, diagram, file, posX, posY);
63     }
64
65     public static Resource importSVGElementR(WriteGraph graph, Resource diagram, File file, double posX, double posY) throws DatabaseException, IOException {
66         final byte[] data = FileUtils.readFile(file);
67         return createSVGElementR(graph, diagram, suffix(file.getName()), data, posX, posY);
68     }
69
70     private static String suffix(String fileName) {
71         int len = fileName.length();
72         if(len < 3) return null;
73         else return fileName.substring(len-3,len).toLowerCase();
74     }
75
76 }