The XMLBeans
representation of a collection (for something with a maxOccurs GT 1) is a bit
limiting... I'm looking to extend it to look more like a Map interface... and
I'm hitting some brick walls...
For discussion sake,
I'll use a structure with three fields:
struct
foo
{
int ID;
String name;
HashMap metadata;
}
The 'metadata' field
contains arbitrary name/value pairs - for simplicity we'll say 'name' and
'value' fields in the hashmap are always strings...
The obvious (to me,
at least) schema for this is something like:
<xs:complexType
name="NVP">
<xs:sequence>
<xs:element name="Value" type="xs:string"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string"/>
</xs:complexType>
<xs:sequence>
<xs:element name="Value" type="xs:string"/>
</xs:sequence>
<xs:attribute name="Name" type="xs:string"/>
</xs:complexType>
<xs:complexType
name="NVPCollection">
<xs:sequence>
<xs:element name="Entry" type="my:NVP" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:sequence>
<xs:element name="Entry" type="my:NVP" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType
name="testCase">
<xs:sequence>
<xs:element name="ID" type="xs:int"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="metadata" type="my:NVPCollection"/>
</xs:sequence>
</xs:complexType>
====
I could build
another layer on top of this, but this could get ugly - What I really
need is a way to extend NVPCollection so I can address items by name (like in a
HashMap) rather than by position...
The ideal would be
something like (assuming that we have a mechanism to bind the 'name' field to
the map key and the 'value' field to be the one of
interest)...
NVPCollection
thisCollection;
// some magic here
to get the collection populated...
someValue =
thisCollection.GetByMap("someArbitraryName");
.... Or we could
save some binding complexity by doing ...GetByMap("someArbitraryName","value"),
saying "get the field 'value' from the collection member whose key
field contains 'someArbitraryName'" (The presumption is that the binding to
the key field 'name' would need to be established earlier so the map can be
maintained)
====
As I read the
documentation, I could build an extension like this, but I'm hosed if I want to
do anything more sophisticated than a linear search through the collection on
each 'get' call - Unless I'm missing something, I need a place to put an
instance-specific HashMap object to maintain mapping between the key field
('name') and the array index... more than a little difficult with the 'static
method' requirement for the extension (Not to mention the population
problem for the HashMap object itself, but a preSet or postSet implementation
would work as long as I never try to delete anything)..
Presumably I could
also build an 'extendedNVPCollection' class, based on the NVPCollection class
generated by XMLBeans, but how would I wire that back into my
(XMLBeans-generated) 'testCase' class? I don't want to get into creating
wrapper classes for every layer...
I tried ignoring
the "don't touch - generated code" warnings and added some stuff
directly to the generated classes for the NVPCollection object, but things
started breaking - I'm not sure if the problem is a flaw in my hacking or a
fundamental problem I won't solve, so I'm seeking advice - am I tilting at
windmills here?
Does anyone have ideas as to
better ways to do this?
=======================================================
Tim Parker
Senior
Developer
PaperThin, Inc.
617-471-4440 x 203
[EMAIL PROTECTED]
www.paperthin.com
===================
PaperThin, Inc. was recently named to KMWorld’s “100
Companies that Matter in Knowledge Management”.
Find out more at www.paperthin.com.