//////////////////////////////////////////////////////////////////////////////// // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published // by the Free Software Foundation; either version 3 of the License, or (at // your option) any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public // License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program; if not, see <http://www.gnu.org/copyleft/lesser.html>. // //////////////////////////////////////////////////////////////////////////////// package org.merapi.internal.io.amf; import flex.messaging.io.SerializationContext; import flex.messaging.io.amf.ASObject; import flex.messaging.io.amf.Amf3Input; import org.merapi.internal.io.reader.IReader; import org.merapi.messages.IMessage; import org.merapi.messages.Message; import org.apache.log4j.Logger; //import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; /** * The <code>AMF3Reader</code> class deserializes AMF 3 encoded binary data into * an <code>IMessage</code>. When a message has been received from the Flex * bridge. * * @see org.merapi.io.reader.IReader; */ //@Service public class AMF3Reader implements IReader { // -------------------------------------------------------------------------- // // Constructor // // -------------------------------------------------------------------------- /** * Constructor. */ public AMF3Reader() { super(); __amf3Input = new Amf3Input(new SerializationContext()); } // -------------------------------------------------------------------------- // // Variables // // -------------------------------------------------------------------------- /** * @private Used to deserialize AMF binary data into an * <code>IMessage</code>. */ Amf3Input __amf3Input = null; Logger __logger = Logger.getLogger(AMF3Reader.class); // -------------------------------------------------------------------------- // // Methods // // -------------------------------------------------------------------------- /** * @return Reads the binary data <code>bytes</code> and deserializes it into * an <code>IMessage</code>. */ public ArrayList<IMessage> read(byte[] bytes) throws ClassNotFoundException, IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( bytes); __amf3Input.reset(); __amf3Input.setInputStream(byteArrayInputStream); Object decoded = __amf3Input.readObject(); IMessage message = null; ArrayList<IMessage> al = new ArrayList<IMessage>(); while (decoded != null) { if (decoded instanceof IMessage) { message = (IMessage) decoded; } else if (decoded instanceof ASObject) { ASObject aso = (ASObject) decoded; Message m = new Message(); if (aso.get("type") != null) { m.setType(aso.get("type").toString()); } if (aso.get("uid") != null ) { m.setUid(aso.get("uid").toString()); } if (aso.containsKey("data")) { m.setData(aso.get("data")); } message = m; } al.add(message); try { decoded = __amf3Input.readObject(); } catch (Exception e) { decoded = null; __logger.error(e.getMessage()); } } return al; } }