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