1 package org
.argeo
.docbook
.ui
;
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
;
7 import java
.io
.IOException
;
8 import java
.io
.InputStream
;
9 import java
.io
.UnsupportedEncodingException
;
11 import java
.net
.URISyntaxException
;
12 import java
.net
.URLEncoder
;
13 import java
.nio
.charset
.StandardCharsets
;
15 import javax
.jcr
.Binary
;
16 import javax
.jcr
.Node
;
17 import javax
.jcr
.RepositoryException
;
18 import javax
.jcr
.nodetype
.NodeType
;
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
;
33 /** Add DocBook images support to {@link CmsImageManager}. */
34 public class DbkImageManager
extends DefaultImageManager
{
35 private Node baseFolder
= null;
37 public DbkImageManager(Node baseFolder
) {
38 this.baseFolder
= baseFolder
;
41 Node
getImageDataNode(Node mediaObjectNode
) throws RepositoryException
{
42 if (mediaObjectNode
.hasNode(DbkType
.imageobject
.get())) {
43 Node imageDataNode
= mediaObjectNode
.getNode(DbkType
.imageobject
.get()).getNode(DbkType
.imagedata
.get());
46 throw new IllegalStateException("No image data found for " + mediaObjectNode
);
51 public Binary
getImageBinary(Node node
) throws RepositoryException
{
53 if (DbkUtils
.isDbk(node
, DbkType
.mediaobject
)) {
54 Node imageDataNode
= getImageDataNode(node
);
55 fileNode
= getFileNode(imageDataNode
);
57 if (node
.isNodeType(NT_FILE
)) {
60 if (fileNode
!= null) {
61 return node
.getNode(JCR_CONTENT
).getProperty(JCR_DATA
).getBinary();
67 public Point
getImageSize(Node mediaObjectNode
) throws RepositoryException
{
68 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
69 Node fileNode
= getFileNode(imageDataNode
);
71 return new Point(0, 0);
73 if (fileNode
.hasProperty(EntityNames
.SVG_WIDTH
) && fileNode
.hasProperty(EntityNames
.SVG_HEIGHT
)) {
74 int width
= (int) fileNode
.getProperty(EntityNames
.SVG_WIDTH
).getLong();
75 int height
= (int) fileNode
.getProperty(EntityNames
.SVG_HEIGHT
).getLong();
76 intrinsicSize
= new Point(width
, height
);
78 try (InputStream in
= JcrUtils
.getFileAsStream(fileNode
)) {
79 ImageData id
= new ImageData(in
);
80 intrinsicSize
= updateSize(fileNode
, id
);
81 } catch (IOException e
) {
82 throw new RuntimeException("Cannot load file " + fileNode
, e
);
85 // TODO interpret image data infos
89 protected Point
updateSize(Node fileNode
, ImageData id
) throws RepositoryException
{
90 fileNode
.addMixin(EntityType
.box
.get());
91 fileNode
.setProperty(EntityNames
.SVG_WIDTH
, id
.width
);
92 fileNode
.setProperty(EntityNames
.SVG_HEIGHT
, id
.height
);
93 return new Point(id
.width
, id
.height
);
97 protected void processNewImageFile(Node mediaObjectNode
, Node fileNode
, ImageData id
)
98 throws RepositoryException
, IOException
{
99 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
100 updateSize(fileNode
, id
);
101 String filePath
= fileNode
.getPath();
102 String relPath
= filePath
.substring(baseFolder
.getPath().length() + 1);
103 imageDataNode
.setProperty(DbkAttr
.fileref
.name(), relPath
);
107 public String
getImageUrl(Node mediaObjectNode
) throws RepositoryException
{
108 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
110 String fileref
= null;
111 if (imageDataNode
.hasProperty(DbkAttr
.fileref
.name()))
112 fileref
= imageDataNode
.getProperty(DbkAttr
.fileref
.name()).getString();
117 // FIXME it messes up with the '/'
118 fileUri
= new URI(URLEncoder
.encode(fileref
, StandardCharsets
.UTF_8
.toString()));
119 } catch (URISyntaxException
| UnsupportedEncodingException e
) {
120 throw new IllegalArgumentException("File ref in " + imageDataNode
+ " is badly formatted", e
);
122 if (fileUri
.getScheme() != null)
123 return fileUri
.toString();
125 Node fileNode
= getFileNode(imageDataNode
);
126 String url
= CmsUiUtils
.getDataPathForUrl(fileNode
);
130 protected Node
getFileNode(Node imageDataNode
) throws RepositoryException
{
131 // FIXME make URL use case more robust
132 String fileref
= null;
133 if (imageDataNode
.hasProperty(DbkAttr
.fileref
.name()))
134 fileref
= imageDataNode
.getProperty(DbkAttr
.fileref
.name()).getString();
138 if (fileref
.startsWith("/"))
139 fileNode
= baseFolder
.getSession().getNode(fileref
);
141 fileNode
= baseFolder
.getNode(fileref
);
145 protected Node
getMediaFolder() {
147 // TODO check edition status
148 Node mediaFolder
= JcrUtils
.getOrAdd(baseFolder
, EntityNames
.MEDIA
, NodeType
.NT_FOLDER
);
150 } catch (RepositoryException e
) {
151 throw new JcrException("Cannot get media folder", e
);