]> git.argeo.org Git - gpl/argeo-jcr.git/blob - swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java
Merge tag 'v2.3.15' into testing
[gpl/argeo-jcr.git] / swt / org.argeo.cms.jcr.ui / src / org / argeo / cms / ui / util / DefaultImageManager.java
1 package org.argeo.cms.ui.util;
2
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;
7
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;
13
14 import javax.jcr.Binary;
15 import javax.jcr.Node;
16 import javax.jcr.Property;
17 import javax.jcr.RepositoryException;
18
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.ImageData;
28
29 /** Manages only public images so far. */
30 public class DefaultImageManager extends AbstractSwtImageManager<Node> {
31 private final static CmsLog log = CmsLog.getLog(DefaultImageManager.class);
32
33 /** @return null if not available */
34 @Override
35 public String getImageUrl(Node node) {
36 return CmsUiUtils.getDataPathForUrl(node);
37 }
38
39 protected String getResourceName(Node node) {
40 try {
41 String workspace = node.getSession().getWorkspace().getName();
42 if (node.hasNode(JCR_CONTENT))
43 return workspace + '_' + node.getNode(JCR_CONTENT).getIdentifier();
44 else
45 return workspace + '_' + node.getIdentifier();
46 } catch (RepositoryException e) {
47 throw new JcrException(e);
48 }
49 }
50
51 public Binary getImageBinary(Node node) {
52 try {
53 if (node.isNodeType(NT_FILE)) {
54 return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
55 } else {
56 return null;
57 }
58 } catch (RepositoryException e) {
59 throw new JcrException(e);
60 }
61 }
62
63 public ImageData getSwtImageData(Node node) {
64 InputStream inputStream = null;
65 Binary binary = getImageBinary(node);
66 if (binary == null)
67 return null;
68 try {
69 inputStream = binary.getStream();
70 return new ImageData(inputStream);
71 } catch (RepositoryException e) {
72 throw new JcrException(e);
73 } finally {
74 IOUtils.closeQuietly(inputStream);
75 JcrUtils.closeQuietly(binary);
76 }
77 }
78
79 @Override
80 public String uploadImage(Node context, Node parentNode, String fileName, InputStream in, String contentType) {
81 InputStream inputStream = null;
82 try {
83 String previousResourceName = null;
84 if (parentNode.hasNode(fileName)) {
85 Node node = parentNode.getNode(fileName);
86 previousResourceName = getResourceName(node);
87 if (node.hasNode(JCR_CONTENT)) {
88 node.getNode(JCR_CONTENT).remove();
89 node.addNode(JCR_CONTENT, NT_RESOURCE);
90 }
91 }
92
93 byte[] arr = IOUtils.toByteArray(in);
94 Node fileNode = JcrUtils.copyBytesAsFile(parentNode, fileName, arr);
95 inputStream = new ByteArrayInputStream(arr);
96 ImageData id = new ImageData(inputStream);
97 processNewImageFile(context, fileNode, id);
98
99 String mime = contentType != null ? contentType : Files.probeContentType(Paths.get(fileName));
100 if (mime != null) {
101 fileNode.getNode(JCR_CONTENT).setProperty(Property.JCR_MIMETYPE, mime);
102 }
103 fileNode.getSession().save();
104
105 // reset resource manager
106 ResourceManager resourceManager = RWT.getResourceManager();
107 if (previousResourceName != null && resourceManager.isRegistered(previousResourceName)) {
108 resourceManager.unregister(previousResourceName);
109 if (log.isDebugEnabled())
110 log.debug("Unregistered image " + previousResourceName);
111 }
112 return CmsUiUtils.getDataPath(fileNode);
113 } catch (IOException e) {
114 throw new RuntimeException("Cannot upload image " + fileName + " in " + parentNode, e);
115 } catch (RepositoryException e) {
116 throw new JcrException(e);
117 } finally {
118 IOUtils.closeQuietly(inputStream);
119 }
120 }
121
122 /** Does nothing by default. */
123 protected void processNewImageFile(Node context, Node fileNode, ImageData id)
124 throws RepositoryException, IOException {
125 }
126
127 @Override
128 protected String noImg(Cms2DSize size) {
129 return CmsUiUtils.noImg(size);
130 }
131 }