001/*
002 * www.openamf.org
003 *
004 * Distributable under LGPL license.
005 * See terms of license at gnu.org.
006 */
007
008package org.granite.messaging.amf;
009
010import java.util.ArrayList;
011import java.util.Iterator;
012import java.util.List;
013import 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 */
024public 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}