package org.marketcetera.photon.parser;
import java.util.List;
import org.codehaus.jparsec.Parser;
import org.codehaus.jparsec.Parsers;
import org.codehaus.jparsec.Scanners;
import org.codehaus.jparsec.pattern.CharPredicates;
import org.codehaus.jparsec.pattern.Patterns;
import org.marketcetera.photon.IBrokerIdValidator;
import org.marketcetera.trade.OrderSingle;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Parses a command string.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: CommandParser.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: CommandParser.java 16154 2012-07-14 16:34:05Z colin $")
public class CommandParser {
/**
* A typical word is a sequence of non-whitespace characters.
*/
private static final Parser<String> WORD = Scanners.pattern(
Patterns.regex("\\S*"), "part").source(); //$NON-NLS-1$ //$NON-NLS-2$
private static final Parser<List<String>> CANCEL_PARSER = Parsers.sequence(
Scanners.isChar(CharPredicates.among("cC")), Scanners.WHITESPACES, //$NON-NLS-1$
WORD.sepBy(Scanners.WHITESPACES));
private final Parser<Object> mCommandParser;
/**
* Constructor.
*
* @param brokerIdValidator
* validates broker id's on order commands, can be null
*/
public CommandParser(IBrokerIdValidator brokerIdValidator) {
mCommandParser = Parsers.or(CANCEL_PARSER, Parsers.sequence(Scanners
.isChar(CharPredicates.among("oO")), Scanners.WHITESPACES, //$NON-NLS-1$
new OrderSingleParser(brokerIdValidator).getParser()));
}
/**
* Parse a command into a string. Currently two commands are supported:
* <ol>
* <li>Order - "o b 10 METC 10", a new OrderSingle object will be returned</li>
* <li>Cancel - "c 1001 1002", a list of strings (the order id's) will be
* returned</li>
* </ol>
*
* @param string
* the command string
* @return either {@link OrderSingle} or {@link List<String>}
*/
public Object parseCommand(String string) {
return mCommandParser.parse(string);
}
}