[ http://issues.apache.org/jira/browse/XMLBEANS-266?page=comments#action_12377504 ]
Wing Yew Poon commented on XMLBEANS-266: ---------------------------------------- Wesley, the normal channel for user questions and issues is the user mailing list (user@xmlbeans.apache.org). Bugs and enhancements may be filed in JIRA. When filing a bug in JIRA, it is helpful to attach repro data (xml schema/instance, java program) as files (rather than in the text body). - Wing Yew > javax.xml.stream.XMLStreamException: problem accessing the parser > ----------------------------------------------------------------- > > Key: XMLBEANS-266 > URL: http://issues.apache.org/jira/browse/XMLBEANS-266 > Project: XMLBeans > Type: Bug > Components: Binding > Versions: Version 2.1 > Environment: Windows XP, Eclipse w/ MyEclipse plugin, Tomcat > Reporter: Wesley King > > 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()); > } > } > } > ===================================== > ===================================== -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]