package com.comphenix.xp.parser.text;
import java.util.List;
import java.util.Queue;
import org.apache.commons.lang.StringUtils;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import com.comphenix.xp.lookup.PlayerQuery;
import com.comphenix.xp.parser.ParsingException;
import com.comphenix.xp.parser.TextParser;
import com.comphenix.xp.parser.Utility;
import com.comphenix.xp.parser.primitives.BooleanParser;
import com.comphenix.xp.parser.primitives.StringParser;
public class PlayerParser extends TextParser<PlayerQuery> {
private ParameterParser<String> nameParser;
private ParameterParser<String> groupParser;
private ParameterParser<DamageCause> damageCauseParser;
private BooleanParser murderParser = new BooleanParser("murder");
public PlayerParser() {
this.nameParser = new ParameterParser<String>(new StringParser());
this.groupParser = new ParameterParser<String>(new StringParser());
this.damageCauseParser = new ParameterParser<DamageCause>(new MobDamageCauseParser());
}
@Override
public PlayerQuery parse(String text) throws ParsingException {
Queue<String> tokens = getParameterQueue(text);
ParsingException errorReason = null;
// Default values
List<String> names = Utility.getElementList((String) null);
List<String> groups = Utility.getElementList((String) null);
List<DamageCause> causes = Utility.getElementList((DamageCause) null);;
try {
names = nameParser.parse(tokens);
groups = groupParser.parse(tokens);
causes = damageCauseParser.parse(tokens);
} catch (ParsingException e) {
// Try more
errorReason = e;
}
// Scan all unused parameters for these options
List<Boolean> murder = murderParser.parseAny(tokens);
// If there are some tokens left, a problem occurred
if (!tokens.isEmpty()) {
// Let the user know about the reason too
if (errorReason != null)
throw errorReason;
else
throw ParsingException.fromFormat("Unknown item tokens: %s", StringUtils.join(tokens, ", "));
}
return new PlayerQuery(names, groups, causes, murder);
}
public ParameterParser<String> getNameParser() {
return nameParser;
}
public void setNameParser(ParameterParser<String> nameParser) {
this.nameParser = nameParser;
}
public ParameterParser<String> getGroupParser() {
return groupParser;
}
public void setGroupParser(ParameterParser<String> groupParser) {
this.groupParser = groupParser;
}
public ParameterParser<DamageCause> getDamageCauseParser() {
return damageCauseParser;
}
public void setDamageCauseParser(ParameterParser<DamageCause> damageCauseParser) {
this.damageCauseParser = damageCauseParser;
}
public BooleanParser getMurderParser() {
return murderParser;
}
public void setMurderParser(BooleanParser murderParser) {
this.murderParser = murderParser;
}
}