]> git.argeo.org Git - gpl/argeo-suite.git/blob - swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImageManager.java
Remove legacy map overview
[gpl/argeo-suite.git] / swt / org.argeo.app.swt / src / org / argeo / app / swt / docbook / DbkImageManager.java
1 package org.argeo.app.swt.docbook;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.UnsupportedEncodingException;
6 import java.net.URI;
7 import java.net.URISyntaxException;
8 import java.net.URLEncoder;
9 import java.nio.charset.StandardCharsets;
10
11 import org.argeo.api.acr.Content;
12 import org.argeo.api.acr.DName;
13 import org.argeo.api.acr.spi.ProvidedContent;
14 import org.argeo.api.cms.ux.Cms2DSize;
15 import org.argeo.api.cms.ux.CmsImageManager;
16 import org.argeo.app.api.EntityNames;
17 import org.argeo.app.api.EntityType;
18 import org.argeo.app.docbook.DbkAttr;
19 import org.argeo.app.docbook.DbkType;
20 import org.argeo.cms.acr.SvgAttrs;
21 import org.argeo.cms.swt.acr.AcrSwtImageManager;
22 import org.eclipse.swt.graphics.ImageData;
23
24 /** Add DocBook images support to {@link CmsImageManager}. */
25 public class DbkImageManager extends AcrSwtImageManager {
26 private Content baseFolder = null;
27
28 public DbkImageManager(Content baseFolder) {
29 this.baseFolder = baseFolder;
30 }
31
32 Content getImageDataNode(Content mediaObjectNode) {
33 return mediaObjectNode.child(DbkType.imageobject).child(DbkType.imagedata);
34 }
35
36 // @Override
37 // public Binary getImageBinary(Node node) {
38 // Node fileNode = null;
39 // if (DbkUtils.isDbk(node, DbkType.mediaobject)) {
40 // Node imageDataNode = getImageDataNode(node);
41 // fileNode = getFileNode(imageDataNode);
42 // }
43 // try {
44 // if (node.isNodeType(NT_FILE)) {
45 // fileNode = node;
46 // }
47 // if (fileNode != null) {
48 // return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
49 // } else {
50 // return null;
51 // }
52 // } catch (RepositoryException e) {
53 // throw new JcrException(e);
54 // }
55 // }
56
57 public Cms2DSize getImageSize(Content mediaObjectNode) {
58 Content imageDataNode = getImageDataNode(mediaObjectNode);
59 Content fileNode = getFileNode(imageDataNode);
60 if (fileNode == null)
61 return new Cms2DSize(0, 0);
62 Cms2DSize intrinsicSize;
63 if (fileNode.containsKey(SvgAttrs.width) && fileNode.containsKey(SvgAttrs.height)) {
64 int width = fileNode.get(SvgAttrs.width, Integer.class).orElseThrow();
65 int height = fileNode.get(SvgAttrs.height, Integer.class).orElseThrow();
66 intrinsicSize = new Cms2DSize(width, height);
67 } else {
68 try (InputStream in = fileNode.open(InputStream.class)) {
69 ImageData id = new ImageData(in);
70 intrinsicSize = updateSize(fileNode, id);
71 } catch (IOException e) {
72 throw new RuntimeException("Cannot load file " + fileNode, e);
73 }
74 }
75 // TODO interpret image data infos
76 return intrinsicSize;
77 }
78
79 protected Cms2DSize updateSize(Content fileNode, ImageData id) {
80 fileNode.addContentClasses(EntityType.box.qName());
81 fileNode.put(SvgAttrs.width, id.width);
82 fileNode.put(SvgAttrs.height, id.height);
83 return new Cms2DSize(id.width, id.height);
84 }
85
86 // @Override
87 // protected void processNewImageFile(Content mediaObjectNode, Content fileNode, ImageData id) throws IOException {
88 // Node imageDataNode = getImageDataNode(mediaObjectNode);
89 // updateSize(fileNode, id);
90 // String filePath = fileNode.getPath();
91 // String relPath = filePath.substring(baseFolder.getPath().length() + 1);
92 // imageDataNode.setProperty(DbkAttr.fileref.name(), relPath);
93 // }
94
95 @Override
96 public String getImageUrl(Content mediaObjectNode) {
97 Content imageDataNode = getImageDataNode(mediaObjectNode);
98 // TODO factorise
99 String fileref = imageDataNode.get(DbkAttr.fileref, String.class).orElse(null);
100 if (fileref == null)
101 return null;
102 URI fileUri;
103 try {
104 // FIXME it messes up with the '/'
105 fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
106 } catch (URISyntaxException | UnsupportedEncodingException e) {
107 throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
108 }
109 if (fileUri.getScheme() != null)
110 return fileUri.toString();
111 // local
112 Content fileNode = getFileNode(imageDataNode);
113 String url = getDataPathForUrl(fileNode);
114 return url;
115 }
116
117 protected Content getFileNode(Content imageDataNode) {
118 // FIXME make URL use case more robust
119 String fileref = imageDataNode.get(DbkAttr.fileref, String.class).orElse(null);
120 if (fileref == null)
121 return null;
122 return ((ProvidedContent) baseFolder).getContent(fileref).get();
123 }
124
125 protected Content getMediaFolder() {
126 // TODO check edition status
127 Content mediaFolder = baseFolder.anyOrAddChild(EntityNames.MEDIA, DName.collection.qName());
128 return mediaFolder;
129 }
130 }