import com.sap.engine.interfaces.webservices.runtime.ServletDispatcher;
import com.sap.engine.interfaces.webservices.runtime.soaphttp.HTTPTransport;

import java.io.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;

public class SoapServlet extends HttpServlet {

  private static final String WS_DISPATCHER = "/wsContext/" + ServletDispatcher.NAME;

  private ServletDispatcher dispatcher;

  public void start() throws Exception {
    Properties p = new Properties();
    p.put("domain", "true");
    Context ctx = new InitialContext(p);
    dispatcher = (ServletDispatcher) ctx.lookup(WS_DISPATCHER);
  }
  
  private void throwException(Exception e) throws ServletException, IOException {
    if (e instanceof ServletException) {
      throw (ServletException) e;
    } else if (e instanceof IOException) {
      throw (IOException) e;
    }
    StringWriter w = new StringWriter();
    PrintWriter pw = new PrintWriter(w);
    e.printStackTrace(pw);
    pw.flush();
    throw new ServletException(w.toString());
  }

  public void init() throws ServletException {
    try {
      start();
    } catch(Exception e) {
      StringWriter w = new StringWriter();
      PrintWriter pw = new PrintWriter(w);
      e.printStackTrace(pw);
      pw.flush();
      throw new UnavailableException(w.toString(), 0);
    }
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
      dispatcher.doPost(request, response, this);
    } catch (Exception e) {
      throwException(e);
    }
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
      dispatcher.doGet(request, response, this);
    } catch (Exception e) {
      throwException(e);
    }
  }
}
