Uploaded image for project: 'XMLBeans'
  1. XMLBeans
  2. XMLBEANS-339

Wrong handling for IdentityConstraint for key <selector xpath=".">

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • Version 2.3
    • None
    • XmlObject
    • None
    • Windows2000 on PC.

    Description

      This problem existed in 2.2.0 and 2.3.0. When I create a key and keyref in schema like
      <xsd:element name="root">
      <xsd:complexType>
      <xsd:sequence minOccurs="1" maxOccurs="1">
      <xsd:element name="AAA" type="myAAA"/>
      <xsd:element name="BBB" type="myBBB"/>
      <xsd:element name="CCC" type="xsd:string"/>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:string" use="required"/>
      </xsd:complexType>
      <xsd:keyref name="myIdref" refer="myId">
      <xsd:selector xpath="."/>
      <xsd:field xpath="@id"/>
      </xsd:keyref>
      <xsd:key name="myId">
      <xsd:selector xpath="."/>
      <xsd:field xpath="CCC"/>
      </xsd:key>
      </xsd:element>

      <xsd:complexType name="myAAA">
      <xsd:sequence minOccurs="1">
      <xsd:element name="a" minOccurs="1" maxOccurs="unbounded">
      <xsd:complexType>
      <xsd:sequence>
      <xsd:element name="DDD" type="xsd:string"/>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:NCName" use="required"/>
      </xsd:complexType>
      </xsd:element>
      </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="myBBB">
      <xsd:sequence minOccurs="1">
      <xsd:element name="b" minOccurs="1" maxOccurs="unbounded">
      <xsd:complexType>
      <xsd:attribute name="idref" type="xsd:NCName" use="required"/>
      </xsd:complexType>
      </xsd:element>
      </xsd:sequence>
      </xsd:complexType>
      </xsd:schema>

      The Xmlbeans validator will throw an exception said like "keyref can't find the key value".

      But if I use the following key and keyref definition,
      <xsd:keyref name="myIdref" refer="myId">
      <xsd:selector xpath="./CCC"/>
      <xsd:field xpath="."/>
      </xsd:keyref>
      <xsd:key name="myId">
      <xsd:selector xpath="."/>
      <xsd:field xpath="@id"/>
      </xsd:key>

      Everything works well. Being curious what happen in code, I open the code and debug it. What I found is "IdentityConstraint.java" wrongly handle the keyrefstat 'remove'. IdentityConstraint build a chain of selectorstate, fieldstat and keyrefstate. But when handling 'addKeyValues' in keyrefstat remove method, the selector has no any value at all in above first case. I can't explain why the selector can't be assigned with correct field value, but it happened as it. Therefore I think you must take care of it. The following code piece is my modification for remove method in keyrefstate.

      void remove(Event e) {
      // First check if there are any keys at the same stack level as this
      // that may contribute key values to me
      + Set _myvalues = new LinkedHashSet(); // define a values for addKeyValues to keyref
      for (ConstraintState cs = _next ; cs != null && cs != _elementStack._savePoint ; cs = cs._next)
      {
      if (cs instanceof SelectorState)
      {
      SelectorState sel = (SelectorState)cs;
      if (sel._constraint == _constraint.getReferencedKey()) {
      + if (!sel._values.isEmpty()) // if the selector has no value, I must use its field value instead.
      addKeyValues(sel._values, false);
      + else { // sometimes selector has no values, but field does have!
      + for (ConstraintState cs2 = _next; cs2 !=null && cs2 != _elementStack._savePoint ; cs2 = cs2._next) {
      + if (cs2 instanceof FieldState) { // I will find the fieldstate. If this fieldstate belongs to above selector, I will try to put the value to keyValues.
      + FieldState fie = (FieldState)cs2;
      + if (fie._selector == sel)

      { + _myvalues.add(fie._value); + }

      + }
      + }
      + }
      }
      }
      }
      + addKeyValues(_myvalues, false);

      I'm sure if this solution is OK for your project. But it seems solve my problem completely. I hope you can fix this bug as soon as possible.

      /zhi

      Attachments

        Activity

          People

            Unassigned Unassigned
            zhi jackychang
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated: