KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > blandware > atleap > webapp > servlet > ThumbnailServlet


1 /*
2  * Copyright 2004 Blandware (http://www.blandware.com)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package com.blandware.atleap.webapp.servlet;
17
18 import com.blandware.atleap.common.Constants;
19 import com.blandware.atleap.model.core.ContentImage;
20 import com.blandware.atleap.model.core.Role;
21 import com.blandware.atleap.service.core.ContentResourceManager;
22 import com.blandware.atleap.webapp.form.core.UploadContentResourceForm;
23 import com.blandware.atleap.webapp.util.core.GlobalProperties;
24 import com.blandware.atleap.webapp.util.core.ImageUtil;
25 import com.blandware.atleap.webapp.util.core.ResourceTypesManager;
26 import com.blandware.atleap.webapp.util.core.WebappConstants;
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.apache.struts.upload.FormFile;
30 import org.springframework.context.ApplicationContext;
31 import org.springframework.web.context.support.WebApplicationContextUtils;
32
33 import javax.imageio.IIOImage JavaDoc;
34 import javax.servlet.ServletConfig JavaDoc;
35 import javax.servlet.ServletContext JavaDoc;
36 import javax.servlet.ServletException JavaDoc;
37 import javax.servlet.http.HttpServlet JavaDoc;
38 import javax.servlet.http.HttpServletRequest JavaDoc;
39 import javax.servlet.http.HttpServletResponse JavaDoc;
40 import java.io.ByteArrayOutputStream JavaDoc;
41 import java.io.IOException JavaDoc;
42 import java.io.OutputStream JavaDoc;
43 import java.util.List JavaDoc;
44
45 /**
46  * <p>Servlet to view thumbnail of image content resource</p>
47  * <p>You can pass <code>contentResourceId</code> parameter or servlet can use
48  * attribute from session. If <code>contentResourceId</code>, file upload form
49  * is tried to get image data.</p>
50  * <p><a HREF="ThumbnailServlet.java.htm"><i>View Source</i></a></p>
51  *
52  * @author Andrey Grebnev <a HREF="mailto:andrey.grebnev@blandware.com">&lt;andrey.grebnev@blandware.com&gt;</a>
53  * @version $Revision: 1.2 $ $Date: 2005/08/04 17:25:19 $
54  * @web.servlet name="thumbnail" load-on-startup="1"
55  * @web.servlet-mapping url-pattern="/servlet/thumbnail/*"
56  */

57 public class ThumbnailServlet extends HttpServlet JavaDoc {
58
59     /**
60      * Commons Logging instance.
61      */

62     protected transient final Log log = LogFactory.getLog(ThumbnailServlet.class);
63
64     public static final String JavaDoc THUMBNAIL_DEFAULT_WIDTH_KEY = "thumbnail.default.width";
65     public static final String JavaDoc THUMBNAIL_DEFAULT_HEIGHT_KEY = "thumbnail.default.height";
66
67     private ResourceTypesManager resourceTypesManager = null;
68     private ApplicationContext ctx = null;
69
70     /**
71      * Initializes the servlet.
72      */

73     public void init(ServletConfig JavaDoc config) throws ServletException JavaDoc {
74         super.init(config);
75         resourceTypesManager = ResourceTypesManager.getInstance(getServletContext());
76         ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
77     }
78
79     /**
80      * Destroys the servlet.
81      */

82     public void destroy() {
83
84     }
85
86     /**
87      * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
88      *
89      * @param request servlet request
90      * @param response servlet response
91      */

92     protected void processRequest(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
93             throws ServletException JavaDoc, IOException JavaDoc {
94
95         Long JavaDoc contentResourceId = null;
96         if ( request.getParameter("contentResourceId") != null ) {
97             contentResourceId = Long.valueOf(request.getParameter("contentResourceId"));
98         } else if ( request.getAttribute("contentResourceId") != null ) {
99             contentResourceId = (Long JavaDoc) request.getAttribute("contentResourceId");
100         }
101
102         ServletContext JavaDoc servletContext = request.getSession().getServletContext();
103
104         int maxWidth = GlobalProperties.getInstance(servletContext).getInteger(THUMBNAIL_DEFAULT_WIDTH_KEY).intValue();
105         int maxHeight = GlobalProperties.getInstance(servletContext).getInteger(THUMBNAIL_DEFAULT_HEIGHT_KEY).intValue();
106         try {
107             if ( request.getParameter("width") != null ) {
108                 maxWidth = Integer.valueOf(request.getParameter("width")).intValue();
109             }
110             if ( request.getParameter("height") != null ) {
111                 maxHeight = Integer.valueOf(request.getParameter("height")).intValue();
112             }
113         } catch ( Exception JavaDoc ex ) {
114             //do nothing
115
}
116
117         UploadContentResourceForm uploadContentResourceForm = (UploadContentResourceForm) request.getSession().getAttribute(WebappConstants.UPLOAD_CONTENT_RESOURCE_FORM_KEY);
118         FormFile file = null;
119         if ( uploadContentResourceForm != null ) {
120             file = uploadContentResourceForm.getFile();
121         }
122
123         String JavaDoc mimeType = null;
124         String JavaDoc resourceType = null;
125         byte[] imageData;
126
127         if ( contentResourceId != null ) {
128             ContentResourceManager contentResourceManager = (ContentResourceManager) ctx.getBean(Constants.CONTENT_RESOURCE_MANAGER_BEAN);
129             ContentImage contentImage = contentResourceManager.retrieveContentImage(contentResourceId);
130
131             if ( contentImage == null ) {
132                 String JavaDoc message = "No content resource with ID=" + contentResourceId + " could be found";
133                 if ( log.isErrorEnabled() ) {
134                     log.error(message);
135                 }
136                 throw new ServletException JavaDoc(message);
137             }
138
139             //check roles
140
List JavaDoc roles = contentImage.getRoles();
141             boolean granted = false;
142             if ( roles != null && roles.size() > 0 ) {
143                 for ( int i = 0; i < roles.size(); i++ ) {
144                     Role role = (Role) roles.get(i);
145                     if ( request.isUserInRole(role.getName()) ) {
146                         if ( log.isDebugEnabled() ) {
147                             log.debug(" User '" + request.getRemoteUser() +
148                                     "' has role '" + role.getName() + "', granting access");
149                         }
150                         granted = true;
151                         break;
152                     }
153                 }
154             } else {
155                 granted = true;
156                 if ( log.isDebugEnabled() ) {
157                     log.debug("Anonymous user granting access");
158                 }
159             }
160
161             if ( !granted ) {
162                 // The current user is not authorized for this action
163
if ( log.isDebugEnabled() ) {
164                     log.debug(" User '" + request.getRemoteUser() +
165                             "' does not have any required role, denying access");
166                 }
167                 response.sendError(HttpServletResponse.SC_FORBIDDEN);
168                 return;
169             }
170
171             imageData = contentImage.getResourceData().getData();
172             mimeType = contentImage.getMimeType();
173             resourceType = contentImage.getType();
174
175             if ( log.isDebugEnabled() ) {
176                 log.debug("Showing thumbnail from DB with mimeType=" + mimeType);
177             }
178
179         } else if ( file != null && file.getFileName() != null && file.getFileName().trim().length() != 0 ) {
180
181             mimeType = resourceTypesManager.getMimeTypeByFileName(file.getFileName());
182             resourceType = resourceTypesManager.getResourceTypeByFileName(file.getFileName());
183             imageData = file.getFileData();
184
185             if ( log.isDebugEnabled() ) {
186                 log.debug("Showing thumbnail from session with mimeType=" + mimeType);
187             }
188
189         } else {
190             String JavaDoc message = "There are neither contentResourceId parameter in request nor " + WebappConstants.UPLOAD_CONTENT_RESOURCE_FORM_KEY + " attribute in session";
191             if ( log.isWarnEnabled() ) {
192                 log.warn(message);
193             }
194             response.sendError(HttpServletResponse.SC_NOT_FOUND);
195             return;
196         }
197
198         if ( !resourceType.equalsIgnoreCase(Constants.RESOURCE_TYPE_IMAGE) ) {
199             String JavaDoc message = "Resource type must be image";
200             if ( log.isErrorEnabled() ) {
201                 log.error(message);
202             }
203             throw new ServletException JavaDoc(message);
204         }
205
206         OutputStream JavaDoc out = response.getOutputStream();
207
208         try {
209             IIOImage JavaDoc source = ImageUtil.decodeImage(imageData, mimeType);
210             IIOImage JavaDoc scaled = ImageUtil.scaleToRectangle(source, maxWidth, maxHeight);
211             if ( source != scaled ) {
212                 ByteArrayOutputStream JavaDoc scaledStream = new ByteArrayOutputStream JavaDoc();
213                 try {
214                     ImageUtil.encodeImage(scaled, scaledStream, mimeType);
215                 } catch ( IllegalArgumentException JavaDoc ex ) {
216                     //cannot encode into original format, try to default
217
mimeType = resourceTypesManager.getDefaultMimeType(resourceType);
218                     response.setContentType(mimeType);
219                     ImageUtil.encodeImage(scaled, scaledStream, mimeType);
220                 }
221                 imageData = scaledStream.toByteArray();
222                 scaledStream.close();
223             }
224         } catch ( IOException JavaDoc ex ) {
225             if ( log.isErrorEnabled() ) {
226                 log.error("Cannot read image, maybe data corrupted", ex);
227             }
228         }
229
230         response.addHeader("Cache-Control", "no-cache,no-store,max-age=0");
231         response.addHeader("Pragma", "No-cache");
232         response.setDateHeader("Expires", 1);
233         response.setContentType(mimeType);
234         response.setContentLength(imageData.length);
235         out.write(imageData);
236
237         out.close();
238     }
239
240     /**
241      * Handles the HTTP <code>GET</code> method.
242      *
243      * @param request servlet request
244      * @param response servlet response
245      */

246     protected void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
247             throws ServletException JavaDoc, IOException JavaDoc {
248         processRequest(request, response);
249     }
250
251     /**
252      * Handles the HTTP <code>POST</code> method.
253      *
254      * @param request servlet request
255      * @param response servlet response
256      */

257     protected void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
258             throws ServletException JavaDoc, IOException JavaDoc {
259         processRequest(request, response);
260     }
261
262     /**
263      * Returns a short description of the servlet.
264      */

265     public String JavaDoc getServletInfo() {
266         return "Servlet to view thumbnail of image content resource";
267     }
268
269 }
Popular Tags