Title: EJB Servlet

    package org.superbiz;
    
    import org.apache.openejb.loader.SystemInstance;
    import org.apache.openejb.server.ServiceException;
    import org.apache.openejb.server.ejbd.EjbServer;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletInputStream;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class EjbServerServlet extends HttpServlet {
        private EjbServer ejbServer;
    
        public void init(ServletConfig config) throws ServletException {
    	ejbServer = new EjbServer();
    
    	try {
    	    ejbServer.init(System.getProperties());
    	} catch (Exception e) {
    	    throw new ServletException(e);
    	}
        }
    
        protected void service(HttpServletRequest request, HttpServletResponse
response) 
        throws ServletException, IOException {
    	ServletInputStream in = request.getInputStream();
    	ServletOutputStream out = response.getOutputStream();
    	try {
    	    ejbServer.service(in, out);
    	} catch (ServiceException e) {
    	    throw new ServletException("ServerService error", e);
    	}
        }
    }

