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    }