package com.esri.geoevent.solutions.transport.irc.jerklib;
import java.util.ArrayList;
import java.util.List;
/**
*
* A Class to parse a line of IRC text
*
* <pre>
* <message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
* <prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
* <command> ::= <letter> { <letter> } | <number> <number> <number>
* <SPACE> ::= ' ' { ' ' }
* <params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ]
*
* <middle> ::= <Any *non-empty* sequence of octets not including SPACE
* or NUL or CR or LF, the first of which may not be ':'>
* <trailing> ::= <Any, possibly *empty*, sequence of octets not including
* NUL or CR or LF>
* </pre>
*
* @author mohadib
*
*/
public class EventToken
{
private final String data;
private String prefix = "", command = "";
private List<String>arguments = new ArrayList<String>();
private int offset = 0;
/**
* Create a new EventToken
*
* @param data to parse
*/
public EventToken(String data)
{
this.data = data;
parse();
}
/**
* Parse message
*/
private void parse()
{
//see if message has prefix
if(data.startsWith(":"))
{
extractPrefix(data);
incTillChar();
}
//get command
command = data.substring(offset , data.indexOf(" ", offset));
offset += command.length();
incTillChar();
extractArguments();
}
/**
* Extract arguments from message
*/
private void extractArguments()
{
String argument = "";
for(int i = offset; i < data.length() ; i++)
{
if(!Character.isWhitespace(data.charAt(i)))
{
argument += data.charAt(i);
//if argument.equals(":") then arg is everything till EOL
if(argument.length() == 1 && argument.equals(":"))
{
argument = data.substring(i + 1);
arguments.add(argument);
return;
}
offset++;
}
else
{
if(argument.length() > 0)
{
arguments.add(argument);
argument = "";
}
offset++;
}
}
if(argument.length() != 0)
{
arguments.add(argument);
}
}
/**
* Increment offset until a non-whitespace char is found
*/
private void incTillChar()
{
for(int i = offset ; i < data.length(); i++)
{
if(!Character.isWhitespace(data.charAt(i)))
{
return;
}
offset++;
}
}
/**
* Extract prefix part of messgae , inc offset
*
* @param data
*/
private void extractPrefix(String data)
{
//set prefix - : is at 0
prefix = data.substring(1 , data.indexOf(" "));
//increment offset , +1 is for : removed
offset += prefix.length() + 1;
}
/**
* Gets hostname from message
* @return hostname or empty string if hostname could not be parsed
*/
public String hostName()
{
int index = prefix.indexOf('@');
if(index != -1 && index + 1 < prefix.length())
{
return prefix.substring(index + 1);
}
return "";
}
/**
* Get username from message
*
* @return username or empty string is username could not be parsed.
*/
public String userName()
{
int sindex = prefix.indexOf('!');
int eindex = prefix.indexOf("@");
if(eindex == -1)eindex = prefix.length() - 1;
if(sindex != -1 && sindex + 1 < prefix.length())
{
return prefix.substring(sindex + 1 , eindex);
}
return "";
}
/**
* Get nick from message
*
* @return nick or empty string is could not be parsed
*/
public String nick()
{
if(prefix.indexOf("!") != -1)
{
return prefix.substring(0,prefix.indexOf('!'));
}
return "";
}
/**
* Gets message prefix if any
* @return returns prefix or empty string if no prefix
*/
public String prefix()
{
return prefix;
}
/**
* Gets the command
* @return the command
*/
public String command()
{
return command;
}
/**
* Gets list of arguments
*
* @return list of arguments
*/
public List<String>args()
{
return arguments;
}
/**
* Gets an argument
*
* @param index
* @return the argument or null if no argument at that index
*/
public String arg(int index)
{
if(index < arguments.size())
{
return arguments.get(index);
}
return null;
}
/**
* Returns raw event data
*
* @return raw event data
*/
public String data()
{
return data;
}
/**
* Get the numeric code of an event.
*
* @return numeric or -1 if command is not numeric
*/
public int numeric()
{
int i = -1;
try
{
i = Integer.parseInt(command);
}
catch (NumberFormatException e){}
return i;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return data;
}
}