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