package commons.application.core;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import commons.application.ctx.Context;
/**
 * Abstract base of service meta class.
 * @author kst
 */
public abstract class CommandMeta
{

private Map<String, MetaDefinition> _map = new HashMap<String, MetaDefinition>();

public abstract boolean evaluate (Command service, Context ctx);

/**
 * A container class for meta definitions.
 * @author kst
 */
static class MetaDefinition
{

@SuppressWarnings("unused")
private String    _inboundKey;
private Pattern   _pattern;
private String    _message;
private Validator _validator = null;

MetaDefinition(String inboundKey, Pattern pattern, Validator validator, String message)
{
   _inboundKey = inboundKey;
   _message = message;
   _validator = validator;
   _pattern = pattern;
}

private MetaDefinition(String inboundKey, Validator validator, String message)
{
   _inboundKey = inboundKey;
   _message = message;
   _validator = validator;
}

private MetaDefinition(String inboundKey, Pattern pattern, String message)
{
   _inboundKey = inboundKey;
   _pattern = pattern;
   _message = message;
}

private MetaDefinition(String inboundKey)
{
   _inboundKey = inboundKey;
}

private String getMessage ()
{
   return _message;
}

private Pattern getPattern ()
{
   return _pattern;
}

private Validator getValidator ()
{
   return _validator;
}
}

public Iterator<String> keyIterator ()
{
   Iterator<String> keyIter = null;
   Set<String> keySet = _map.keySet();
   if (keySet != null)
   {
      keyIter = keySet.iterator();
   }
   return keyIter;
}

public void add (String inboundKey, Pattern pattern, Validator validator, String message)
{
   _map.put(inboundKey, new MetaDefinition(inboundKey, pattern, validator, message));
}

public void add (String inboundKey, Validator validator, String message)
{
   _map.put(inboundKey, new MetaDefinition(inboundKey, validator, message));
}

public void add (String inboundKey, Pattern pattern, String message)
{
   _map.put(inboundKey, new MetaDefinition(inboundKey, pattern, message));
}

public void add (String inboundKey)
{
   _map.put(inboundKey, new MetaDefinition(inboundKey));
}

public boolean hasDef (String inboundKey)
{
   return _map.containsKey(inboundKey);
}

private MetaDefinition getMetaDef (String inboundKey)
{
   return _map.get(inboundKey);
}

public Pattern getPattern (String inKey)
{
   return hasDef(inKey) ? getMetaDef(inKey).getPattern() : null;
}

public Validator getValidator (String inKey)
{
   return hasDef(inKey) ? getMetaDef(inKey).getValidator() : null;
}

public String getMessage (String inKey)
{
   return hasDef(inKey) ? getMetaDef(inKey).getMessage() : null;
}
}
