/*******************************************************************************
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU GPL v3.0
* which accompanies this distribution, and is available at:
* http://www.gnu.org/licenses/gpl-3.0.txt
*
* Developers:
* Peter Pilgrim -- design, development and implementation
* -- Blog: http://www.xenonique.co.uk/blog/
* -- Twitter: @peter_pilgrim
*
* Contributors:
*
*******************************************************************************/
package je7hb.servlets.simple;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* The type AsyncReaderServlet
*
* @author Peter Pilgrim
*/
@WebServlet(name = "AsyncReaderServlet", urlPatterns = { "/reader"}, asyncSupported = true )
public class AsyncReaderServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.printf("init() called on %s\n",
getClass().getSimpleName());
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
System.out.printf("doGet() called on %s\n",
getClass().getSimpleName());
processRequest(request);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
System.out.printf("doPost() called on %s\n",
getClass().getSimpleName());
processRequest(request);
}
private void processRequest(HttpServletRequest request)
throws IOException {
System.out.printf("processRequest() called %s" +
" on thread [%s]\n",
getClass().getSimpleName(),
Thread.currentThread().getName());
AsyncContext context = request.startAsync();
ServletInputStream input = request.getInputStream();
input.setReadListener(new AsyncReadListener(input, context));
}
private class AsyncReadListener implements ReadListener {
private ServletInputStream input;
private AsyncContext context;
private AsyncReadListener(ServletInputStream input,
AsyncContext context) {
this.input = input;
this.context = context;
}
@Override
public void onDataAvailable() {
try {
StringBuilder sb = new StringBuilder();
int len = -1;
byte buffer[] = new byte[2048];
while (input.isReady()
&& (len = input.read(buffer)) != -1) {
String data = new String(buffer, 0, len);
System.out.printf("thread [%s] data: %s\n",
Thread.currentThread().getName(),
data);
}
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
@Override
public void onAllDataRead() {
System.out.printf("thread [%s] onAllDataRead()\n",
Thread.currentThread().getName() );
context.complete();
}
@Override
public void onError(Throwable t) {
System.out.printf("thread [%s] Error occurred=%s\n",
Thread.currentThread().getName(),
t.getMessage());
context.complete();
}
}
}