package org.kie.dmn.backend.marshalling.v1_1.xstream;
import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import org.kie.dmn.backend.marshalling.CustomStaxReader;
import org.kie.dmn.backend.marshalling.CustomStaxWriter;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
/**
* Please note this does not extend the DMNBaseConverter as it just need access to the node value itself.
*/
public class QNameConverter implements Converter {
@Override
public boolean canConvert(Class clazz) {
return clazz.equals( QName.class );
}
@Override
public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) {
QName qname = (QName) object;
if ( !XMLConstants.NULL_NS_URI.equals(qname.getNamespaceURI()) && !XMLConstants.DEFAULT_NS_PREFIX.equals(qname.getPrefix()) ) {
CustomStaxWriter staxWriter = ((CustomStaxWriter) writer.underlyingWriter());
try {
staxWriter.writeNamespace(qname.getPrefix(), qname.getNamespaceURI());
} catch (XMLStreamException e) {
// TODO what to do?
e.printStackTrace();
}
}
writer.setValue(MarshallingUtils.formatQName(qname));
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
QName qname = MarshallingUtils.parseQNameString( reader.getValue() );
Map<String, String> currentNSCtx = ((CustomStaxReader) reader.underlyingReader()).getNsContext();
String qnameURI = currentNSCtx.get(qname.getPrefix());
if (qnameURI != null) {
return new QName(qnameURI, qname.getLocalPart(), qname.getPrefix());
}
return qname;
}
}