1 package org
.argeo
.app
.ui
.docbook
;
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
.api
.cms
.ux
.Cms2DSize
;
21 import org
.argeo
.api
.cms
.ux
.CmsImageManager
;
22 import org
.argeo
.app
.api
.EntityNames
;
23 import org
.argeo
.app
.api
.EntityType
;
24 import org
.argeo
.app
.docbook
.DbkAttr
;
25 import org
.argeo
.app
.docbook
.DbkType
;
26 import org
.argeo
.app
.jcr
.docbook
.DbkJcrUtils
;
27 import org
.argeo
.cms
.ui
.util
.CmsUiUtils
;
28 import org
.argeo
.cms
.ui
.util
.DefaultImageManager
;
29 import org
.argeo
.jcr
.JcrException
;
30 import org
.argeo
.jcr
.JcrUtils
;
31 import org
.eclipse
.swt
.graphics
.ImageData
;
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
) {
43 if (mediaObjectNode
.hasNode(DbkType
.imageobject
.get())) {
44 Node imageDataNode
= mediaObjectNode
.getNode(DbkType
.imageobject
.get())
45 .getNode(DbkType
.imagedata
.get());
48 throw new IllegalStateException("No image data found for " + mediaObjectNode
);
50 } catch (RepositoryException e
) {
51 throw new JcrException(e
);
56 public Binary
getImageBinary(Node node
) {
58 if (DbkJcrUtils
.isDbk(node
, DbkType
.mediaobject
)) {
59 Node imageDataNode
= getImageDataNode(node
);
60 fileNode
= getFileNode(imageDataNode
);
63 if (node
.isNodeType(NT_FILE
)) {
66 if (fileNode
!= null) {
67 return node
.getNode(JCR_CONTENT
).getProperty(JCR_DATA
).getBinary();
71 } catch (RepositoryException e
) {
72 throw new JcrException(e
);
76 public Cms2DSize
getImageSize(Node mediaObjectNode
) {
77 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
78 Node fileNode
= getFileNode(imageDataNode
);
80 return new Cms2DSize(0, 0);
82 Cms2DSize intrinsicSize
;
83 if (fileNode
.hasProperty(EntityNames
.SVG_WIDTH
) && fileNode
.hasProperty(EntityNames
.SVG_HEIGHT
)) {
84 int width
= (int) fileNode
.getProperty(EntityNames
.SVG_WIDTH
).getLong();
85 int height
= (int) fileNode
.getProperty(EntityNames
.SVG_HEIGHT
).getLong();
86 intrinsicSize
= new Cms2DSize(width
, height
);
88 try (InputStream in
= JcrUtils
.getFileAsStream(fileNode
)) {
89 ImageData id
= new ImageData(in
);
90 intrinsicSize
= updateSize(fileNode
, id
);
91 } catch (IOException e
) {
92 throw new RuntimeException("Cannot load file " + fileNode
, e
);
95 // TODO interpret image data infos
97 } catch (RepositoryException e
) {
98 throw new JcrException(e
);
102 protected Cms2DSize
updateSize(Node fileNode
, ImageData id
) throws RepositoryException
{
103 fileNode
.addMixin(EntityType
.box
.get());
104 fileNode
.setProperty(EntityNames
.SVG_WIDTH
, id
.width
);
105 fileNode
.setProperty(EntityNames
.SVG_HEIGHT
, id
.height
);
106 return new Cms2DSize(id
.width
, id
.height
);
110 protected void processNewImageFile(Node mediaObjectNode
, Node fileNode
, ImageData id
)
111 throws RepositoryException
, IOException
{
112 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
113 updateSize(fileNode
, id
);
114 String filePath
= fileNode
.getPath();
115 String relPath
= filePath
.substring(baseFolder
.getPath().length() + 1);
116 imageDataNode
.setProperty(DbkAttr
.fileref
.name(), relPath
);
120 public String
getImageUrl(Node mediaObjectNode
) {
121 Node imageDataNode
= getImageDataNode(mediaObjectNode
);
123 String fileref
= null;
125 if (imageDataNode
.hasProperty(DbkAttr
.fileref
.name()))
126 fileref
= imageDataNode
.getProperty(DbkAttr
.fileref
.name()).getString();
127 } catch (RepositoryException e
) {
128 throw new JcrException(e
);
134 // FIXME it messes up with the '/'
135 fileUri
= new URI(URLEncoder
.encode(fileref
, StandardCharsets
.UTF_8
.toString()));
136 } catch (URISyntaxException
| UnsupportedEncodingException e
) {
137 throw new IllegalArgumentException("File ref in " + imageDataNode
+ " is badly formatted", e
);
139 if (fileUri
.getScheme() != null)
140 return fileUri
.toString();
142 Node fileNode
= getFileNode(imageDataNode
);
143 String url
= CmsUiUtils
.getDataPathForUrl(fileNode
);
147 protected Node
getFileNode(Node imageDataNode
) {
148 // FIXME make URL use case more robust
150 String fileref
= null;
151 if (imageDataNode
.hasProperty(DbkAttr
.fileref
.name()))
152 fileref
= imageDataNode
.getProperty(DbkAttr
.fileref
.name()).getString();
156 if (fileref
.startsWith("/"))
157 fileNode
= baseFolder
.getSession().getNode(fileref
);
159 fileNode
= baseFolder
.getNode(fileref
);
161 } catch (RepositoryException e
) {
162 throw new JcrException(e
);
166 protected Node
getMediaFolder() {
168 // TODO check edition status
169 Node mediaFolder
= JcrUtils
.getOrAdd(baseFolder
, EntityNames
.MEDIA
, NodeType
.NT_FOLDER
);
171 } catch (RepositoryException e
) {
172 throw new JcrException("Cannot get media folder", e
);