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 String CONTENT_TYPE = "application/x-amf";
029        public static final int CURRENT_VERSION = 3;
030    
031        protected int version = CURRENT_VERSION;
032        protected final List<AMF0Header> headers = new ArrayList<AMF0Header>();
033        protected final List<AMF0Body> bodies = new ArrayList<AMF0Body>();
034    
035        public void addHeader(String key, boolean required, Object value) {
036            addHeader(new AMF0Header(key, required, value));
037        }
038    
039        public void addHeader(AMF0Header header) {
040            headers.add(header);
041        }
042    
043        public int getHeaderCount() {
044            return headers.size();
045        }
046    
047        public AMF0Header getHeader(int index) {
048            return headers.get(index);
049        }
050    
051        /**
052         *
053         * @return a List that contains zero or more {@link AMF0Header} objects
054         *
055         */
056        public List<AMF0Header> getHeaders() {
057            return headers;
058        }
059    
060        public AMF0Body addBody(String target, String response, Object value, byte type) {
061            return addBody(new AMF0Body(target, response, value, type));
062        }
063    
064        public AMF0Body addBody(AMF0Body body) {
065            bodies.add(body);
066            return body;
067        }
068    
069        public int getBodyCount() {
070            return bodies.size();
071        }
072    
073        public AMF0Body getBody(int index) {
074            return bodies.get(index);
075        }
076    
077        public Iterator<AMF0Body> getBodies() {
078            return bodies.iterator();
079        }
080    
081        public boolean isFirstMessage() {
082            if (bodies.size() == 1)
083                return bodies.get(0).isFirstBody();
084    
085            for (AMF0Body body : bodies) {
086                if (body.isFirstBody())
087                    return true;
088            }
089    
090            return false;
091        }
092    
093        public int getVersion() {
094            return version;
095        }
096    
097        public void setVersion(int version) {
098            this.version = version;
099        }
100    
101        public String getBodiesString() {
102            StringBuffer sb = new StringBuffer();
103            for (int i = 0; i < bodies.size(); i++) {
104                if (i > 0) {
105                    sb.append('\n');
106                }
107                AMF0Body amfBody = bodies.get(i);
108                sb.append(amfBody);
109            }
110            return sb.toString();
111        }
112    
113        /*
114         * AMFMessage content
115         */
116    
117        @Override
118        public String toString() {
119            return toString("");
120        }
121    
122        public String toString(String indent) {
123            final String innerIndent = indent + "    ";
124    
125            StringBuilder sb = new StringBuilder(2048);
126            sb.append('\n').append(indent).append(AMF0Message.class.getName()).append(" {");
127    
128            // Print version.
129            sb.append('\n').append(indent).append("  version = ").append(version);
130    
131            // Print headers.
132            sb.append('\n').append(indent).append("  headers = [");
133            for (int i = 0; i < headers.size(); i++) {
134                AMF0Header amfHeader = headers.get(i);
135                sb.append(amfHeader.toString(innerIndent));
136            }
137            if (headers.size() > 0)
138                sb.append('\n').append(indent).append("  ");
139            sb.append(']');
140    
141            // Print bodies.
142            sb.append('\n').append(indent).append("  bodies = [");
143            for (int i = 0; i < bodies.size(); i++) {
144                if (i > 0)
145                    sb.append(',');
146                AMF0Body amfBody = bodies.get(i);
147                sb.append(amfBody.toString(innerIndent));
148            }
149            if (bodies.size() > 0)
150                sb.append('\n').append(indent).append("  ");
151            sb.append(']');
152    
153            sb.append('\n').append(indent).append("}");
154    
155            return sb.toString();
156        }
157    
158    }