You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@ws.apache.org by sn...@apache.org on 2004/06/23 05:28:10 UTC

cvs commit: ws-soap/java/samples/excfault DeploymentDescriptor.xml ExcFaultClient.java ExcFaultException.java ExcFaultExceptionSerializer.java ExcFaultService.java README testit.cmd testit.sh

snichol     2004/06/22 20:28:10

  Added:       java/samples/excfault DeploymentDescriptor.xml
                        ExcFaultClient.java ExcFaultException.java
                        ExcFaultExceptionSerializer.java
                        ExcFaultService.java README testit.cmd testit.sh
  Log:
  New sample demonstrating ExceptionFaultListener.
  
  Revision  Changes    Path
  1.1                  ws-soap/java/samples/excfault/DeploymentDescriptor.xml
  
  Index: DeploymentDescriptor.xml
  ===================================================================
  <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
               id="urn:exc-fault-sample">
    <isd:provider type="java"
                  scope="Application"
                  methods="throw1">
      <isd:java class="samples.excfault.ExcFaultService" static="false"/>
      <isd:option key="gzip" value="false"/>
      <isd:option key="SessionRequired" value="false"/>
    </isd:provider>
  
    <isd:faultListener>org.apache.soap.server.ExceptionFaultListener</isd:faultListener>
  
    <isd:mappings>
      <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
               xmlns:x="urn:exc-fault-sample" qname="x:ExcFaultException"
               javaType="samples.excfault.ExcFaultException"
               java2XMLClassName="samples.excfault.ExcFaultExceptionSerializer"
               xml2JavaClassName="samples.excfault.ExcFaultExceptionSerializer"/>
    </isd:mappings>    
  </isd:service>
  
  
  
  1.1                  ws-soap/java/samples/excfault/ExcFaultClient.java
  
  Index: ExcFaultClient.java
  ===================================================================
  /**
   *
   * Copyright 2000-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  
  package samples.excfault;
  
  import java.net.URL;
  import java.util.Vector;
  import org.apache.soap.Constants;
  import org.apache.soap.Fault;
  import org.apache.soap.Header;
  import org.apache.soap.encoding.SOAPMappingRegistry;
  import org.apache.soap.rpc.Call;
  import org.apache.soap.rpc.Parameter;
  import org.apache.soap.rpc.Response;
  import org.apache.soap.rpc.SOAPContext;
  import org.apache.soap.util.xml.QName;
  
  /**
   * See README for info.
   *
   * @author Scott Nichol (snichol@computer.org)
   */
  public class ExcFaultClient {
      private static void usage() {
          System.err.println ("Usage: java " + ExcFaultClient.class.getName() +
                              " [-9|-0] SOAP-router-URL");
          System.exit(1);
      }
  
      public static void main (String[] args) throws Exception {
          // Process the arguments.
          URL url = null;
          String schemaURI = null;
          if (args.length == 1) {
              url = new URL(args[0]);
              schemaURI = Constants.NS_URI_2001_SCHEMA_XSD;
          } else if (args.length == 2) {
              if (args[0].equals("-9"))
                  schemaURI = Constants.NS_URI_1999_SCHEMA_XSD;
              else if (args[0].equals("-0"))
                  schemaURI = Constants.NS_URI_2000_SCHEMA_XSD;
              else
                  usage();
              url = new URL(args[1]);
          } else {
              usage();
          }
  
          // Create the mapping
          ExcFaultExceptionSerializer ser = new ExcFaultExceptionSerializer();
          SOAPMappingRegistry smr = new SOAPMappingRegistry(null, schemaURI);
          smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                       new QName("urn:exc-fault-sample", "ExcFaultException"),
                       ExcFaultException.class, ser, ser);
  
          // Build the call.
          Header header = new Header();
          SOAPContext ctx = new SOAPContext();
          ctx.setGzip(false);
          ctx.setDocLitSerialization(false);
          Vector params = new Vector();
          Call call = new Call("urn:exc-fault-sample",
                               "throw1",
                               params,
                               header,
                               Constants.NS_URI_SOAP_ENC,
                               ctx);
          call.setSOAPMappingRegistry(smr);
  
          // Invoke the call and handle the response.
          Response resp = call.invoke(url, "");
          if (resp.generatedFault()) {
              Fault fault = resp.getFault();
              System.err.println("Generated fault: " + fault);
              Vector v = fault.getDetailEntries();
              for (int i = 0; i < v.size(); i++) {
              	Object o = v.elementAt(i);
              	if (o instanceof Parameter) {
              		Parameter p = (Parameter) o;
              		if (p.getType().equals(ExcFaultException.class)) {
              			ExcFaultException exc = (ExcFaultException) p.getValue();
              			System.err.println(" ExcFaultException >>>>>");
              			System.err.println("  Code: " + exc.getCode());
              			System.err.println("  Message: " + exc.getMessage());
              			exc.printStackTrace();
              		}
              	}
              }
          } else {
              Parameter result = resp.getReturnValue();
              Object o = result.getValue();
              System.out.println("return: " + o);
          }
      }
  }
  
  
  
  1.1                  ws-soap/java/samples/excfault/ExcFaultException.java
  
  Index: ExcFaultException.java
  ===================================================================
  /**
   *
   * Copyright 2000-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  
  package samples.excfault;
  
  import java.io.PrintStream;
  import java.io.PrintWriter;
  
  public class ExcFaultException extends Exception {
      protected int code;
      protected String stackTrace;
  
      public ExcFaultException(int code, String msg) {
          this(code, msg, (String) null);
      }
      
      public ExcFaultException(int code, String msg, String stackTrace) {
          super(msg);
          this.code = code;
          this.stackTrace = stackTrace;
      }
      
      public int getCode() {
          return code;
      }
  
      public void printStackTrace() {
          printStackTrace(System.err);
      }
  
      public void printStackTrace(PrintStream s) {
          PrintWriter pw = new PrintWriter(s);
          printStackTrace(pw);
          pw.close();
      }
  
      public void printStackTrace(PrintWriter w) {
          if (stackTrace != null) {
              w.print(stackTrace);
          } else {
              super.printStackTrace(w);
          }
      }
  }
  
  
  
  1.1                  ws-soap/java/samples/excfault/ExcFaultExceptionSerializer.java
  
  Index: ExcFaultExceptionSerializer.java
  ===================================================================
  /**
   *
   * Copyright 2000-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  
  package samples.excfault;
  
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.io.StringWriter;
  import java.io.Writer;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.apache.soap.Constants;
  import org.apache.soap.Envelope;
  import org.apache.soap.encoding.soapenc.SoapEncUtils;
  import org.apache.soap.rpc.SOAPContext;
  import org.apache.soap.util.Bean;
  import org.apache.soap.util.xml.Deserializer;
  import org.apache.soap.util.xml.DOMUtils;
  import org.apache.soap.util.xml.NSStack;
  import org.apache.soap.util.xml.QName;
  import org.apache.soap.util.xml.Serializer;
  import org.apache.soap.util.xml.XMLJavaMappingRegistry;
  
  /**
   * Serializes and deserializes an ExcFaultException.
   * 
   * @author Scott Nichol (snichol@computer.org)
   */
  public class ExcFaultExceptionSerializer implements Serializer, Deserializer {
    public void marshall(String inScopeEncStyle, Class javaType, Object src,
                         Object context, Writer sink, NSStack nsStack,
                         XMLJavaMappingRegistry xjmr, SOAPContext ctx)
        throws IllegalArgumentException, IOException {
  
      nsStack.pushScope();
  
      if (src == null) {
        SoapEncUtils.generateNullStructure(inScopeEncStyle,
                                           javaType,
                                           context,
                                           sink,
                                           nsStack,
                                           xjmr,
                                           ctx);
      } else {
        SoapEncUtils.generateStructureHeader(inScopeEncStyle,
                                             javaType,
                                             context,
                                             sink,
                                             nsStack,
                                             xjmr,
                                             ctx);
  
        sink.write(Envelope.LINE_SEPARATOR);
  
        ExcFaultException exc = (ExcFaultException) src;
  
        nsStack.pushScope();
        int code = exc.getCode();
        xjmr.marshall(Constants.NS_URI_SOAP_ENC, int.class, new Integer(code),
                      "code", sink, nsStack, ctx);
        sink.write(Envelope.LINE_SEPARATOR);
        nsStack.popScope();
  
        nsStack.pushScope();
        String msg = exc.getMessage();
        if (msg == null) {
            SoapEncUtils.generateNullStructure(Constants.NS_URI_SOAP_ENC,
                                               String.class, "message", sink,
                                               nsStack, xjmr, ctx);
        } else {
            xjmr.marshall(Constants.NS_URI_SOAP_ENC, String.class, msg,
                          "message", sink, nsStack, ctx);
        }
        sink.write(Envelope.LINE_SEPARATOR);
        nsStack.popScope();
  
        nsStack.pushScope();
        StringWriter sw = new StringWriter(1024);
        PrintWriter pw = new PrintWriter(sw);
        exc.printStackTrace(pw);
        pw.close();
        xjmr.marshall(Constants.NS_URI_SOAP_ENC, String.class, sw.toString(),
                      "stackTrace", sink, nsStack, ctx);
        sink.write(Envelope.LINE_SEPARATOR);
        nsStack.popScope();
  
        sink.write("</" + context + '>');
      }
  
      nsStack.popScope();
    }
  
    public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src,
                           XMLJavaMappingRegistry xjmr, SOAPContext ctx)
      throws IllegalArgumentException {
      Element root = (Element)src;
      if (SoapEncUtils.isNull(root)) {
        return new Bean(ExcFaultException.class, null);
      }
  
  	int code = -1;
  	String msg = null;
  	String stackTrace = null;
  
      Element tempEl = DOMUtils.getFirstChildElement(root);
      while (tempEl != null) {
        String declEncStyle = DOMUtils.getAttributeNS(tempEl,
                              Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE);
        String actualEncStyle = declEncStyle != null
                    ? declEncStyle
                    : inScopeEncStyle;
  
        // If it's a local reference, follow it.
        String href = tempEl.getAttribute(Constants.ATTR_REFERENCE);
        Element actualEl = tempEl;
        if (href != null && !href.equals("") && (href.charAt(0) == '#')) {
            href = href.substring(1);
            actualEl = DOMUtils.getElementByID(src.getOwnerDocument().getDocumentElement(),href);
            if (actualEl == null) {
                throw new IllegalArgumentException("No such ID '" + href + "'");
            }
        }
                    
        QName declItemType = SoapEncUtils.getTypeQName(actualEl);
        QName actualItemType = declItemType;
  
        Bean b = xjmr.unmarshall(actualEncStyle, actualItemType,
                                 actualEl, ctx);
  
        if (actualEl.getLocalName().equals("code")) {
          code = ((Integer) b.value).intValue();
        } else if (actualEl.getLocalName().equals("message")) {
          msg = (String) b.value;
        } else if (actualEl.getLocalName().equals("stackTrace")) {
          stackTrace = (String) b.value;
        } else {
          throw new IllegalArgumentException("Unknown element '" + actualEl.getLocalName() + "'");
        }
  
        tempEl = DOMUtils.getNextSiblingElement(tempEl);
      }
  
  	ExcFaultException exc = new ExcFaultException(code, msg, stackTrace);
      return new Bean(ExcFaultException.class, exc);
    }
  
  }
  
  
  
  1.1                  ws-soap/java/samples/excfault/ExcFaultService.java
  
  Index: ExcFaultService.java
  ===================================================================
  /**
   *
   * Copyright 2000-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  
  package samples.excfault;
  
  /**
   * Tests ExceptionFaultListener.
   *
   * @author Scott Nichol (snichol@computer.org)
   */
  public class ExcFaultService {
      /**
       *  Throws an exception.
       */
      public void throw1() throws ExcFaultException {
      	throw new ExcFaultException(98, "This is thrown from ExcFaultService#throw1");
      }
  }
  
  
  
  1.1                  ws-soap/java/samples/excfault/README
  
  Index: README
  ===================================================================
  
  Service:
  -------
  To install this service on an Apache-SOAP listener, you need to make
  the samples.excfault package available on the Apache-SOAP listener's
  classpath. Then deploy this service by filling in the deployment
  template using the info in the deployment descriptor in this
  directory or by using the service manager client:
    java org.apache.soap.server.ServiceManagerClient routerURL deploy dd.xml
  where routerURL is the URL of the SOAP RPC router and dd.xml is the
  name of the deployment descriptor file.  For example:
    java org.apache.soap.server.ServiceManagerClient  \
      http://localhost:8080/soap/servlet/rpcrouter deploy DeploymentDescriptor.xml
  
  
  Client:
  ------
  
  There is one HTTP client calls the throw1 service method.  
  The service method throws an exception, which will be processed by
  the ExceptionFaultListener configured in the deployment descriptor.
  
  Additional Client Classpath Requirements:
  ----------------------------------------
  
    ../..
  
  
  Explanation:
  -----------
  
  This demonstrates and tests the ExceptionFaultListener class.
  
  
  Sample Usage:
  ------------
  
  java samples.excfault.ExcFaultClient \
    http://localhost:8080/soap/servlet/rpcrouter
  
  
  Wire Dump:
  ---------
  *** REQUEST ***
  POST /soap/servlet/rpcrouter HTTP/1.0
  Host: localhost:81
  Content-Type: text/xml;charset=utf-8
  Content-Length: 398
  SOAPAction: ""
  Accept-Encoding: gzip
  
  <?xml version='1.0' encoding='UTF-8'?>
  <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
  <ns1:throw1 xmlns:ns1="urn:exc-fault-sample" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  </ns1:throw1>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
  
  *** RESPONSE ***
  HTTP/1.1 500 Internal Server Error
  Accept-Encoding: gzip
  Content-Type: text/xml;charset=utf-8
  Content-Length: 3715
  Date: Wed, 23 Jun 2004 03:24:15 GMT
  Server: Apache-Coyote/1.1
  Connection: close
  
  <?xml version='1.0' encoding='UTF-8'?>
  <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
  <SOAP-ENV:Fault>
  <faultcode>SOAP-ENV:Server</faultcode>
  <faultstring>Exception from service object: This is thrown from ExcFaultService#throw1</faultstring>
  <faultactor>/soap/servlet/rpcrouter</faultactor>
  <detail>
  <detailEntry xmlns:ns1="urn:exc-fault-sample" xsi:type="ns1:ExcFaultException" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <code xsi:type="xsd:int">98</code>
  <message xsi:type="xsd:string">This is thrown from ExcFaultService#throw1</message>
  <stackTrace xsi:type="xsd:string">samples.excfault.ExcFaultException: This is thrown from ExcFaultService#throw1
  	at samples.excfault.ExcFaultService.throw1(ExcFaultService.java:30)
  	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  	at java.lang.reflect.Method.invoke(Method.java:324)
  	at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:165)
  	at org.apache.soap.providers.RPCJavaProvider.invoke(RPCJavaProvider.java:89)
  	at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:348)
  	at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
  	at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
  	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
  	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
  	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
  	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
  	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
  	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
  	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
  	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
  	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
  	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
  	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
  	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
  	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
  	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
  	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
  	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
  	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
  	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
  	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
  	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
  	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
  	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
  	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
  	at java.lang.Thread.run(Thread.java:534)
  </stackTrace>
  </detailEntry>
  </detail>
  </SOAP-ENV:Fault>
  
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
  
  
  
  1.1                  ws-soap/java/samples/excfault/testit.cmd
  
  Index: testit.cmd
  ===================================================================
  @echo off
  echo This test assumes a server URL of http://localhost:8080/soap/servlet/rpcrouter
  echo Deploying the excfault service...
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter deploy DeploymentDescriptor.xml
  echo .
  echo Verify that it's there
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list
  echo .
  echo Running the excfault test
  java samples.excfault.ExcFaultClient http://localhost:8080/soap/servlet/rpcrouter
  echo .
  echo Running the excfault test with the 1999 schema
  java samples.excfault.ExcFaultClient -9 http://localhost:8080/soap/servlet/rpcrouter
  echo .
  echo Undeploy it now
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter undeploy urn:exc-fault-sample
  echo .
  echo Verify that it's gone
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list
  
  
  
  1.1                  ws-soap/java/samples/excfault/testit.sh
  
  Index: testit.sh
  ===================================================================
  echo This test assumes a server URL of http://localhost:8080/soap/servlet/rpcrouter
  echo Deploying the excfault service...
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter deploy DeploymentDescriptor.xml
  echo 
  echo Verify that it\'s there
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list
  echo 
  echo Running the excfault test
  java samples.excfault.ExcFaultClient http://localhost:8080/soap/servlet/rpcrouter
  echo 
  echo Running the excfault test with the 1999 schema
  java samples.excfault.ExcFaultClient -9 http://localhost:8080/soap/servlet/rpcrouter
  echo 
  echo Undeploy it now
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter undeploy urn:exc-fault-sample
  echo 
  echo Verify that it\'s gone
  java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list