/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.marketdata.manipulator.dsl;
import java.util.Collections;
import java.util.Objects;
import java.util.Set;
import java.util.regex.Pattern;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.opengamma.engine.marketdata.manipulator.DistinctMarketDataSelector;
import com.opengamma.engine.marketdata.manipulator.SelectorResolver;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.RegexUtils;
import com.opengamma.util.money.Currency;
/**
* Selector base class for data structures that will be selected by name and currency.
*/
/* package */ abstract class Selector implements DistinctMarketDataSelector {
private final Set<String> _names;
private final Set<Currency> _currencies;
private final PatternWrapper _nameMatchPattern;
private final PatternWrapper _nameLikePattern;
private final Set<String> _calcConfigNames;
/* package */ Selector(Set<String> calcConfigNames,
Set<String> names,
Set<Currency> currencies,
Pattern nameMatchPattern,
Pattern nameLikePattern) {
_calcConfigNames = calcConfigNames;
_names = names;
_currencies = currencies;
_nameMatchPattern = PatternWrapper.wrap(nameMatchPattern);
_nameLikePattern = PatternWrapper.wrap(nameLikePattern);
}
/* package */ Set<String> getNames() {
return _names;
}
/* package */ Set<Currency> getCurrencies() {
return _currencies;
}
/* package */ Pattern getNameMatchPattern() {
return _nameMatchPattern == null ? null : _nameMatchPattern.getPattern();
}
/* package */ Pattern getNameLikePattern() {
return _nameLikePattern == null ? null : _nameLikePattern.getPattern();
}
/* package */ Set<String> getCalcConfigNames() {
return _calcConfigNames;
}
/* package */ boolean matches(String name, Currency currency) {
// TODO can / should these be relaxed?
ArgumentChecker.notEmpty(name, "name");
ArgumentChecker.notNull(currency, "currency");
if (_names != null && !_names.contains(name)) {
return false;
}
if (_nameMatchPattern != null && !_nameMatchPattern.getPattern().matcher(name).matches()) {
return false;
}
if (_nameLikePattern != null && !_nameLikePattern.getPattern().matcher(name).matches()) {
return false;
}
if (_currencies != null && !_currencies.contains(currency)) {
return false;
}
return true;
}
@Override
public boolean hasSelectionsDefined() {
return true;
}
@Override
public DistinctMarketDataSelector findMatchingSelector(ValueSpecification valueSpecification,
String calcConfigName,
SelectorResolver resolver) {
ArgumentChecker.notNull(valueSpecification, "valueSpecification");
if (_calcConfigNames != null && !_calcConfigNames.contains(calcConfigName)) {
return null;
}
if (matches(valueSpecification)) {
return this;
} else {
return null;
}
}
/* package */ abstract boolean matches(ValueSpecification valueSpecification);
@Override
public int hashCode() {
return Objects.hash(_names,
_currencies,
_nameMatchPattern,
_nameLikePattern,
_calcConfigNames);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final Selector other = (Selector) obj;
return Objects.equals(this._names, other._names) &&
Objects.equals(this._currencies, other._currencies) &&
Objects.equals(this._nameMatchPattern, other._nameMatchPattern) &&
Objects.equals(this._nameLikePattern, other._nameLikePattern) &&
Objects.equals(this._calcConfigNames, other._calcConfigNames);
}
@Override
public String toString() {
return "Selector [" +
"_names=" + _names +
", _currencies=" + _currencies +
", _nameMatchPattern=" + _nameMatchPattern +
", _nameLikePattern=" + _nameLikePattern +
", _calcConfigNames=" + _calcConfigNames +
"]";
}
/* package */ abstract static class Builder {
private final Scenario _scenario;
private Set<String> _names;
private Set<Currency> _currencies;
private Pattern _nameMatchPattern;
private Pattern _nameLikePattern;
/* package */ Builder(Scenario scenario) {
ArgumentChecker.notNull(scenario, "scenario");
_scenario = scenario;
}
/* package */ Builder named(String... names) {
ArgumentChecker.notEmpty(names, "names");
if (_names != null) {
throw new IllegalStateException("named() can only be called once");
}
if (_nameMatchPattern != null) {
throw new IllegalStateException("Only one of named() and nameMatches() can be used");
}
if (_nameLikePattern != null) {
throw new IllegalStateException("Only one of named() and nameMatches() can be used");
}
_names = ImmutableSet.copyOf(names);
return this;
}
/* package */ Builder currencies(String... codes) {
ArgumentChecker.notEmpty(codes, "codes");
if (_currencies != null) {
throw new IllegalStateException("currencies() can only be called once");
}
Set<Currency> currencies = Sets.newHashSet();
for (String code : codes) {
currencies.add(Currency.of(code));
}
_currencies = Collections.unmodifiableSet(currencies);
return this;
}
/* package */ Builder nameMatches(String regex) {
if (_nameMatchPattern != null) {
throw new IllegalStateException("nameMatches() can only be called once");
}
if (_nameLikePattern != null) {
throw new IllegalStateException("nameMatches() can only be called once");
}
if (_names != null) {
throw new IllegalStateException("Only one of named() and nameMatches() can be used");
}
_nameMatchPattern = Pattern.compile(regex);
return this;
}
/* package */ Builder nameLike(String glob) {
if (_nameLikePattern != null) {
throw new IllegalStateException("nameLike() can only be called once");
}
if (_names != null) {
throw new IllegalStateException("Only one of named() and nameMatches() and nameLike() can be used");
}
if (_nameMatchPattern != null) {
throw new IllegalStateException("Only one of named() and nameMatches() and nameLike() can be used");
}
_nameLikePattern = RegexUtils.globToPattern(glob);
return this;
}
/* package */ Scenario getScenario() {
return _scenario;
}
/* package */ Set<String> getNames() {
return _names;
}
/* package */ Set<Currency> getCurrencies() {
return _currencies;
}
/* package */ Pattern getNameMatchPattern() {
return _nameMatchPattern;
}
/* package */ Pattern getNameLikePattern() {
return _nameLikePattern;
}
}
}