package org.menacheri.jetserver.handlers.netty; import java.io.ByteArrayInputStream; import java.io.IOException; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandler.Sharable; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; import org.menacheri.jetserver.convert.Transform; import org.menacheri.jetserver.convert.flex.AMFDeSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import flex.messaging.io.SerializationContext; /** * This class takes a {@link ChannelBuffer} containing AMF3 object as input and * creates a java object from it using the {@link AMFDeSerializer} class. * * @author Abraham Menacherry. * */ @Sharable public class AMF3ToJavaObjectDecoder extends OneToOneDecoder implements Transform<ChannelBuffer, Object> { private static final Logger LOG = LoggerFactory.getLogger(AMF3ToJavaObjectDecoder.class); @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { if(null == msg) { LOG.warn("Incoming message is null"); return msg; } ChannelBuffer buffer = (ChannelBuffer)msg; // buffer.array() will ignore the readerIndex. Hence readBytes is used // and then .array is called ByteArrayInputStream bis = new ByteArrayInputStream(buffer.readBytes( buffer.readableBytes()).array()); return deSerializeObjectFromStream(bis); } @Override public Object convert(ChannelBuffer buffer) throws Exception { ByteArrayInputStream bis = new ByteArrayInputStream(buffer.array()); return deSerializeObjectFromStream(bis); } protected Object deSerializeObjectFromStream(ByteArrayInputStream bis) throws Exception { AMFDeSerializer serializer = new AMFDeSerializer(SerializationContext .getSerializationContext()); Object o = null; try { // do the deserialization. o = serializer.fromAmf(bis); LOG.trace("Serialized object: {}",o); bis.close(); } catch (IOException e) { LOG.error("IO error in AMF3ToJavaObjectDecoder: {}",e); throw e; } catch (ClassNotFoundException e) { LOG.error("Error in AMF3ToJavaObjectDecoder: {}.\n " + "Check if flash class has corresponding java class",e); throw e; } return o; } }