package org.caudexorigo.cli;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;
class OptionSpecificationImpl extends ArgumentSpecificationImpl implements OptionSpecification
{
private static final Logger g_logger = Logger.getLogger(OptionSpecificationImpl.class.getName());
private final List<String> m_allNames = new ArrayList<String>();
private final List<String> m_shortNames;
private final String m_longName;
private final String m_description;
private final String m_pattern;
private final List<String> m_default;
private final boolean m_helpRequest;
public OptionSpecificationImpl(final Method method, final Class<?> klass)
{
super(method, klass);
final Option optionAnnotation = method.getAnnotation(Option.class);
final String[] shortNameSpecification = optionAnnotation.shortName();
m_shortNames = new ArrayList<String>();
for (int i = 0; i < shortNameSpecification.length; i++)
{
final String shortName = shortNameSpecification[i].trim();
if (shortName.length() > 0)
{
m_shortNames.add(shortNameSpecification[i].substring(0, 1));
}
}
m_allNames.addAll(m_shortNames);
final String longNameSpecification = optionAnnotation.longName().trim();
m_longName = nullOrBlank(longNameSpecification) ? getName() : longNameSpecification;
m_allNames.add(m_longName);
m_description = optionAnnotation.description().trim();
m_pattern = optionAnnotation.pattern();
m_default = Arrays.asList(optionAnnotation.defaultValue());
m_helpRequest = optionAnnotation.helpRequest();
g_logger.finer(String.format("Create option specification name:%s, shortName:%s, type:%s (multiValued:%b, hasValue:%b, isOptional:%b, defaultValue:%s)) ", getName(), getShortNames(), getType(), isMultiValued(), hasValue(), isOptional(), getDefaultValue()));
}
/**
* @inheritdoc
*/
public List<String> getShortNames()
{
return m_shortNames;
}
/**
* @inheritdoc
*/
public String getLongName()
{
return m_longName;
}
public boolean hasCustomPattern()
{
return !m_pattern.equals(".*");
}
public boolean patternMatches(final String value)
{
return value.matches(m_pattern);
}
/**
* @inheritdoc
*/
public boolean hasShortName()
{
return m_shortNames.size() > 0;
}
private boolean nullOrBlank(final String string)
{
return string == null || string.equals("");
}
/**
* @inheritdoc
*/
public String getDescription()
{
return m_description;
}
public StringBuilder getSummary(final StringBuilder result)
{
if (isOptional())
{
result.append("[");
}
result.append("--").append(getLongName());
for (final String shortName : getShortNames())
{
result.append(" -").append(shortName);
}
if (hasValue())
{
if (hasCustomPattern())
{
result.append(" /").append(m_pattern).append("/");
}
else
{
result.append(" value");
}
if (isMultiValued())
{
result.append("...");
}
}
if (isOptional())
{
result.append("]");
}
return result;
}
@Override
public String toString()
{
final StringBuilder result = new StringBuilder();
getSummary(result);
if (!nullOrBlank(getDescription()))
{
result.append(" : ").append(getDescription());
}
return result.toString();
}
public List<String> getAllNames()
{
return m_allNames;
}
public List<String> getDefaultValue()
{
return m_default;
}
public boolean hasDefaultValue()
{
return m_default.size() > 0;
}
public boolean isHelpOption()
{
return m_helpRequest;
}
}