package org.mailster.smtp.core.commands;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import org.apache.mina.core.session.IoSession;
import org.mailster.smtp.core.SMTPConnectionHandler;
/**
* An abstract class which provides a minimal function set used
* by SMTP commands implementations.
*
* @author De Oliveira Edouard <doe_wanted@yahoo.fr>
* @author Ian McFarland <ian@neo.com>
* @author Jon Stevens
*/
abstract public class AbstractCommand implements Command
{
private String name;
private CommandHandler handler;
private static Map<String, HelpMessage> helpMessageMap = new HashMap<String, HelpMessage>();
public AbstractCommand(String name, String help)
{
this.name = name;
if (help != null)
setHelp(new HelpMessage(name, help));
}
public AbstractCommand(String name, String help, String argumentDescription)
{
this.name = name;
if (help != null)
setHelp(new HelpMessage(name, help, argumentDescription));
}
private void setHelp(HelpMessage helpMessage)
{
helpMessageMap.put(helpMessage.getName().toUpperCase(), helpMessage);
}
public CommandHandler getCommandHandler()
{
return handler;
}
public void setCommandHandler(CommandHandler handler)
{
this.handler = handler;
}
public HelpMessage getHelp(String commandName)
throws CommandException
{
HelpMessage msg = helpMessageMap.get(commandName.toUpperCase());
if (msg == null)
throw new CommandException();
return msg;
}
protected Map<String, HelpMessage> getHelp()
{
return helpMessageMap;
}
protected String getArgPredicate(String commandString)
{
if (commandString == null || commandString.length() < 4)
return "";
return commandString.substring(4).trim();
}
public String getName()
{
return name;
}
protected void sendResponse(IoSession session, String response)
throws IOException
{
SMTPConnectionHandler.sendResponse(session, response);
}
protected boolean isValidEmailAddress(String address)
{
// MAIL FROM: <>
if (address.length() == 0)
return true;
try
{
InternetAddress[] ia = InternetAddress.parse(address, true);
return (ia.length != 0);
}
catch (AddressException ae)
{
return false;
}
}
protected static void getTokenizedString(StringBuilder sb, Collection<String> items, String delim)
{
for( Iterator<String> it=items.iterator(); it.hasNext(); )
{
sb.append(it.next());
if( it.hasNext() )
sb.append(delim);
}
}
protected String[] getArgs(String commandString)
{
List<String> strings = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(commandString);
while (st.hasMoreTokens())
strings.add(st.nextToken());
return strings.toArray(new String[strings.size()]);
}
protected String extractEmailAddress(String args, int subcommandOffset)
{
String address = args.substring(subcommandOffset).trim();
if (address.indexOf('<') == 0)
address = address.substring(1, address.indexOf('>'));
return address;
}
@Override
public boolean isAuthRequired()
{
return true;
}
}