You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Amy Krause <am...@epcc.ed.ac.uk> on 2007/01/29 15:28:46 UTC

Deserializing substitutionGroup and abstract types

Hi,

I'm having a very similar problem as described here:
http://marc.theaimsgroup.com/?l=axis-user&m=113819830006177&w=2

My schema is included below.
I'm trying to implement a composite pattern. There are three types derived 
from an abstract type as follows:

         Workflow (abstract)
        /         |        \
    Parallel   Sequence  Pipeline

Both parallel and sequence elements must contain nested Workflow elements 
(one or more of parallel, sequence or pipeline), whereas pipeline elements 
cannot - they form the leaves of the workflow tree.
An example of a document would be:

<perform>
   <sequence>
     <parallel>
       <pipeline> ... </pipeline>
       <pipeline> ... </pipeline>
     </parallel>
     <pipeline> ... </pipeline>
   </sequence>
<perform>

In the schema I've defined an abstract Workflow element and elements 
parallel, sequence and pipeline. These are substitution elements for the 
Workflow element.
When I generate Java beans with WSDL2Java there is no trace of the 
parallel and sequence elements. There is a Java class called Composite 
which extends WorkflowComponent but there is no way of telling whether 
this Composite object used to be a sequence or a parallel element. How can 
I force Axis to generate Java beans corresponding to those elements?

Any help with this would be appreciated.

Thanks,
Amy



  <!-- root element -->
  <xsd:element name="perform">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element ref="tns:workflow"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

   <!-- work flow group and component -->

   <xsd:element name="workflow" abstract="true"
                type="tns:WorkflowComponent">
   </xsd:element>

   <xsd:complexType name="WorkflowComponent">
   </xsd:complexType>

   <xsd:element name="parallel"
                substitutionGroup="tns:workflow"
                type="tns:Composite"/>
   <xsd:element name="sequence"
                substitutionGroup="tns:workflow"
                type="tns:Composite"/>

   <xsd:complexType name="Composite">
     <xsd:complexContent>
       <xsd:extension base="tns:WorkflowComponent">
         <xsd:sequence>
           <xsd:element ref="tns:workflow" maxOccurs="unbounded"/>
         </xsd:sequence>
       </xsd:extension>
     </xsd:complexContent>
   </xsd:complexType>

   <xsd:element name="pipeline"
                substitutionGroup="tns:workflow"
                type="tns:Pipeline"/>

   <xsd:complexType name="Pipeline">
     <xsd:complexContent>
       <xsd:extension base="tns:WorkflowComponent">
         <xsd:sequence>
           <xsd:element ref="tns:activity" minOccurs="1"
                                           maxOccurs="unbounded"/>
         </xsd:sequence>
       </xsd:extension>
     </xsd:complexContent>
   </xsd:complexType>

   <xsd:element name="activity">
      <!-- some definitions here ... -->
   </xsd:element>


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Deserializing substitutionGroup and abstract types

Posted by Jeff Greif <jg...@alumni.princeton.edu>.
I've had some luck using XMLBeans to produce classes corresponding to
a schema.  It is claimed that this handles all features of XML Schema.
 There is supposed to be a way (but I haven't read up on it or used
it) to integrate those classes into the Axis
serialization/deserialization mechanism.  Most likely, you would
download the XMLBeans libraries from their normal location
(xmlbeans.apache.org), and Axis would provide some additional glue
classes, apparently in the package
org.apache.axis.encoding.ser.xbeans.

There's some indication in a quick Google search, that after
generating the classes and the auxiliary information from the schema,
you have to generate Axis-style type-mappings to guide the Axis
serialization mechanism.  Some people have wound up having to do it by
hand, but it seems likely there is a way to automate it, or that the
Axis glue classes could use the information produced by the XMLBeans
compiler.  Probably if you collect all the qnames of types, global
elements and attributes in your schema (perhaps using the XML Schema
API as provided by Xerces) and specify the XmlBeanSerializerFactory
and XmlBeanDeserializerFactory as their serializer/deserializers in
the type mappings, you'll be close.

Jeff

On 1/30/07, Amy Krause <am...@epcc.ed.ac.uk> wrote:
> Hi,
>
> > Abstract types and substitution groups seem not to be well supported
> > in most web service machinery.  Even if you find a supporting
> > platform, there may be interoperability problems if clients use other
> > platforms.
>
> That's interesting. I wasn't aware of that.
>
> > You might have an easier time getting something like this
> > to work:
> >
> > <element name="sequence" type="tns:Workflow"/>
> > <element name="parallel" type="tns:Workflow"/>
> > <element name="pipeline" type="tns:Pipeline"/>
> >
> > <complexType name="Workflow">
> >  <choice maxOccurs="unbounded">
> >     <element ref="sequence"/>
> >     <element ref="parallel"/>
> >     <element ref="pipeline"/>
> >   </choice>
> > </complexType>
> >
> > <complexType name="Pipeline">
> >  ...
> > </complexType>
> >
>
> This is a far more elegant way of writing the schema, I agree - it's what
> I originally used. Unfortunately, WSDL2Java (Axis 1.4) doesn't seem to
> support the maxOccurs attribute on a choice element. The beans don't
> reflect it, there's only one member in the Java bean for each of the
> subelements.
> It is a complicated problem. Since the sequence, parallel and
> pipeline elements can occur in any order and multiplicity the bean would
> have to provide a List containing those objects. But then those objects
> need to be cast to the correct types ...
> This is why I tried to use substitutionGroups.
>
> Is there any other way of solving the problem? I hope I was wrong and it's
> possible to generate beans for the <choice maxOccurs="unbounded">  ...
> solution.
>
> Amy
>
>
>
>
> > On 1/29/07, Amy Krause <am...@epcc.ed.ac.uk> wrote:
> >> Hi,
> >>
> >> I'm having a very similar problem as described here:
> >> http://marc.theaimsgroup.com/?l=axis-user&m=113819830006177&w=2
> >>
> >> My schema is included below.
> >> I'm trying to implement a composite pattern. There are three types derived
> >> from an abstract type as follows:
> >>
> >>          Workflow (abstract)
> >>         /         |        \
> >>     Parallel   Sequence  Pipeline
> >>
> >> Both parallel and sequence elements must contain nested Workflow elements
> >> (one or more of parallel, sequence or pipeline), whereas pipeline elements
> >> cannot - they form the leaves of the workflow tree.
> >> An example of a document would be:
> >>
> >> <perform>
> >>    <sequence>
> >>      <parallel>
> >>        <pipeline> ... </pipeline>
> >>        <pipeline> ... </pipeline>
> >>      </parallel>
> >>      <pipeline> ... </pipeline>
> >>    </sequence>
> >> <perform>
> >>
> >> In the schema I've defined an abstract Workflow element and elements
> >> parallel, sequence and pipeline. These are substitution elements for the
> >> Workflow element.
> >> When I generate Java beans with WSDL2Java there is no trace of the
> >> parallel and sequence elements. There is a Java class called Composite
> >> which extends WorkflowComponent but there is no way of telling whether
> >> this Composite object used to be a sequence or a parallel element. How can
> >> I force Axis to generate Java beans corresponding to those elements?
> >>
> >> Any help with this would be appreciated.
> >>
> >> Thanks,
> >> Amy
> >>
> >>
> >>
> >>   <!-- root element -->
> >>   <xsd:element name="perform">
> >>      <xsd:complexType>
> >>        <xsd:sequence>
> >>          <xsd:element ref="tns:workflow"/>
> >>        </xsd:sequence>
> >>      </xsd:complexType>
> >>    </xsd:element>
> >>
> >>    <!-- work flow group and component -->
> >>
> >>    <xsd:element name="workflow" abstract="true"
> >>                 type="tns:WorkflowComponent">
> >>    </xsd:element>
> >>
> >>    <xsd:complexType name="WorkflowComponent">
> >>    </xsd:complexType>
> >>
> >>    <xsd:element name="parallel"
> >>                 substitutionGroup="tns:workflow"
> >>                 type="tns:Composite"/>
> >>    <xsd:element name="sequence"
> >>                 substitutionGroup="tns:workflow"
> >>                 type="tns:Composite"/>
> >>
> >>    <xsd:complexType name="Composite">
> >>      <xsd:complexContent>
> >>        <xsd:extension base="tns:WorkflowComponent">
> >>          <xsd:sequence>
> >>            <xsd:element ref="tns:workflow" maxOccurs="unbounded"/>
> >>          </xsd:sequence>
> >>        </xsd:extension>
> >>      </xsd:complexContent>
> >>    </xsd:complexType>
> >>
> >>    <xsd:element name="pipeline"
> >>                 substitutionGroup="tns:workflow"
> >>                 type="tns:Pipeline"/>
> >>
> >>    <xsd:complexType name="Pipeline">
> >>      <xsd:complexContent>
> >>        <xsd:extension base="tns:WorkflowComponent">
> >>          <xsd:sequence>
> >>            <xsd:element ref="tns:activity" minOccurs="1"
> >>                                            maxOccurs="unbounded"/>
> >>          </xsd:sequence>
> >>        </xsd:extension>
> >>      </xsd:complexContent>
> >>    </xsd:complexType>
> >>
> >>    <xsd:element name="activity">
> >>       <!-- some definitions here ... -->
> >>    </xsd:element>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> >> For additional commands, e-mail: axis-user-help@ws.apache.org
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
> >
>
>
>
>
>
> --
>    ------------------------------------------------------------
>   | Dr Amy Krause                      Applications Consultant |
>   |                        |epcc|, The University of Edinburgh |
>   |     King's Buildings, Mayfield Road, Edinburgh EH9 3JZ, UK |
>   | Tel: +44 (0)131 650 6718 --- email: a.krause@epcc.ed.ac.uk |
>    ------------------------------------------------------------
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Deserializing substitutionGroup and abstract types

Posted by Amy Krause <am...@epcc.ed.ac.uk>.
Hi,

> Abstract types and substitution groups seem not to be well supported
> in most web service machinery.  Even if you find a supporting
> platform, there may be interoperability problems if clients use other
> platforms.

That's interesting. I wasn't aware of that.

> You might have an easier time getting something like this
> to work:
>
> <element name="sequence" type="tns:Workflow"/>
> <element name="parallel" type="tns:Workflow"/>
> <element name="pipeline" type="tns:Pipeline"/>
>
> <complexType name="Workflow">
>  <choice maxOccurs="unbounded">
>     <element ref="sequence"/>
>     <element ref="parallel"/>
>     <element ref="pipeline"/>
>   </choice>
> </complexType>
>
> <complexType name="Pipeline">
>  ...
> </complexType>
>

This is a far more elegant way of writing the schema, I agree - it's what 
I originally used. Unfortunately, WSDL2Java (Axis 1.4) doesn't seem to 
support the maxOccurs attribute on a choice element. The beans don't 
reflect it, there's only one member in the Java bean for each of the 
subelements.
It is a complicated problem. Since the sequence, parallel and 
pipeline elements can occur in any order and multiplicity the bean would 
have to provide a List containing those objects. But then those objects 
need to be cast to the correct types ...
This is why I tried to use substitutionGroups.

Is there any other way of solving the problem? I hope I was wrong and it's 
possible to generate beans for the <choice maxOccurs="unbounded">  ... 
solution.

Amy




> On 1/29/07, Amy Krause <am...@epcc.ed.ac.uk> wrote:
>> Hi,
>> 
>> I'm having a very similar problem as described here:
>> http://marc.theaimsgroup.com/?l=axis-user&m=113819830006177&w=2
>> 
>> My schema is included below.
>> I'm trying to implement a composite pattern. There are three types derived
>> from an abstract type as follows:
>>
>>          Workflow (abstract)
>>         /         |        \
>>     Parallel   Sequence  Pipeline
>> 
>> Both parallel and sequence elements must contain nested Workflow elements
>> (one or more of parallel, sequence or pipeline), whereas pipeline elements
>> cannot - they form the leaves of the workflow tree.
>> An example of a document would be:
>> 
>> <perform>
>>    <sequence>
>>      <parallel>
>>        <pipeline> ... </pipeline>
>>        <pipeline> ... </pipeline>
>>      </parallel>
>>      <pipeline> ... </pipeline>
>>    </sequence>
>> <perform>
>> 
>> In the schema I've defined an abstract Workflow element and elements
>> parallel, sequence and pipeline. These are substitution elements for the
>> Workflow element.
>> When I generate Java beans with WSDL2Java there is no trace of the
>> parallel and sequence elements. There is a Java class called Composite
>> which extends WorkflowComponent but there is no way of telling whether
>> this Composite object used to be a sequence or a parallel element. How can
>> I force Axis to generate Java beans corresponding to those elements?
>> 
>> Any help with this would be appreciated.
>> 
>> Thanks,
>> Amy
>> 
>> 
>>
>>   <!-- root element -->
>>   <xsd:element name="perform">
>>      <xsd:complexType>
>>        <xsd:sequence>
>>          <xsd:element ref="tns:workflow"/>
>>        </xsd:sequence>
>>      </xsd:complexType>
>>    </xsd:element>
>>
>>    <!-- work flow group and component -->
>>
>>    <xsd:element name="workflow" abstract="true"
>>                 type="tns:WorkflowComponent">
>>    </xsd:element>
>>
>>    <xsd:complexType name="WorkflowComponent">
>>    </xsd:complexType>
>>
>>    <xsd:element name="parallel"
>>                 substitutionGroup="tns:workflow"
>>                 type="tns:Composite"/>
>>    <xsd:element name="sequence"
>>                 substitutionGroup="tns:workflow"
>>                 type="tns:Composite"/>
>>
>>    <xsd:complexType name="Composite">
>>      <xsd:complexContent>
>>        <xsd:extension base="tns:WorkflowComponent">
>>          <xsd:sequence>
>>            <xsd:element ref="tns:workflow" maxOccurs="unbounded"/>
>>          </xsd:sequence>
>>        </xsd:extension>
>>      </xsd:complexContent>
>>    </xsd:complexType>
>>
>>    <xsd:element name="pipeline"
>>                 substitutionGroup="tns:workflow"
>>                 type="tns:Pipeline"/>
>>
>>    <xsd:complexType name="Pipeline">
>>      <xsd:complexContent>
>>        <xsd:extension base="tns:WorkflowComponent">
>>          <xsd:sequence>
>>            <xsd:element ref="tns:activity" minOccurs="1"
>>                                            maxOccurs="unbounded"/>
>>          </xsd:sequence>
>>        </xsd:extension>
>>      </xsd:complexContent>
>>    </xsd:complexType>
>>
>>    <xsd:element name="activity">
>>       <!-- some definitions here ... -->
>>    </xsd:element>
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
>> For additional commands, e-mail: axis-user-help@ws.apache.org
>> 
>> 
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>





--
   ------------------------------------------------------------
  | Dr Amy Krause                      Applications Consultant |
  |                        |epcc|, The University of Edinburgh |
  |     King's Buildings, Mayfield Road, Edinburgh EH9 3JZ, UK |
  | Tel: +44 (0)131 650 6718 --- email: a.krause@epcc.ed.ac.uk |
   ------------------------------------------------------------

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Deserializing substitutionGroup and abstract types

Posted by Jeff Greif <jg...@alumni.princeton.edu>.
Abstract types and substitution groups seem not to be well supported
in most web service machinery.  Even if you find a supporting
platform, there may be interoperability problems if clients use other
platforms.  You might have an easier time getting something like this
to work:

<element name="sequence" type="tns:Workflow"/>
<element name="parallel" type="tns:Workflow"/>
<element name="pipeline" type="tns:Pipeline"/>

<complexType name="Workflow">
   <choice maxOccurs="unbounded">
      <element ref="sequence"/>
      <element ref="parallel"/>
      <element ref="pipeline"/>
    </choice>
</complexType>

<complexType name="Pipeline">
   ...
</complexType>

Jeff

On 1/29/07, Amy Krause <am...@epcc.ed.ac.uk> wrote:
> Hi,
>
> I'm having a very similar problem as described here:
> http://marc.theaimsgroup.com/?l=axis-user&m=113819830006177&w=2
>
> My schema is included below.
> I'm trying to implement a composite pattern. There are three types derived
> from an abstract type as follows:
>
>          Workflow (abstract)
>         /         |        \
>     Parallel   Sequence  Pipeline
>
> Both parallel and sequence elements must contain nested Workflow elements
> (one or more of parallel, sequence or pipeline), whereas pipeline elements
> cannot - they form the leaves of the workflow tree.
> An example of a document would be:
>
> <perform>
>    <sequence>
>      <parallel>
>        <pipeline> ... </pipeline>
>        <pipeline> ... </pipeline>
>      </parallel>
>      <pipeline> ... </pipeline>
>    </sequence>
> <perform>
>
> In the schema I've defined an abstract Workflow element and elements
> parallel, sequence and pipeline. These are substitution elements for the
> Workflow element.
> When I generate Java beans with WSDL2Java there is no trace of the
> parallel and sequence elements. There is a Java class called Composite
> which extends WorkflowComponent but there is no way of telling whether
> this Composite object used to be a sequence or a parallel element. How can
> I force Axis to generate Java beans corresponding to those elements?
>
> Any help with this would be appreciated.
>
> Thanks,
> Amy
>
>
>
>   <!-- root element -->
>   <xsd:element name="perform">
>      <xsd:complexType>
>        <xsd:sequence>
>          <xsd:element ref="tns:workflow"/>
>        </xsd:sequence>
>      </xsd:complexType>
>    </xsd:element>
>
>    <!-- work flow group and component -->
>
>    <xsd:element name="workflow" abstract="true"
>                 type="tns:WorkflowComponent">
>    </xsd:element>
>
>    <xsd:complexType name="WorkflowComponent">
>    </xsd:complexType>
>
>    <xsd:element name="parallel"
>                 substitutionGroup="tns:workflow"
>                 type="tns:Composite"/>
>    <xsd:element name="sequence"
>                 substitutionGroup="tns:workflow"
>                 type="tns:Composite"/>
>
>    <xsd:complexType name="Composite">
>      <xsd:complexContent>
>        <xsd:extension base="tns:WorkflowComponent">
>          <xsd:sequence>
>            <xsd:element ref="tns:workflow" maxOccurs="unbounded"/>
>          </xsd:sequence>
>        </xsd:extension>
>      </xsd:complexContent>
>    </xsd:complexType>
>
>    <xsd:element name="pipeline"
>                 substitutionGroup="tns:workflow"
>                 type="tns:Pipeline"/>
>
>    <xsd:complexType name="Pipeline">
>      <xsd:complexContent>
>        <xsd:extension base="tns:WorkflowComponent">
>          <xsd:sequence>
>            <xsd:element ref="tns:activity" minOccurs="1"
>                                            maxOccurs="unbounded"/>
>          </xsd:sequence>
>        </xsd:extension>
>      </xsd:complexContent>
>    </xsd:complexType>
>
>    <xsd:element name="activity">
>       <!-- some definitions here ... -->
>    </xsd:element>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org