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 }