[xsde-users] Serialization crashes for data model constructed from multiple xsd files

Nikita Visnevski nikita_visnevski at hotmail.com
Mon Jun 18 16:31:19 EDT 2012






I am experiencing a strange crash in the serialization that I am attributing to the fact that my data model is defined in 2 separate xsd files.  My first file <SignalManipulationModel.xsd> contains a set of object definitions which is used by multiple other xsd files.  My second file <SignalOperationModel.xsd> includes the first to define some additional data structures and a root element.  I have an xml file that is constructed using objects in the second schema file.  I am trying to parse this xml file, inspect the resulting data model, and then serialize it back to the screen.  Parsing works flawlessly and inspection of the data model shows that all the data is in order.  When I attempt serialization, I get a hard crash with unhandled exception - access violation.  The crash happens in <elements.ixx> in the serializer_base::_set_type method.

If I move all the definitions to a single xsd file, the problem goes away.  This is a little help to me since these schema files will eventually be auto-generated from a third party software, and I cannot force it to only use 1 xsd file.  I am attaching the schema files, the xml file and the c++ code segment that illustrates the problem.  Any idea is much appreciated.

Nikita

1. Here is the driver c++ code:

#include "SignalManipulationModel.hxx"
#include "SignalManipulationModel-pimpl.hxx"
#include "SignalManipulationModel-pskel.hxx"
#include "SignalManipulationModel-simpl.hxx"
#include "SignalManipulationModel-sskel.hxx"
#include "SignalOperationModel.hxx"
#include "SignalOperationModel-pimpl.hxx"
#include "SignalOperationModel-pskel.hxx"
#include "SignalOperationModel-simpl.hxx"
#include "SignalOperationModel-sskel.hxx"

using namespace Simulation::AeroSim::SignalManipulationModel;
using namespace Simulation::AeroSim::SignalOperationModel;

...

        // Parsing XML to object model
        SignalOperationList_paggr   sol_p;
        xml_schema::document_pimpl doc_p (sol_p.root_parser (), sol_p.root_namespace (), sol_p.root_name (), true);

        sol_p.pre ();
        doc_p.parse (fileName);
        std::auto_ptr<SignalOperationList> sol (sol_p.post ());

        // Inspecting content
        for(SignalOperationList::operation_iterator i = sol->operation().begin(); i != sol->operation().end(); i++) {
            SignalOperation&        so  = *i;
            OperationDescriptor&    sod = so.operationDesc();
            ActionDescriptor&       ad  = so.actionDesc();

            cout << so.signalID() << endl;
            if (SignalAlterationDescriptor* sad = dynamic_cast<SignalAlterationDescriptor*>(&sod)) {
                cout << "Signal alteration operation"                               << endl;
                cout << "Fault activation Cmd   : " << sad->faultActivationCmd()    << endl;
                cout << "Bias activation Cmd    : " << sad->biasActivationCmd()     << endl;
                cout << "Noise activation Cmd   : " << sad->noiseActivationCmd()    << endl;
                AlterationConfigContainer& acc  = sad->configContainer();
                cout << "Fault value            : " << acc.faultValue()             << endl;
                cout << "Fault ramp time        : " << acc.faultRampTime()          << endl;
                cout << "Bias value             : " << acc.biasValue()              << endl;
                cout << "Bias ramp time         : " << acc.biasRampTime()           << endl;
                cout << "Noise STD              : " << acc.noiseSTD()               << endl;
            } else if (SignalLoggingDescriptor* sld = dynamic_cast<SignalLoggingDescriptor*>(&sod)) {
                cout << "Signal logging operation"                                  << endl;
                cout << "Logging activation Cmd : " << sld->logActivationCmd()      << endl;
                LoggingConfigContainer&     lcc = sld->configContainer();
                cout << "Log sampling           : " << lcc.logSampling()            << endl;
            } else if (SignalTriggerDescriptor* std = dynamic_cast<SignalTriggerDescriptor*>(&sod)) {
                cout << "Signal triggering operation"                               << endl;
                cout << "Trigger activation Cmd : " << std->triggerActivationCmd()  << endl;
                TriggeringConfigContainer&  tcc = std->configContainer();
                cout << "Reference value        : " << tcc.referenceValue()         << endl;
                cout << "Trigger type           : " << tcc.triggerType()            << endl;
            }
            if (ImmediateAction*    ia  = dynamic_cast<ImmediateAction*>(&ad)) {
                cout << "Immediate action" << endl;
            } else if (TimedAction*    ta  = dynamic_cast<TimedAction*>(&ad)) {
                cout << "Timed action"                                              << endl;
                cout << "Is relative            : " << ta->relative()               << endl;
                cout << "Time                   : " << ta->relative()               << endl;
            } else if (TriggeredAction*    tra  = dynamic_cast<TriggeredAction*>(&ad)) {
                cout << "Triggered action"                                          << endl;
                cout << "Trigger list           : ";
                TriggeredAction::triggerList_sequence&  tls = tra->triggerList();
                for (TriggeredAction::triggerList_iterator j = tls.begin(); j != tls.end(); j++ ) {
                    cout << *j << "";
                }
                cout << endl;
            }
        }

        // Serializing the object model
        SignalOperationList_saggr   sol_s;

        xml_schema::document_simpl doc_s (sol_s.root_serializer (), sol_s.root_namespace(), sol_s.root_name (), true);
        sol_s.pre (*sol);
        doc_s.serialize (cout, xml_schema::document_simpl::pretty_print);
        sol_s.post ();

2. Here is my xml file.  

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:SignalOperationList
    xmlns:ns2="http://www.aurora.aero/Simulation/AeroSim/SignalManipulationModel">
    <operation signalID="Signal4">
        <operationDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:SignalTriggerDescriptor" type="VALUE_TRIGGERING">
            <configContainer triggerType="LESS_THAN_OR_EQUAL"
                referenceValue="5.5" />
            <triggerActivationCmd>ACTIVATE</triggerActivationCmd>
        </operationDesc>
        <actionDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:TimedAction" time="5.0" relative="true" type="TIME_BASED" />
    </operation>
    <operation signalID="Signal1">
        <operationDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:SignalAlterationDescriptor" type="VALUE_ALTERATION">
            <configContainer noiseSTD="0.0" biasRampTime="0.0"
                biasValue="0.0" faultRampTime="0.0" faultValue="10.0" />
            <faultActivationCmd>ACTIVATE</faultActivationCmd>
            <biasActivationCmd>ACTIVATE_DEFAULT</biasActivationCmd>
            <noiseActivationCmd>ACTIVATE_DEFAULT</noiseActivationCmd>
        </operationDesc>
        <actionDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:ImmediateAction" type="IMMEDIATE" />
    </operation>
    <operation signalID="Signal1">
        <operationDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:SignalAlterationDescriptor" type="VALUE_ALTERATION">
            <configContainer noiseSTD="0.0" biasRampTime="0.0"
                biasValue="0.0" faultRampTime="0.0" faultValue="0.0" />
            <faultActivationCmd>CLEAR</faultActivationCmd>
            <biasActivationCmd>ACTIVATE_DEFAULT</biasActivationCmd>
            <noiseActivationCmd>ACTIVATE_DEFAULT</noiseActivationCmd>
        </operationDesc>
        <actionDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:TimedAction" time="10.0" relative="false" type="TIME_BASED" />
    </operation>
    <operation signalID="Signal2">
        <operationDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:SignalAlterationDescriptor" type="VALUE_ALTERATION">
            <configContainer noiseSTD="0.0" biasRampTime="10.0"
                biasValue="5.0" faultRampTime="0.0" faultValue="0.0" />
            <faultActivationCmd>ACTIVATE_DEFAULT</faultActivationCmd>
            <biasActivationCmd>ACTIVATE</biasActivationCmd>
            <noiseActivationCmd>ACTIVATE_DEFAULT</noiseActivationCmd>
        </operationDesc>
        <actionDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:TimedAction" time="15.0" relative="false" type="TIME_BASED" />
    </operation>
    <operation signalID="Signal3">
        <operationDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:SignalLoggingDescriptor" type="VALUE_LOGGING">
            <configContainer logSampling="1.0" />
            <logActivationCmd>ACTIVATE</logActivationCmd>
        </operationDesc>
        <actionDesc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:type="ns2:TriggeredAction" type="EVENT_BASED">
            <triggerList>Signal4</triggerList>
        </actionDesc>
    </operation>
</ns2:SignalOperationList>

3. Here is <SignalOperationModel.xsd>

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.aurora.aero/Simulation/AeroSim/SignalOperationModel" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:smdm="http://www.aurora.aero/Simulation/AeroSim/SignalManipulationModel" xmlns:sodm="http://www.aurora.aero/Simulation/AeroSim/SignalOperationModel">
   <xsd:import namespace="http://www.aurora.aero/Simulation/AeroSim/SignalManipulationModel" schemaLocation="SignalManipulationModel.xsd" />
    <xsd:complexType name="SignalOperation">
      <xsd:complexContent>
        <xsd:extension base="smdm:AbstractBase">
                <xsd:sequence>
                    <xsd:element name="operationDesc" type="smdm:OperationDescriptor"></xsd:element>
                    <xsd:element name="actionDesc" type="smdm:ActionDescriptor"></xsd:element>
                </xsd:sequence>
            </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="SignalOperationList">
        <xsd:sequence>
            <xsd:element name="operation" type="sodm:SignalOperation" minOccurs="0" maxOccurs="unbounded"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    
    <xsd:element name="SignalOperationList" type="sodm:SignalOperationList"></xsd:element>
</xsd:schema>


4. Here is the <SignalManipulationModel.xsd> ( a little big, but really quite simple)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.aurora.aero/Simulation/AeroSim/SignalManipulationModel" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:smdm="http://www.aurora.aero/Simulation/AeroSim/SignalManipulationModel">
    <xsd:simpleType name="ActionType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="IMMEDIATE"></xsd:enumeration>
            <xsd:enumeration value="TIME_BASED"></xsd:enumeration>
            <xsd:enumeration value="EVENT_BASED"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="ActivationCmdType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="ACTIVATE_DEFAULT"></xsd:enumeration>
            <xsd:enumeration value="ACTIVATE"></xsd:enumeration>
            <xsd:enumeration value="CLEAR_DEFAULT"></xsd:enumeration>
            <xsd:enumeration value="CLEAR"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="OperationType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="VALUE_ALTERATION"></xsd:enumeration>
            <xsd:enumeration value="VALUE_LOGGING"></xsd:enumeration>
            <xsd:enumeration value="VALUE_TRIGGERING"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="TriggerType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="LESS_THAN"></xsd:enumeration>
            <xsd:enumeration value="LESS_THAN_OR_EQUAL"></xsd:enumeration>
            <xsd:enumeration value="GREATER_THAN"></xsd:enumeration>
            <xsd:enumeration value="GREATER_THEN_OR_EQUAL"></xsd:enumeration>
            <xsd:enumeration value="THRESHOLD_CROSSING"></xsd:enumeration>
            <xsd:enumeration value="ABOVE_THRESHOLD"></xsd:enumeration>
            <xsd:enumeration value="BELOW_THRESHOLD"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="ActionStatusType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="OCCURED"></xsd:enumeration>
            <xsd:enumeration value="IN_PROCESS"></xsd:enumeration>
            <xsd:enumeration value="SCHEDULED"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="OperationStatusType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="DEFAULT"></xsd:enumeration>
            <xsd:enumeration value="ACTIVE"></xsd:enumeration>
            <xsd:enumeration value="CLEARED"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="AbstractBase" abstract="true">
        <xsd:attribute name="signalID" type="xsd:string" use="required"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="ActionDescriptor" abstract="true">
        <xsd:attribute name="type" type="smdm:ActionType" use="required"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="OperationDescriptor" abstract="true">
        <xsd:attribute name="type" type="smdm:OperationType" use="required"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="ImmediateAction">
        <xsd:complexContent>
            <xsd:extension base="smdm:ActionDescriptor">
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    
    <xsd:complexType name="TimedAction">
        <xsd:complexContent>
            <xsd:extension base="smdm:ActionDescriptor">
                <xsd:attribute name="relative" type="xsd:boolean"></xsd:attribute>
                <xsd:attribute name="time" type="xsd:double"></xsd:attribute>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="TriggeredAction">
        <xsd:complexContent>
            <xsd:extension base="smdm:ActionDescriptor">
                <xsd:sequence>
                    <xsd:element name="triggerList" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="AlterationConfigContainer">
        <xsd:attribute name="faultValue" type="xsd:double"></xsd:attribute>
        <xsd:attribute name="faultRampTime" type="xsd:double"></xsd:attribute>
        <xsd:attribute name="biasValue" type="xsd:double"></xsd:attribute>
        <xsd:attribute name="biasRampTime" type="xsd:double"></xsd:attribute>
        <xsd:attribute name="noiseSTD" type="xsd:double"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="LoggingConfigContainer">
        <xsd:attribute name="logSampling" type="xsd:double"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="TriggeringConfigContainer">
        <xsd:attribute name="referenceValue" type="xsd:double"></xsd:attribute>
        <xsd:attribute name="triggerType" type="smdm:TriggerType"></xsd:attribute>
    </xsd:complexType>

    <xsd:complexType name="SignalAlterationDescriptor">
        <xsd:complexContent>
            <xsd:extension base="smdm:OperationDescriptor">
                <xsd:sequence>
                    <xsd:element name="configContainer" type="smdm:AlterationConfigContainer"></xsd:element>
                    <xsd:element name="faultActivationCmd" type="smdm:ActivationCmdType"></xsd:element>
                    <xsd:element name="biasActivationCmd" type="smdm:ActivationCmdType"></xsd:element>
                    <xsd:element name="noiseActivationCmd" type="smdm:ActivationCmdType"></xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="SignalLoggingDescriptor">
        <xsd:complexContent>
            <xsd:extension base="smdm:OperationDescriptor">
                <xsd:sequence>
                    <xsd:element name="configContainer" type="smdm:LoggingConfigContainer"></xsd:element>
                    <xsd:element name="logActivationCmd" type="smdm:ActivationCmdType"></xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="SignalTriggerDescriptor">
        <xsd:complexContent>
            <xsd:extension base="smdm:OperationDescriptor">
                <xsd:sequence>
                    <xsd:element name="configContainer" type="smdm:TriggeringConfigContainer"></xsd:element>
                    <xsd:element name="triggerActivationCmd" type="smdm:ActivationCmdType"></xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="ActionListItem">
        <xsd:sequence>
            <xsd:element name="action" type="smdm:ActionDescriptor"></xsd:element>
            <xsd:element name="status" type="smdm:ActionStatusType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>








 		 	   		  


More information about the xsde-users mailing list