]> git.argeo.org Git - gpl/argeo-jcr.git/blob - swt/org.argeo.cms.jcr.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java
Use simple versioning
[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.Image;
28 import org.eclipse.swt.graphics.ImageData;
29 import org.eclipse.swt.widgets.Display;
30
31 /** Manages only public images so far. */
32 public class DefaultImageManager extends AbstractSwtImageManager<Node> {
33 private final static CmsLog log = CmsLog.getLog(DefaultImageManager.class);
34
35 /** @return null if not available */
36 @Override
37 public String getImageUrl(Node node) {
38 return CmsUiUtils.getDataPathForUrl(node);
39 }
40
41 protected String getResourceName(Node node) {
42 try {
43 String workspace = node.getSession().getWorkspace().getName();
44 if (node.hasNode(JCR_CONTENT))
45 return workspace + '_' + node.getNode(JCR_CONTENT).getIdentifier();
46 else
47 return workspace + '_' + node.getIdentifier();
48 } catch (RepositoryException e) {
49 throw new JcrException(e);
50 }
51 }
52
53 public Binary getImageBinary(Node node) {
54 try {
55 if (node.isNodeType(NT_FILE)) {
56 return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
57 } else {
58 return null;
59 }
60 } catch (RepositoryException e) {
61 throw new JcrException(e);
62 }
63 }
64
65 public Image getSwtImage(Node node) {
66 InputStream inputStream = null;
67 Binary binary = getImageBinary(node);
68 if (binary == null)
69 return null;
70 try {
71 inputStream = binary.getStream();
72 return new Image(Display.getCurrent(), inputStream);
73 } catch (RepositoryException e) {
74 throw new JcrException(e);
75 } finally {
76 IOUtils.closeQuietly(inputStream);
77 JcrUtils.closeQuietly(binary);
78 }
79 }
80
81 @Override
82 public String uploadImage(Node context, Node parentNode, String fileName, InputStream in, String contentType) {
83 InputStream inputStream = null;
84 try {
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);
92 }
93 }
94
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);
100
101 String mime = contentType != null ? contentType : Files.probeContentType(Paths.get(fileName));
102 if (mime != null) {
103 fileNode.getNode(JCR_CONTENT).setProperty(Property.JCR_MIMETYPE, mime);
104 }
105 fileNode.getSession().save();
106
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);
113 }
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);
119 } finally {
120 IOUtils.closeQuietly(inputStream);
121 }
122 }
123
124 /** Does nothing by default. */
125 protected void processNewImageFile(Node context, Node fileNode, ImageData id)
126 throws RepositoryException, IOException {
127 }
128
129 @Override
130 protected String noImg(Cms2DSize size) {
131 return CmsUiUtils.noImg(size);
132 }
133 }