Is there a way to set the order of Xstream serialization

classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
I need to generate XML from java objects on Android. XML nodes must be in
definite sequence.
Due http://xstream.codehaus.org/manual-tweaking-output.html order of XML nodes
match object's fields define. There is no problems when I use java
classes(String, Date...) as fields. But there is problem when I need serialize
my objects as fields.

Here is my code:

    final XStream x = new XStream();

    x.autodetectAnnotations(true);

    SecondEntity secondEntity = new SecondEntity();
    secondEntity.setSecondaryString("Secondary String");
    secondEntity.setSecondaryDate(new Date());

    InnerEntity innerEntity = new InnerEntity();
    innerEntity.setInnerString("Inner String");
    innerEntity.setInnerDate(new Date());

    SomeEntity someEntity = new SomeEntity();
    someEntity.setInnerEntity(innerEntity);
    someEntity.setSecondEntity(secondEntity);
    someEntity.setSomeDate(new Date());
    someEntity.setSomeString("Some string");

    x.toXML(someEntity)

SomeEntity:



    @XStreamAlias("SomeEntity")
    public class SomeEntity {
        @XStreamAlias("innerEntity")
        private InnerEntity innerEntity;
        @XStreamAlias("secondEntity")
        private SecondEntity secondEntity;
        @XStreamAlias("someString")
        private String someString;
        @XStreamAlias("someDate")
        private Date someDate;
   
        public InnerEntity getInnerEntity() {
            return innerEntity;
        }
   
        public void setInnerEntity(InnerEntity innerEntity) {
            this.innerEntity = innerEntity;
        }
   
        public SecondEntity getSecondEntity() {
            return secondEntity;
        }
   
        public void setSecondEntity(SecondEntity secondEntity) {
            this.secondEntity = secondEntity;
        }
   
        public String getSomeString() {
            return someString;
        }
   
        public void setSomeString(String someString) {
            this.someString = someString;
        }
   
        public Date getSomeDate() {
            return someDate;
        }
   
        public void setSomeDate(Date someDate) {
            this.someDate = someDate;
        }
    }

InnerEntity:

    @XStreamAlias("InnerEntity")
    public class InnerEntity {
        @XStreamAlias("innerString")
        private String innerString;
        @XStreamAlias("innerDate")
        private Date innerDate;
   
        public String getInnerString() {
            return innerString;
        }
   
        public void setInnerString(String innerString) {
            this.innerString = innerString;
        }
   
        public Date getInnerDate() {
            return innerDate;
        }
   
        public void setInnerDate(Date innerDate) {
            this.innerDate = innerDate;
        }
    }

SecondEntity:

    @XStreamAlias("SecondEntity")
    public class SecondEntity {
        @XStreamAlias("secondaryString")
        private String secondaryString;
        @XStreamAlias("secondaryDate")
        private Date secondaryDate;

        public String getSecondaryString() {
            return secondaryString;
        }

        public void setSecondaryString(String secondaryString) {
            this.secondaryString = secondaryString;
        }

        public Date getSecondaryDate() {
            return secondaryDate;
        }

        public void setSecondaryDate(Date secondaryDate) {
            this.secondaryDate = secondaryDate;
        }
    }


I get

    <SomeEntity>
        <innerEntity>
            <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
            <innerString>Inner String</innerString>
        </innerEntity>
        <secondEntity>
            <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
            <secondaryString>Secondary String</secondaryString>
        </secondEntity>
        <someDate>2013-02-28 18:04:24.184 UTC</someDate>
        <someString>Some string</someString>
    </SomeEntity>

When I need:

    <SomeEntity>
        <innerEntity>
            <innerString>Inner String</innerString>
            <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
        </innerEntity>
        <secondEntity>
            <secondaryString>Secondary String</secondaryString>
            <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
        </secondEntity>
        <someDate>2013-02-28 18:04:24.184 UTC</someDate>
        <someString>Some string</someString>
    </SomeEntity>




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-2
Hi Ihar,

Ihar Tsimoshka wrote:

> I need to generate XML from java objects on Android. XML nodes must be in
> definite sequence.
> Due http://xstream.codehaus.org/manual-tweaking-output.html order of XML
> nodes match object's fields define. There is no problems when I use java
> classes(String, Date...) as fields. But there is problem when I need
> serialize my objects as fields.
>
> Here is my code:
>
>     final XStream x = new XStream();
>
>     x.autodetectAnnotations(true);
>
>     SecondEntity secondEntity = new SecondEntity();
>     secondEntity.setSecondaryString("Secondary String");
>     secondEntity.setSecondaryDate(new Date());
>
>     InnerEntity innerEntity = new InnerEntity();
>     innerEntity.setInnerString("Inner String");
>     innerEntity.setInnerDate(new Date());
>
>     SomeEntity someEntity = new SomeEntity();
>     someEntity.setInnerEntity(innerEntity);
>     someEntity.setSecondEntity(secondEntity);
>     someEntity.setSomeDate(new Date());
>     someEntity.setSomeString("Some string");
>
>     x.toXML(someEntity)
>
> SomeEntity:
>
>
>
>     @XStreamAlias("SomeEntity")
>     public class SomeEntity {
>         @XStreamAlias("innerEntity")
>         private InnerEntity innerEntity;
>         @XStreamAlias("secondEntity")
>         private SecondEntity secondEntity;
>         @XStreamAlias("someString")
>         private String someString;
>         @XStreamAlias("someDate")
>         private Date someDate;
>    
>         public InnerEntity getInnerEntity() {
>             return innerEntity;
>         }
>    
>         public void setInnerEntity(InnerEntity innerEntity) {
>             this.innerEntity = innerEntity;
>         }
>    
>         public SecondEntity getSecondEntity() {
>             return secondEntity;
>         }
>    
>         public void setSecondEntity(SecondEntity secondEntity) {
>             this.secondEntity = secondEntity;
>         }
>    
>         public String getSomeString() {
>             return someString;
>         }
>    
>         public void setSomeString(String someString) {
>             this.someString = someString;
>         }
>    
>         public Date getSomeDate() {
>             return someDate;
>         }
>    
>         public void setSomeDate(Date someDate) {
>             this.someDate = someDate;
>         }
>     }
>
> InnerEntity:
>
>     @XStreamAlias("InnerEntity")
>     public class InnerEntity {
>         @XStreamAlias("innerString")
>         private String innerString;
>         @XStreamAlias("innerDate")
>         private Date innerDate;
>    
>         public String getInnerString() {
>             return innerString;
>         }
>    
>         public void setInnerString(String innerString) {
>             this.innerString = innerString;
>         }
>    
>         public Date getInnerDate() {
>             return innerDate;
>         }
>    
>         public void setInnerDate(Date innerDate) {
>             this.innerDate = innerDate;
>         }
>     }
>
> SecondEntity:
>
>     @XStreamAlias("SecondEntity")
>     public class SecondEntity {
>         @XStreamAlias("secondaryString")
>         private String secondaryString;
>         @XStreamAlias("secondaryDate")
>         private Date secondaryDate;
>
>         public String getSecondaryString() {
>             return secondaryString;
>         }
>
>         public void setSecondaryString(String secondaryString) {
>             this.secondaryString = secondaryString;
>         }
>
>         public Date getSecondaryDate() {
>             return secondaryDate;
>         }
>
>         public void setSecondaryDate(Date secondaryDate) {
>             this.secondaryDate = secondaryDate;
>         }
>     }
>
>
> I get
>
>     <SomeEntity>
>         <innerEntity>
>             <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
>             <innerString>Inner String</innerString>
>         </innerEntity>
>         <secondEntity>
>             <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
>             <secondaryString>Secondary String</secondaryString>
>         </secondEntity>
>         <someDate>2013-02-28 18:04:24.184 UTC</someDate>
>         <someString>Some string</someString>
>     </SomeEntity>
>
> When I need:
>
>     <SomeEntity>
>         <innerEntity>
>             <innerString>Inner String</innerString>
>             <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
>         </innerEntity>
>         <secondEntity>
>             <secondaryString>Secondary String</secondaryString>
>             <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
>         </secondEntity>
>         <someDate>2013-02-28 18:04:24.184 UTC</someDate>
>         <someString>Some string</someString>
>     </SomeEntity>

XStream itself does no sorting. If your class type is handled by the
reflection provider, it simply requests the declared fields of a type using
reflection and handles them in the sequence they are reported by the Java
runtime.

Now, this sequence is not defined by the runtime itself, but by the compiler
used to compile a class. Normally the fields get created (and reported) in
the declaration sequence. Personally I know only two compilers that created
a different order: Compilers of the IBM JDK in old versions of Java 1.4.2
and 1.3.x and the compiler that was delivered once with Apache Harmony.

Since I assume that you used the same compiler for all your classes and they
have not been modified using byte-code manipulation libraries like ASM,
CGLIB, BCEL or Javaassist, it is a bit strange that for one of you classes
the reported sequence does not match the declaration order ...

Nevertheless, you can influence the field sequence or sorting using a
FieldKeySorter. Have a look at the CustomFieldKeySorterTest in XStream's
acceptance package. However, if the SecondEntity is the only type where this
happens and if the type is really that simple, you ma get away a lot easier
by simply writing a custom converter for it. Have a look at the convertere
tutorial, is is easy and straight forward.

Cheers,
Jörg


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
Hi Jörg.


I've investigated this problem more. And I found that Xstream handles fields in
wrong order on Android in classes where Date or Integer(or both) fields are. In
this case Date field is handled first.
I cannot use FieldKeySorter because I have many classes with Date and Integer
fields and I don't want to create Sorter for everyone.
Please note that in all my messages I run code on Android (minSdk=8)


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-2
Hi Ihar,

Ihar Tsimoshka wrote:

> Hi Jörg.
>
>
> I've investigated this problem more. And I found that Xstream handles
> fields in wrong order on Android in classes where Date or Integer(or both)
> fields are. In this case Date field is handled first.
> I cannot use FieldKeySorter because I have many classes with Date and
> Integer fields and I don't want to create Sorter for everyone.
> Please note that in all my messages I run code on Android (minSdk=8)

Actually XStream has no idea about the "correct" order either. It relies
completely on the Java runtime to return the fields in declaration order.

- Jörg


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
Hi,  Jörg.

Due http://xstream.codehaus.org/manual-tweaking-output.html "correct" fields
order is 'the sequence they are defined' - without any restrictions in different
runtime environments. Since it doesn't happen in Android, Xstream does not
support Android. Am I right?


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-3
Hi Ihar,

Ihar Tsimoshka wrote:

> Hi,  Jörg.
>
> Due http://xstream.codehaus.org/manual-tweaking-output.html "correct"
> fields order is 'the sequence they are defined' - without any restrictions
> in different runtime environments. Since it doesn't happen in Android,
> Xstream does not support Android. Am I right?

No. XStream is Java to XML and back. Nothing less, but nothing more in first
place. And that's what it does also on Android. Any additional requirement
concerning the XML (element naming, value formatting or element sequence) is
an external requirement and not necessary for XStream to work at all.

If Android obviously does not deliver the field elements in their
declaration sequence, it is nothing that XStream can "fix", because the
information is then simply not available at runtime. But it does not stop
XStream to persist the object graph and read it back. And as said earlier in
this thread, the sequence is defined by the compiler used to compile the
class.

XStream is highly configurable and can be adjusted in a lot of ways (e.g.
you could use a field sorted that reads the "correct field" order from an
annotation in the provided type), but it cannot make wonders and create
information out of thin air.

Actually I'd be surprised if you get different results with JAXP, since even
this package will create the stub Java classes from the compiled data
classes.

- Jörg


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
 OK. As I understood Xstream doesn't support any way to get custom field order
except FieldKeySorter. I looked for way like 'propOrder' in jaxb. Implement
FieldKeySorter for every handled class is to expensive. But I still think that
sentence 'They will write the fields of a class in the sequence they are
defined' is misleading




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Paul Hammant-3
In reply to this post by Ihar Tsimoshka
The problem you are trying to solve is Android refusing to load XML saved by Sun/Oracle Java (and XStream) ?

- Paul

On Fri, Mar 1, 2013 at 4:34 AM, Ihar Tsimoshka <[hidden email]> wrote:
I need to generate XML from java objects on Android. XML nodes must be in
definite sequence.
Due http://xstream.codehaus.org/manual-tweaking-output.html order of XML nodes
match object's fields define. There is no problems when I use java
classes(String, Date...) as fields. But there is problem when I need serialize
my objects as fields.

Here is my code:

    final XStream x = new XStream();

    x.autodetectAnnotations(true);

    SecondEntity secondEntity = new SecondEntity();
    secondEntity.setSecondaryString("Secondary String");
    secondEntity.setSecondaryDate(new Date());

    InnerEntity innerEntity = new InnerEntity();
    innerEntity.setInnerString("Inner String");
    innerEntity.setInnerDate(new Date());

    SomeEntity someEntity = new SomeEntity();
    someEntity.setInnerEntity(innerEntity);
    someEntity.setSecondEntity(secondEntity);
    someEntity.setSomeDate(new Date());
    someEntity.setSomeString("Some string");

    x.toXML(someEntity)

SomeEntity:



    @XStreamAlias("SomeEntity")
    public class SomeEntity {
        @XStreamAlias("innerEntity")
        private InnerEntity innerEntity;
        @XStreamAlias("secondEntity")
        private SecondEntity secondEntity;
        @XStreamAlias("someString")
        private String someString;
        @XStreamAlias("someDate")
        private Date someDate;

        public InnerEntity getInnerEntity() {
            return innerEntity;
        }

        public void setInnerEntity(InnerEntity innerEntity) {
            this.innerEntity = innerEntity;
        }

        public SecondEntity getSecondEntity() {
            return secondEntity;
        }

        public void setSecondEntity(SecondEntity secondEntity) {
            this.secondEntity = secondEntity;
        }

        public String getSomeString() {
            return someString;
        }

        public void setSomeString(String someString) {
            this.someString = someString;
        }

        public Date getSomeDate() {
            return someDate;
        }

        public void setSomeDate(Date someDate) {
            this.someDate = someDate;
        }
    }

InnerEntity:

    @XStreamAlias("InnerEntity")
    public class InnerEntity {
        @XStreamAlias("innerString")
        private String innerString;
        @XStreamAlias("innerDate")
        private Date innerDate;

        public String getInnerString() {
            return innerString;
        }

        public void setInnerString(String innerString) {
            this.innerString = innerString;
        }

        public Date getInnerDate() {
            return innerDate;
        }

        public void setInnerDate(Date innerDate) {
            this.innerDate = innerDate;
        }
    }

SecondEntity:

    @XStreamAlias("SecondEntity")
    public class SecondEntity {
        @XStreamAlias("secondaryString")
        private String secondaryString;
        @XStreamAlias("secondaryDate")
        private Date secondaryDate;

        public String getSecondaryString() {
            return secondaryString;
        }

        public void setSecondaryString(String secondaryString) {
            this.secondaryString = secondaryString;
        }

        public Date getSecondaryDate() {
            return secondaryDate;
        }

        public void setSecondaryDate(Date secondaryDate) {
            this.secondaryDate = secondaryDate;
        }
    }


I get

    <SomeEntity>
        <innerEntity>
            <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
            <innerString>Inner String</innerString>
        </innerEntity>
        <secondEntity>
            <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
            <secondaryString>Secondary String</secondaryString>
        </secondEntity>
        <someDate>2013-02-28 18:04:24.184 UTC</someDate>
        <someString>Some string</someString>
    </SomeEntity>

When I need:

    <SomeEntity>
        <innerEntity>
            <innerString>Inner String</innerString>
            <innerDate>2013-02-28 18:04:24.184 UTC</innerDate>
        </innerEntity>
        <secondEntity>
            <secondaryString>Secondary String</secondaryString>
            <secondaryDate>2013-02-28 18:04:24.183 UTC</secondaryDate>
        </secondEntity>
        <someDate>2013-02-28 18:04:24.184 UTC</someDate>
        <someString>Some string</someString>
    </SomeEntity>




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-2
In reply to this post by Ihar Tsimoshka
Hi,

Ihar Tsimoshka wrote:

>  OK. As I understood Xstream doesn't support any way to get custom field
>  order
> except FieldKeySorter. I looked for way like 'propOrder' in jaxb.
> Implement FieldKeySorter for every handled class is to expensive.

Why? Do as I suggested and implement one FieldKeySorter that looks for an
annotation that defines this order. If no annotation is present, just return
the provided Map. That's just like JAXB then.

> But I
> still think that sentence 'They will write the fields of a class in the
> sequence they are defined' is misleading

All compiler/run-time combinations in the last 10 years provided the fields
either in declaration order or reverse declaration order ... :-/

Cheers,
Jörg


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
Hi, Jörg

I will try your suggest and will inform you about results. Maybe I'm wrong, but
Android returns fields in alphabetical order of field types. If you have time
can you please check it?




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
In reply to this post by Paul Hammant-3
No. I try to generate XML with defined node order on Android.

Paul Hammant <paul@...> writes:

>
>
> The problem you are trying to solve is Android refusing to load XML saved by
Sun/Oracle Java (and XStream) ?
>



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-3
In reply to this post by Ihar Tsimoshka
Hi Ihar,

Ihar Tsimoshka wrote:

> Hi, Jörg
>
> I will try your suggest and will inform you about results. Maybe I'm
> wrong, but Android returns fields in alphabetical order of field types. If
> you have time can you please check it?

As said, I have no experience with Android myself. I never found the time to
setup a proper test environment for XStream.

So, is there anyone else who can confirm this behavior in Android?

- Jörg


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
Hi, Jörg Schaible


I've created annotation with order field and all works fine. Thank you.


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Ihar Tsimoshka
I've created this annotation:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface XMLSequence {
    String[] value();
}

This is example of use (write before class definition):
@XMLSequence({
        "accountIds",
        "addresses",
        "birthDate",
        "contact",
        "name",
        "status",
})

Then I've overrided FieldKeySorter :

public class SequenceFieldKeySorter implements FieldKeySorter {
    @Override
    public Map sort(final Class type, final Map keyedByFieldKey) {
        Annotation sequence = type.getAnnotation(XMLSequence.class);
        if (sequence != null) {
            final String[] fieldsOrder = ((XMLSequence) sequence).value();
            Map result = new OrderRetainingMap();
            Set<Map.Entry<FieldKey, Field>> fields = keyedByFieldKey.entrySet();
            for (String fieldName : fieldsOrder) {
                if (fieldName != null) {
                    for (Map.Entry<FieldKey, Field> fieldEntry : fields) {
                        if
(fieldName.equals(fieldEntry.getKey().getFieldName())) {
                            result.put(fieldEntry.getKey(),
fieldEntry.getValue());
                        }
                    }
                }
            }
            return result;
        } else {
            return keyedByFieldKey;
        }

    }
}

And this is how I've instanced XStream:
XStream x = new XStream(new PureJavaReflectionProvider(new
FieldDictionary(new SequenceFieldKeySorter())));


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to set the order of Xstream serialization

Jörg Schaible-2

Thanks for sharing ;-)

Ihar Tsimoshka wrote:

> I've created this annotation:
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target(ElementType.TYPE)
> public @interface XMLSequence {
>     String[] value();
> }
>
> This is example of use (write before class definition):
> @XMLSequence({
>         "accountIds",
>         "addresses",
>         "birthDate",
>         "contact",
>         "name",
>         "status",
> })
>
> Then I've overrided FieldKeySorter :
>
> public class SequenceFieldKeySorter implements FieldKeySorter {
>     @Override
>     public Map sort(final Class type, final Map keyedByFieldKey) {
>         Annotation sequence = type.getAnnotation(XMLSequence.class);
>         if (sequence != null) {
>             final String[] fieldsOrder = ((XMLSequence) sequence).value();
>             Map result = new OrderRetainingMap();
>             Set<Map.Entry<FieldKey, Field>> fields =
>             keyedByFieldKey.entrySet(); for (String fieldName :
>             fieldsOrder) {
>                 if (fieldName != null) {
>                     for (Map.Entry<FieldKey, Field> fieldEntry : fields) {
>                         if
> (fieldName.equals(fieldEntry.getKey().getFieldName())) {
>                             result.put(fieldEntry.getKey(),
> fieldEntry.getValue());
>                         }
>                     }
>                 }
>             }
>             return result;
>         } else {
>             return keyedByFieldKey;
>         }
>
>     }
> }
>
> And this is how I've instanced XStream:
> XStream x = new XStream(new PureJavaReflectionProvider(new
> FieldDictionary(new SequenceFieldKeySorter())));
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>     http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email