This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
simple_java_nio_chat/src/Message.java

254 lines
8.7 KiB
Java

import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Type of the Message
*/
enum MessageType
{
OK, ERROR, MESSAGE, NEW_NICKNAME, JOINED, LEFT, BYE, PRIVATE
}
/**
* Message class
*/
public class
Message
{
public static final String REGEX_NICKNAME = "([^ .]+)";
public static final String REGEX_ROOM_NAME = "([^ .]+)";
public static final String REGEX_TEXT = "(.*)";
// Regex for command process
private static final String REGEX_CMD_OK = "OK";
private static final String REGEX_CMD_ERROR = "ERROR";
private static final String REGEX_CMD_MESSAGE = "MESSAGE " + REGEX_NICKNAME + " " + REGEX_TEXT;
private static final String REGEX_CMD_NEW_NICKNAME = "NEWNICK " + REGEX_NICKNAME + " " + REGEX_NICKNAME;
private static final String REGEX_CMD_JOINED = "JOINED " + REGEX_NICKNAME;
private static final String REGEX_CMD_LEFT = "LEFT " + REGEX_NICKNAME;
private static final String REGEX_CMD_BYE = "BYE";
private static final String REGEX_CMD_PRIVATE = "PRIVATE " + REGEX_NICKNAME + " " + REGEX_TEXT;
private final MessageType type;
// There are no getters for these two attributes, refer to toString
private final String token1;
private final String token2;
/**
* Constructor
*
* @param type
*/
public Message (MessageType type)
{
this.type = type;
this.token1 = "";
this.token2 = "";
}
/**
* Constructor
*
* @param type
* @param token1
*/
public Message (MessageType type, String token1)
{
this.type = type;
this.token1 = token1;
this.token2 = "";
}
/**
* Constructor
*
* @param type
* @param token1
* @param token2
*/
public Message (MessageType type, String token1, String token2)
{
this.type = type;
this.token1 = token1;
this.token2 = token2;
}
/**
* Message from String
* ONLY TO BE USED BY CHAT CLIENT (that is, command process and not
* message process as happens in the server)
*
* @param text
* @return Message
*/
public static Message
parse_string (String text)
{
MessageType type;
Matcher tokens;
String token1 = "";
String token2 = "";
if (Pattern.matches(REGEX_CMD_OK, text))
{
type = MessageType.OK;
}
else if (Pattern.matches(REGEX_CMD_ERROR, text))
{
type = MessageType.ERROR;
}
else if ((tokens = Pattern.compile(REGEX_CMD_MESSAGE).matcher(text)).find())
{
type = MessageType.MESSAGE;
token1 = tokens.group(1); // Emitter
token2 = tokens.group(2); // Message
}
else if ((tokens = Pattern.compile(REGEX_CMD_NEW_NICKNAME).matcher(text)).find())
{
type = MessageType.NEW_NICKNAME;
token1 = tokens.group(1); // Old nickname
token2 = tokens.group(2); // New nickname
}
else if ((tokens = Pattern.compile(REGEX_CMD_JOINED).matcher(text)).find())
{
type = MessageType.JOINED;
token1 = tokens.group(1);
}
else if ((tokens = Pattern.compile(REGEX_CMD_LEFT).matcher(text)).find())
{
type = MessageType.LEFT;
token1 = tokens.group(1);
}
else if (Pattern.matches(REGEX_CMD_BYE, text))
{
type = MessageType.BYE;
}
else if ((tokens = Pattern.compile(REGEX_CMD_PRIVATE).matcher(text)).find())
{
type = MessageType.PRIVATE;
token1 = tokens.group(1); // Emitter
token2 = tokens.group(2); // Message
}
else
{
type = MessageType.ERROR;
}
return new Message(type, token1, token2);
}
/**
* @return MessageType
*/
public MessageType
get_type ()
{
return this.type;
}
/**
* @return String
*/
@Override
public String
toString ()
{
return this.toString(false);
}
/**
* @param pretty
* @return String
*/
public String
toString (boolean pretty)
{
String output = "";
switch (this.type)
{
case OK:
if (pretty)
{
output = "Command successful.";
}
else
{
output = "OK";
}
break;
case ERROR:
if (pretty)
{
output = "Error. " + this.token1;
}
else
{
output = "ERROR";
}
break;
case MESSAGE:
if (pretty)
{
output = this.token1 + ": " + this.token2;
}
else
{
output = "MESSAGE " + this.token1 + " " + this.token2;
}
break;
case NEW_NICKNAME:
if (pretty)
{
output = this.token1 + " is now known as " + this.token2;
}
else
{
output = "NEWNICK " + this.token1 + " " + this.token2;
}
break;
case JOINED:
if (pretty)
{
output = this.token1 + " has joined the room.";
}
else
{
output = "JOINED " + this.token1;
}
break;
case LEFT:
if (pretty)
{
output = this.token1 + " left the room.";
}
else
{
output = "LEFT " + this.token1;
}
break;
case BYE:
if (pretty)
{
output = "Disconnected...";
}
else
{
output = "BYE";
}
break;
case PRIVATE:
if (pretty)
{
output = "<" + this.token1 + ">: " + this.token2;
}
else
{
output = "PRIVATE " + this.token1 + " " + this.token2;
}
break;
}
return output + "\n";
}
}