/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.calcnode;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.LongSet;
import it.unimi.dsi.fastutil.objects.Object2LongMap;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.opengamma.engine.cache.CacheSelectHint;
import com.opengamma.engine.cache.IdentifierEncodedValueSpecifications;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;
/**
* The definition of a particular job that must be performed by a calculation node.
*/
public class CalculationJob implements IdentifierEncodedValueSpecifications {
private final CalculationJobSpecification _specification;
private final long _functionInitializationIdentifier;
private final VersionCorrection _resolverVersionCorrection;
private final long[] _required;
private final List<CalculationJobItem> _jobItems;
private final CacheSelectHint _cacheSelect;
/**
* The tail is a set of jobs that must execute at the same location. It is not however part of the job so is not serialized.
*/
private Collection<CalculationJob> _tail;
/**
* The cancellation flag is used to abort a calculation mid-way if possible. It is not serialized.
*/
private boolean _cancelled;
public CalculationJob(CalculationJobSpecification specification, long functionInitializationIdentifier, final VersionCorrection resolverVersionCorrection, long[] requiredJobIds,
List<CalculationJobItem> jobItems, final CacheSelectHint cacheSelect) {
ArgumentChecker.notNull(specification, "specification");
ArgumentChecker.notNull(resolverVersionCorrection, "resolverVersionCorrection");
ArgumentChecker.notNull(jobItems, "jobItems");
ArgumentChecker.notNull(cacheSelect, "cacheSelect");
_specification = specification;
_functionInitializationIdentifier = functionInitializationIdentifier;
_resolverVersionCorrection = resolverVersionCorrection;
_required = requiredJobIds;
_jobItems = jobItems;
_cacheSelect = cacheSelect;
}
/**
* @return the specification
*/
public CalculationJobSpecification getSpecification() {
return _specification;
}
public long getFunctionInitializationIdentifier() {
return _functionInitializationIdentifier;
}
public VersionCorrection getResolverVersionCorrection() {
return _resolverVersionCorrection;
}
public long[] getRequiredJobIds() {
return _required;
}
public CacheSelectHint getCacheSelectHint() {
return _cacheSelect;
}
public List<CalculationJobItem> getJobItems() {
return Collections.unmodifiableList(_jobItems);
}
public Collection<CalculationJob> getTail() {
return _tail;
}
public void addTail(final CalculationJob tail) {
if (_tail == null) {
_tail = new LinkedList<CalculationJob>();
}
_tail.add(tail);
}
public boolean isCancelled() {
return _cancelled;
}
public void cancel() {
_cancelled = true;
}
@Override
public void convertIdentifiers(final Long2ObjectMap<ValueSpecification> identifiers) {
_cacheSelect.convertIdentifiers(identifiers);
for (CalculationJobItem item : _jobItems) {
item.convertIdentifiers(identifiers);
}
}
@Override
public void collectIdentifiers(final LongSet identifiers) {
_cacheSelect.collectIdentifiers(identifiers);
for (CalculationJobItem item : _jobItems) {
item.collectIdentifiers(identifiers);
}
}
@Override
public void convertValueSpecifications(final Object2LongMap<ValueSpecification> valueSpecifications) {
_cacheSelect.convertValueSpecifications(valueSpecifications);
for (CalculationJobItem item : _jobItems) {
item.convertValueSpecifications(valueSpecifications);
}
}
@Override
public void collectValueSpecifications(final Set<ValueSpecification> valueSpecifications) {
_cacheSelect.collectValueSpecifications(valueSpecifications);
for (CalculationJobItem item : _jobItems) {
item.collectValueSpecifications(valueSpecifications);
}
}
@Override
public String toString() {
return "CalculationJob, spec = " + _specification.toString() + ", job item count = " + _jobItems.size();
}
}