1 package org
.argeo
.cms
.ui
.util
;
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 import static javax
.jcr
.nodetype
.NodeType
.NT_RESOURCE
;
8 import java
.io
.ByteArrayInputStream
;
9 import java
.io
.IOException
;
10 import java
.io
.InputStream
;
11 import java
.nio
.file
.Files
;
12 import java
.nio
.file
.Paths
;
14 import javax
.jcr
.Binary
;
15 import javax
.jcr
.Node
;
16 import javax
.jcr
.Property
;
17 import javax
.jcr
.RepositoryException
;
19 import org
.apache
.commons
.io
.IOUtils
;
20 import org
.argeo
.api
.cms
.CmsLog
;
21 import org
.argeo
.api
.cms
.ux
.Cms2DSize
;
22 import org
.argeo
.cms
.swt
.AbstractSwtImageManager
;
23 import org
.argeo
.jcr
.JcrException
;
24 import org
.argeo
.jcr
.JcrUtils
;
25 import org
.eclipse
.rap
.rwt
.RWT
;
26 import org
.eclipse
.rap
.rwt
.service
.ResourceManager
;
27 import org
.eclipse
.swt
.graphics
.Image
;
28 import org
.eclipse
.swt
.graphics
.ImageData
;
29 import org
.eclipse
.swt
.widgets
.Display
;
31 /** Manages only public images so far. */
32 public class DefaultImageManager
extends AbstractSwtImageManager
<Node
> {
33 private final static CmsLog log
= CmsLog
.getLog(DefaultImageManager
.class);
35 /** @return null if not available */
37 public String
getImageUrl(Node node
) {
38 return CmsUiUtils
.getDataPathForUrl(node
);
41 protected String
getResourceName(Node node
) {
43 String workspace
= node
.getSession().getWorkspace().getName();
44 if (node
.hasNode(JCR_CONTENT
))
45 return workspace
+ '_' + node
.getNode(JCR_CONTENT
).getIdentifier();
47 return workspace
+ '_' + node
.getIdentifier();
48 } catch (RepositoryException e
) {
49 throw new JcrException(e
);
53 public Binary
getImageBinary(Node node
) {
55 if (node
.isNodeType(NT_FILE
)) {
56 return node
.getNode(JCR_CONTENT
).getProperty(JCR_DATA
).getBinary();
60 } catch (RepositoryException e
) {
61 throw new JcrException(e
);
65 public Image
getSwtImage(Node node
) {
66 InputStream inputStream
= null;
67 Binary binary
= getImageBinary(node
);
71 inputStream
= binary
.getStream();
72 return new Image(Display
.getCurrent(), inputStream
);
73 } catch (RepositoryException e
) {
74 throw new JcrException(e
);
76 IOUtils
.closeQuietly(inputStream
);
77 JcrUtils
.closeQuietly(binary
);
82 public String
uploadImage(Node context
, Node parentNode
, String fileName
, InputStream in
, String contentType
) {
83 InputStream inputStream
= null;
85 String previousResourceName
= null;
86 if (parentNode
.hasNode(fileName
)) {
87 Node node
= parentNode
.getNode(fileName
);
88 previousResourceName
= getResourceName(node
);
89 if (node
.hasNode(JCR_CONTENT
)) {
90 node
.getNode(JCR_CONTENT
).remove();
91 node
.addNode(JCR_CONTENT
, NT_RESOURCE
);
95 byte[] arr
= IOUtils
.toByteArray(in
);
96 Node fileNode
= JcrUtils
.copyBytesAsFile(parentNode
, fileName
, arr
);
97 inputStream
= new ByteArrayInputStream(arr
);
98 ImageData id
= new ImageData(inputStream
);
99 processNewImageFile(context
, fileNode
, id
);
101 String mime
= contentType
!= null ? contentType
: Files
.probeContentType(Paths
.get(fileName
));
103 fileNode
.getNode(JCR_CONTENT
).setProperty(Property
.JCR_MIMETYPE
, mime
);
105 fileNode
.getSession().save();
107 // reset resource manager
108 ResourceManager resourceManager
= RWT
.getResourceManager();
109 if (previousResourceName
!= null && resourceManager
.isRegistered(previousResourceName
)) {
110 resourceManager
.unregister(previousResourceName
);
111 if (log
.isDebugEnabled())
112 log
.debug("Unregistered image " + previousResourceName
);
114 return CmsUiUtils
.getDataPath(fileNode
);
115 } catch (IOException e
) {
116 throw new RuntimeException("Cannot upload image " + fileName
+ " in " + parentNode
, e
);
117 } catch (RepositoryException e
) {
118 throw new JcrException(e
);
120 IOUtils
.closeQuietly(inputStream
);
124 /** Does nothing by default. */
125 protected void processNewImageFile(Node context
, Node fileNode
, ImageData id
)
126 throws RepositoryException
, IOException
{
130 protected String
noImg(Cms2DSize size
) {
131 return CmsUiUtils
.noImg(size
);