package com.bagri.client.hazelcast.serialize;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.xquery.XQDataFactory;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQItemType;
import javax.xml.xquery.XQSequence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.nio.serialization.StreamSerializer;
public class XQSequenceSerializer implements StreamSerializer<XQSequence> {
private static final Logger logger = LoggerFactory.getLogger(XQSequenceSerializer.class);
private XQDataFactory xqFactory;
protected XQDataFactory getXQDataFactory() {
return xqFactory;
}
public void setXQDataFactory(XQDataFactory xqDataFactory) {
this.xqFactory = xqDataFactory;
}
@Override
public int getTypeId() {
return DataSerializationFactoryImpl.cli_XQSequence;
}
@Override
public void destroy() {
}
@Override
public XQSequence read(ObjectDataInput in) throws IOException {
try {
//XQItemType type = in.readObject();
List list = (List) in.readObject();
logger.trace("read; got list: {}", list);
return xqFactory.createSequence(list.iterator());
} catch (XQException ex) {
throw new IOException(ex);
}
}
@Override
public void write(ObjectDataOutput out, XQSequence sequence) throws IOException {
try {
XQItemType type = null;
boolean typeSerialized = false;
List list = new ArrayList();
while (sequence.next()) {
// what if sequence contains different types ?!
if (!typeSerialized) {
type = sequence.getItemType();
//out.writeObject(type);
typeSerialized = true;
}
list.add(sequence.getItem());
}
logger.trace("write; got type: {}; list: {}", type, list);
out.writeObject(list);
} catch (XQException ex) {
throw new IOException(ex);
}
}
}