org.xlightweb
Interface IBodyDataHandler

Package class diagram package IBodyDataHandler
All Known Implementing Classes:
BodyForwarder

public interface IBodyDataHandler

The body handler. Example

 class BodyToFileStreamer implements IBodyDataHandler {
 
    private IHttpExchange exchange = null;
    
    private String path = null;
    private RandomAccessFile raf = null;
    private FileChannel fc = null;
    
    private String id = null;
    
    BodyToFileStreamer(IHttpExchange exchange, File file, String id) throws IOException {
       this.exchange = exchange;
       this.id = id;
       
       raf = new RandomAccessFile(file, "rw");
       fc = raf.getChannel();
    }
    
    public boolean onData(NonBlockingBodyDataSource bodyDataSource) throws BufferUnderflowException {
       try {
          int available = bodyDataSource.available();
          
          // data to transfer?
          if (available > 0) {
             bodyDataSource.transferTo(fc, available);
             
          // end of stream reached?
          } else if (available == -1) {
             fc.close();
             raf.close();
             exchange.send(new HttpResponse(201, "text/plain", id));
          }
       } catch (IOException ioe) {
          try {
             fc.close();
             raf.close();
             new File(path).delete();
          } catch (Exception ignore) { }
          
          exchange.sendError(500);
       }
       return true;
    }
 }
 

 class MyRequestHandler implements IHttpRequestHandler  {
 
    // will be called if request header is received (Default-InvokeOn is HEADER_RECEIVED)
    public void onRequest(IHttpExchange exchange) throws IOException {
       // ..

       BodyToFileStreamer streamer = new BodyToFileStreamer(exchange, file, uid);
       exchange.getRequest().getNonBlockingBody().setDataHandler(streamer);
    }
 }
 


Field Summary
static int DEFAULT_EXECUTION_MODE
           
 
Method Summary
 boolean onData(NonBlockingBodyDataSource bodyDataSource)
          call back.
 

Field Detail

DEFAULT_EXECUTION_MODE

static final int DEFAULT_EXECUTION_MODE
See Also:
Constant Field Values
Method Detail

onData

boolean onData(NonBlockingBodyDataSource bodyDataSource)
               throws BufferUnderflowException
call back. This method will be called each time body data has been received for the given body

Parameters:
bodyDataSource - the body
Returns:
true, if the event has been handled
Throws:
BufferUnderflowException - if more incoming data is required to process (e.g. delimiter hasn't yet received -> readByDelimiter methods or size of the available, received data is smaller than the required size -> readByLength). The BufferUnderflowException will be swallowed by the framework