package org.jboss.jaxr.juddi.axis;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.IRegistry;
import org.apache.juddi.datatype.RegistryObject;
import org.apache.juddi.datatype.response.DispositionReport;
import org.apache.juddi.error.BusyException;
import org.apache.juddi.error.RegistryException;
import org.apache.juddi.error.UnsupportedException;
import org.apache.juddi.handler.DispositionReportHandler;
import org.apache.juddi.handler.HandlerMaker;
import org.apache.juddi.handler.IHandler;
import org.apache.juddi.registry.RegistryEngine;
import org.apache.juddi.registry.RegistryServlet;
import org.apache.juddi.util.Config;
import org.apache.juddi.util.xml.XMLUtils;
import org.jboss.axis.AxisFault;
import org.jboss.axis.Message;
import org.jboss.axis.MessageContext;
import org.jboss.axis.message.SOAPBodyElementAxisImpl;
import org.jboss.axis.message.SOAPEnvelopeAxisImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class JBossJuddiAxisProcessor
{
private static Log log = LogFactory.getLog(JBossJuddiAxisProcessor.class);
private static HandlerMaker maker = HandlerMaker.getInstance();
public JBossJuddiAxisProcessor(Message soapResponse, MessageContext messageContext)
{
Message soapRequest = messageContext.getRequestMessage();
try
{
log.debug(soapRequest.getSOAPPartAsString());
} catch (AxisFault af)
{
af.printStackTrace();
}
Element request = null;
Element response = null;
String function = null;
String generic = null;
try
{
SOAPEnvelopeAxisImpl env = soapRequest.getSOAPEnvelope();
SOAPBodyElementAxisImpl requestBody = env.getFirstBody();
request = requestBody.getAsDOM();
function = request.getLocalName();
generic = request.getAttribute("generic");
if (generic == null)
generic = IRegistry.UDDI_V2_GENERIC;
IHandler requestHandler = maker.lookup(function);
if (requestHandler == null)
throw new UnsupportedException("The request " +
"type is unknown: " + function);
RegistryObject uddiRequest = requestHandler.unmarshal(request);
Object juddiServlet = messageContext.getProperty("transport.http.servlet");
if ((juddiServlet instanceof JBossJuddiInquiryServlet) &&
(!(uddiRequest instanceof org.apache.juddi.datatype.request.Inquiry)))
{
throw new RegistryException("Inquiry API " +
"does not support function: " + function);
} else if (juddiServlet instanceof JBossJuddiPublishServlet &&
(!(uddiRequest instanceof org.apache.juddi.datatype.request.Publish) &&
!(uddiRequest instanceof org.apache.juddi.datatype.request.SecurityPolicy)))
{
throw new RegistryException("Publish API " +
"does not support function: " + function);
} else if ((juddiServlet instanceof JBossJuddiAdminServlet) && (!(uddiRequest instanceof org.apache.juddi.datatype.request.Admin)))
{
throw new RegistryException("Admin API " +
"does not support function: " + function);
}
RegistryObject uddiResponse = null;
RegistryEngine registry = RegistryServlet.getRegistry();
if ((registry != null) && (registry.isAvailable()))
uddiResponse = registry.execute(uddiRequest);
else
throw new BusyException("The Registry is unavailable");
Document document = XMLUtils.createDocument();
Element element = document.createElement("temp");
IHandler responseHandler = maker.lookup(uddiResponse.getClass().getName());
responseHandler.marshal(uddiResponse, element);
response = (Element) element.getFirstChild();
} catch (RegistryException rex)
{
log.error(rex.getMessage(), rex);
String fCode = rex.getFaultCode();
String fString = rex.getFaultString();
String fActor = rex.getFaultActor();
DispositionReport dispRpt = rex.getDispositionReport();
if (dispRpt != null)
{
dispRpt.setGeneric(generic);
dispRpt.setOperator(Config.getOperator());
}
response = createFault(fCode, fString, fActor, dispRpt);
} catch (AxisFault axf)
{
log.error(axf.getMessage(), axf);
String fCode = String.valueOf(axf.getFaultCode());
String fString = axf.getFaultString();
String fActor = axf.getFaultActor();
response = createFault(fCode, fString, fActor, null);
} catch (Exception ex)
{
log.error(ex.getMessage(), ex);
String fCode = null;
String fString = ex.getMessage();
String fActor = null;
response = createFault(fCode, fString, fActor, null);
} finally
{
}
try
{
SOAPBodyElementAxisImpl soapRespBody = new SOAPBodyElementAxisImpl(response);
SOAPEnvelopeAxisImpl soapRespEnv = soapResponse.getSOAPEnvelope();
soapRespEnv.addBodyElement(soapRespBody);
} catch (AxisFault af)
{
af.printStackTrace();
}
try
{
log.debug(soapResponse.getSOAPPartAsString());
} catch (AxisFault af)
{
af.printStackTrace();
}
}
private static Element createFault(String fCode, String fString, String fActor, DispositionReport dispRpt)
{
Document document = XMLUtils.createDocument();
Element fault = document.createElement("Fault");
if (fCode != null)
{
Element fCodeElement = document.createElement("faultcode");
fCodeElement.appendChild(document.createTextNode(fCode));
fault.appendChild(fCodeElement);
}
if (fString == null)
fString = "";
Element fStringElement = document.createElement("faultstring");
fStringElement.appendChild(document.createTextNode(fString));
fault.appendChild(fStringElement);
if (fActor != null)
{
Element fActorElement = document.createElement("faultactor");
fActorElement.appendChild(document.createTextNode(fActor));
fault.appendChild(fActorElement);
}
if (dispRpt != null)
{
Element fDetailElement = document.createElement("detail");
IHandler handler = maker.lookup(DispositionReportHandler.TAG_NAME);
handler.marshal(dispRpt, fDetailElement);
fault.appendChild(fDetailElement);
}
return fault;
}
}