package retrofit.converter;
import org.simpleframework.xml.Serializer;
import retrofit.mime.TypedByteArray;
import retrofit.mime.TypedInput;
import retrofit.mime.TypedOutput;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Type;
/**
* A {@link Converter} which uses SimpleXML for reading and writing entities.
*
* @author Fabien Ric (fabien.ric@gmail.com)
*/
public class SimpleXMLConverter implements Converter
{
private static final String CHARSET = "UTF-8";
private static final String MIME_TYPE = "application/xml; charset=" + CHARSET;
private final Serializer serializer;
public SimpleXMLConverter(Serializer serializer)
{
this.serializer = serializer;
}
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException
{
try
{
return serializer.read((Class<?>) type, body.in());
}
catch (Exception e)
{
throw new ConversionException(e);
}
}
@Override
public TypedOutput toBody(Object source)
{
OutputStreamWriter osw = null;
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
osw = new OutputStreamWriter(bos, CHARSET);
serializer.write(source, osw);
osw.flush();
return new TypedByteArray(MIME_TYPE, bos.toByteArray());
}
catch (Exception e)
{
throw new AssertionError(e);
}
finally
{
try
{
if (osw != null)
{
osw.close();
}
}
catch (IOException e)
{
throw new AssertionError(e);
}
}
}
}