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}