1
22
23 package com.liferay.portal.servlet;
24
25 import com.liferay.portal.NoSuchImageException;
26 import com.liferay.portal.PortalException;
27 import com.liferay.portal.SystemException;
28 import com.liferay.portal.kernel.log.Log;
29 import com.liferay.portal.kernel.log.LogFactoryUtil;
30 import com.liferay.portal.kernel.servlet.HttpHeaders;
31 import com.liferay.portal.kernel.util.GetterUtil;
32 import com.liferay.portal.kernel.util.ParamUtil;
33 import com.liferay.portal.kernel.util.Validator;
34 import com.liferay.portal.model.Image;
35 import com.liferay.portal.model.User;
36 import com.liferay.portal.model.impl.ImageImpl;
37 import com.liferay.portal.service.ImageLocalServiceUtil;
38 import com.liferay.portal.service.UserLocalServiceUtil;
39 import com.liferay.portal.util.ContentTypeUtil;
40 import com.liferay.portal.util.PortalUtil;
41 import com.liferay.portlet.imagegallery.model.IGImage;
42 import com.liferay.portlet.imagegallery.service.IGImageLocalServiceUtil;
43 import com.liferay.util.servlet.ServletResponseUtil;
44
45 import java.io.IOException;
46
47 import java.util.Date;
48
49 import javax.servlet.ServletConfig;
50 import javax.servlet.ServletException;
51 import javax.servlet.http.HttpServlet;
52 import javax.servlet.http.HttpServletRequest;
53 import javax.servlet.http.HttpServletResponse;
54
55
62 public class ImageServlet extends HttpServlet {
63
64 public void init(ServletConfig servletConfig) throws ServletException {
65 super.init(servletConfig);
66
67 _lastModified = GetterUtil.getBoolean(
68 servletConfig.getInitParameter("last_modified"), true);
69 }
70
71 public void service(
72 HttpServletRequest request, HttpServletResponse response)
73 throws IOException, ServletException {
74
75 if (_lastModified) {
76 long lastModified = getLastModified(request);
77
78 if (lastModified > 0) {
79 long ifModifiedSince = request.getDateHeader(
80 HttpHeaders.IF_MODIFIED_SINCE);
81
82 if ((ifModifiedSince > 0) &&
83 (ifModifiedSince == lastModified)) {
84
85 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
86
87 return;
88 }
89 }
90
91 if (lastModified > 0) {
92 response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
93 }
94 }
95
96 try {
97 writeImage(request, response);
98 }
99 catch (Exception e) {
100 PortalUtil.sendError(
101 HttpServletResponse.SC_NOT_FOUND, e, request, response);
102 }
103 }
104
105 protected Image getDefaultImage(HttpServletRequest request, long imageId)
106 throws NoSuchImageException {
107
108 String path = GetterUtil.getString(request.getPathInfo());
109
110 if (path.startsWith("/company_logo")) {
111 return ImageLocalServiceUtil.getDefaultCompanyLogo();
112 }
113 else if (path.startsWith("/user_female_portrait")) {
114 return ImageLocalServiceUtil.getDefaultUserFemalePortrait();
115 }
116 else if (path.startsWith("/user_male_portrait")) {
117 return ImageLocalServiceUtil.getDefaultUserMalePortrait();
118 }
119 else if (path.startsWith("/user_portrait")) {
120 return ImageLocalServiceUtil.getDefaultUserMalePortrait();
121 }
122 else {
123 throw new NoSuchImageException(
124 "No default image exists for " + imageId);
125 }
126 }
127
128 protected Image getImage(HttpServletRequest request, boolean getDefault)
129 throws PortalException, SystemException {
130
131 long imageId = getImageId(request);
132
133 Image image = null;
134
135 if (imageId > 0) {
136 image = ImageLocalServiceUtil.getImage(imageId);
137 }
138 else {
139 String uuid = ParamUtil.getString(request, "uuid");
140 long groupId = ParamUtil.getLong(request, "groupId");
141
142 try {
143 if (Validator.isNotNull(uuid) && (groupId > 0)) {
144 IGImage igImage =
145 IGImageLocalServiceUtil.getImageByUuidAndGroupId(
146 uuid, groupId);
147
148 image = ImageLocalServiceUtil.getImage(
149 igImage.getLargeImageId());
150 }
151 }
152 catch (Exception e) {
153 }
154 }
155
156 if (getDefault) {
157 if (image == null) {
158 if (_log.isWarnEnabled()) {
159 _log.warn("Get a default image for " + imageId);
160 }
161
162 image = getDefaultImage(request, imageId);
163 }
164 }
165
166 return image;
167 }
168
169 protected long getImageId(HttpServletRequest request) {
170
171
173 long imageId = ParamUtil.getLong(request, "image_id");
174
175 if (imageId <= 0) {
176 imageId = ParamUtil.getLong(request, "img_id");
177 }
178
179 if (imageId <= 0) {
180 imageId = ParamUtil.getLong(request, "i_id");
181 }
182
183 if (imageId <= 0) {
184 long companyId = ParamUtil.getLong(request, "companyId");
185 String screenName = ParamUtil.getString(request, "screenName");
186
187 try {
188 if ((companyId > 0) && Validator.isNotNull(screenName)) {
189 User user = UserLocalServiceUtil.getUserByScreenName(
190 companyId, screenName);
191
192 imageId = user.getPortraitId();
193 }
194 }
195 catch (Exception e) {
196 }
197 }
198
199 return imageId;
200 }
201
202 protected long getLastModified(HttpServletRequest request) {
203 try {
204 Image image = getImage(request, false);
205
206 if (image == null) {
207 return -1;
208 }
209
210 Date modifiedDate = image.getModifiedDate();
211
212 if (modifiedDate == null) {
213 modifiedDate = PortalUtil.getUptime();
214 }
215
216
218 return (modifiedDate.getTime() / 1000) * 1000;
219 }
220 catch (Exception e) {
221 _log.error(e, e);
222
223 return -1;
224 }
225 }
226
227 protected void writeImage(
228 HttpServletRequest request, HttpServletResponse response)
229 throws PortalException, SystemException {
230
231 Image image = getImage(request, true);
232
233 if (image == null) {
234 throw new NoSuchImageException("Image is null");
235 }
236 else {
237 if (!image.getType().equals(ImageImpl.TYPE_NOT_AVAILABLE)) {
238 String contentType = ContentTypeUtil.getContentType(
239 image.getType());
240
241 response.setContentType(contentType);
242 }
243
244 try {
245 ServletResponseUtil.write(response, image.getTextObj());
246 }
247 catch (Exception e) {
248 if (_log.isWarnEnabled()) {
249 _log.warn(e, e);
250 }
251 }
252 }
253 }
254
255 private static Log _log = LogFactoryUtil.getLog(ImageServlet.class);
256
257 private boolean _lastModified = true;
258
259 }