]> git.argeo.org Git - gpl/argeo-suite.git/blob - DbkImageManager.java
8ff17b8676281961916e68aa672e0dd38f8b427b
[gpl/argeo-suite.git] / DbkImageManager.java
1 package org.argeo.docbook.ui;
2
3 import static javax.jcr.Node.JCR_CONTENT;
4 import static javax.jcr.Property.JCR_DATA;
5 import static javax.jcr.nodetype.NodeType.NT_FILE;
6
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.UnsupportedEncodingException;
10 import java.net.URI;
11 import java.net.URISyntaxException;
12 import java.net.URLEncoder;
13 import java.nio.charset.StandardCharsets;
14
15 import javax.jcr.Binary;
16 import javax.jcr.Node;
17 import javax.jcr.RepositoryException;
18 import javax.jcr.nodetype.NodeType;
19
20 import org.argeo.cms.ui.CmsImageManager;
21 import org.argeo.cms.ui.util.CmsUiUtils;
22 import org.argeo.cms.ui.util.DefaultImageManager;
23 import org.argeo.docbook.DbkUtils;
24 import org.argeo.docbook.DbkAttr;
25 import org.argeo.docbook.DbkType;
26 import org.argeo.entity.EntityNames;
27 import org.argeo.entity.EntityType;
28 import org.argeo.jcr.JcrException;
29 import org.argeo.jcr.JcrUtils;
30 import org.eclipse.swt.graphics.ImageData;
31 import org.eclipse.swt.graphics.Point;
32
33 /** Add DocBook images support to {@link CmsImageManager}. */
34 public class DbkImageManager extends DefaultImageManager {
35 private Node baseFolder = null;
36
37 public DbkImageManager(Node baseFolder) {
38 this.baseFolder = baseFolder;
39 }
40
41 @Override
42 public Binary getImageBinary(Node node) throws RepositoryException {
43 Node fileNode = null;
44 if (DbkUtils.isDbk(node, DbkType.imagedata)) {
45 fileNode = getFileNode(node);
46 }
47 if (node.isNodeType(NT_FILE)) {
48 fileNode = node;
49 }
50 if (fileNode != null) {
51 return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
52 } else {
53 return null;
54 }
55 }
56
57 public Point getImageSize(Node imageDataNode) throws RepositoryException {
58 Node fileNode = getFileNode(imageDataNode);
59 if (fileNode == null)
60 return new Point(0, 0);
61 Point intrinsicSize;
62 if (fileNode.hasProperty(EntityNames.SVG_WIDTH) && fileNode.hasProperty(EntityNames.SVG_HEIGHT)) {
63 int width = (int) fileNode.getProperty(EntityNames.SVG_WIDTH).getLong();
64 int height = (int) fileNode.getProperty(EntityNames.SVG_HEIGHT).getLong();
65 intrinsicSize = new Point(width, height);
66 } else {
67 try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
68 ImageData id = new ImageData(in);
69 intrinsicSize = updateSize(fileNode, id);
70 } catch (IOException e) {
71 throw new RuntimeException("Cannot load file " + fileNode, e);
72 }
73 }
74 // TODO interpret image data infos
75 return intrinsicSize;
76 }
77
78 protected Point updateSize(Node fileNode, ImageData id) throws RepositoryException {
79 fileNode.addMixin(EntityType.box.get());
80 fileNode.setProperty(EntityNames.SVG_WIDTH, id.width);
81 fileNode.setProperty(EntityNames.SVG_HEIGHT, id.height);
82 return new Point(id.width, id.height);
83 }
84
85 @Override
86 protected void processNewImageFile(Node context, Node fileNode, ImageData id)
87 throws RepositoryException, IOException {
88 updateSize(fileNode, id);
89 String filePath = fileNode.getPath();
90 String relPath = filePath.substring(baseFolder.getPath().length() + 1);
91 context.setProperty(DbkAttr.fileref.name(), relPath);
92 }
93
94 @Override
95 public String getImageUrl(Node imageDataNode) throws RepositoryException {
96 // TODO factorise
97 String fileref = null;
98 if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
99 fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
100 if (fileref == null)
101 return null;
102 URI fileUri;
103 try {
104 fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
105 } catch (URISyntaxException | UnsupportedEncodingException e) {
106 throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
107 }
108 if (fileUri.getScheme() != null)
109 return fileUri.toString();
110 // local
111 Node fileNode = getFileNode(imageDataNode);
112 String url = CmsUiUtils.getDataPath(fileNode);
113 return url;
114 }
115
116 protected Node getFileNode(Node imageDataNode) throws RepositoryException {
117 // FIXME make URL use case more robust
118 String fileref = null;
119 if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
120 fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
121 if (fileref == null)
122 return null;
123 Node fileNode;
124 if (fileref.startsWith("/"))
125 fileNode = baseFolder.getSession().getNode(fileref);
126 else
127 fileNode = baseFolder.getNode(fileref);
128 return fileNode;
129 }
130
131 protected Node getMediaFolder() {
132 try {
133 // TODO check edition status
134 Node mediaFolder = JcrUtils.getOrAdd(baseFolder, EntityNames.MEDIA, NodeType.NT_FOLDER);
135 return mediaFolder;
136 } catch (RepositoryException e) {
137 throw new JcrException("Cannot get media folder", e);
138 }
139 }
140 }