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 }