package org.radargun.utils; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import org.radargun.config.Converter; import org.radargun.logging.Log; import org.radargun.logging.LogFactory; /** * Tokenizes the arguments into list, parsing text in apostrophes. * Apostrophes cannot be escaped. * * @author Radim Vansa <rvansa@redhat.com> */ public class ArgsConverter implements Converter<List<String>> { private static Log log = LogFactory.getLog(ArgsConverter.class); @Override public List<String> convert(String string, Type type) { ArrayList<String> list = new ArrayList<String>(); Tokenizer tokenizer = new Tokenizer(string, new String[] {" ", "\t", "\n", "\r", "\f", "'"}, true, false, 0); StringBuilder sb = null; while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); if (token.charAt(0) == '\'') { if (sb == null) { // non-quoted sb = new StringBuilder().append(token); } else { // quoted sb.append("'"); list.add(sb.toString()); sb = null; } } else if (Character.isWhitespace(token.charAt(0)) && token.length() == 1) { if (sb != null) { sb.append(token); } } else { if (sb == null) { list.add(token); } else { sb.append(token); } } } if (sb != null) { log.warn("Args are not closed: " + string); sb.append('\''); list.add(sb.toString()); } return list; } @Override public String convertToString(List<String> value) { if (value == null) { return "<none>"; } StringBuilder sb = new StringBuilder(); for (String arg : value) { sb.append(arg).append(' '); } return sb.toString(); } @Override public String allowedPattern(Type type) { return ANY_MULTI_LINE; } }