001 package org.granite.client.messaging.channel.amf;
002
003 import java.io.IOException;
004 import java.io.InputStream;
005 import java.io.UnsupportedEncodingException;
006 import java.net.URI;
007
008 import org.granite.client.configuration.Configuration;
009 import org.granite.client.messaging.channel.AsyncToken;
010 import org.granite.client.messaging.codec.JMFAMF0MessagingCodec;
011 import org.granite.client.messaging.codec.MessagingCodec;
012 import org.granite.client.messaging.messages.ResponseMessage;
013 import org.granite.client.messaging.messages.responses.AbstractResponseMessage;
014 import org.granite.client.messaging.transport.DefaultTransportMessage;
015 import org.granite.client.messaging.transport.Transport;
016 import org.granite.client.messaging.transport.TransportMessage;
017 import org.granite.messaging.amf.AMF0Body;
018 import org.granite.messaging.amf.AMF0Message;
019 import org.granite.messaging.amf.AMF3Object;
020
021 import flex.messaging.messages.AcknowledgeMessage;
022 import flex.messaging.messages.Message;
023
024 public class JMFAMFRemotingChannel extends AMFRemotingChannel {
025
026 public JMFAMFRemotingChannel(Transport transport, String id, URI uri) {
027 super(transport, id, uri);
028 }
029
030 public JMFAMFRemotingChannel(Transport transport, String id, URI uri, int maxConcurrentRequests) {
031 super(transport, id, uri, maxConcurrentRequests);
032 }
033
034 public JMFAMFRemotingChannel(Transport transport, Configuration configuration, String id, URI uri, int maxConcurrentRequests) {
035 super(transport, configuration, id, uri, maxConcurrentRequests);
036 }
037
038 @Override
039 protected MessagingCodec<AMF0Message> newMessagingCodec(Configuration configuration) {
040 return new JMFAMF0MessagingCodec(configuration);
041 }
042
043 @Override
044 protected TransportMessage createTransportMessage(AsyncToken token) throws UnsupportedEncodingException {
045 AMF0Message amf0Message = new AMF0Message();
046 for (Message message : convertToAmf(token.getRequest())) {
047 AMF0Body body = new AMF0Body("", "/" + (index++), new Object[]{message}, AMF0Body.DATA_TYPE_AMF3_OBJECT);
048 amf0Message.addBody(body);
049 }
050 return new DefaultTransportMessage<AMF0Message>(token.getId(), false, clientId, null, amf0Message, codec);
051 }
052
053 @Override
054 protected ResponseMessage decodeResponse(InputStream is) throws IOException {
055 final AMF0Message amf0Message = codec.decode(is);
056 final int messagesCount = amf0Message.getBodyCount();
057
058 AbstractResponseMessage response = null, previous = null;
059
060 for (int i = 0; i < messagesCount; i++) {
061 AMF0Body body = amf0Message.getBody(i);
062
063 if (!(body.getValue() instanceof AMF3Object))
064 throw new RuntimeException("Message should be an AMF3Object: " + body.getValue());
065
066 AMF3Object bodyObject = (AMF3Object)body.getValue();
067 if (!(bodyObject.getValue() instanceof AcknowledgeMessage))
068 throw new RuntimeException("Message should be an AcknowledgeMessage: " + bodyObject.getValue());
069
070 AcknowledgeMessage message = (AcknowledgeMessage)bodyObject.getValue();
071 AbstractResponseMessage current = convertFromAmf(message);
072
073 if (response == null)
074 response = previous = current;
075 else {
076 previous.setNext(current);
077 previous = current;
078 }
079 }
080
081 return response;
082 }
083 }