I am trying to use castor 1.3.1, where a collection is a java.util.Queue.
Actually a ConcurrentLinkedQueue<TQueueElement>.
When I try:
Mapping mapping = new Mapping();
mapping.loadMapping("file://castorTestMapping.xml<file:///\\castorTestMapping.xml>"
);;
It causes the error:
Nested error: org.exolab.castor.xml.MarshalException:
java.lang.IllegalArgumentException: java.util.Queue is not a valid
FieldMappingCollectionType
Is there some other collection that will work for this? Or an alternate way of
doing this?
Thanks.
Here is the a part of the mapping file:
<class name="com.test.TQueue">
<field name="queue_" collection="java.util.Queue"
type="com.test.TQueueElement" get-method="getQueue" set-method="setQueue">
<bind-xml name="Queue"/>
</field>
<field name="name_" type="java.lang.String" get-method="getName"
set-method="setName" >
<bind-xml name="QueueName" node="attribute" />
</field>
<field name="type_" type="java.lang.String" get-method="getType"
set-method="setType" >
<bind-xml name="QueueType" node="attribute" />
</field>
</class>
<class name="com.test.TQueueElement">
<field name="payload_" type="org.exolab.castor.mapping.MapItem"
collection="map" get-method="getPayload" set-method="setPayload">
<bind-xml name="queueItem">
<class name="org.exolab.castor.mapping.MapItem">
<field name="key" type="java.lang.String">
</field>
<field name="value" type="java.lang.String" />
</class>
</bind-xml>
</field>
</class>
And the related java classes (simplified) are:
public class TQueue
{
private Queue<TQueueElement> queue_;
private String name_;
private String type_;
public TQueue()
{
queue_ = new ConcurrentLinkedQueue<TQueueElement>();
}
public void add(TQueueElement element)
{
if ( element == null ) {
throw new NullPointerException();
}
queue_.add(element);
}
public synchronized String getName()
{
return name_;
}
public synchronized String getType()
{
return type_;
}
public synchronized void setName(String name)
{
if ( name == null ) {
throw new NullPointerException();
}
name_ = name;
}
public synchronized void setType(String type)
{
if ( type == null ) {
throw new NullPointerException();
}
type_ = type;
}
}
public class TQueueElement implements Cloneable {
private Map<String,String> payload_;
public TQueueElement()
{
payload_ = new HashMap<String,String>();
}
public String getEntry(String name) {
return getPayload().get(name);
}
public Map<String,String> getPayload()
{
return payload_;
}
public String putEntry(String name, String value)
{
return getPayload().put(name, value);
}
public void setPayload(Map<String,String> payload)
{
if ( payload == null ) {
throw new NullPointerException();
}
payload_ = payload;
}
}