package de.neuland.jade4j.util; import java.util.ArrayList; import java.util.List; /** * Split arguments passed as single String into list of strings, preserve quotes when argument is not simple string constant. * For example: * foo('a'),'b' -> [ "foo('a')", "b" ] * * @author dusan.zatkovsky, 2/5/15 */ public class ArgumentSplitter { private static final char argumentDelimiter = ','; private final String arguments; private List<String> argList = new ArrayList<String>(); /** * Split arguments passed as single String into list * @param arguments * @return Parsed arguments */ public static List<String> split(String arguments) { return new ArgumentSplitter(arguments).splitArguments(); } private ArgumentSplitter(String arguments) { this.arguments = arguments; } private List<String> splitArguments() { final int argLength = arguments.length(); StringBuilder sb = new StringBuilder(argLength); boolean insideQuotas = false; int bracesBlock = 0; for (int i = 0; i < argLength; i++) { char ch = arguments.charAt(i); // detect when pointer is inside quoted text if (ch == '"' || ch == '\'') { insideQuotas = !insideQuotas; } else if (ch == '(') { bracesBlock++; } else if (ch == ')') { bracesBlock--; } // detect argument delimiter, then push argument else if (ch == argumentDelimiter && !insideQuotas && bracesBlock == 0) { pushArg(sb); sb = new StringBuilder(argLength); } sb.append(ch); } pushArg(sb); return argList; } private void pushArg(StringBuilder sb) { argList.add(sb.toString().trim().replaceAll("^,", "").trim()); sb = new StringBuilder(arguments.length()); } }