1 package org
.argeo
.cms
.internal
;
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
;
10 import java
.io
.ByteArrayInputStream
;
11 import java
.io
.IOException
;
12 import java
.io
.InputStream
;
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
;
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
;
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();
44 public Boolean
load(Node node
, Control control
, Point preferredSize
)
45 throws RepositoryException
{
46 Point imageSize
= getImageSize(node
);
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
55 // no image if not completely known
56 size
= resizeTo(NO_IMAGE_SIZE
,
57 preferredSize
!= null ? preferredSize
: imageSize
);
58 imgTag
= CmsUtils
.noImg(size
);
61 } else if (preferredSize
.x
!= 0 && preferredSize
.y
!= 0) {
62 // given size if completely provided
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
);
73 boolean loaded
= false;
77 if (control
instanceof Label
) {
79 // IMAGE RETRIEVED HERE
80 imgTag
= getImageTag(node
, size
);
83 imgTag
= CmsUtils
.noImg(size
);
88 Label lbl
= (Label
) control
;
91 } else if (control
instanceof FileUpload
) {
92 FileUpload lbl
= (FileUpload
) control
;
93 lbl
.setImage(CmsUtils
.noImage(size
));
102 private Point
resizeTo(Point orig
, Point constraints
) {
103 if (constraints
.x
!= 0 && constraints
.y
!= 0) {
105 } else if (constraints
.x
== 0 && constraints
.y
== 0) {
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
),
114 throw new CmsException("Cannot resize " + orig
+ " to " + constraints
);
117 private int scale(int origDimension
, int otherDimension
, int otherConstraint
) {
118 return Math
.round(origDimension
119 * divide(otherConstraint
, otherDimension
));
122 private float divide(int a
, int b
) {
123 return ((float) a
) / ((float) b
);
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);
133 /** @return null if not available */
135 public String
getImageTag(Node node
) throws RepositoryException
{
136 return getImageTag(node
, getImageSize(node
));
139 private String
getImageTag(Node node
, Point size
)
140 throws RepositoryException
{
141 StringBuilder buf
= getImageTagBuilder(node
, size
);
144 return buf
.append("/>").toString();
147 /** @return null if not available */
149 public StringBuilder
getImageTagBuilder(Node node
, Point size
)
150 throws RepositoryException
{
151 return getImageTagBuilder(node
, Integer
.toString(size
.x
),
152 Integer
.toString(size
.y
));
155 /** @return null if not available */
156 private StringBuilder
getImageTagBuilder(Node node
, String width
,
157 String height
) throws RepositoryException
{
158 String url
= getImageUrl(node
);
161 return CmsUtils
.imgBuilder(url
, width
, height
);
164 /** @return null if not available */
166 public String
getImageUrl(Node node
) throws RepositoryException
{
167 return CmsUtils
.getDataPath(node
);
168 // String name = getResourceName(node);
169 // ResourceManager resourceManager = RWT.getResourceManager();
170 // if (!resourceManager.isRegistered(name)) {
171 // InputStream inputStream = null;
172 // Binary binary = getImageBinary(node);
173 // if (binary == null)
176 // inputStream = binary.getStream();
177 // resourceManager.register(name, inputStream);
179 // IOUtils.closeQuietly(inputStream);
180 // JcrUtils.closeQuietly(binary);
182 // if (log.isTraceEnabled())
183 // log.trace("Registered image " + name);
185 // return resourceManager.getLocation(name);
188 protected String
getResourceName(Node node
) throws RepositoryException
{
189 String workspace
= node
.getSession().getWorkspace().getName();
190 if (node
.hasNode(JCR_CONTENT
))
191 return workspace
+ '_' + node
.getNode(JCR_CONTENT
).getIdentifier();
193 return workspace
+ '_' + node
.getIdentifier();
196 public Binary
getImageBinary(Node node
) throws RepositoryException
{
197 if (node
.isNodeType(NT_FILE
))
198 return node
.getNode(JCR_CONTENT
).getProperty(JCR_DATA
).getBinary();
199 else if (node
.isNodeType(CMS_STYLED
) && node
.hasProperty(CMS_DATA
)) {
200 return node
.getProperty(CMS_DATA
).getBinary();
206 public Image
getSwtImage(Node node
) throws RepositoryException
{
207 InputStream inputStream
= null;
208 Binary binary
= getImageBinary(node
);
212 inputStream
= binary
.getStream();
213 return new Image(Display
.getCurrent(), inputStream
);
215 IOUtils
.closeQuietly(inputStream
);
216 JcrUtils
.closeQuietly(binary
);
221 public String
uploadImage(Node parentNode
, String fileName
, InputStream in
)
222 throws RepositoryException
{
223 InputStream inputStream
= null;
225 String previousResourceName
= null;
226 if (parentNode
.hasNode(fileName
)) {
227 Node node
= parentNode
.getNode(fileName
);
228 previousResourceName
= getResourceName(node
);
229 if (node
.hasNode(JCR_CONTENT
)) {
230 node
.getNode(JCR_CONTENT
).remove();
231 node
.addNode(JCR_CONTENT
, NT_RESOURCE
);
235 byte[] arr
= IOUtils
.toByteArray(in
);
236 Node fileNode
= JcrUtils
.copyBytesAsFile(parentNode
, fileName
, arr
);
237 fileNode
.addMixin(CmsTypes
.CMS_IMAGE
);
239 inputStream
= new ByteArrayInputStream(arr
);
240 ImageData id
= new ImageData(inputStream
);
241 fileNode
.setProperty(CMS_IMAGE_WIDTH
, id
.width
);
242 fileNode
.setProperty(CMS_IMAGE_HEIGHT
, id
.height
);
243 fileNode
.setProperty(Property
.JCR_MIMETYPE
,
244 fileTypeMap
.getContentType(fileName
));
245 fileNode
.getSession().save();
247 // reset resource manager
248 ResourceManager resourceManager
= RWT
.getResourceManager();
249 if (previousResourceName
!= null
250 && resourceManager
.isRegistered(previousResourceName
)) {
251 resourceManager
.unregister(previousResourceName
);
252 if (log
.isDebugEnabled())
253 log
.debug("Unregistered image " + previousResourceName
);
255 return getImageUrl(fileNode
);
256 } catch (IOException e
) {
257 throw new CmsException("Cannot upload image " + fileName
+ " in "
260 IOUtils
.closeQuietly(inputStream
);