001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.activemq.transport.stomp; 018 019 import java.io.UnsupportedEncodingException; 020 import java.util.Arrays; 021 import java.util.HashMap; 022 import java.util.Iterator; 023 import java.util.Map; 024 025 import org.apache.activemq.command.Command; 026 import org.apache.activemq.command.Endpoint; 027 import org.apache.activemq.command.Response; 028 import org.apache.activemq.state.CommandVisitor; 029 import org.apache.activemq.util.MarshallingSupport; 030 031 /** 032 * Represents all the data in a STOMP frame. 033 * 034 * @author <a href="http://hiramchirino.com">chirino</a> 035 */ 036 public class StompFrame implements Command { 037 038 public static final byte[] NO_DATA = new byte[] {}; 039 040 private String action; 041 private Map<String, String> headers = new HashMap<String, String>(); 042 private byte[] content = NO_DATA; 043 044 public StompFrame(String command) { 045 this(command, null, null); 046 } 047 048 public StompFrame(String command, Map<String, String> headers) { 049 this(command, headers, null); 050 } 051 052 public StompFrame(String command, Map<String, String> headers, byte[] data) { 053 this.action = command; 054 if (headers != null) 055 this.headers = headers; 056 if (data != null) 057 this.content = data; 058 } 059 060 public StompFrame() { 061 } 062 063 public String getAction() { 064 return action; 065 } 066 067 public void setAction(String command) { 068 this.action = command; 069 } 070 071 public byte[] getContent() { 072 return content; 073 } 074 075 public String getBody() { 076 try { 077 return new String(content, "UTF-8"); 078 } catch (UnsupportedEncodingException e) { 079 return new String(content); 080 } 081 } 082 083 public void setContent(byte[] data) { 084 this.content = data; 085 } 086 087 public Map<String, String> getHeaders() { 088 return headers; 089 } 090 091 public void setHeaders(Map<String, String> headers) { 092 this.headers = headers; 093 } 094 095 // 096 // Methods in the Command interface 097 // 098 public int getCommandId() { 099 return 0; 100 } 101 102 public Endpoint getFrom() { 103 return null; 104 } 105 106 public Endpoint getTo() { 107 return null; 108 } 109 110 public boolean isBrokerInfo() { 111 return false; 112 } 113 114 public boolean isMessage() { 115 return false; 116 } 117 118 public boolean isMessageAck() { 119 return false; 120 } 121 122 public boolean isMessageDispatch() { 123 return false; 124 } 125 126 public boolean isMessageDispatchNotification() { 127 return false; 128 } 129 130 public boolean isResponse() { 131 return false; 132 } 133 134 public boolean isResponseRequired() { 135 return false; 136 } 137 138 public boolean isShutdownInfo() { 139 return false; 140 } 141 142 public boolean isConnectionControl() { 143 return false; 144 } 145 146 public boolean isWireFormatInfo() { 147 return false; 148 } 149 150 public void setCommandId(int value) { 151 } 152 153 public void setFrom(Endpoint from) { 154 } 155 156 public void setResponseRequired(boolean responseRequired) { 157 } 158 159 public void setTo(Endpoint to) { 160 } 161 162 public Response visit(CommandVisitor visitor) throws Exception { 163 return null; 164 } 165 166 public byte getDataStructureType() { 167 return 0; 168 } 169 170 public boolean isMarshallAware() { 171 return false; 172 } 173 174 public String toString() { 175 return format(true); 176 } 177 178 public String format() { 179 return format(false); 180 } 181 182 public String format(boolean forLogging) { 183 StringBuffer buffer = new StringBuffer(); 184 buffer.append(getAction()); 185 buffer.append("\n"); 186 Map headers = getHeaders(); 187 for (Iterator iter = headers.entrySet().iterator(); iter.hasNext();) { 188 Map.Entry entry = (Map.Entry)iter.next(); 189 buffer.append(entry.getKey()); 190 buffer.append(":"); 191 if (forLogging && entry.getKey().toString().toLowerCase().contains(Stomp.Headers.Connect.PASSCODE)) { 192 buffer.append("*****"); 193 } else { 194 buffer.append(entry.getValue()); 195 } 196 buffer.append("\n"); 197 } 198 buffer.append("\n"); 199 if (getContent() != null) { 200 try { 201 String contentString = new String(getContent(), "UTF-8"); 202 if (forLogging) { 203 contentString = MarshallingSupport.truncate64(contentString); 204 } 205 buffer.append(contentString); 206 } catch (Throwable e) { 207 buffer.append(Arrays.toString(getContent())); 208 } 209 } 210 return buffer.toString(); 211 } 212 }