001    /*
002     * www.openamf.org
003     *
004     * Distributable under LGPL license.
005     * See terms of license at gnu.org.
006     */
007    
008    package org.granite.messaging.amf;
009    
010    import java.util.ArrayList;
011    import java.util.Iterator;
012    import java.util.List;
013    import java.io.Serializable;
014    
015    /**
016     * AMF Message
017     *
018     * @author Jason Calabrese <jasonc@missionvi.com>
019     * @author Pat Maddox <pergesu@users.sourceforge.net>
020     * @see AMF0Header
021     * @see AMF0Body
022     * @version $Revision: 1.13 $, $Date: 2003/11/30 02:25:00 $
023     */
024    public class AMF0Message implements Serializable {
025    
026        private static final long serialVersionUID = 1L;
027    
028        public static final int CURRENT_VERSION = 3;
029    
030        protected int version = CURRENT_VERSION;
031        protected final List<AMF0Header> headers = new ArrayList<AMF0Header>();
032        protected final List<AMF0Body> bodies = new ArrayList<AMF0Body>();
033    
034        public void addHeader(String key, boolean required, Object value) {
035            addHeader(new AMF0Header(key, required, value));
036        }
037    
038        public void addHeader(AMF0Header header) {
039            headers.add(header);
040        }
041    
042        public int getHeaderCount() {
043            return headers.size();
044        }
045    
046        public AMF0Header getHeader(int index) {
047            return headers.get(index);
048        }
049    
050        /**
051         *
052         * @return a List that contains zero or more {@link AMF0Header} objects
053         *
054         */
055        public List<AMF0Header> getHeaders() {
056            return headers;
057        }
058    
059        public AMF0Body addBody(String target, String response, Object value, byte type) {
060            return addBody(new AMF0Body(target, response, value, type));
061        }
062    
063        public AMF0Body addBody(AMF0Body body) {
064            bodies.add(body);
065            return body;
066        }
067    
068        public int getBodyCount() {
069            return bodies.size();
070        }
071    
072        public AMF0Body getBody(int index) {
073            return bodies.get(index);
074        }
075    
076        public Iterator<AMF0Body> getBodies() {
077            return bodies.iterator();
078        }
079    
080        public boolean isFirstMessage() {
081            if (bodies.size() == 1)
082                return bodies.get(0).isFirstBody();
083    
084            for (AMF0Body body : bodies) {
085                if (body.isFirstBody())
086                    return true;
087            }
088    
089            return false;
090        }
091    
092        public int getVersion() {
093            return version;
094        }
095    
096        public void setVersion(int version) {
097            this.version = version;
098        }
099    
100        public String getBodiesString() {
101            StringBuffer sb = new StringBuffer();
102            for (int i = 0; i < bodies.size(); i++) {
103                if (i > 0) {
104                    sb.append('\n');
105                }
106                AMF0Body amfBody = bodies.get(i);
107                sb.append(amfBody);
108            }
109            return sb.toString();
110        }
111    
112        /*
113         * AMFMessage content
114         */
115    
116        @Override
117        public String toString() {
118            return toString("");
119        }
120    
121        public String toString(String indent) {
122            final String innerIndent = indent + "    ";
123    
124            StringBuilder sb = new StringBuilder(2048);
125            sb.append('\n').append(indent).append(AMF0Message.class.getName()).append(" {");
126    
127            // Print version.
128            sb.append('\n').append(indent).append("  version = ").append(version);
129    
130            // Print headers.
131            sb.append('\n').append(indent).append("  headers = [");
132            for (int i = 0; i < headers.size(); i++) {
133                AMF0Header amfHeader = headers.get(i);
134                sb.append(amfHeader.toString(innerIndent));
135            }
136            if (headers.size() > 0)
137                sb.append('\n').append(indent).append("  ");
138            sb.append(']');
139    
140            // Print bodies.
141            sb.append('\n').append(indent).append("  bodies = [");
142            for (int i = 0; i < bodies.size(); i++) {
143                if (i > 0)
144                    sb.append(',');
145                AMF0Body amfBody = bodies.get(i);
146                sb.append(amfBody.toString(innerIndent));
147            }
148            if (bodies.size() > 0)
149                sb.append('\n').append(indent).append("  ");
150            sb.append(']');
151    
152            sb.append('\n').append(indent).append("}");
153    
154            return sb.toString();
155        }
156    
157    }