Hello Werner, Thanks for your response. I turned the type mode back to 'element'. However, it still didn't work for me. The issue seems to be with the handling of a sequence of subsitution group elements. XACMLClassDescriptorImpl:339 throws a ValidationException stating:
Element with name -subtype- passed to type -container- in incorrect order; It is not allowed to be the last element of this sequence! Here's a minimal XSD you asked for: ------------- <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xacml="urn:oasis:names:tc:xacml:2.0:policy:schema:os" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:oasis:names:tc:xacml:2.0:policy:schema:os" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Expression" type="xacml:ExpressionType" abstract="true"/> <xs:complexType name="ExpressionType" abstract="true"/> <xs:element name="Condition" type="xacml:ConditionType"/> <xs:complexType name="ConditionType"> <xs:sequence> <xs:element ref="xacml:Expression"/> </xs:sequence> </xs:complexType> <xs:element name="Apply" type="xacml:ApplyType" substitutionGroup="xacml:Expression"/> <xs:complexType name="ApplyType"> <xs:complexContent> <xs:extension base="xacml:ExpressionType"> <xs:sequence> <xs:element ref="xacml:Expression" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="FunctionId" type="xs:anyURI" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> ------------- Here's an input document: -------------- <Condition xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='urn:oasis:names:tc:xacml:2.0:policy:schema:os' xsi:schemaLocation='urn:oasis:names:tc:xacml: 2.0:policy:schema:os minimal.xsd'> <Apply FunctionId="urn:oasis:names:tc:xacml: 1.0:function:string-at-least-one-member-of"> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"/> <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"/> </Apply> </Condition> -------------- Here's the exception trace I get: -------------- Caused by: ValidationException: Element with name Apply passed to type Condition in incorrect order; It is not allowed to be the last element of this sequence! at org.exolab.castor.xml.util.XMLClassDescriptorImpl.checkDescriptorForCorrectOrderWithinSequence (XMLClassDescriptorImpl.java:339) at org.exolab.castor.xml.MarshalFramework$InternalXMLClassDescriptor.checkDescriptorForCorrectOrderWithinSequence (MarshalFramework.java:652) at org.exolab.castor.xml.UnmarshalHandler.startElement( UnmarshalHandler.java:1870) at org.exolab.castor.xml.UnmarshalHandler.startElement( UnmarshalHandler.java:1353) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java :709) at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java :610) at ajd.condition.Minimal.main(Minimal.java:38) --------------------- To work around, I'm currently setting the " org.exolab.castor.xml.lenient.sequence.order" property to true at runtime. With this property, I can unmarshal my document. However, I'm not sure if that's the best way to proceed. Another problem is the way substitution types are marshalled. For instance, after unmarshalling, if I marshal the input document again, this is what I get: ---- <Condition xmlns="urn:oasis:names:tc:xacml:2.0:policy:schema:os"> <Expression xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" FunctionId="urn:oasis:names:tc:xacml: 1.0:function:string-at-least-one-member-of" xsi:type="Apply"> <Expression FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag" xsi:type="Apply"/> <Expression FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag" xsi:type="Apply"/> </Expression> </Condition> ----- This isn't the same as the input. How do I get back the original document? Finally, I really appreciate your efforts for looking into this issue. Thanks again. thanks, -- ajd. On 19/12/2007, Werner Guttmann <[EMAIL PROTECTED] > wrote: > > Btw, I just noticed (re-reading parts of your message again) that you > are using 'type' mode during code generation. As far as I remember, that > will not work with substitution groups, but I am not 100% sure. Can you > please switch to 'element' mode and see whetehr that makes a difference ? > > Thanks in advance > Werner > > aldrin d'souza wrote: > > Hello, > > > > I'm facing a problem which has been discussed on this mailing list > before - > > http://www.mail-archive.com/[email protected]/msg04355.html > > > > Here is the the issue: > > > > I am using castor 1.1.2.1 <http://1.1.2.1> to generate the java classes > > that correspond to the XACML 2.0 XSD which makes use of substitution > groups. > > An element "Apply" can appear wherever an element "Expression" is > > expected. Based on the schema the following is a valid document: > > > > --------------------------------------------------- > > <PolicySet xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' > > xmlns='urn:oasis:names:tc:xacml: 2.0:policy:schema:os' > > > > xsi:schemaLocation='urn:oasis:names:tc:xacml:2.0:policy:schema:os > > http://docs.oasis-open.org/xacml/access_control-xacml-2.0-policy-schema-os.xsd > > > <http://docs.oasis-open.org/xacml/access_control-xacml-2.0-policy-schema-os.xsd > >' > > PolicySetId="policy-set" > > > > PolicyCombiningAlgId="urn:oasis:names:tc:xacml: > 1.0:policy-combining-algorithm:deny-overrides "> > > <Target/> > > <Policy PolicyId="policy" > > RuleCombiningAlgId="urn:oasis:names:tc:xacml: > > 1.0:rule-combining-algorithm:first-applicable"> > > <Target/> > > <Rule RuleId="primary-rule" Effect="Permit"> > > <Condition> > > <Apply > > FunctionId="urn:oasis:names:tc:xacml: > > 1.0:function:string-at-least-one-member-of "> > > <Apply > > FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag"> > > <AttributeValue > > DataType=" http://www.w3.org/2001/XMLSchema#string"> > > Admin > > </AttributeValue> > > <AttributeValue > > DataType=" http://www.w3.org/2001/XMLSchema#string"> > > Operator > > </AttributeValue> > > </Apply> > > <SubjectAttributeDesignator > > AttributeId="urn:oasis:names:tc:xacml: 2.0:subject:role" > > DataType="http://www.w3.org/2001/XMLSchema#string " > > SubjectCategory="urn:oasis:names:tc:xacml: > > 1.0:subject-category:access-subject" /> > > </Apply> > > </Condition> > > </Rule> > > </Policy> > > </PolicySet> > > ------------------------------------- > > > > However, when I try to unmarshal it - the code fails with the following > > exception: > > > > ------------------------------------- > > org.exolab.castor.xml.MarshalException: unable to find FieldDescriptor > > for 'Apply' in ClassDescriptor of ConditionType > > ------------------------------------- > > > > Apparently, the unmarshalling code does not seem to understand the > > substitution group. > > Based on the suggestions I found on the web I enabled the following > > options in my castorbuilder.properties file: > > > > ------------------------------------- > > org.exolab.castor.builder.automaticConflictResolution=true > > org.exolab.castor.builder.javaclassmapping=type > > ------------------------------------- > > > > However, it still doesn't work. > > Any help on this would be appreciated. > > > > thanks, > > -- > > ajd. > >

