package cyrille.codec;
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import com.thoughtworks.xstream.XStream;
import junit.framework.TestCase;
/**
* <p>
* Sample : java object -> xml String (via xstream) -> base 64 string (via base64 encode ) -> xml
* string (via base 64 decode) -> java object (via xstream)
* </p>
*
* @author <a href="mailto:cleclerc@xebia.fr">Cyrille Le Clerc</a>
*/
public class XStreamCommonsCodecBase64Test extends TestCase {
/**
* Sample java object
*/
public static class Person {
protected String firstName;
protected String lastName;
public Person() {
super();
}
public Person(String lastName, String firstName) {
this();
this.lastName = lastName;
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int hashCode() {
return new HashCodeBuilder().append(this.lastName).append(this.firstName).toHashCode();
}
public boolean equals(Object obj) {
if (false == (obj instanceof Person)) {
return false;
}
final Person other = (Person) obj;
return new EqualsBuilder().append(this.lastName, other.lastName).append(this.firstName, other.firstName).isEquals();
}
public String toString() {
return new ToStringBuilder(this).append("lastName", this.lastName).append("firstName", this.firstName).toString();
}
}
/**
* Decode given base64 bytes (handled as a String) into an XML String.
*/
private String base64Decode(String xmlAsBase64String, String xmlEncoding) throws UnsupportedEncodingException {
byte[] xmlAsBase64 = Base64.decodeBase64(xmlAsBase64String.getBytes("ascii"));
return new String(xmlAsBase64, xmlEncoding);
}
/**
* Encode given XML String into base64 bytes (handled as a string).
*/
private String base64Encode(String xmlAsString, String xmlEncoding) throws UnsupportedEncodingException {
String xmlencodingDeclaration = "<?xml version=\"1.0\" encoding=\"" + xmlEncoding + "\"?>";
byte[] xmlAsBytes = (xmlencodingDeclaration + xmlAsString).getBytes(xmlEncoding);
byte[] xmlAsBase64 = Base64.encodeBase64(xmlAsBytes);
// base64 is pure ascii
String xmlAsBase64String = new String(xmlAsBase64, "ascii");
return xmlAsBase64String;
}
/**
* Test encode-decode.
*/
private void testBase64EncodeDecode(String xmlEncoding) throws UnsupportedEncodingException {
System.out.println("> testBase64EncodeDecode(" + xmlEncoding + ")");
// INITIALIZE XSTREAM
XStream xstream = new XStream();
xstream.alias("person", Person.class);
Person person = new Person("my-last-name", "my-first-name-with-accents-����");
// XSTREAM MARSHAL (OBJECT TO XML)
String xmlAsString = xstream.toXML(person);
System.out.println("\t xmlAsString\t" + xmlAsString);
// BASE 64 ENCODE
String xmlAsBase64String = base64Encode(xmlAsString, xmlEncoding);
System.out.println("\t xmlAsBase64\t" + xmlAsBase64String);
// BASE 64 DECODE
String decodedBase64XmlAsString = base64Decode(xmlAsBase64String, xmlEncoding);
// XSTREAM UNMARSHAL (OBJECT FROM XML)
Person decodedPerson = (Person) xstream.fromXML(decodedBase64XmlAsString);
assertEquals(person, decodedPerson);
}
public void testBase64EncodeDecodeIso88591() throws Exception {
String xmlEncoding = "ISO-8859-1";
testBase64EncodeDecode(xmlEncoding);
}
public void testBase64EncodeDecodeUtf8() throws Exception {
String xmlEncoding = "UTF-8";
testBase64EncodeDecode(xmlEncoding);
}
}