I am reposting this once more w/ hopes that one of the Axis wizards
might give me some advice. I'm really stumped on this one...
Thanks,
-- Chris

---------- Forwarded message ----------
From: Chris Berry <[EMAIL PROTECTED]>
Date: Jun 26, 2006 7:55 AM
Subject: Building a SOAPFaultHandler
To: [email protected]


Greetings,
I'm struggling to build an Axis Handler which modifies a SOAPFault on
it's way back out to the Client. I want to add a bit of generic
information (e.g. hostname, svcname, timestamp, etc.) to the SOAPFault
(i.e. to the faultstring and faultactor) o assist my Client's in their
debugging. Unfortunately I am not able to actually modify what the
Client sees, although I can see the Message is changed locally. Is
this even possible?? It appears that the Message is read-only at this
point?? Below is the code I'm using.

Does anyone have any ideas for me?? Am I just doing something silly??
Thanks,
-- Chris

public class ErrorHandler
 extends BasicHandler
{
 //------------------------------------
 public void invoke( MessageContext msgContext  )
   throws AxisFault
 {
   try {
     /* do nothing */
   }
   catch ( Exception e ) {
     errlog.error( e );
     throw AxisFault.makeFault( e );
   }
 }

 //------------------------------------
 public void onFault(MessageContext msgContext)
 {
   try {
     addFaultDetails( msgContext );
     logError( msgContext );
   }
   catch ( Exception ee ) {
     errlog.error( "An additional error occured while processing
onFault()", ee );
   }
 }

 //------------------------------------
 public void addFaultDetails( MessageContext msgContext )
 {
   try {
     if ( msgContext == null )
       return; // EXIT

     SOAPMessage msg = msgContext.getMessage();
     if ( msg == null )
       return; // EXIT

     SOAPBody body = msg.getSOAPBody();
     if ( body == null )
       return; // EXIT

     SOAPFault fault = (SOAPFault)(body.getFault());
     if ( fault == null )
       return; // EXIT

     // send back hostname, timestamp, svcname as part of the
     //   "faultcode/faultstring/faultactor" fields..
     String targetService = msgContext.getTargetService();
     if ( targetService == null )
       targetService = "UNKNOWN_SVC";

     String operation = "UNKNOWN_OP";
     if ( msgContext.getOperation() != null
          && msgContext.getOperation().getName() != null )
       operation = msgContext.getOperation().getName();

     String svcname = targetService + "." + operation;
     String timestamp = (new Date()).toString();
     String hostname = java.net.Inet4Address.getLocalHost().getHostName();

     String faultString = fault.getFaultString();
     faultString = "SOAPFault @ <" + timestamp + "> = " + faultString;
     fault.setFaultString( faultString );

     String faultActor = fault.getFaultActor();
     fault.setFaultActor(  "[" + svcname + "] @ (" + hostname + ") "
+ faultActor );

     SOAPEnvelope env = new SOAPEnvelope();
     env.clearBody();
     env.addBodyElement(fault);

     Message respMsg = new Message(env);
     msgContext.setResponseMessage(respMsg);
   }
   catch ( Exception ee ) {
     errlog.error( "An additional error occured while processing
onFault()", ee );
   }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to