1 /*
2 * Copyright (c) 2003
3 * Information Desire GmbH
4 * All rights reserved.
5 */
6 package com.infodesire.infobit.servlet;
7
8 import com.infodesire.infobit.AclManager;
9 import com.infodesire.infobit.InfobitConfiguration;
10 import com.infodesire.infobit.InfobitException;
11 import com.infodesire.infobit.InfobitPool;
12 import com.infodesire.infobit.InfobitManager;
13 import com.infodesire.infobit.InfobitSecurityException;
14
15 import com.infodesire.infobit.data.Acl;
16 import com.infodesire.infobit.data.BinaryContent;
17 import com.infodesire.infobit.data.Content;
18 import com.infodesire.infobit.data.Infobit;
19 import com.infodesire.infobit.data.Version;
20
21 import com.infodesire.infobit.render.InfobitRenderer;
22 import com.infodesire.infobit.render.velocity.VelocityRenderer;
23
24 import net.sf.hibernate.Session;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.io.OutputStream;
32 import java.io.PrintWriter;
33 import java.io.Writer;
34
35 import java.util.HashSet;
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Properties;
39 import java.util.Set;
40
41 import javax.servlet.ServletConfig;
42 import javax.servlet.ServletContext;
43 import javax.servlet.ServletException;
44 import javax.servlet.ServletOutputStream;
45
46 import javax.servlet.http.HttpServlet;
47 import javax.servlet.http.HttpServletRequest;
48 import javax.servlet.http.HttpServletResponse;
49
50 /***
51 * Servlet capable to emit binary content of infobit versions. The servlet
52 * supports get/post methids and does no more than just stream out binary
53 * content with appropriate ( set in content ) mime type.
54 *
55 * @author peter2
56 * @created August 28, 2003
57 * @version $Revision: 1.4 $
58 */
59 public class BinaryServlet extends HttpServlet {
60
61 /***
62 * parameter specifying which infobit pool is to be used
63 */
64 public final static String POOL_NAME = "poolName";
65 private static Log _log = LogFactory.getLog(BinaryServlet.class);
66
67 InfobitPool _pool;
68 InfobitManager _manager;
69 private String _poolName;
70
71
72 /***
73 * initialize servlet for binary infobit streaming
74 *
75 * @param config Description of Parameter
76 * @exception ServletException Description of Exception
77 */
78 public void init(ServletConfig config) throws ServletException {
79 super.init(config);
80 _poolName = config.getInitParameter(POOL_NAME);
81 try {
82 _log.debug("******* loading infobit pool ***************");
83 _pool = InfobitConfiguration.getInstance().getPool(_poolName);
84 _log.debug("******* retriving infobit manager ***********");
85 _manager = _pool.getInfobitManager();
86
87 // flush infobit pool - our resource loader opens connection
88 // just in case it opened connetcions
89 _pool.flush();
90 } catch (Exception ex) {
91 _log.error("exception while acquiring infobit pool: " + _poolName, ex);
92 throw new ServletException("exception while acquiring infobit pool: " + _poolName, ex);
93 }
94 }
95
96
97 /***
98 * Handles GET - calls doRequest()
99 *
100 * @param request servlet request
101 * @param response response
102 * @exception ServletException Description of Exception
103 * @exception IOException Description of Exception
104 */
105 public void doGet(HttpServletRequest request, HttpServletResponse response)
106 throws ServletException, IOException {
107 doRequest(request, response);
108 }
109
110
111 /***
112 * Handle a POST request - calls doRequest()
113 *
114 * @param request Description of Parameter
115 * @param response Description of Parameter
116 * @exception ServletException Description of Exception
117 * @exception IOException Description of Exception
118 */
119 public void doPost(HttpServletRequest request, HttpServletResponse response)
120 throws ServletException, IOException {
121 doRequest(request, response);
122 }
123
124
125 /***
126 * Handles with both GET and POST requests. we just render infobit out using
127 * renderer
128 *
129 * @param request HttpServletRequest object containing client
130 * request
131 * @param response HttpServletResponse object for the response
132 * @exception ServletException Description of Exception
133 * @exception IOException Description of Exception
134 */
135 protected void doRequest(HttpServletRequest request,
136 HttpServletResponse response)
137 throws ServletException, IOException {
138
139 String pathInfo = (String) request.getAttribute("javax.servlet.include.path_info");
140 if (pathInfo == null) {
141 if (_log.isDebugEnabled()) {
142 _log.debug("handling original request");
143 }
144 // and grab path info out of request
145 pathInfo = request.getPathInfo();
146 }
147
148 String infobitName = pathInfo.substring(1);
149 if (_log.isDebugEnabled()) {
150 _log.debug("rendering binary infobit : " + infobitName);
151 }
152
153 try {
154 Infobit ib = _manager.getInfobit(infobitName);
155 Version version = ib.getActualVersion();
156
157 if (version == null) {
158 _log.error("infobit " + infobitName + " nas no actual version");
159 response.sendError(HttpServletResponse.SC_NO_CONTENT,
160 "infobit " + infobitName + " has no actual version");
161 return;
162 }
163
164 Content content = version.getContent();
165
166 if (!(content instanceof BinaryContent)) {
167 _log.error("unexpected content: " + content.getClass().getName());
168 response.sendError(HttpServletResponse.SC_BAD_REQUEST,
169 "Infobit " + infobitName + " does not have " +
170 "binary content");
171 return;
172 }
173
174 BinaryContent binary = (BinaryContent) content;
175 InputStream data = _manager.getContent(binary);
176
177 // _log.debug("commited after retriewing stream: " + response.isCommitted());
178 response.reset();
179 response.setContentType(binary.getMimeType());
180 response.setBufferSize(2048);
181 int contentLength = _manager.getContentLength(binary);
182 if (_log.isDebugEnabled()) {
183 _log.debug("serving " + contentLength + " bytes of content");
184 }
185 response.setContentLength(contentLength);
186
187 _log.debug("commited after status: " + response.isCommitted());
188 OutputStream stream = response.getOutputStream();
189 byte[] b = new byte[512];
190 int n;
191 int l = 0;
192 while ((n = data.read(b)) > -1) {
193 stream.write(b, 0, n);
194 l += n;
195 }
196
197 if (_log.isDebugEnabled()) {
198 _log.debug("wrote content of " + l + " bytes");
199 }
200 stream.flush();
201 //stream.close();
202 //response.flushBuffer();
203 if (_log.isDebugEnabled()) {
204 _log.debug("successfull. flushed and closed");
205 }
206 } catch (Exception ex) {
207 _log.error("error occured while rendering infobit", ex);
208
209 }
210 }
211
212 }
213
This page was automatically generated by Maven