/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.cache;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.LongSet;
import it.unimi.dsi.fastutil.objects.Object2LongMap;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.ArgumentChecker;
/**
* A filter to determine whether given values are to go into a private or shared cache.
*/
public final class CacheSelectHint implements IdentifierEncodedValueSpecifications, Serializable {
private static final long serialVersionUID = 1L;
private static final CacheSelectHint ALL_SHARED_INSTANCE = new CacheSelectHint(null, null, true);
private static final CacheSelectHint ALL_PRIVATE_INSTANCE = new CacheSelectHint(null, null, false);
private final Set<ValueSpecification> _valueSpecifications;
private long[] _valueIdentifiers;
private final boolean _isPrivate;
private CacheSelectHint(final Collection<ValueSpecification> valueSpecifications, final long[] valueIdentifiers, final boolean isPrivate) {
if (valueSpecifications != null) {
_valueSpecifications = new HashSet<ValueSpecification>(valueSpecifications);
} else {
_valueSpecifications = new HashSet<ValueSpecification>();
}
_valueIdentifiers = valueIdentifiers;
_isPrivate = isPrivate;
}
public static CacheSelectHint privateValues(final Collection<ValueSpecification> privateValues) {
ArgumentChecker.notNull(privateValues, "privateValues");
return new CacheSelectHint(privateValues, null, true);
}
public static CacheSelectHint sharedValues(final Collection<ValueSpecification> sharedValues) {
ArgumentChecker.notNull(sharedValues, "sharedValues");
return new CacheSelectHint(sharedValues, null, false);
}
public static CacheSelectHint allShared() {
return ALL_SHARED_INSTANCE;
}
public static CacheSelectHint allPrivate() {
return ALL_PRIVATE_INSTANCE;
}
@Override
public void convertValueSpecifications(final Object2LongMap<ValueSpecification> valueSpecifications) {
if (_valueIdentifiers == null) {
_valueIdentifiers = new long[_valueSpecifications.size()];
int i = 0;
for (final ValueSpecification specification : _valueSpecifications) {
_valueIdentifiers[i++] = valueSpecifications.getLong(specification);
}
}
}
@Override
public void collectValueSpecifications(final Set<ValueSpecification> valueSpecifications) {
valueSpecifications.addAll(_valueSpecifications);
}
@Override
public void convertIdentifiers(final Long2ObjectMap<ValueSpecification> identifiers) {
if (_valueSpecifications.isEmpty()) {
for (final long identifier : _valueIdentifiers) {
_valueSpecifications.add(identifiers.get(identifier));
}
}
}
@Override
public void collectIdentifiers(final LongSet identifiers) {
for (final long identifier : _valueIdentifiers) {
identifiers.add(identifier);
}
}
public boolean isPrivateValue(final ValueSpecification valueSpecification) {
if (_isPrivate) {
return _valueSpecifications.contains(valueSpecification);
} else {
return !_valueSpecifications.contains(valueSpecification);
}
}
/**
* Gets the valueIdentifiers field.
*
* @return the valueIdentifiers
*/
public long[] getValueIdentifiers() {
return _valueIdentifiers;
}
/**
* Gets the isPrivate field.
*
* @return the isPrivate
*/
public boolean isPrivate() {
return _isPrivate;
}
public static CacheSelectHint create(final long[] valueIdentifiers, final boolean isPrivate) {
return new CacheSelectHint(null, valueIdentifiers, isPrivate);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
if (isPrivate()) {
sb.append("All SHARED");
} else {
sb.append("All PRIVATE");
}
if (!_valueSpecifications.isEmpty()) {
sb.append(" except for [");
boolean comma = false;
for (final ValueSpecification v : _valueSpecifications) {
if (comma) {
sb.append(", ");
} else {
comma = true;
}
sb.append(v);
}
sb.append("]");
}
return sb.toString();
}
}