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.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
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 }