Uploaded image for project: 'XMLBeans'
  1. XMLBeans
  2. XMLBEANS-266

javax.xml.stream.XMLStreamException: problem accessing the parser

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: Version 2.1
    • Fix Version/s: None
    • Component/s: Binding
    • Labels:
      None
    • Environment:
      Windows XP, Eclipse w/ MyEclipse plugin, Tomcat

      Description

      I have an soap message receiver class that extends AbstractInOutSyncMessageReceiver. I use this class to handle my web service requests. Inside the invokeBusinessLogic(MessageContext, MessageContext) method, I am attempting to parse the envelope header first and then the body. The header contains an element called MultiSpeakMsgHeader and the body contains an element called PingURL. All the XML objects were created using XMLBeans. The web service works fine if I only attempt to parse the body's first element creating the PingURLDocument. If I try to parse the header's first element creating the MultiSpeakMsgHeaderDocument, that works fine, but right afterwards if I try to parse the body's first element I get an exception: XMLStreamException: problem accessing parser.

      Am I doing something wrong? If so, any help would be appreciated. If not, is this a known bug/issue? And is there a work around? Also I wasn't sure if this is the right place to submit questions. What is the normal procedure for submitting questions or possible bugs?

      Include below are three files that may or may not be helpfull. (1) The AbstractInOutSyncMessageReceiver java file. (2) The skeleton java file that handles the service. And (3) the xml I'm sending to the server. As I mentioned above, everything works fine if I don't attempt to read the header. As a side note, the reason I need to read the header is to check for a valid user id and password. If there is another way to check/validate header information, I'm open to suggestions.

      =====================================
      =====================================
      (3) XML Request being sent
      ---------------------------------------
      <?xml version='1.0' encoding='utf-8'?>
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope" />
      <soapenv:Header>
      <MultiSpeakMsgHeader UserID="test" Pwd="test" xmlns="http://www.multispeak.org/Version_3.0" />
      </soapenv:Header>
      <soapenv:Body>
      <PingURL xmlns="http://www.multispeak.org/Version_3.0" />
      </soapenv:Body>
      </soapenv:Envelope>
      =====================================
      =====================================

      =====================================
      =====================================
      (2) Java class to handle request
      --------------------------------------------
      package com.daffron.multispeak;

      import java.lang.reflect.Method;
      import java.util.Calendar;
      import java.util.GregorianCalendar;

      import org.apache.xmlbeans.XmlObject;
      import org.multispeak.version30.*;

      public class MultispeakSoapSkeleton {

      public PingURLResponseDocument PingURL(PingURLDocument requestDoc) {

      PingURLResponseDocument pingURLRespDoc = null;
      try

      { pingURLRespDoc = (PingURLResponseDocument) getReturnObject(PingURLResponseDocument.class); }

      catch (Exception e)

      { System.out.println("Failed to create return object for PingURL request."); }

      if (pingURLRespDoc != null)

      { pingURLRespDoc.addNewPingURLResponse(); }

      return pingURLRespDoc;
      }

      protected XmlObject getReturnObject(Class type) throws Exception {
      Method creatorMethod = null;

      if (XmlObject.class.isAssignableFrom(type)) {
      Class[] declaredClasses = type.getDeclaredClasses();

      for (int i = 0; i < declaredClasses.length; i++) {
      Class declaredClass = declaredClasses[i];

      if (declaredClass.getName().endsWith("$Factory"))

      { creatorMethod = declaredClass.getMethod("newInstance", null); break; }

      }
      }

      if (creatorMethod != null)

      { return (XmlObject) creatorMethod.invoke(null, null); }

      else

      { throw new Exception("Creator not found!"); }

      }
      }

      =====================================
      =====================================

      =====================================
      =====================================
      (1) AbstractInOutSyncMessageReceiver java file
      -----------------------------------------------------------------
      package com.daffron.multispeak;

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;

      import javax.xml.namespace.QName;

      import org.apache.axis2.*;
      import org.apache.axis2.context.*;
      import org.apache.axis2.description.*;
      import org.apache.axis2.engine.*;
      import org.apache.axis2.om.*;
      import org.apache.axis2.om.impl.OMNodeEx;
      import org.apache.axis2.om.impl.llom.builder.StAXOMBuilder;
      import org.apache.axis2.receivers.*;
      import org.apache.axis2.soap.*;
      import org.apache.axis2.util.StreamWrapper;
      import org.apache.xmlbeans.XmlObject;
      import org.multispeak.version30.*;

      /**

      • */
        public class MultispeakSoapMessageReceiver extends AbstractInOutSyncMessageReceiver {
        //
        private static QName[] qNameArray = {};

      public void invokeBusinessLogic(MessageContext msgContext, MessageContext newMsgContext) throws AxisFault {
      try {
      // get the implementation class for the Web Service
      Object obj = getTheImplementationObject(msgContext);

      //Inject the Message Context if it is asked for
      DependencyManager.configureBusinessLogicProvider(obj, msgContext, newMsgContext);

      MultispeakSoapSkeleton skel = (MultispeakSoapSkeleton) obj;

      //Out Envelop
      SOAPEnvelope envelope = null;

      //Find the axisOperation that has been set by the Dispatch phase.
      AxisOperation op = msgContext.getOperationContext().getAxisOperation();

      if (op == null)

      { throw new AxisFault( "Operation is not located, if this is doclit style the SOAP-ACTION should specified via the SOAP Action to use the RawXMLProvider"); }

      String methodName;

      if ((op.getName() != null) & ((methodName = op.getName().getLocalPart()) != null)) {
      SOAPEnvelope tempEnv = msgContext.getEnvelope();

      // NOTE: validate header
      SOAPHeader header = tempEnv.getHeader();
      if (header != null)

      { OMElement headerE = header.getFirstElement(); validateHeader((MultiSpeakMsgHeaderDocument) fromOM(headerE, MultiSpeakMsgHeaderDocument.class)); }

      if ("PingURL".equals(methodName))

      { PingURLResponseDocument respDoc = null; //doc style respDoc = skel.PingURL((PingURLDocument) fromOM(msgContext.getEnvelope().getBody().getFirstElement(), PingURLDocument.class)); envelope = toEnvelope(getSOAPFactory(msgContext), respDoc); }

      newMsgContext.setEnvelope(envelope);
      }
      }
      catch (Exception e)

      { throw AxisFault.makeFault(e); }

      }

      private OMElement toOM(MultiSpeakMsgHeaderDocument param)

      { StAXOMBuilder builder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(), new StreamWrapper(param.newXMLStreamReader())); OMElement documentElement = builder.getDocumentElement(); optimizeContent(documentElement, qNameArray); ((OMNodeEx) documentElement).setParent(null); return documentElement; }

      private SOAPEnvelope toEnvelope(SOAPFactory factory, MultiSpeakMsgHeaderDocument param) { SOAPEnvelope envelope = factory.getDefaultEnvelope(); envelope.getBody().addChild(toOM(param)); return envelope; }

      private boolean validateHeader(MultiSpeakMsgHeaderDocument headerDoc) { return true; }

      private OMElement toOM(PingURLResponseDocument param) { StAXOMBuilder builder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(), new StreamWrapper(param.newXMLStreamReader())); OMElement documentElement = builder.getDocumentElement(); optimizeContent(documentElement, qNameArray); ((OMNodeEx) documentElement).setParent(null); return documentElement; }

      private SOAPEnvelope toEnvelope(SOAPFactory factory, PingURLResponseDocument param)

      { SOAPEnvelope envelope = factory.getDefaultEnvelope(); envelope.getBody().addChild(toOM(param)); return envelope; }

      private OMElement toOM(PingURLDocument param) { StAXOMBuilder builder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(), new StreamWrapper(param.newXMLStreamReader())); OMElement documentElement = builder.getDocumentElement(); optimizeContent(documentElement, qNameArray); ((OMNodeEx) documentElement).setParent(null); return documentElement; }

      private SOAPEnvelope toEnvelope(SOAPFactory factory, PingURLDocument param) { SOAPEnvelope envelope = factory.getDefaultEnvelope(); envelope.getBody().addChild(toOM(param)); return envelope; }

      public XmlObject fromOM(OMElement param, Class type) {
      try {
      if (MultiSpeakMsgHeaderDocument.class.equals(type))

      { return MultiSpeakMsgHeaderDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching()); }

      if (PingURLResponseDocument.class.equals(type))

      { return PingURLResponseDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching()); }

      if (PingURLDocument.class.equals(type))

      { return PingURLDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching()); }

      }
      catch (Exception e)

      { throw new RuntimeException("Data binding error", e); }

      return null;
      }

      private void optimizeContent(org.apache.axis2.om.OMElement element, javax.xml.namespace.QName[] qNames) {
      for (int i = 0; i < qNames.length; i++)

      { markElementsAsOptimized(qNames[i], element); }

      }

      private void markElementsAsOptimized(javax.xml.namespace.QName qName, org.apache.axis2.om.OMElement rootElt) {
      if (rootElt.getQName().equals(qName)) {
      //get the text node and mark it
      org.apache.axis2.om.OMNode node = rootElt.getFirstOMChild();

      if (node.getType() == org.apache.axis2.om.OMNode.TEXT_NODE)

      { ((org.apache.axis2.om.OMText) node).setOptimize(true); }

      }

      java.util.Iterator childElements = rootElt.getChildElements();

      while (childElements.hasNext())

      { markElementsAsOptimized(qName, (org.apache.axis2.om.OMElement) childElements.next()); }

      }
      }

      =====================================
      =====================================

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              wesleyking Wesley King
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated: