/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.service.utils.hessian;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import com.caucho.hessian.micro.MicroHessianOutput;
import com.vodafone360.people.utils.CloseUtils;
/**
* Produce Hessian encoded byte array using Caucho Hessian implementation
*/
public class HessianEncoder {
/**
* Create Hessian encoded byte array from Hashtable
*
* @param ht Hashtable to encode
* @return encoded byte array
* @throws IOException
*/
public static byte[] createHessianByteArray(String function, Hashtable<String, Object> ht)
throws IOException {
// write our hash table to Hessian format
ByteArrayOutputStream bos = new ByteArrayOutputStream();
MicroHessianOutput mho = new MicroHessianOutput(bos);
mho.startCall(function);
writeHashtable(ht, mho);
mho.completeCall();
CloseUtils.close(bos);
return bos.toByteArray();
}
private static void writeHashtable(Hashtable<String, Object> ht, MicroHessianOutput mho)
throws IOException {
mho.writeMapBegin(null);
Enumeration<String> e = ht.keys();
while (e.hasMoreElements()) {
Object key = e.nextElement();
Object value = ht.get(key);
mho.writeObject(key);
if (value instanceof byte[]) {
mho.writeBytes((byte[])value);
} else if (value instanceof Hashtable<?, ?>) {
@SuppressWarnings("unchecked")
Hashtable<String, Object> table = (Hashtable<String, Object>)value;
writeHashtable(table, mho);
} else if (value instanceof ArrayList<?>) {
@SuppressWarnings("unchecked")
ArrayList<String> list = (ArrayList<String>)value;
writeStringArrayList(list, mho);
} else {
mho.writeObject(value);
}
}
mho.writeMapEnd();
}
private static void writeStringArrayList(ArrayList<String> list, MicroHessianOutput mho)
throws IOException {
mho.writeListBegin(list.size(), null);
for (String to : list) {
mho.writeString(to);
}
mho.writeListEnd();
}
}