Okay thanks.
 
My lack of understanding is what is being stored internally. I assumed it
was object pointers i.e doing a setXXX and then a getXXX would return the
same XXX object.
 
Thanks for clearing that up.

  _____  

From: Jacob Danner [mailto:[EMAIL PROTECTED] 
Sent: 12 January 2008 02:19
To: [email protected]
Subject: Re: [newbie] difference between addNew and (Factory.newInstance +
set)


Hi Paul,
This is actually working as expected :) I just spaced and missed it the
first time around.

try something like:

BusinessDescription.Contact contact =
BusinessDescription.Contact.Factory.newInstance();
contact.setAddress(address);
businessDescription.setContact (contact);

Its the difference between copy and reference in java.
A simpler example:
String a = "1";
String b = a;

//b actually has the same memory address as a

a = "2";
// the memory address for a and b are now different

The same is happening in your use of the API.
businessDescription.setContact(contact) does not maintain the reference to
the contact object once it changes because it is now a 'new' object. 
The addNewXXX() works differently. If you take a peek at the java source
(scomp -src <dir> yourXSDs) things should get a little clearer :)

Hope this helps,
-jacobd





On Jan 11, 2008 2:11 PM, Paul French <[EMAIL PROTECTED]> wrote:


Thanks for the reply I really appreciate your help.
 
I understand what you say about the
BusinessDescription.Contact.Factory.newInstance() creating an unassociated
contact. Hence I assume you can associate it to a BusinessDescription
instance by calling
 
businessDescription.setContact(contact)
 
Now if I add additional properties to the contact e.g contact.setXXXX they
cannot be seen by calling
 
businessDescription.getContact().getXXXX 
 
The schemas are public ones so I have attached them. Look at the
BusinessDescription_v3_1.xsd schema. I looked at sending a small snippet but
couldn't see how....
 
Have a good weekend!!
 


  _____  


From: Jacob Danner [mailto:[EMAIL PROTECTED] 

Sent: 11 January 2008 18:56 

To: [email protected]
Subject: Re: [newbie] difference between addNew and (Factory.newInstance +
set)


Thought I should take a crack at the question in the subject line real
quick.

The differences in addNew versus newInstance is that addNew is adding the
type to an existing element. The newInstance is just that, a brand new
instance, not attached to anything. 
In your case below, addNewContact() is being called on the
BusinesDescription Class, which adds a new ContactType to the
BusinessDescription

BusinessDescription.Contact contact = businessDescription.addNewContact();

In the Factory.newInstance 

BusinessDescription.Contact contact =
BusinessDescription.Contact.Factory.newInstance();
a new Type is create that is NOT associated with the BusinessDescription
element that 'encloses/wraps' the contact type in the schema.In schema-ish
terms, the contact type is local to the BusinessDescription element. 
When contact is used like it is above, it will be wrapped by <xml-fragment
/> because it is not associated with an element.

In simple terms, thats how I know those API to work, and the differences
between them. 

The addNewXXX() methods exist because of the way the schema is defined, so
not all the schemas you may work with will have this structure. 
Does this help you understanding?

As to why, one usage returns null and the other one does not, I'm not sure.
I'm curious how things might be defined in your XSD. Can you give us a peek
at a schema snippet? 

Thanks,
-jacobd



On Jan 11, 2008 10:23 AM, Paul French <[EMAIL PROTECTED]> wrote:


The Address has it's own type and is imported into the main schema via
another schema.
 
I did as you said:
 

BusinessDescription.Contact contact = businessDescription.addNewContact();
contact.setAddress(address);
 
contact.xmlText() or businessDescription.getContact().xmlText() gives

 
<rol:BS7666Address xmlns:rol="http://www.rol.co.uk";><bs7:AdministrativeArea
xmlns:bs7="http://www.govtalk.gov.uk/people/bs7666";
<http://www.govtalk.gov.uk/people/bs7666%22%3ETEST%3C/bs7:AdministrativeArea
%3E%3C/rol:BS7666Address> >TEST</bs7:AdministrativeArea></rol:BS7666Address
>

However for:
 

BusinessDescription.Contact contact =
BusinessDescription.Contact.Factory.newInstance();
businessDescription.setContact(contact);
contact.setAddress(address);
 
contact.xmlText() gives
 
<rol:BS7666Address xmlns:rol="http://www.rol.co.uk";><bs7:AdministrativeArea
xmlns:bs7="http://www.govtalk.gov.uk/people/bs7666";
<http://www.govtalk.gov.uk/people/bs7666%22%3ETEST%3C/bs7:AdministrativeArea
%3E%3C/rol:BS7666Address> >TEST</bs7:AdministrativeArea></rol:BS7666Address
>

 
However, businessDescription.getContact().xmlText() gives

 

<xml-fragment/>

 
I have seen the same behaviour with DateTime.
 
I was doing:
 
contact.setDateTime(Calendar.getInstance()) // line 1
contact.getDateTime().setTime(someDate); // line 2
 
If I call contact.getDateTime() now it will still hold the same date and
time set in line 1
 
 
I had to change the code to do:
 
Calendar cal = Calendar.getInstance();
cal.setTime(someDate);
contact.setDateTime(someDate);
 
I assumed this must be due to XMLBeans passing back a copy of the Calendar
object when calling contact.getDateTime()
 
 
 
 


  _____  

From: Jacob Danner [mailto:[EMAIL PROTECTED] 
Sent: 11 January 2008 17:52
To: [email protected]
Subject: Re: [newbie] difference between addNew and (Factory.newInstance +
set)


Hi Paul,
Can you do a 
System.out.println(contact.xmlText());  
in each of the scenarios below?
How is Address defined in the schema?
Thanks,
-jacobd


On Jan 11, 2008 9:29 AM, Paul French < [EMAIL PROTECTED]> wrote:


Hello,
 
I have created a library using scomp from an xml schema.
 
I am building a XML document using this library. I have come across some
behaviour I do not understand. For this example a BusinessDescription may
have a Contact and a Contact may have an Address.
 
 
If I do the following:
 
BusinessDescription.Contact contact = businessDescription.addNewContact();
contact.setAddress(address);
 
if (businessDescription.getContact().getAddress() != null)
{
    System.out.println("Address is not null");
}
else
{

    System.out.println("Address is null");
}
 
My code prints out "Address is not null" as expected
 
 
However If I do the following:
 
BusinessDescription.Contact contact =
BusinessDescription.Contact.Factory.newInstance();
businessDescription.setContact(contact);
contact.setAddress(address);
 


if (businessDescription.getContact().getAddress() != null)
{
    System.out.println("Address is not null");
}
else
{

    System.out.println("Address is null");
}
 

My code prints out "Address is null".
 
For some reason setting the address on the contact object after the contact
object is set on the businessDescription is ignored. XMLBeans must be
cloning objects internally?? This behaviour is unintuitive to me? Can
someone explain.
 
Thanks




-- 
I'm competing in a Half-Ironman distance triathlon to raise money for the
fight against cancer!
Please help support my efforts by going to:
http://www.active.com/donate/tntwaak/jacobd 




-- 
I'm competing in a Half-Ironman distance triathlon to raise money for the
fight against cancer!
Please help support my efforts by going to:
http://www.active.com/donate/tntwaak/jacobd 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





-- 
I'm competing in a Half-Ironman distance triathlon to raise money for the
fight against cancer! 
Please help support my efforts by going to:
http://www.active.com/donate/tntwaak/jacobd 

Reply via email to