Wrong handling for IdentityConstraint for key <selector xpath=".">
------------------------------------------------------------------
Key: XMLBEANS-339
URL: https://issues.apache.org/jira/browse/XMLBEANS-339
Project: XMLBeans
Issue Type: Bug
Components: XmlObject
Affects Versions: Version 2.3
Environment: Windows2000 on PC.
Reporter: jackychang
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
--
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]