package org.apache.cassandra.stress.settings;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* For specifying multiple grouped sub-options in the form: group(arg1=,arg2,arg3) etc.
*/
abstract class OptionMulti extends Option
{
private static final Pattern ARGS = Pattern.compile("([^,]+)", Pattern.CASE_INSENSITIVE);
private final class Delegate extends GroupedOptions
{
@Override
public List<? extends Option> options()
{
return OptionMulti.this.options();
}
}
protected abstract List<? extends Option> options();
private final String name;
private final Pattern pattern;
private final String description;
private final Delegate delegate = new Delegate();
public OptionMulti(String name, String description)
{
this.name = name;
pattern = Pattern.compile(name + "\\((.*)\\)", Pattern.CASE_INSENSITIVE);
this.description = description;
}
@Override
public boolean accept(String param)
{
Matcher m = pattern.matcher(param);
if (!m.matches())
return false;
m = ARGS.matcher(m.group(1));
int last = -1;
while (m.find())
{
if (m.start() != last + 1)
throw new IllegalArgumentException("Invalid " + name + " specification: " + param);
last = m.end();
if (!delegate.accept(m.group()))
throw new IllegalArgumentException("Invalid " + name + " specification: " + m.group());
}
return true;
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append("(");
for (Option option : options())
{
sb.append(option);
sb.append(",");
}
sb.append(")");
return sb.toString();
}
@Override
public String shortDisplay()
{
return name + "(?)";
}
@Override
public String longDisplay()
{
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append("(");
for (Option opt : options())
{
sb.append(opt.shortDisplay());
}
sb.append("): ");
sb.append(description);
return sb.toString();
}
@Override
public List<String> multiLineDisplay()
{
final List<String> r = new ArrayList<>();
for (Option option : options())
r.add(option.longDisplay());
return r;
}
@Override
boolean happy()
{
return delegate.happy();
}
}