001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.service.impl;
016    
017    import com.liferay.portal.ImageTypeException;
018    import com.liferay.portal.NoSuchImageException;
019    import com.liferay.portal.image.HookFactory;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.exception.SystemException;
022    import com.liferay.portal.kernel.image.Hook;
023    import com.liferay.portal.kernel.image.ImageBag;
024    import com.liferay.portal.kernel.image.ImageToolUtil;
025    import com.liferay.portal.kernel.log.Log;
026    import com.liferay.portal.kernel.log.LogFactoryUtil;
027    import com.liferay.portal.kernel.util.FileUtil;
028    import com.liferay.portal.kernel.util.PropsKeys;
029    import com.liferay.portal.model.Image;
030    import com.liferay.portal.model.impl.ImageImpl;
031    import com.liferay.portal.service.base.ImageLocalServiceBaseImpl;
032    import com.liferay.portal.util.PropsUtil;
033    import com.liferay.portal.webserver.WebServerServletTokenUtil;
034    
035    import java.awt.image.RenderedImage;
036    
037    import java.io.File;
038    import java.io.FileInputStream;
039    import java.io.IOException;
040    import java.io.InputStream;
041    
042    import java.util.Arrays;
043    import java.util.Date;
044    import java.util.List;
045    
046    /**
047     * @author Brian Wing Shun Chan
048     * @author Julio Camarero
049     * @author Shuyang Zhou
050     */
051    public class ImageLocalServiceImpl extends ImageLocalServiceBaseImpl {
052    
053            @Override
054            public void afterPropertiesSet() {
055                    super.afterPropertiesSet();
056    
057                    ClassLoader classLoader = getClassLoader();
058    
059                    try {
060                            InputStream is = classLoader.getResourceAsStream(
061                                    PropsUtil.get(PropsKeys.IMAGE_DEFAULT_SPACER));
062    
063                            if (is == null) {
064                                    _log.error("Default spacer is not available");
065                            }
066    
067                            _defaultSpacer = getImage(is);
068                    }
069                    catch (Exception e) {
070                            _log.error(
071                                    "Unable to configure the default spacer: " + e.getMessage());
072                    }
073    
074                    try {
075                            InputStream is = classLoader.getResourceAsStream(
076                                    PropsUtil.get(PropsKeys.IMAGE_DEFAULT_COMPANY_LOGO));
077    
078                            if (is == null) {
079                                    _log.error("Default company logo is not available");
080                            }
081    
082                            _defaultCompanyLogo = getImage(is);
083                    }
084                    catch (Exception e) {
085                            _log.error(
086                                    "Unable to configure the default company logo: " +
087                                            e.getMessage());
088                    }
089    
090                    try {
091                            InputStream is = classLoader.getResourceAsStream(
092                                    PropsUtil.get(PropsKeys.IMAGE_DEFAULT_ORGANIZATION_LOGO));
093    
094                            if (is == null) {
095                                    _log.error("Default organization logo is not available");
096                            }
097    
098                            _defaultOrganizationLogo = getImage(is);
099                    }
100                    catch (Exception e) {
101                            _log.error(
102                                    "Unable to configure the default organization logo: " +
103                                            e.getMessage());
104                    }
105    
106                    try {
107                            InputStream is = classLoader.getResourceAsStream(
108                                    PropsUtil.get(PropsKeys.IMAGE_DEFAULT_USER_FEMALE_PORTRAIT));
109    
110                            if (is == null) {
111                                    _log.error("Default user female portrait is not available");
112                            }
113    
114                            _defaultUserFemalePortrait = getImage(is);
115                    }
116                    catch (Exception e) {
117                            _log.error(
118                                    "Unable to configure the default user female portrait: " +
119                                            e.getMessage());
120                    }
121    
122                    try {
123                            InputStream is = classLoader.getResourceAsStream(
124                                    PropsUtil.get(PropsKeys.IMAGE_DEFAULT_USER_MALE_PORTRAIT));
125    
126                            if (is == null) {
127                                    _log.error("Default user male portrait is not available");
128                            }
129    
130                            _defaultUserMalePortrait = getImage(is);
131                    }
132                    catch (Exception e) {
133                            _log.error(
134                                    "Unable to configure the default user male portrait: " +
135                                            e.getMessage());
136                    }
137            }
138    
139            @Override
140            public Image deleteImage(long imageId)
141                    throws PortalException, SystemException {
142    
143                    if (imageId <= 0) {
144                            return null;
145                    }
146    
147                    /*if (PropsValues.IMAGE_HOOK_IMPL.equals(
148                                    DatabaseHook.class.getName()) &&
149                            (imagePersistence.getListeners().length == 0)) {
150    
151                            runSQL("delete from Image where imageId = " + imageId);
152    
153                            imagePersistence.clearCache();
154                    }
155                    else {*/
156                            Image image = getImage(imageId);
157    
158                            if (image != null) {
159                                    imagePersistence.remove(image);
160    
161                                    Hook hook = HookFactory.getInstance();
162    
163                                    try {
164                                            hook.deleteImage(image);
165                                    }
166                                    catch (NoSuchImageException nsie) {
167    
168                                            // DLHook throws NoSuchImageException if the file no longer
169                                            // exists. See LPS-30430. This exception can be ignored.
170    
171                                            if (_log.isWarnEnabled()) {
172                                                    _log.warn(nsie, nsie);
173                                            }
174                                    }
175                            }
176    
177                            return image;
178                    //}
179            }
180    
181            @Override
182            public Image getCompanyLogo(long imageId) {
183                    Image image = getImage(imageId);
184    
185                    if (image == null) {
186                            image = getDefaultCompanyLogo();
187                    }
188    
189                    return image;
190            }
191    
192            @Override
193            public Image getDefaultCompanyLogo() {
194                    return _defaultCompanyLogo;
195            }
196    
197            @Override
198            public Image getDefaultOrganizationLogo() {
199                    return _defaultOrganizationLogo;
200            }
201    
202            @Override
203            public Image getDefaultSpacer() {
204                    return _defaultSpacer;
205            }
206    
207            @Override
208            public Image getDefaultUserFemalePortrait() {
209                    return _defaultUserFemalePortrait;
210            }
211    
212            @Override
213            public Image getDefaultUserMalePortrait() {
214                    return _defaultUserMalePortrait;
215            }
216    
217            @Override
218            public Image getImage(byte[] bytes)
219                    throws PortalException, SystemException {
220    
221                    return getImage(null, bytes);
222            }
223    
224            @Override
225            public Image getImage(File file) throws PortalException, SystemException {
226                    try {
227                            return getImage(new FileInputStream(file));
228                    }
229                    catch (IOException ioe) {
230                            throw new SystemException(ioe);
231                    }
232            }
233    
234            @Override
235            public Image getImage(InputStream is)
236                    throws PortalException, SystemException {
237    
238                    return getImage(is, null);
239            }
240    
241            @Override
242            public Image getImage(InputStream is, boolean cleanUpStream)
243                    throws PortalException, SystemException {
244    
245                    return getImage(is, null, cleanUpStream);
246            }
247    
248            @Override
249            public Image getImage(long imageId) {
250                    if (imageId > 0) {
251                            try {
252                                    return imagePersistence.fetchByPrimaryKey(imageId);
253                            }
254                            catch (Exception e) {
255                                    if (_log.isWarnEnabled()) {
256                                            _log.warn(
257                                                    "Unable to get image " + imageId + ": " +
258                                                            e.getMessage());
259                                    }
260                            }
261                    }
262    
263                    return null;
264            }
265    
266            @Override
267            public Image getImageOrDefault(long imageId) {
268                    Image image = getImage(imageId);
269    
270                    if (image == null) {
271                            image = getDefaultSpacer();
272                    }
273    
274                    return image;
275            }
276    
277            @Override
278            public List<Image> getImages() throws SystemException {
279                    return imagePersistence.findAll();
280            }
281    
282            @Override
283            public List<Image> getImagesBySize(int size) throws SystemException {
284                    return imagePersistence.findByLtSize(size);
285            }
286    
287            @Override
288            public boolean isNullOrDefaultSpacer(byte[] bytes) {
289                    if ((bytes == null) || (bytes.length == 0) ||
290                            Arrays.equals(bytes, getDefaultSpacer().getTextObj())) {
291    
292                            return true;
293                    }
294                    else {
295                            return false;
296                    }
297            }
298    
299            @Override
300            public Image updateImage(long imageId, byte[] bytes)
301                    throws PortalException, SystemException {
302    
303                    Image image = getImage(bytes);
304    
305                    return updateImage(
306                            imageId, image.getTextObj(), image.getType(), image.getHeight(),
307                            image.getWidth(), image.getSize());
308            }
309    
310            @Override
311            public Image updateImage(
312                            long imageId, byte[] bytes, String type, int height, int width,
313                            int size)
314                    throws PortalException, SystemException {
315    
316                    Image image = imagePersistence.fetchByPrimaryKey(imageId);
317    
318                    if (image == null) {
319                            image = imagePersistence.create(imageId);
320                    }
321    
322                    image.setModifiedDate(new Date());
323                    image.setType(type);
324                    image.setHeight(height);
325                    image.setWidth(width);
326                    image.setSize(size);
327    
328                    Hook hook = HookFactory.getInstance();
329    
330                    hook.updateImage(image, type, bytes);
331    
332                    imagePersistence.update(image, false);
333    
334                    WebServerServletTokenUtil.resetToken(imageId);
335    
336                    return image;
337            }
338    
339            @Override
340            public Image updateImage(long imageId, File file)
341                    throws PortalException, SystemException {
342    
343                    Image image = getImage(file);
344    
345                    return updateImage(
346                            imageId, image.getTextObj(), image.getType(), image.getHeight(),
347                            image.getWidth(), image.getSize());
348            }
349    
350            @Override
351            public Image updateImage(long imageId, InputStream is)
352                    throws PortalException, SystemException {
353    
354                    Image image = getImage(is);
355    
356                    return updateImage(
357                            imageId, image.getTextObj(), image.getType(), image.getHeight(),
358                            image.getWidth(), image.getSize());
359            }
360    
361            @Override
362            public Image updateImage(
363                            long imageId, InputStream is, boolean cleanUpStream)
364                    throws PortalException, SystemException {
365    
366                    Image image = getImage(is, cleanUpStream);
367    
368                    return updateImage(
369                            imageId, image.getTextObj(), image.getType(), image.getHeight(),
370                            image.getWidth(), image.getSize());
371            }
372    
373            protected Image getImage(InputStream is, byte[] bytes)
374                    throws PortalException, SystemException {
375    
376                    return getImage(is, bytes, true);
377            }
378    
379            protected Image getImage(
380                            InputStream is, byte[] bytes, boolean cleanUpStream)
381                    throws PortalException, SystemException {
382    
383                    try {
384                            if (is != null) {
385                                    bytes = FileUtil.getBytes(is, -1, cleanUpStream);
386                            }
387    
388                            if (bytes == null) {
389                                    return null;
390                            }
391    
392                            ImageBag imageBag = ImageToolUtil.read(bytes);
393    
394                            RenderedImage renderedImage = imageBag.getRenderedImage();
395                            String type = imageBag.getType();
396    
397                            if (renderedImage == null) {
398                                    throw new ImageTypeException();
399                            }
400    
401                            int height = renderedImage.getHeight();
402                            int width = renderedImage.getWidth();
403                            int size = bytes.length;
404    
405                            Image image = new ImageImpl();
406    
407                            image.setTextObj(bytes);
408                            image.setType(type);
409                            image.setHeight(height);
410                            image.setWidth(width);
411                            image.setSize(size);
412    
413                            return image;
414                    }
415                    catch (IOException ioe) {
416                            throw new SystemException(ioe);
417                    }
418            }
419    
420            private static Log _log = LogFactoryUtil.getLog(
421                    ImageLocalServiceImpl.class);
422    
423            private Image _defaultCompanyLogo;
424            private Image _defaultOrganizationLogo;
425            private Image _defaultSpacer;
426            private Image _defaultUserFemalePortrait;
427            private Image _defaultUserMalePortrait;
428    
429    }