package utils.nexus; import java.util.ArrayList; import org.apache.commons.lang.math.IntRange; import org.apache.log4j.Logger; public class NexusParser { private static final Logger logger = Logger.getLogger(NexusParser.class); private String input; private ArrayList<String> tokens; private int currentPos = 0; public NexusParser(String input){ this.input = input; } public void split(String regex, boolean discardEmptyTokens){ String splitted[] = input.split(regex); tokens = new ArrayList<String>(); for(String s : splitted){ if(s.equals("") && discardEmptyTokens){ }else{ tokens.add(s); } } } public int countTokens(){ if(tokens != null){ return tokens.size(); } else{ return 0; } } public boolean hasMoreTokens(){ if(currentPos + 1 < countTokens()){ return true; }else{ return false; } } public void next(){ currentPos ++; } public boolean isNextTokensRange(){ // logger.info(getTokenAt(currentPos)); // logger.info(isTokenInteger(currentPos)); // logger.info(getTokenAt(currentPos + 1)); // logger.info(matchesToken(currentPos + 1,"\\-")); // logger.info(getTokenAt(currentPos + 2)); // logger.info(isTokenInteger(currentPos + 2)); if(isTokenInteger(currentPos) && matchesToken(currentPos + 1,"\\-") && isTokenInteger(currentPos + 2)){ return true; } else{ return false; } } private boolean matchesToken(int pos, String matchString) { String token = getTokenAt(pos); if(token == null){ return false; } else{ //logger.info(matchString); return token.matches(matchString); } } private boolean isTokenInteger(int pos) { return matchesToken(pos,"-?\\d+(\\.\\d+)?(\\\\\\d+)?"); //match a number with optional '-' and decimal. and optional \3 } public boolean isNextTokenNumeric() { return isTokenInteger(currentPos); } private String getTokenAt(int pos) { if(pos < countTokens()){ return tokens.get(pos); } else{ return null; } } public boolean isNextTokensIntRange() { return isNextTokensRange(); } public NexusRange getNexusRange(int positionVal){ String firstVal = getTokenAt(currentPos); String secondVal = getTokenAt(currentPos + 2); // Get steps val from last integer (if there is one) e.g. 1223\3 String[] splitted = secondVal.split("\\\\"); secondVal = splitted[0]; String steps = "1"; if(splitted.length > 1){ steps = splitted[1]; } NexusRange range = new NexusRange(Integer.parseInt(firstVal), Integer.parseInt(secondVal), Integer.parseInt(steps), positionVal); // Spola fram currentPos += 3; return range; } public IntRange getIntegerAsRange() { String firstVal = getTokenAt(currentPos); IntRange range = new IntRange(Integer.parseInt(firstVal), Integer.parseInt(firstVal)); // Spola fram currentPos += 1; return range; } public String getToken() { return getTokenAt(currentPos); } public void debug() { // logger.info("tokenCount=" + countTokens()); for(String token: tokens){ // logger.info("token='" + token + "'"); } } public String getLine() { // TODO Auto-generated method stub return null; } }