1 package org
.argeo
.app
.swt
.docbook
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.io
.UnsupportedEncodingException
;
7 import java
.net
.URISyntaxException
;
8 import java
.net
.URLEncoder
;
9 import java
.nio
.charset
.StandardCharsets
;
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
;
24 /** Add DocBook images support to {@link CmsImageManager}. */
25 public class DbkImageManager
extends AcrSwtImageManager
{
26 private Content baseFolder
= null;
28 public DbkImageManager(Content baseFolder
) {
29 this.baseFolder
= baseFolder
;
32 Content
getImageDataNode(Content mediaObjectNode
) {
33 return mediaObjectNode
.child(DbkType
.imageobject
).child(DbkType
.imagedata
);
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);
44 // if (node.isNodeType(NT_FILE)) {
47 // if (fileNode != null) {
48 // return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
52 // } catch (RepositoryException e) {
53 // throw new JcrException(e);
57 public Cms2DSize
getImageSize(Content mediaObjectNode
) {
58 Content imageDataNode
= getImageDataNode(mediaObjectNode
);
59 Content fileNode
= getFileNode(imageDataNode
);
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
);
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
);
75 // TODO interpret image data infos
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
);
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);
96 public String
getImageUrl(Content mediaObjectNode
) {
97 Content imageDataNode
= getImageDataNode(mediaObjectNode
);
99 String fileref
= imageDataNode
.get(DbkAttr
.fileref
, String
.class).orElse(null);
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
);
109 if (fileUri
.getScheme() != null)
110 return fileUri
.toString();
112 Content fileNode
= getFileNode(imageDataNode
);
113 String url
= getDataPathForUrl(fileNode
);
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);
122 return ((ProvidedContent
) baseFolder
).getContent(fileref
).get();
125 protected Content
getMediaFolder() {
126 // TODO check edition status
127 Content mediaFolder
= baseFolder
.anyOrAddChild(EntityNames
.MEDIA
, DName
.collection
.qName());