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