Dear Christian,
it's very great that you've incorporated
the SAXSerializer. But you've overdone it a bit. The setItem() method and
the parse() methods are required. I've written a JUnit-Test to demonstrate
the application of the SAXSerializer with JAXB.
In line 49 there should be the method
setItem, which you have removed. The JAXB unmarshaller is going to invoke
parse(String) which now throws an exception with an 'unimplemented' note.
So please re-enable the parse()-methods
and re-introduce the setItem()-method.
package
basex.test.sax;
import
java.io.File;
import
javax.xml.bind.JAXBContext;
import
javax.xml.transform.Source;
import
javax.xml.transform.sax.SAXSource;
import
junit.framework.Assert;
import
org.basex.core.Context;
import
org.basex.core.cmd.CreateDB;
import
org.basex.io.serial.SAXSerializer;
import
org.basex.io.serial.Serializer;
import
org.basex.query.QueryProcessor;
import
org.basex.query.value.item.Item;
import
org.junit.Test;
public
class
SAXSerializerTest
{
@Test
public
void
unmarshallJAXBObjectWithSAXSerializer() throws
Exception
{
File temp = getTemp();
JAXBContext jaxbContext = JAXBContext.newInstance(DomainObject.class);
//
create XML
File input = new
File(temp, "input.xml");
jaxbContext.createMarshaller().marshal(new
DomainObject("Object1",
42), input);
//
create DB
System.setProperty("org.basex.path",
temp.getAbsolutePath());
Context context = new
Context();
new
CreateDB("test1",
input.getAbsolutePath()).execute(context);
//
get object from DB
QueryProcessor queryProcessor = new
QueryProcessor("//domain-object[@name='Object1']",
context);
Item item1 = queryProcessor.iter().next();
//
write out to see that item is here
Serializer serializer1 = queryProcessor.getSerializer(System.out);
serializer1.serialize(item1);
serializer1.close();
SAXSerializer saxSerializer = new
SAXSerializer();
SAXSource saxSource = new
SAXSource(saxSerializer, null);
//
this is needed!!!
saxSerializer.setItem(item1);
DomainObject domainObject1 = jaxbContext.createUnmarshaller().unmarshal(saxSource,
DomainObject.class).getValue();
queryProcessor.close();
Assert.assertEquals(42, domainObject1.getValue());
}
private
File getTemp()
{
File temp = new
File("d:/temp/basex");
//System.getProperty("java.io.tmpdir");
temp.mkdirs();
return
temp;
}
}
The code is attached to this mail.