blob: 2dd351261f97cf3682bae885a41647cce684554b [file] [log] [blame]
package org.apache.cassandra.stress.settings;
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import com.google.common.base.Function;
/**
* For parsing a simple (sub)option for a command/major option
*/
class OptionSimple extends Option implements Serializable
{
final String displayPrefix;
private final Pattern matchPrefix;
private final String defaultValue;
private final Function<String, String> valueAdapter;
private final String description;
private final boolean required;
private String value;
private static final class ValueMatcher implements Function<String, String>, Serializable
{
final Pattern pattern;
private ValueMatcher(Pattern pattern)
{
this.pattern = pattern;
}
public String apply(String s)
{
if (!pattern.matcher(s).matches())
throw new IllegalArgumentException("Invalid value " + s + "; must match pattern " + pattern);
return s;
}
}
public OptionSimple(String prefix, String valuePattern, String defaultValue, String description, boolean required)
{
this(prefix, Pattern.compile(Pattern.quote(prefix), Pattern.CASE_INSENSITIVE),
Pattern.compile(valuePattern, Pattern.CASE_INSENSITIVE), defaultValue, description, required);
}
public OptionSimple(String prefix, Function<String, String> valueAdapter, String defaultValue, String description, boolean required)
{
this(prefix, Pattern.compile(Pattern.quote(prefix), Pattern.CASE_INSENSITIVE), valueAdapter, defaultValue, description, required);
}
public OptionSimple(String displayPrefix, Pattern matchPrefix, Pattern valuePattern, String defaultValue, String description, boolean required)
{
this(displayPrefix, matchPrefix, new ValueMatcher(valuePattern), defaultValue, description, required);
}
public OptionSimple(String displayPrefix, Pattern matchPrefix, Function<String, String> valueAdapter, String defaultValue, String description, boolean required)
{
this.displayPrefix = displayPrefix;
this.matchPrefix = matchPrefix;
this.valueAdapter = valueAdapter;
this.defaultValue = defaultValue;
this.description = description;
this.required = required;
}
public boolean setByUser()
{
return value != null;
}
public boolean isRequired()
{
return required;
}
public boolean present()
{
return value != null || defaultValue != null;
}
public String value()
{
return value != null ? value : defaultValue;
}
public boolean accept(String param)
{
if (matchPrefix.matcher(param).lookingAt())
{
if (value != null)
throw new IllegalArgumentException("Suboption " + displayPrefix + " has been specified more than once");
String v = param.substring(displayPrefix.length());
value = valueAdapter.apply(v);
assert value != null;
return true;
}
return false;
}
@Override
public boolean happy()
{
return !required || value != null;
}
public String shortDisplay()
{
StringBuilder sb = new StringBuilder();
if (!required)
sb.append("[");
sb.append(displayPrefix);
if (displayPrefix.endsWith("="))
sb.append("?");
if (displayPrefix.endsWith("<"))
sb.append("?");
if (displayPrefix.endsWith(">"))
sb.append("?");
if (!required)
sb.append("]");
return sb.toString();
}
public String longDisplay()
{
if (description.equals("") && defaultValue == null
&& (valueAdapter instanceof ValueMatcher && ((ValueMatcher) valueAdapter).pattern.pattern().equals("")))
return null;
StringBuilder sb = new StringBuilder();
sb.append(displayPrefix);
if (displayPrefix.endsWith("="))
sb.append("?");
if (displayPrefix.endsWith("<"))
sb.append("?");
if (displayPrefix.endsWith(">"))
sb.append("?");
if (defaultValue != null)
{
sb.append(" (default=");
sb.append(defaultValue);
sb.append(")");
}
return GroupedOptions.formatLong(sb.toString(), description);
}
public String getOptionAsString()
{
StringBuilder sb = new StringBuilder();
sb.append(displayPrefix);
if (!(displayPrefix.endsWith("=") || displayPrefix.endsWith("<") || displayPrefix.endsWith(">")))
{
sb.append(setByUser() ? ":*set*" : ":*not set*");
}else{
sb.append(value == null ? defaultValue : value);
}
return sb.toString();
}
public List<String> multiLineDisplay()
{
return Collections.emptyList();
}
public int hashCode()
{
return displayPrefix.hashCode();
}
@Override
public boolean equals(Object that)
{
return that instanceof OptionSimple && ((OptionSimple) that).displayPrefix.equals(this.displayPrefix);
}
}