]> git.argeo.org Git - lgpl/argeo-commons.git/blob - ImageManagerImpl.java
7765ecdc3dc7491b9c4582726a3b25e6ca5d3710
[lgpl/argeo-commons.git] / ImageManagerImpl.java
1 package org.argeo.cms.internal;
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 import static org.argeo.cms.CmsConstants.NO_IMAGE_SIZE;
8 import static org.argeo.cms.CmsTypes.CMS_STYLED;
9
10 import java.io.ByteArrayInputStream;
11 import java.io.IOException;
12 import java.io.InputStream;
13
14 import javax.activation.MimetypesFileTypeMap;
15 import javax.jcr.Binary;
16 import javax.jcr.Node;
17 import javax.jcr.Property;
18 import javax.jcr.RepositoryException;
19
20 import org.apache.commons.io.IOUtils;
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.argeo.cms.CmsException;
24 import org.argeo.cms.CmsImageManager;
25 import org.argeo.cms.CmsNames;
26 import org.argeo.cms.CmsTypes;
27 import org.argeo.cms.util.CmsUtils;
28 import org.argeo.jcr.JcrUtils;
29 import org.eclipse.rap.rwt.RWT;
30 import org.eclipse.rap.rwt.service.ResourceManager;
31 import org.eclipse.rap.rwt.widgets.FileUpload;
32 import org.eclipse.swt.graphics.Image;
33 import org.eclipse.swt.graphics.ImageData;
34 import org.eclipse.swt.graphics.Point;
35 import org.eclipse.swt.widgets.Control;
36 import org.eclipse.swt.widgets.Display;
37 import org.eclipse.swt.widgets.Label;
38
39 /** Manages only public images so far. */
40 public class ImageManagerImpl implements CmsImageManager, CmsNames {
41 private final static Log log = LogFactory.getLog(ImageManagerImpl.class);
42 private MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
43
44 public Boolean load(Node node, Control control, Point preferredSize)
45 throws RepositoryException {
46 Point imageSize = getImageSize(node);
47 Point size;
48 String imgTag = null;
49 if (preferredSize == null || imageSize.x == 0 || imageSize.y == 0
50 || (preferredSize.x == 0 && preferredSize.y == 0)) {
51 if (imageSize.x != 0 && imageSize.y != 0) {
52 // actual image size if completely known
53 size = imageSize;
54 } else {
55 // no image if not completely known
56 size = resizeTo(NO_IMAGE_SIZE,
57 preferredSize != null ? preferredSize : imageSize);
58 imgTag = CmsUtils.noImg(size);
59 }
60
61 } else if (preferredSize.x != 0 && preferredSize.y != 0) {
62 // given size if completely provided
63 size = preferredSize;
64 } else {
65 // at this stage :
66 // image is completely known
67 assert imageSize.x != 0 && imageSize.y != 0;
68 // one and only one of the dimension as been specified
69 assert preferredSize.x == 0 || preferredSize.y == 0;
70 size = resizeTo(imageSize, preferredSize);
71 }
72
73 boolean loaded = false;
74 if (control == null)
75 return loaded;
76
77 if (control instanceof Label) {
78 if (imgTag == null) {
79 // IMAGE RETRIEVED HERE
80 imgTag = getImageTag(node, size);
81 //
82 if (imgTag == null)
83 imgTag = CmsUtils.noImg(size);
84 else
85 loaded = true;
86 }
87
88 Label lbl = (Label) control;
89 lbl.setText(imgTag);
90 // lbl.setSize(size);
91 } else if (control instanceof FileUpload) {
92 FileUpload lbl = (FileUpload) control;
93 lbl.setImage(CmsUtils.noImage(size));
94 lbl.setSize(size);
95 return loaded;
96 } else
97 loaded = false;
98
99 return loaded;
100 }
101
102 private Point resizeTo(Point orig, Point constraints) {
103 if (constraints.x != 0 && constraints.y != 0) {
104 return constraints;
105 } else if (constraints.x == 0 && constraints.y == 0) {
106 return orig;
107 } else if (constraints.y == 0) {// force width
108 return new Point(constraints.x,
109 scale(orig.y, orig.x, constraints.x));
110 } else if (constraints.x == 0) {// force height
111 return new Point(scale(orig.x, orig.y, constraints.y),
112 constraints.y);
113 }
114 throw new CmsException("Cannot resize " + orig + " to " + constraints);
115 }
116
117 private int scale(int origDimension, int otherDimension, int otherConstraint) {
118 return Math.round(origDimension
119 * divide(otherConstraint, otherDimension));
120 }
121
122 private float divide(int a, int b) {
123 return ((float) a) / ((float) b);
124 }
125
126 public Point getImageSize(Node node) throws RepositoryException {
127 return new Point(node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node
128 .getProperty(CMS_IMAGE_WIDTH).getLong() : 0,
129 node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node.getProperty(
130 CMS_IMAGE_HEIGHT).getLong() : 0);
131 }
132
133 /** @return null if not available */
134 @Override
135 public String getImageTag(Node node) throws RepositoryException {
136 return getImageTag(node, getImageSize(node));
137 }
138
139 private String getImageTag(Node node, Point size)
140 throws RepositoryException {
141 StringBuilder buf = getImageTagBuilder(node, size);
142 if (buf == null)
143 return null;
144 return buf.append("/>").toString();
145 }
146
147 /** @return null if not available */
148 @Override
149 public StringBuilder getImageTagBuilder(Node node, Point size)
150 throws RepositoryException {
151 return getImageTagBuilder(node, Integer.toString(size.x),
152 Integer.toString(size.y));
153 }
154
155 /** @return null if not available */
156 private StringBuilder getImageTagBuilder(Node node, String width,
157 String height) throws RepositoryException {
158 String url = getImageUrl(node);
159 if (url == null)
160 return null;
161 return CmsUtils.imgBuilder(url, width, height);
162 }
163
164 /** @return null if not available */
165 @Override
166 public String getImageUrl(Node node) throws RepositoryException {
167 String url = "/data/public/node/"
168 + node.getSession().getWorkspace().getName() + node.getPath();
169 return url;
170 // String name = getResourceName(node);
171 // ResourceManager resourceManager = RWT.getResourceManager();
172 // if (!resourceManager.isRegistered(name)) {
173 // InputStream inputStream = null;
174 // Binary binary = getImageBinary(node);
175 // if (binary == null)
176 // return null;
177 // try {
178 // inputStream = binary.getStream();
179 // resourceManager.register(name, inputStream);
180 // } finally {
181 // IOUtils.closeQuietly(inputStream);
182 // JcrUtils.closeQuietly(binary);
183 // }
184 // if (log.isTraceEnabled())
185 // log.trace("Registered image " + name);
186 // }
187 // return resourceManager.getLocation(name);
188 }
189
190 protected String getResourceName(Node node) throws RepositoryException {
191 String workspace = node.getSession().getWorkspace().getName();
192 if (node.hasNode(JCR_CONTENT))
193 return workspace + '_' + node.getNode(JCR_CONTENT).getIdentifier();
194 else
195 return workspace + '_' + node.getIdentifier();
196 }
197
198 public Binary getImageBinary(Node node) throws RepositoryException {
199 if (node.isNodeType(NT_FILE))
200 return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
201 else if (node.isNodeType(CMS_STYLED) && node.hasProperty(CMS_DATA)) {
202 return node.getProperty(CMS_DATA).getBinary();
203 } else {
204 return null;
205 }
206 }
207
208 public Image getSwtImage(Node node) throws RepositoryException {
209 InputStream inputStream = null;
210 Binary binary = getImageBinary(node);
211 if (binary == null)
212 return null;
213 try {
214 inputStream = binary.getStream();
215 return new Image(Display.getCurrent(), inputStream);
216 } finally {
217 IOUtils.closeQuietly(inputStream);
218 JcrUtils.closeQuietly(binary);
219 }
220 }
221
222 @Override
223 public String uploadImage(Node parentNode, String fileName, InputStream in)
224 throws RepositoryException {
225 InputStream inputStream = null;
226 try {
227 String previousResourceName = null;
228 if (parentNode.hasNode(fileName)) {
229 Node node = parentNode.getNode(fileName);
230 previousResourceName = getResourceName(node);
231 if (node.hasNode(JCR_CONTENT)) {
232 node.getNode(JCR_CONTENT).remove();
233 node.addNode(JCR_CONTENT, NT_RESOURCE);
234 }
235 }
236
237 byte[] arr = IOUtils.toByteArray(in);
238 Node fileNode = JcrUtils.copyBytesAsFile(parentNode, fileName, arr);
239 fileNode.addMixin(CmsTypes.CMS_IMAGE);
240
241 inputStream = new ByteArrayInputStream(arr);
242 ImageData id = new ImageData(inputStream);
243 fileNode.setProperty(CMS_IMAGE_WIDTH, id.width);
244 fileNode.setProperty(CMS_IMAGE_HEIGHT, id.height);
245 fileNode.setProperty(Property.JCR_MIMETYPE,
246 fileTypeMap.getContentType(fileName));
247 fileNode.getSession().save();
248
249 // reset resource manager
250 ResourceManager resourceManager = RWT.getResourceManager();
251 if (previousResourceName != null
252 && resourceManager.isRegistered(previousResourceName)) {
253 resourceManager.unregister(previousResourceName);
254 if (log.isDebugEnabled())
255 log.debug("Unregistered image " + previousResourceName);
256 }
257 return getImageUrl(fileNode);
258 } catch (IOException e) {
259 throw new CmsException("Cannot upload image " + fileName + " in "
260 + parentNode, e);
261 } finally {
262 IOUtils.closeQuietly(inputStream);
263 }
264 }
265 }