001    /**
002     * Copyright (c) 2000-2012 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.portlet.portalsettings.action;
016    
017    import com.liferay.portal.ImageTypeException;
018    import com.liferay.portal.kernel.image.ImageBag;
019    import com.liferay.portal.kernel.image.ImageToolUtil;
020    import com.liferay.portal.kernel.json.JSONFactoryUtil;
021    import com.liferay.portal.kernel.json.JSONObject;
022    import com.liferay.portal.kernel.log.Log;
023    import com.liferay.portal.kernel.log.LogFactoryUtil;
024    import com.liferay.portal.kernel.portlet.PortletResponseUtil;
025    import com.liferay.portal.kernel.servlet.SessionErrors;
026    import com.liferay.portal.kernel.upload.UploadException;
027    import com.liferay.portal.kernel.upload.UploadPortletRequest;
028    import com.liferay.portal.kernel.util.Constants;
029    import com.liferay.portal.kernel.util.MimeTypesUtil;
030    import com.liferay.portal.kernel.util.ParamUtil;
031    import com.liferay.portal.kernel.util.StreamUtil;
032    import com.liferay.portal.kernel.util.TempFileUtil;
033    import com.liferay.portal.kernel.util.Validator;
034    import com.liferay.portal.model.Company;
035    import com.liferay.portal.security.auth.PrincipalException;
036    import com.liferay.portal.service.CompanyServiceUtil;
037    import com.liferay.portal.struts.PortletAction;
038    import com.liferay.portal.theme.ThemeDisplay;
039    import com.liferay.portal.util.PortalUtil;
040    import com.liferay.portal.util.WebKeys;
041    import com.liferay.portlet.documentlibrary.DuplicateFileException;
042    import com.liferay.portlet.documentlibrary.FileSizeException;
043    import com.liferay.portlet.documentlibrary.NoSuchFileException;
044    
045    import java.awt.Rectangle;
046    import java.awt.image.BufferedImage;
047    import java.awt.image.RenderedImage;
048    
049    import java.io.InputStream;
050    
051    import javax.portlet.ActionRequest;
052    import javax.portlet.ActionResponse;
053    import javax.portlet.MimeResponse;
054    import javax.portlet.PortletConfig;
055    import javax.portlet.PortletRequest;
056    import javax.portlet.RenderRequest;
057    import javax.portlet.RenderResponse;
058    import javax.portlet.ResourceRequest;
059    import javax.portlet.ResourceResponse;
060    
061    import org.apache.struts.action.ActionForm;
062    import org.apache.struts.action.ActionForward;
063    import org.apache.struts.action.ActionMapping;
064    
065    /**
066     * @author Brian Wing Shun Chan
067     */
068    public class EditCompanyLogoAction extends PortletAction {
069    
070            @Override
071            public void processAction(
072                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
073                            ActionRequest actionRequest, ActionResponse actionResponse)
074                    throws Exception {
075    
076                    try {
077                            String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
078    
079                            if (cmd.equals(Constants.ADD_TEMP)) {
080                                    addTempImageFile(actionRequest);
081                            }
082                            else {
083                                    saveTempImageFile(actionRequest);
084    
085                                    sendRedirect(actionRequest, actionResponse);
086                            }
087                    }
088                    catch (Exception e) {
089                            if (e instanceof PrincipalException) {
090                                    SessionErrors.add(actionRequest, e.getClass());
091    
092                                    setForward(actionRequest, "portlet.portal_settings.error");
093                            }
094                            else if (e instanceof FileSizeException ||
095                                             e instanceof ImageTypeException) {
096    
097                                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
098    
099                                    jsonObject.putException(e);
100    
101                                    writeJSON(actionRequest, actionResponse, jsonObject);
102                            }
103                            else if (e instanceof NoSuchFileException ||
104                                             e instanceof UploadException) {
105    
106                                    SessionErrors.add(actionRequest, e.getClass());
107                            }
108                            else {
109                                    throw e;
110                            }
111                    }
112            }
113    
114            @Override
115            public ActionForward render(
116                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
117                            RenderRequest renderRequest, RenderResponse renderResponse)
118                    throws Exception {
119    
120                    return mapping.findForward(
121                            getForward(
122                                    renderRequest, "portlet.portal_settings.edit_company_logo"));
123            }
124    
125            @Override
126            public void serveResource(
127                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
128                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
129                    throws Exception {
130    
131                    try {
132                            String cmd = ParamUtil.getString(resourceRequest, Constants.CMD);
133    
134                            if (cmd.equals(Constants.GET_TEMP)) {
135                                    String folderName = getTempImageFilePath(resourceRequest);
136    
137                                    InputStream tempImageStream = getTempImageStream(folderName);
138    
139                                    if (tempImageStream != null) {
140                                            serveTempImageFile(resourceResponse, tempImageStream);
141                                    }
142                            }
143                    }
144                    catch (Exception e) {
145                            _log.error(e);
146                    }
147            }
148    
149            protected void addTempImageFile(PortletRequest portletRequest)
150                    throws Exception {
151    
152                    UploadPortletRequest uploadPortletRequest =
153                            PortalUtil.getUploadPortletRequest(portletRequest);
154    
155                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
156                            WebKeys.THEME_DISPLAY);
157    
158                    InputStream inputStream = null;
159    
160                    try {
161                            inputStream = uploadPortletRequest.getFileAsStream("fileName");
162    
163                            String mimeType = MimeTypesUtil.getContentType(inputStream, null);
164    
165                            if (!MimeTypesUtil.isWebImage(mimeType)) {
166                                    throw new ImageTypeException();
167                            }
168    
169                            TempFileUtil.addTempFile(
170                                    themeDisplay.getUserId(), getTempImageFileName(portletRequest),
171                                    getTempImageFolderName(), inputStream);
172                    }
173                    catch (DuplicateFileException dfe) {
174                            TempFileUtil.deleteTempFile(getTempImageFilePath(portletRequest));
175    
176                            TempFileUtil.addTempFile(
177                                    themeDisplay.getUserId(), getTempImageFileName(portletRequest),
178                                    getTempImageFolderName(), inputStream);
179                    }
180                    finally {
181                            StreamUtil.cleanUp(inputStream);
182                    }
183            }
184    
185            protected RenderedImage getCroppedRenderedImage(
186                    RenderedImage renderedImage, int height, int width, int x, int y) {
187    
188                    Rectangle rectangle = new Rectangle(width, height);
189    
190                    Rectangle croppedRectangle = rectangle.intersection(
191                            new Rectangle(renderedImage.getWidth(), renderedImage.getHeight()));
192    
193                    BufferedImage bufferedImage = ImageToolUtil.getBufferedImage(
194                            renderedImage);
195    
196                    return bufferedImage.getSubimage(
197                            x, y, croppedRectangle.width, croppedRectangle.height);
198            }
199    
200            protected String getTempImageFileName(PortletRequest portletRequest) {
201                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
202                            WebKeys.THEME_DISPLAY);
203    
204                    return String.valueOf(themeDisplay.getCompanyId());
205            }
206    
207            protected String getTempImageFilePath(PortletRequest portletRequest)
208                    throws Exception {
209    
210            ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
211                    WebKeys.THEME_DISPLAY);
212    
213            return TempFileUtil.getTempFileName(
214                    themeDisplay.getUserId(), getTempImageFileName(portletRequest),
215                    getTempImageFolderName());
216            }
217    
218            protected String getTempImageFolderName() {
219                    Class<?> clazz = getClass();
220    
221                    return clazz.getName();
222            }
223    
224            protected InputStream getTempImageStream(String tempFilePath) {
225                    try {
226                            return TempFileUtil.getTempFileAsStream(tempFilePath);
227                    }
228                    catch (Exception e) {
229                            return null;
230                    }
231            }
232    
233            protected void saveTempImageFile(ActionRequest actionRequest)
234                    throws Exception {
235    
236                    String tempFilePath = getTempImageFilePath(actionRequest);
237                    InputStream tempImageStream = null;
238    
239                    try {
240                            tempImageStream = getTempImageStream(tempFilePath);
241    
242                            if (tempImageStream == null) {
243                                    throw new UploadException();
244                            }
245    
246                            ImageBag imageBag = ImageToolUtil.read(tempImageStream);
247    
248                            RenderedImage renderedImage = imageBag.getRenderedImage();
249    
250                            String cropRegionJSON = ParamUtil.getString(
251                                    actionRequest, "cropRegion");
252    
253                            if (Validator.isNotNull(cropRegionJSON)) {
254                                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
255                                            cropRegionJSON);
256    
257                                    int height = jsonObject.getInt("height");
258                                    int width = jsonObject.getInt("width");
259                                    int x = jsonObject.getInt("x");
260                                    int y = jsonObject.getInt("y");
261    
262                                    renderedImage = getCroppedRenderedImage(
263                                            renderedImage, height, width, x, y);
264                            }
265    
266                            byte[] bytes = ImageToolUtil.getBytes(
267                                    renderedImage, imageBag.getType());
268    
269                            saveTempImageFile(actionRequest, bytes);
270                    }
271                    finally {
272                            TempFileUtil.deleteTempFile(tempFilePath);
273                            StreamUtil.cleanUp(tempImageStream);
274                    }
275            }
276    
277            protected void saveTempImageFile(
278                            PortletRequest portletRequest, byte[] bytes)
279                    throws Exception {
280    
281                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
282                            WebKeys.THEME_DISPLAY);
283    
284                    Company company = CompanyServiceUtil.updateLogo(
285                            themeDisplay.getCompanyId(), bytes);
286    
287                    themeDisplay.setCompany(company);
288            }
289    
290            protected void serveTempImageFile(
291                            MimeResponse mimeResponse, InputStream tempImageStream)
292                    throws Exception {
293    
294                    ImageBag imageBag = ImageToolUtil.read(tempImageStream);
295    
296                    byte[] bytes = ImageToolUtil.getBytes(
297                            imageBag.getRenderedImage(), imageBag.getType());
298    
299                    String contentType = MimeTypesUtil.getContentType(
300                            "A." + imageBag.getType());
301    
302                    mimeResponse.setContentType(contentType);
303    
304                    PortletResponseUtil.write(mimeResponse, bytes);
305            }
306    
307            private static Log _log = LogFactoryUtil.getLog(
308                    EditCompanyLogoAction.class);
309    
310    }