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