method name conflicts in beans extensions (re JIRA #265)

2006-04-20 Thread Tim Parker



I wrote this up a 
week or so ago and nobody seems to have had the time to look at 
it..

The problem is that 
scomp seems to be ignoring which class extensions belong to, resulting in the 
unreasonable requirement that all extension methods must have globally unique 
names- or that beans with extensions can't get built together if you want 
to avoid the globally-unique-name constraint.

Am I missing 
something?
=== 
Tim Parker Senior 
Developer PaperThin, Inc. 617-471-4440 x 203 [EMAIL PROTECTED] www.paperthin.com 
=== 
PaperThin, Inc. was recently named to KMWorlds 100 
Companies that Matter in Knowledge Management. 
Find out more at www.paperthin.com.



RE: XMLBookmark question...

2006-03-29 Thread Tim Parker



Are there any examples of XMLBookmark usage?? I don't 
seem to be able to get back a bookmark I set, and I'm having trouble seeing what 
I'm doing wrong...

I've created an extension 'getSomething()' for an 
XMLBeans-derived collection type, and I'm trying to use a bookmark to associate 
a HashMap object with the collection - but when I create a cursor and set a 
bookmark, I don't get the bookmark back when I try to get it.. And... I've 
been unable to find examples anywhere which illustrate a working 
case...

My extension function is currently...

 public static String getSomething(XmlObject 
xo) { NVPCollection coll = 
(NVPCollection)xo; XmlCursor tmpCursor = 
coll.newCursor(); NVPBookmark foo = new 
NVPBookmark(); NVPBookmark bmk;

 ArrayList fubar = new 
ArrayList();

 bmk = 
(NVPBookmark)tmpCursor.getBookmark(NVPBookmark.class);

 String rval;

 if (bmk == null) 
{tmpCursor.setBookmark(bmk);rval 
= "created new bookmark:"; } 
elserval = "already had a 
bookmark:";

 
tmpCursor.getAllBookmarkRefs(fubar);

 tmpCursor.dispose();// make sure 
we don't leak...

 return rval + 
String.valueOf(fubar.size());

 }
And the bookmark class is just a 
shell...

public class NVPBookmark extends 
XmlCursor.XmlBookmark{ private HashMap nameMap = new 
HashMap();

 public HashMap getMap() 
{ return nameMap; }}



From: Cezar Andrei [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, March 29, 2006 1:20 PMTo: 
user@xmlbeans.apache.orgSubject: RE: XMLBookmark 
question...


The rule is to call 
xmlCursor.dispose() after you finished the work with a cursor. 


Cezar 







From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 4:00 
PMTo: 
user@xmlbeans.apache.orgSubject: XMLBookmark 
question...

As a follow-on to the 
HashMap implementation questions... I feel like I may be missing something 
but... I'm looking at creating an extension methodfor my NVPCollection 
class something like:

public String 
getValueByMap(String keyName)

If I hang the hashmap 
on a bookmark, how do I get the bookmark without having to do a newCursor() 
every time? Or is it OK to run newCursor() dozens or hundreds of times 
without risk of performance or memory problems? Am I missing 
something?

Tim






From: Cezar 
Andrei [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 4:33 
PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??
That is a good article 
to read, also check out the tests under 
test\cases\xbean\extensions.

Cezar






From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 3:08 
PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??

Thank you for the quick 
reply - I'll look into the XMLBookmark idea...

Is there anything else 
I need to know about the preSet and postSet methods? I found documentation 
(including the operationType values) at http://dev2dev.bea.com/pub/a/2004/11/Configuring_XMLBeans.html- 
is this the latest-and-greatest, or is there a better and/or more current 
reference available?

Tim




From: Cezar 
Andrei [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 2:29 
PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??
Tim,

I would recommend using 
the extensions, otherwise modifying the generated code is definitely possible 
but missing even a small thing would break the 
code.

Back to using 
extensions, if one wants to store a state he can do it by using XmlBookmark  
which stays with the xml entity even if moved. In your case the hash map should 
be stored on metadata element.
Also the pre/post Set 
methods are called every time the document is about to change, so youll get 
calls for all creation/modification/deletion events, made through XmlObject 
interfaces. Modification through other interfaces like XmlCursor or DOM will not 
trigger the calls to the pre/post Set methods.

Cezar






From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 1:11 
PMTo: 
user@xmlbeans.apache.orgSubject: alternate representations of 
collections in XMLBeans??


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:sequencexs:element 
name="Value" 
type="xs:string"//xs:sequencexs:attribute 
name="Name" 
type="xs:string"//xs:complexType



xs:complexType 
name="NVPCollection"xs:sequencexs:element 
name="

RE: XMLBookmark question...

2006-03-29 Thread Tim Parker
I knew I was close :-

Thank you!

Tim 

-Original Message-
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Eric
Vasilik
Sent: Wednesday, March 29, 2006 4:26 PM
To: user@xmlbeans.apache.org
Subject: Re: XMLBookmark question...

Where you call setBookmark:

if (bmk == null)
{
   tmpCursor.setBookmark(bmk);
   rval = created new bookmark:;
}
else

You are always passing a null bookmark, which is a no-op.

- Eric

On 3/29/06, Tim Parker [EMAIL PROTECTED] wrote:

 Are there any examples of XMLBookmark usage??  I don't seem to be able

 to get back a bookmark I set, and I'm having trouble seeing what I'm 
 doing wrong...

 I've created an extension 'getSomething()' for an XMLBeans-derived 
 collection type, and I'm trying to use a bookmark to associate a 
 HashMap object with the collection - but when I create a cursor and 
 set a bookmark, I don't get the bookmark back when I try to get it..  
 And... I've been unable to find examples anywhere which illustrate a
working case...

 My extension function is currently...

   public static String getSomething(XmlObject xo)
   {
 NVPCollection coll = (NVPCollection)xo;
 XmlCursor tmpCursor = coll.newCursor();
 NVPBookmark foo = new NVPBookmark();
 NVPBookmark bmk;

 ArrayList fubar = new ArrayList();

 bmk =
 (NVPBookmark)tmpCursor.getBookmark(NVPBookmark.class);

 String rval;

 if (bmk == null)
 {
 tmpCursor.setBookmark(bmk);
 rval = created new bookmark:;
 }
 else
 rval = already had a bookmark:;

 tmpCursor.getAllBookmarkRefs(fubar);

 tmpCursor.dispose(); // make sure we don't leak...

 return rval + String.valueOf(fubar.size());

   }
 And the bookmark class is just a shell...

 public class NVPBookmark extends XmlCursor.XmlBookmark {
   private HashMap nameMap = new HashMap();

   public HashMap getMap()
   {
 return nameMap;
   }
 }

 

 From: Cezar Andrei [mailto:[EMAIL PROTECTED]
 Sent: Wednesday, March 29, 2006 1:20 PM

 To: user@xmlbeans.apache.org
 Subject: RE: XMLBookmark question...

 From: Cezar Andrei [mailto:[EMAIL PROTECTED]
 Sent: Wednesday, March 29, 2006 1:20 PM

 To: user@xmlbeans.apache.org
 Subject: RE: XMLBookmark question...




 The rule is to call xmlCursor.dispose() after you finished the work 
 with a cursor.



 Cezar



 


 From: Tim Parker [mailto:[EMAIL PROTECTED]
 Sent: Tuesday, March 28, 2006 4:00 PM
 To: user@xmlbeans.apache.org
 Subject: XMLBookmark question...



 As a follow-on to the HashMap implementation questions...  I feel like

 I may be missing something but... I'm looking at creating an extension

 method for my NVPCollection class something like:



 public String getValueByMap(String keyName)



 If I hang the hashmap on a bookmark, how do I get the bookmark without

 having to do a newCursor() every time?  Or is it OK to run newCursor()

 dozens or hundreds of times without risk of performance or memory
problems?
 Am I missing something?



 Tim






 


 From: Cezar Andrei [mailto:[EMAIL PROTECTED]
 Sent: Tuesday, March 28, 2006 4:33 PM
 To: user@xmlbeans.apache.org
 Subject: RE: alternate representations of collections in XMLBeans??

 That is a good article to read, also check out the tests under 
 test\cases\xbean\extensions.



 Cezar



 


 From: Tim Parker [mailto:[EMAIL PROTECTED]
 Sent: Tuesday, March 28, 2006 3:08 PM
 To: user@xmlbeans.apache.org
 Subject: RE: alternate representations of collections in XMLBeans??



 Thank you for the quick reply - I'll look into the XMLBookmark idea...



 Is there anything else I need to know about the preSet and postSet
methods?
 I found documentation (including the operationType values) at 
 http://dev2dev.bea.com/pub/a/2004/11/Configuring_XMLBeans.html
 - is this the latest-and-greatest, or is there a better and/or more 
 current reference available?



 Tim


 


 From: Cezar Andrei [mailto:[EMAIL PROTECTED]
 Sent: Tuesday, March 28, 2006 2:29 PM
 To: user@xmlbeans.apache.org
 Subject: RE: alternate representations of collections in XMLBeans??

 Tim,



 I would recommend using the extensions, otherwise modifying the 
 generated code is definitely possible but missing even a small thing 
 would break the code.



 Back to using extensions, if one wants to store a state he can do it 
 by using XmlBookmark - which stays with the xml entity even if moved. 
 In your case the hash map should be stored on 'metadata' element.

 Also the pre/post Set methods are called every time the document is 
 about to change, so you'll get calls for all 
 creation/modification/deletion events, made through XmlObject 
 interfaces. Modification through other interfaces like XmlCursor or 
 DOM will not trigger the calls to the pre/post Set methods.



 Cezar



 


 From: Tim

RE: alternate representations of collections in XMLBeans??

2006-03-28 Thread Tim Parker



Thank you for the quick reply - I'll look into the 
XMLBookmark idea...

Is there anything else I need to know about the preSet and 
postSet methods? I found documentation (including the operationType 
values) at http://dev2dev.bea.com/pub/a/2004/11/Configuring_XMLBeans.html- 
is this the latest-and-greatest, or is there a better and/or more current 
reference available?

Tim


From: Cezar Andrei [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, March 28, 2006 2:29 PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??


Tim,

I would recommend using 
the extensions, otherwise modifying the generated code is definitely possible 
but missing even a small thing would break the 
code.

Back to using 
extensions, if one wants to store a state he can do it by using XmlBookmark  
which stays with the xml entity even if moved. In your case the hash map should 
be stored on metadata element.
Also the pre/post Set 
methods are called every time the document is about to change, so youll get 
calls for all creation/modification/deletion events, made through XmlObject 
interfaces. Modification through other interfaces like XmlCursor or DOM will not 
trigger the calls to the pre/post Set methods.

Cezar






From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 1:11 
PMTo: 
user@xmlbeans.apache.orgSubject: alternate representations of 
collections in XMLBeans??


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:sequencexs:element 
name="Value" 
type="xs:string"//xs:sequencexs:attribute 
name="Name" 
type="xs:string"//xs:complexType



xs:complexType 
name="NVPCollection"xs:sequencexs: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, butthis 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 fieldcontains 
'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" warningsand 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, In

XMLBookmark question...

2006-03-28 Thread Tim Parker



As a follow-on to the HashMap implementation 
questions... I feel like I may be missing something but... I'm looking at 
creating an extension methodfor my NVPCollection class something 
like:

public String getValueByMap(String 
keyName)

If I hang the hashmap on a bookmark, how do I get the 
bookmark without having to do a newCursor() every time? Or is it OK to run 
newCursor() dozens or hundreds of times without risk of performance or memory 
problems? Am I missing something?

Tim




From: Cezar Andrei [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, March 28, 2006 4:33 PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??


That is a good article 
to read, also check out the tests under 
test\cases\xbean\extensions.

Cezar






From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 3:08 
PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??

Thank you for the quick 
reply - I'll look into the XMLBookmark idea...

Is there anything else 
I need to know about the preSet and postSet methods? I found documentation 
(including the operationType values) at http://dev2dev.bea.com/pub/a/2004/11/Configuring_XMLBeans.html- 
is this the latest-and-greatest, or is there a better and/or more current 
reference available?

Tim




From: Cezar 
Andrei [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 2:29 
PMTo: 
user@xmlbeans.apache.orgSubject: RE: alternate representations of 
collections in XMLBeans??
Tim,

I would recommend using 
the extensions, otherwise modifying the generated code is definitely possible 
but missing even a small thing would break the 
code.

Back to using 
extensions, if one wants to store a state he can do it by using XmlBookmark  
which stays with the xml entity even if moved. In your case the hash map should 
be stored on metadata element.
Also the pre/post Set 
methods are called every time the document is about to change, so youll get 
calls for all creation/modification/deletion events, made through XmlObject 
interfaces. Modification through other interfaces like XmlCursor or DOM will not 
trigger the calls to the pre/post Set methods.

Cezar






From: Tim 
Parker [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 28, 2006 1:11 
PMTo: 
user@xmlbeans.apache.orgSubject: alternate representations of 
collections in XMLBeans??


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:sequencexs:element 
name="Value" 
type="xs:string"//xs:sequencexs:attribute 
name="Name" 
type="xs:string"//xs:complexType



xs:complexType 
name="NVPCollection"xs:sequencexs: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, butthis 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 fieldcontains 
'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' requireme