001 /**
002 * GRANITE DATA SERVICES
003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 * This file is part of the Granite Data Services Platform.
006 *
007 * Granite Data Services is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * Granite Data Services is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 * USA, or see <http://www.gnu.org/licenses/>.
021 */
022 /*
023 * www.openamf.org
024 *
025 * Distributable under LGPL license.
026 * See terms of license at gnu.org.
027 */
028
029 package org.granite.messaging.amf;
030
031 import java.util.ArrayList;
032 import java.util.Iterator;
033 import java.util.List;
034 import java.io.Serializable;
035
036 /**
037 * AMF Message
038 *
039 * @author Jason Calabrese <jasonc@missionvi.com>
040 * @author Pat Maddox <pergesu@users.sourceforge.net>
041 * @see AMF0Header
042 * @see AMF0Body
043 * @version $Revision: 1.13 $, $Date: 2003/11/30 02:25:00 $
044 */
045 public class AMF0Message implements Serializable {
046
047 private static final long serialVersionUID = 1L;
048
049 public static final int CURRENT_VERSION = 3;
050
051 protected int version = CURRENT_VERSION;
052 protected final List<AMF0Header> headers = new ArrayList<AMF0Header>();
053 protected final List<AMF0Body> bodies = new ArrayList<AMF0Body>();
054
055 public void addHeader(String key, boolean required, Object value) {
056 addHeader(new AMF0Header(key, required, value));
057 }
058
059 public void addHeader(AMF0Header header) {
060 headers.add(header);
061 }
062
063 public int getHeaderCount() {
064 return headers.size();
065 }
066
067 public AMF0Header getHeader(int index) {
068 return headers.get(index);
069 }
070
071 /**
072 *
073 * @return a List that contains zero or more {@link AMF0Header} objects
074 *
075 */
076 public List<AMF0Header> getHeaders() {
077 return headers;
078 }
079
080 public AMF0Body addBody(String target, String response, Object value, byte type) {
081 return addBody(new AMF0Body(target, response, value, type));
082 }
083
084 public AMF0Body addBody(AMF0Body body) {
085 bodies.add(body);
086 return body;
087 }
088
089 public int getBodyCount() {
090 return bodies.size();
091 }
092
093 public AMF0Body getBody(int index) {
094 return bodies.get(index);
095 }
096
097 public Iterator<AMF0Body> getBodies() {
098 return bodies.iterator();
099 }
100
101 public boolean isFirstMessage() {
102 if (bodies.size() == 1)
103 return bodies.get(0).isFirstBody();
104
105 for (AMF0Body body : bodies) {
106 if (body.isFirstBody())
107 return true;
108 }
109
110 return false;
111 }
112
113 public int getVersion() {
114 return version;
115 }
116
117 public void setVersion(int version) {
118 this.version = version;
119 }
120
121 public String getBodiesString() {
122 StringBuffer sb = new StringBuffer();
123 for (int i = 0; i < bodies.size(); i++) {
124 if (i > 0) {
125 sb.append('\n');
126 }
127 AMF0Body amfBody = bodies.get(i);
128 sb.append(amfBody);
129 }
130 return sb.toString();
131 }
132
133 /*
134 * AMFMessage content
135 */
136
137 @Override
138 public String toString() {
139 return toString("");
140 }
141
142 public String toString(String indent) {
143 final String innerIndent = indent + " ";
144
145 StringBuilder sb = new StringBuilder(2048);
146 sb.append('\n').append(indent).append(AMF0Message.class.getName()).append(" {");
147
148 // Print version.
149 sb.append('\n').append(indent).append(" version = ").append(version);
150
151 // Print headers.
152 sb.append('\n').append(indent).append(" headers = [");
153 for (int i = 0; i < headers.size(); i++) {
154 AMF0Header amfHeader = headers.get(i);
155 sb.append(amfHeader.toString(innerIndent));
156 }
157 if (headers.size() > 0)
158 sb.append('\n').append(indent).append(" ");
159 sb.append(']');
160
161 // Print bodies.
162 sb.append('\n').append(indent).append(" bodies = [");
163 for (int i = 0; i < bodies.size(); i++) {
164 if (i > 0)
165 sb.append(',');
166 AMF0Body amfBody = bodies.get(i);
167 sb.append(amfBody.toString(innerIndent));
168 }
169 if (bodies.size() > 0)
170 sb.append('\n').append(indent).append(" ");
171 sb.append(']');
172
173 sb.append('\n').append(indent).append("}");
174
175 return sb.toString();
176 }
177
178 }