/*
* Copyright 2010 david varnes.
*
* Licensed under the Apache License, version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.freeswitch.esl.client.transport.message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.freeswitch.esl.client.transport.message.EslHeaders.Name;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Basic FreeSWITCH Event Socket messages from the server are decoded into this data object.
* <p>
* An ESL message is modelled as text lines. A message always has one or more header lines, and
* optionally may have some body lines.
* <p>
* Header lines are parsed and cached in a map keyed by the {@link EslHeaders.Name} enum. A message
* is always expected to have a "Content-Type" header
* <p>
* Any Body lines are cached in a list.
*
* @author david varnes
* @see EslHeaders.Name
*/
public class EslMessage
{
private final Logger log = LoggerFactory.getLogger( this.getClass() );
private final Map<Name,String> headers = new HashMap<Name,String>();
private final List<String> body = new ArrayList<String>();
private Integer contentLength = null;
/**
* All the received message headers in a map keyed by {@link EslHeaders.Name}. The string mapped value
* is the parsed content of the header line (ie, it does not include the header name).
*
* @return map of header values
*/
public Map<Name,String> getHeaders()
{
return headers;
}
/**
* Convenience method
*
* @param headerName as a {@link EslHeaders.Name}
* @return true if an only if there is a header entry with the supplied header name
*/
public boolean hasHeader( Name headerName )
{
return headers.containsKey( headerName );
}
/**
* Convenience method
*
* @param headerName as a {@link EslHeaders.Name}
* @return same as getHeaders().get( headerName )
*/
public String getHeaderValue( Name headerName )
{
return headers.get( headerName );
}
/**
* Convenience method
*
* @return true if and only if a header exists with name "Content-Length"
*/
public boolean hasContentLength()
{
return headers.containsKey( Name.CONTENT_LENGTH );
}
/**
* Convenience method
*
* @return integer value of header with name "Content-Length"
*/
public Integer getContentLength()
{
if ( contentLength != null )
{
return contentLength;
}
if ( hasContentLength() )
{
contentLength = Integer.valueOf( headers.get( Name.CONTENT_LENGTH) );
}
return contentLength;
}
/**
* Convenience method
*
* @return header value of header with name "Content-Type"
*/
public String getContentType()
{
return headers.get( Name.CONTENT_TYPE );
}
/**
* Any received message body lines
*
* @return list with a string for each line received, may be an empty list
*/
public List<String> getBodyLines()
{
return body;
}
/**
* Used by the {@link EslMessageDecoder}.
*
* @param name
* @param value
*/
void addHeader( Name name, String value )
{
log.debug( "adding header [{}] [{}]", name, value );
headers.put( name, value );
}
/**
* Used by the {@link EslMessageDecoder}
*
* @param line
*/
void addBodyLine( String line )
{
if ( line == null )
{
return;
}
body.add( line );
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder( "EslMessage: contentType=[" );
sb.append( getContentType() );
sb.append( "] headers=" );
sb.append( headers.size() );
sb.append( ", body=" );
sb.append( body.size() );
sb.append( " lines." );
return sb.toString();
}
}