You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by rabidgremlin <ra...@gmail.com> on 2005/10/18 01:21:52 UTC

Set vs Add methods

Hi All,

I have a curious problem. I am porting some existing code that uses another
XML binding tool. This code uses uses "set" methods to associate different
objects together. The port was thus pretty easy as there was a close
correlation between the structure of the old code and the code that uses
XmlBeans.

However when I do a test run, my XML is not being created correctly. After a
couple of tests I have determined that the order in which you do the "sets"
are important. This seems very odd to me (not to mention very fragile and
error prone).

I have a small example:

With the following XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="
http://testschema" xmlns:TestSchema="http://testschema">
<complexType name="Song">
<sequence>
<element name="Title" type="string"></element>
<element name="length" type="duration"></element>
</sequence>
</complexType>

<element name="Album">
<complexType>
<sequence>
<element name="Songs" type="TestSchema:Song" minOccurs="1"
maxOccurs="unbounded">
</element>
</sequence>
<attribute name="Title" type="string" use="required"></attribute>
<attribute name="Year" type="string" use="required"></attribute>
</complexType>
</element>
</schema>

and the following code:

import org.apache.xmlbeans.GDuration;

import testschema.AlbumDocument;
import testschema.Song;
import testschema.AlbumDocument.Album;

public class TestSchema
{

public static void main(String[] args)
{
try
{
testWithAdd();
testWithSet1();
testWithSet2();
}
catch(Exception e)
{
System.out.println("Oops -> " + e);
}
}

public static void testWithAdd()throws Exception
{
AlbumDocument doc = AlbumDocument.Factory.newInstance();

Album album = doc.addNewAlbum();
album.setTitle("FloodLand");
album.setYear("1990");

Song tempSong = album.addNewSongs();
tempSong.setTitle("Dominion/Mother Russia");
tempSong.setLength( new GDuration(1,2,4,5,10,12,15,null) );

tempSong = album.addNewSongs();
tempSong.setTitle("Flood I");
tempSong.setLength( new GDuration(1,2,2,5,10,12,15,null) );


System.out.println("Add: isValid=" + doc.validate());
System.out.println("Add: " + doc.xmlText());
}

public static void testWithSet1()throws Exception
{
AlbumDocument doc = AlbumDocument.Factory.newInstance();

Album album = Album.Factory.newInstance();
// NOTE SET HERE
doc.setAlbum(album);
album.setTitle("FloodLand");
album.setYear("1990");

Song[] songs = new Song[2];

songs[0] = Song.Factory.newInstance();
songs[0].setTitle("Dominion/Mother Russia");
songs[0].setLength( new GDuration(1,2,4,5,10,12,15,null) );

songs[1] = Song.Factory.newInstance();
songs[1].setTitle("Flood I");
songs[1].setLength( new GDuration(1,2,2,5,10,12,15,null) );

album.setSongsArray(songs);

System.out.println("Set1: isValid=" + doc.validate());
System.out.println("Set1: " + doc.xmlText());
}

public static void testWithSet2()throws Exception
{
AlbumDocument doc = AlbumDocument.Factory.newInstance();

Album album = Album.Factory.newInstance();
album.setTitle("FloodLand");
album.setYear("1990");

Song[] songs = new Song[2];

songs[0] = Song.Factory.newInstance();
songs[0].setTitle("Dominion/Mother Russia");
songs[0].setLength( new GDuration(1,2,4,5,10,12,15,null) );

songs[1] = Song.Factory.newInstance();
songs[1].setTitle("Flood I");
songs[1].setLength( new GDuration(1,2,2,5,10,12,15,null) );

album.setSongsArray(songs);
// NOTE SET HERE
doc.setAlbum(album);

System.out.println("Set2: isValid=" + doc.validate());
System.out.println("Set2: " + doc.xmlText());
}
}

I get the following results:

Add: isValid=true
Add: <tes:Album Title="FloodLand" Year="1990"
xmlns:tes="http://testschema"><Songs><Title>Dominion/Mother
Russia</Title><length>P2Y4M5DT10H12M15S</length></Songs><Songs><Title>Flood
I</Title><length>P2Y2M5DT10H12M15S</length></Songs></tes:Album>
Set1: isValid=false
Set1: <tes:Album xmlns:tes="http://testschema"/>
Set2: isValid=true
Set2: <tes:Album Title="FloodLand" Year="1990"
xmlns:tes="http://testschema"><Songs><Title>Dominion/Mother
Russia</Title><length>P2Y4M5DT10H12M15S</length></Songs><Songs><Title>Flood
I</Title><length>P2Y2M5DT10H12M15S</length></Songs></tes:Album>

Note how the output of the testWithSet1() method is not valid where as the
output of testWithSet2() is. The only difference is the placement of the "
doc.setAlbum(album);" line.

Anyone have any idea as to why this is and is there something I am not doing
?

Jonathan

Re: Set vs Add methods

Posted by rabidgremlin <ra...@gmail.com>.
Ah, that makes sense.

Was that behavior documented anywhere ? I did not see it :)

Jonathan

On 10/18/05, David Jencks <da...@yahoo.com> wrote:
>
> In order not to have side effects on its argument, add(FooType foo)
> methods add a copy of foo rather than the foo you supply. Subsequent
> modifications of foo will then have no effect on the copy. The
> particular change would be changing the parent xml object. I find
> using add much more convenient.
>
> thanks
> david jencks
>
>

Re: Set vs Add methods

Posted by David Jencks <da...@yahoo.com>.
In order not to have side effects on its argument, add(FooType foo)  
methods add a copy of foo rather than the foo you supply.  Subsequent  
modifications of foo will then have no effect on the copy.  The  
particular change would be changing the parent xml object.  I find  
using add much more convenient.

thanks
david jencks

On Oct 17, 2005, at 4:21 PM, rabidgremlin wrote:

> Hi All,
>
>  I have a curious problem. I am porting some existing code that uses  
> another XML binding tool. This code uses uses "set" methods to  
> associate different objects together. The port was thus pretty easy as  
> there was a close correlation between the structure of the old code  
> and the code that uses XmlBeans.
>
>  However when I do a test run, my XML is not being created correctly.  
> After a couple of tests I have determined that the order in which you  
> do the "sets" are important. This seems very odd to me (not to mention  
> very fragile and error prone).
>
>  I have a small example:
>
>  With the following XSD:
>
>  <?xml version="1.0" encoding="UTF-8"?>
>  <schema xmlns="http://www.w3.org/2001/XMLSchema"  
> targetNamespace="http://testschema" xmlns:TestSchema="  
> http://testschema">
>      <complexType name="Song">
>          <sequence>
>              <element name="Title" type="string"></element>
>              <element name="length" type="duration"></element>
>          </sequence>
>      </complexType>
>
>      <element name="Album">
>          <complexType>
>              <sequence>
>                  <element name="Songs" type="TestSchema:Song"  
> minOccurs="1" maxOccurs="unbounded">
>                  </element>
>              </sequence>
>              <attribute name="Title" type="string"  
> use="required"></attribute>
>              <attribute name="Year" type="string"  
> use="required"></attribute>
>          </complexType>
>      </element>
>  </schema>
>
>  and the following code:
>
>  import org.apache.xmlbeans.GDuration;
>
>  import testschema.AlbumDocument;
>  import testschema.Song;
>  import testschema.AlbumDocument.Album;
>
>  public class TestSchema
>  {
>
>    public static void main(String[] args)
>    {
>      try
>      {
>        testWithAdd();
>        testWithSet1();
>        testWithSet2();
>      }
>      catch(Exception e)
>      {
>        System.out.println("Oops -> " + e);
>      }
>    }
>   
>    public static void testWithAdd()throws Exception
>    {
>      AlbumDocument doc = AlbumDocument.Factory.newInstance();
>     
>      Album album = doc.addNewAlbum();
>      album.setTitle("FloodLand");
>      album.setYear("1990");
>     
>      Song tempSong = album.addNewSongs();
>      tempSong.setTitle("Dominion/Mother Russia");
>      tempSong.setLength( new GDuration(1,2,4,5,10,12,15,null) );
>     
>      tempSong = album.addNewSongs();
>      tempSong.setTitle("Flood I");
>      tempSong.setLength( new GDuration(1,2,2,5,10,12,15,null) );
>     
>     
>      System.out.println("Add: isValid=" + doc.validate());
>      System.out.println("Add: " + doc.xmlText());   
>    }
>   
>    public static void testWithSet1()throws Exception
>    {
>      AlbumDocument doc = AlbumDocument.Factory.newInstance();
>     
>      Album album = Album.Factory.newInstance();
>      // NOTE SET HERE
>      doc.setAlbum(album);
>      album.setTitle("FloodLand");
>      album.setYear("1990");
>     
>      Song[] songs = new Song[2];
>         
>      songs[0] = Song.Factory.newInstance();   
>      songs[0].setTitle("Dominion/Mother Russia");
>      songs[0].setLength( new GDuration(1,2,4,5,10,12,15,null) );
>     
>      songs[1] = Song.Factory.newInstance();
>      songs[1].setTitle("Flood I");
>      songs[1].setLength( new GDuration(1,2,2,5,10,12,15,null) );
>     
>      album.setSongsArray(songs);   
>     
>      System.out.println("Set1: isValid=" + doc.validate());
>      System.out.println("Set1: " + doc.xmlText());   
>    }
>   
>    public static void testWithSet2()throws Exception
>    {
>      AlbumDocument doc = AlbumDocument.Factory.newInstance();
>     
>      Album album = Album.Factory.newInstance();   
>      album.setTitle("FloodLand");
>      album.setYear("1990");
>     
>      Song[] songs = new Song[2];
>         
>      songs[0] = Song.Factory.newInstance();   
>      songs[0].setTitle("Dominion/Mother Russia");
>      songs[0].setLength( new GDuration(1,2,4,5,10,12,15,null) );
>     
>      songs[1] = Song.Factory.newInstance();
>      songs[1].setTitle("Flood I");
>      songs[1].setLength( new GDuration(1,2,2,5,10,12,15,null) );
>     
>      album.setSongsArray(songs);  
>      // NOTE SET HERE
>      doc.setAlbum(album);
>     
>      System.out.println("Set2: isValid=" + doc.validate());
>      System.out.println("Set2: " + doc.xmlText());   
>    }
>  }
>
>  I get the following results:
>
>  Add: isValid=true
>  Add: <tes:Album Title="FloodLand" Year="1990"  
> xmlns:tes="http://testschema"><Songs><Title>Dominion/Mother  
> Russia</Title><length>P2Y4M5DT10H12M15S</length></ 
> Songs><Songs><Title>Flood  
> I</Title><length>P2Y2M5DT10H12M15S</length></Songs></tes:Album>
>  Set1: isValid=false
>  Set1: <tes:Album xmlns:tes="http://testschema"/>
>  Set2: isValid=true
>  Set2: <tes:Album Title="FloodLand" Year="1990"  
> xmlns:tes="http://testschema"><Songs><Title>Dominion/Mother  
> Russia</Title><length>P2Y4M5DT10H12M15S</length></ 
> Songs><Songs><Title>Flood  
> I</Title><length>P2Y2M5DT10H12M15S</length></Songs></tes:Album>
>
>  Note how the output of the testWithSet1() method is not valid where  
> as the output of testWithSet2() is. The only difference is the  
> placement of the "doc.setAlbum(album);" line.
>
>  Anyone have any idea as to why this is and is there something I am  
> not doing ?
>
>  Jonathan
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org