package jpaoletti.jpm.parser;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.util.ArrayList;
import jpaoletti.jpm.converter.Converter;
import jpaoletti.jpm.converter.Converters;
import jpaoletti.jpm.converter.ExternalConverter;
import jpaoletti.jpm.core.PresentationManager;
/**
* This is not a recursive class! This is an xstream converter for the
* pm.core.converter.Converter class.
*
* @author jpaoletti
*/
public class ConverterConverter implements com.thoughtworks.xstream.converters.Converter {
@Override
public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
final Converters converters = (Converters) o;
writer.startNode("converters");
for (Converter c : converters.getConverters()) {
writer.startNode("converter");
mc.convertAnother(c);
writer.endNode();
}
for (ExternalConverter c : converters.getExternalConverters()) {
writer.startNode("econverter");
mc.convertAnother(c);
writer.endNode();
}
writer.endNode();
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
final Converters converters = new Converters();
converters.setConverters(new ArrayList<Converter>());
converters.setExternalConverters(new ArrayList<ExternalConverter>());
while (reader.hasMoreChildren()) {
reader.moveDown();
if (reader.getNodeName().equals("converter")) {
final String clazz = reader.getAttribute("class");
try {
final Converter c = (Converter) uc.convertAnother(converters, Class.forName(clazz));
converters.getConverters().add(c);
} catch (Exception ex) {
PresentationManager.getPm().warn("Converter not found: " + clazz);
}
} else if (reader.getNodeName().equals("econverter")) {
ExternalConverter c = (ExternalConverter) uc.convertAnother(converters, ExternalConverter.class);
converters.getExternalConverters().add(c);
}
reader.moveUp();
}
return converters;
}
@Override
public boolean canConvert(Class type) {
return type.equals(Converters.class);
}
}