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