Package com.eclipsesource.restfuse.internal.callback

Source Code of com.eclipsesource.restfuse.internal.callback.CallbackSerlvet

/*******************************************************************************
* Copyright (c) 2011 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Holger Staudacher - initial API and implementation
******************************************************************************/
package com.eclipsesource.restfuse.internal.callback;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eclipsesource.restfuse.CallbackResource;
import com.eclipsesource.restfuse.MediaType;
import com.eclipsesource.restfuse.Response;
import com.eclipsesource.restfuse.Request;
import com.eclipsesource.restfuse.internal.RequestImpl;


public class CallbackSerlvet extends HttpServlet {
 
  private boolean wasCalled;
  private final CallbackResource resource;
  private final CallbackStatement statement;

  public CallbackSerlvet( CallbackResource resource, CallbackStatement callbackStatement ) {
    this.resource = resource;
    this.statement = callbackStatement;
  }
 
  @Override
  protected void doGet( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.get( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }

  @Override
  protected void doPost( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.post( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }
 
  @Override
  protected void doPut( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.put( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }
 
  @Override
  protected void doDelete( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.delete( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }
 
  @Override
  protected void doHead( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.head( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }
 
  @Override
  protected void doOptions( HttpServletRequest req, HttpServletResponse resp )
    throws ServletException, IOException
  {
    try {
      createResponse( resp, resource.options( createRequest( req ) ) );
    } catch( Throwable failure ) {
      statement.failWithinCallback( failure );
    }
    wasCalled = true;
  }

  private Request createRequest( HttpServletRequest req ) {
    MediaType mediaType = MediaType.fromString( req.getContentType() );
    String body = getBody( req );
    RequestImpl result = new RequestImpl( body, mediaType );
    addHeaderToRequest( req, result );
    return result;
  }

  private void addHeaderToRequest( HttpServletRequest req, RequestImpl request ) {
    @SuppressWarnings( "rawtypes" )
    Enumeration headerNames = req.getHeaderNames();
    if( headerNames != null ) {
      while( headerNames.hasMoreElements() ) {
        String name = ( String )headerNames.nextElement();
        String value = req.getHeader( name );
        request.addHeader( name, value );
      }
    }
  }

  private String getBody( HttpServletRequest req ) {
    String result = null;
    try {
      BufferedReader reader = req.getReader();
      String buffer = "";
      StringBuilder stringBuilder = new StringBuilder();
      while( ( buffer = reader.readLine() ) != null ) {
        stringBuilder.append( buffer );
      }
      reader.close();
      result = stringBuilder.toString();
    } catch( IOException shouldNotHappen ) {
      throw new IllegalStateException( shouldNotHappen );
    }
    return result;
  }

  private void createResponse( HttpServletResponse resp, Response response ) throws IOException {
    resp.setStatus( response.getStatus() );
    addHeadersToResponse( resp, response );
    addContentTypeToResponse( resp, response );
    addBodyToResponse( resp, response );
  }

  private void addHeadersToResponse( HttpServletResponse resp, Response response ) {
    Map<String, List<String>> headers = response.getHeaders();
    if( headers != null ) {
      Set<String> keySet = headers.keySet();
      for( String key : keySet ) {
        List<String> values = headers.get( key );
        for( String value : values ) {
          resp.setHeader( key, value );
        }
      }
    }
  }

  private void addContentTypeToResponse( HttpServletResponse resp, Response response ) {
    MediaType type = response.getType();
    if( type != null ) {
      resp.setContentType( type.getMimeType() );
    }
  }

  private void addBodyToResponse( HttpServletResponse resp, Response response ) throws IOException {
    if( response.hasBody() ) {
      String body = response.getBody( String.class );
      resp.getWriter().write( body );
      resp.getWriter().close();
    }
  }

  public boolean wasCalled() {
    return wasCalled;
  }
}
TOP

Related Classes of com.eclipsesource.restfuse.internal.callback.CallbackSerlvet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.