[ 
https://issues.apache.org/jira/browse/AXIS2-3184?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jose Antonio updated AXIS2-3184:
--------------------------------

    Attachment: Begin.java

I've been playing with the generated Begin class and debugging how it works.

In the XSD, Begin is defined as:

<xs:complexType name="AssertionType">
        <xs:sequence>
            <xs:any minOccurs="0" namespace="##other" processContents="lax"/>
        </xs:sequence>
        <xs:attribute ref="wsu:Id" use="optional"/>
    </xs:complexType>
    <xs:element name="begin">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="tns:AssertionType">
                    <xs:sequence>
                        <xs:element name="type" type="xs:QName"/>
                        <xs:element name="expiresAt" minOccurs="0">
                            <xs:simpleType>
                                <xs:union memberTypes="xs:dateTime">
                                    <xs:simpleType>
                                        <xs:restriction base="xs:token">
                                            <xs:enumeration value=""/>
                                        </xs:restriction>
                                    </xs:simpleType>
                                </xs:union>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>

So it has a mandatory element "type" and an optional "any" element. 
This is the generated parse method:

public static Begin parse(javax.xml.stream.XMLStreamReader reader)
                                throws java.lang.Exception {
                        Begin object = new Begin();

                        int event;
                        java.lang.String nillableValue = null;
                        java.lang.String prefix = "";
                        java.lang.String namespaceuri = "";
                        try {

                                while (!reader.isStartElement() && 
!reader.isEndElement())
                                        reader.next();

                                if (reader.getAttributeValue(
                                                
"http://www.w3.org/2001/XMLSchema-instance";, "type") != null) {
                                        java.lang.String fullTypeName = reader
                                                        .getAttributeValue(
                                                                        
"http://www.w3.org/2001/XMLSchema-instance";,
                                                                        "type");
                                        if (fullTypeName != null) {
                                                java.lang.String nsPrefix = 
null;
                                                if (fullTypeName.indexOf(":") > 
-1) {
                                                        nsPrefix = 
fullTypeName.substring(0, fullTypeName
                                                                        
.indexOf(":"));
                                                }
                                                nsPrefix = nsPrefix == null ? 
"" : nsPrefix;

                                                java.lang.String type = 
fullTypeName
                                                                
.substring(fullTypeName.indexOf(":") + 1);

                                                if (!"begin".equals(type)) {
                                                        // find namespace for 
the prefix
                                                        java.lang.String nsUri 
= reader
                                                                        
.getNamespaceContext().getNamespaceURI(
                                                                                
        nsPrefix);
                                                        return (Begin) 
org.oasis_open.docs.ws_caf._2005._10.wsctx.ExtensionMapper
                                                                        
.getTypeObject(nsUri, type, reader);
                                                }

                                        }

                                }

                                // Note all attributes that were handled. Used 
to differ normal
                                // attributes
                                // from anyAttributes.
                                java.util.Vector handledAttributes = new 
java.util.Vector();

                                // handle attribute "Id"
                                java.lang.String tempAttribId =

                                reader
                                                .getAttributeValue(
                                                                
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";,
                                                                "Id");

                                if (tempAttribId != null) {
                                        java.lang.String content = tempAttribId;

                                        object
                                                        
.setId(org.apache.axis2.databinding.utils.ConverterUtil
                                                                        
.convertToID(tempAttribId));

                                } else {

                                }
                                handledAttributes.add("Id");
*****************************************************************************
                                reader.next();

                                while (!reader.isStartElement() && 
!reader.isEndElement())
                                        reader.next();

                                if (reader.isStartElement()) {

                                        // use the QName from the parser as the 
name for the builder
                                        javax.xml.namespace.QName startQname1 = 
reader.getName();

                                        // We need to wrap the reader so that 
it produces a fake
                                        // START_DOCUMENT event
                                        // this is needed by the builder classes
                                        
org.apache.axis2.databinding.utils.NamedStaxOMBuilder builder1 = new 
org.apache.axis2.databinding.utils.NamedStaxOMBuilder(
                                                        new 
org.apache.axis2.util.StreamWrapper(reader),
                                                        startQname1);
                                        
object.setExtraElement(builder1.getOMElement());

                                        reader.next();

                                } // End of if for expected property start 
element

                                else {

                                }
***************************************************************************************
                                while (!reader.isStartElement() && 
!reader.isEndElement())
                                        reader.next();

                                if (reader.isStartElement()
                                                && new 
javax.xml.namespace.QName(
                                                                
"http://docs.oasis-open.org/ws-caf/2005/10/wsctx";,
                                                                
"type").equals(reader.getName())) {

                                        java.lang.String content = 
reader.getElementText();

                                        int index = content.indexOf(":");
                                        if (index > 0) {
                                                prefix = content.substring(0, 
index);
                                        } else {
                                                prefix = "";
                                        }
                                        namespaceuri = 
reader.getNamespaceURI(prefix);
                                        object
                                                        
.setType(org.apache.axis2.databinding.utils.ConverterUtil
                                                                        
.convertToQName(content, namespaceuri));

                                        reader.next();

                                } // End of if for expected property start 
element

                                else {
                                        // A start element we are not expecting 
indicates an invalid
                                        // parameter was passed
                                        throw new 
org.apache.axis2.databinding.ADBException(
                                                        "Unexpected subelement 
" + reader.getLocalName());
                                }

                                while (!reader.isStartElement() && 
!reader.isEndElement())
                                        reader.next();

                                if (reader.isStartElement()
                                                && new 
javax.xml.namespace.QName(
                                                                
"http://docs.oasis-open.org/ws-caf/2005/10/wsctx";,
                                                                
"expiresAt").equals(reader.getName())) {

                                        object
                                                        
.setExpiresAt(org.oasis_open.docs.ws_caf._2005._10.wsctx.ExpiresAt_type1.Factory
                                                                        
.parse(reader));

                                        reader.next();

                                } // End of if for expected property start 
element

                                else {

                                }

                                while (!reader.isStartElement() && 
!reader.isEndElement())
                                        reader.next();

                                if (reader.isStartElement())
                                        // A start element we are not expecting 
indicates a trailing
                                        // invalid property
                                        throw new 
org.apache.axis2.databinding.ADBException(
                                                        "Unexpected subelement 
" + reader.getLocalName());

                        } catch (javax.xml.stream.XMLStreamException e) {
                                throw new java.lang.Exception(e);
                        }

                        return object;
                }

I've marked the problem. It reads the first element and assigns its value to 
the ExtraElement, which is optional, and then tries to read the mandatory 
"type" element. In that case, that element could be the only element in the 
begin message and in that case, it is assigned to the extraElement field, 
instead of its type element.

Changing the marked code to the end and deleting the code:
// A start element we are not expecting indicates an invalid
                                        // parameter was passed
                                        throw new 
org.apache.axis2.databinding.ADBException(
                                                        "Unexpected subelement 
" + reader.getLocalName());

from the else section in the "type" read statement works for that class.

> Databinding cannot parse itself (Unexpected subelement)
> -------------------------------------------------------
>
>                 Key: AXIS2-3184
>                 URL: https://issues.apache.org/jira/browse/AXIS2-3184
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: 1.3
>         Environment: JDK 1.5 and 1.6, Ubuntu Linux 7.04
>            Reporter: Jose Antonio
>         Attachments: Begin.java, wsctx-specification.zip
>
>
> Hello, I'm developing a web service specification with Axis2 1.3 and
> I've generated the code using ADB. That specification has a type B
> that extends type A and in some circumstances I want to convert an
> object of type A to B so I did something like:
> elem = A.getContent().getOMElement(B.name,factory);
> B.parse(elem);
> But I got an exception saying:
> Unexpected subelement b
> where b B.name.localpart.
> To get it better, I have the following code:
> RegistrationContext ctx = new RegistrationContext();
> RegistrationContextType ctxContent = new RegistrationContextType();
> ContextIdentifierType ctxId = new ContextIdentifierType();
> ctxId.setAnyURI(new URI("http://adapt20/0";));
> ctxContent.setContextIdentifier(ctxId);
> ServiceRefType regSrvc = new ServiceRefType();
> regSrvc.setExtraElement(AddressingUtils.eprToOM(new
> EndpointReference("http://localhost/registration";)));
> ctxContent.setRegistrationService(regSrvc );
> ctx.setRegistrationContext(ctxContent);
> OMElement regCtxElem = ctx.getOMElement(null, 
> OMAbstractFactory.getOMFactory());
> System.out.println("Created registration context element:");
> System.out.println(regCtxElem.toString());
> RegistrationContext newRegCtx =
> RegistrationContext.Factory.parse(regCtxElem.getXMLStreamReader());
> So what I'm doing is basically creating an object of type B, getting
> an OMElement from it and then parsing it through B.Factory.parse
> method. It should work but I get the following exception:
> java.lang.Exception: org.apache.axis2.databinding.ADBException:
> Unexpected subelement registrationContext
>        at 
> org.oasis.wscaf.types.wscf.RegistrationContextType$Factory.parse(RegistrationContextType.java:1103)
>        at 
> org.oasis.wscaf.types.wscf.RegistrationContext$Factory.parse(RegistrationContext.java:307)
>        at org.oasis.wscaf.tests.DatabindingTest.main(DatabindingTest.java:52)
> Caused by: org.apache.axis2.databinding.ADBException: Unexpected
> subelement registrationContext
>        at 
> org.oasis.wscaf.types.wscf.RegistrationContextType$Factory.parse(RegistrationContextType.java:907)
>        ... 2 more
> Which is strange since registrationContext is the local name of
> RegistrationContext class.
> I cannot use the getPullParser method because of this bug:
> https://issues.apache.org/jira/browse/AXIS2-3028
> So I'm doing this through the getOMElement method.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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

Reply via email to