package org.jboss.webservice.server;
import org.jboss.axis.AxisEngine;
import org.jboss.axis.AxisFault;
import org.jboss.axis.MessageContext;
import org.jboss.axis.handlers.soap.SOAPService;
import org.jboss.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ContextServlet extends AbstractServlet
{
protected final Logger log = Logger.getLogger(ContextServlet.class);
private boolean assertServiceAccess(HttpServletRequest req, HttpServletResponse res)
throws IOException
{
String contextPath = req.getContextPath();
String requestURI = req.getRequestURI();
String pathInfo = req.getPathInfo();
if (requestURI.startsWith(contextPath + "/services/") && "/Version".equals(pathInfo) == false)
{
reportTrouble(new IllegalAccessException(requestURI), res, res.getWriter());
return false;
}
return true;
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
if (assertServiceAccess(req, res) == false)
return;
super.doPost(req, res);
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
if (assertServiceAccess(req, res) == false)
return;
String url = req.getRequestURL().toString();
String queryString = req.getQueryString();
log.debug("doGet: " + url + (queryString != null ? "?" + queryString : ""));
PrintWriter writer = res.getWriter();
try
{
AxisEngine engine = getEngine();
String serviceName = getServiceName(req);
SOAPService service = (serviceName != null ? engine.getService(serviceName) : null);
boolean wsdlRequested = req.getParameter("wsdl") != null || req.getParameter("WSDL") != null;
if (!wsdlRequested)
{
log.debug("Report available services");
reportAvailableServices(res, writer, req);
return;
}
if (service == null)
{
log.error("Cannot get axis service: " + serviceName);
reportCantGetAxisService(req, res, writer);
return;
}
MessageContext msgContext = createMessageContext(engine, req, res);
if (service != null)
msgContext.setTargetService(serviceName);
String transportURL = getTransportURL(req, serviceName);
if (transportURL != null)
{
msgContext.setProperty(MessageContext.TRANS_URL, transportURL);
log.debug("Set transport.url=" + transportURL);
}
if (wsdlRequested)
{
String wsdlResource = req.getParameter("resource");
if (wsdlResource != null)
{
log.debug("Process wsdl import request: " + wsdlResource);
msgContext.setProperty(MessageContext.WSDLGEN_RESOURCE, wsdlResource);
}
else
{
log.debug("Process wsdl request");
}
processWsdlRequest(msgContext, res, writer);
return;
}
log.debug("Report service info");
reportServiceInfo(res, writer, service, serviceName);
}
catch (AxisFault fault)
{
reportTrouble(fault, res, writer);
}
catch (Exception e)
{
reportTrouble(e, res, writer);
}
finally
{
AxisEngine.setCurrentMessageContext(null);
writer.close();
}
}
protected String getServiceName(HttpServletRequest req)
{
String serviceName = null;
if (req.getRequestURI().equals(req.getContextPath() + "/services/Version"))
serviceName = "Version";
return serviceName;
}
}