/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.depgraph;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
/**
* Visitor for processing resolution failure information. The basic implementation writes messages to a logger. Override these methods for more useful error reporting or handling.
*
* @param <T> return type of the visit methods
*/
public abstract class ResolutionFailureVisitor<T> implements ResolutionFailureListener {
private static final Logger s_logger = LoggerFactory.getLogger(ResolutionFailureVisitor.class);
@Override
public final void notifyFailure(ResolutionFailure resolutionFailure) {
resolutionFailure.accept(this);
}
/**
* A default instance for writing messages to a logger.
*/
public static final ResolutionFailureVisitor<Void> DEFAULT_INSTANCE = new ResolutionFailureVisitor<Void>() {
@Override
protected Void visitCouldNotResolve(final ValueRequirement valueRequirement) {
s_logger.info("Could not resolve {}", valueRequirement);
return super.visitCouldNotResolve(valueRequirement);
}
@Override
protected Void visitNoFunctions(final ValueRequirement valueRequirement) {
s_logger.info("No functions available for {}", valueRequirement);
return super.visitNoFunctions(valueRequirement);
}
@Override
protected Void visitRecursiveRequirement(final ValueRequirement valueRequirement) {
s_logger.info("Recursive requirement on {} for function(s) producing it", valueRequirement);
return super.visitRecursiveRequirement(valueRequirement);
}
@Override
protected Void visitUnsatisfied(final ValueRequirement valueRequirement) {
s_logger.info("Unsatisfied requirement {}", valueRequirement);
return super.visitUnsatisfied(valueRequirement);
}
@Override
protected Void visitMarketDataMissing(final ValueRequirement valueRequirement) {
s_logger.info("Market data missing to satisfy requirement {}", valueRequirement);
return super.visitMarketDataMissing(valueRequirement);
}
@Override
protected Void visitSuccessfulFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied) {
s_logger.info("Applied {} for {}", function, valueRequirement);
return super.visitSuccessfulFunction(valueRequirement, function, desiredOutput, satisfied);
}
@Override
protected Void visitFailedFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied, final Set<ResolutionFailure> unsatisfied) {
s_logger.info("Couldn't satisfy {} to produce {}", unsatisfied, desiredOutput);
s_logger.info("Caused by:");
return super.visitFailedFunction(valueRequirement, function, desiredOutput, satisfied, unsatisfied);
}
@Override
protected Void visitGetAdditionalRequirementsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
s_logger.info("getAdditionalRequirements method failed on {} with inputs {}", function, requirements);
return super.visitGetAdditionalRequirementsFailed(valueRequirement, function, desiredOutput, requirements);
}
@Override
protected Void visitGetResultsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
s_logger.info("getResults method failed on {} with inputs {}", function, requirements);
return super.visitGetResultsFailed(valueRequirement, function, desiredOutput, requirements);
}
@Override
protected Void visitGetRequirementsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput) {
s_logger.info("getRequirements method failed on {} for {}", function, desiredOutput);
return super.visitGetRequirementsFailed(valueRequirement, function, desiredOutput);
}
@Override
protected Void visitLateResolutionFailure(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
s_logger.info("Provisional result {} not in function output after late resolution", desiredOutput);
return super.visitLateResolutionFailure(valueRequirement, function, desiredOutput, requirements);
}
@Override
protected Void visitBlacklistSuppressed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
s_logger.info("Function blacklist prevented resolution of {}", valueRequirement);
return super.visitBlacklistSuppressed(valueRequirement, function, desiredOutput, requirements);
}
};
protected T visitCouldNotResolve(final ValueRequirement valueRequirement) {
return null;
}
protected T visitNoFunctions(final ValueRequirement valueRequirement) {
return null;
}
protected T visitRecursiveRequirement(final ValueRequirement valueRequirement) {
return null;
}
protected T visitUnsatisfied(final ValueRequirement valueRequirement) {
return null;
}
protected T visitMarketDataMissing(final ValueRequirement valueRequirement) {
return null;
}
protected T visitSuccessfulFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied) {
return null;
}
protected T visitFailedFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied, final Set<ResolutionFailure> unsatisfied) {
for (ResolutionFailure requirement : unsatisfied) {
requirement.accept(this);
}
return null;
}
protected T visitFailedFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied, final Set<ResolutionFailure> unsatisfied, final Set<ResolutionFailure> unsatisfiedAdditional) {
if (unsatisfied.isEmpty()) {
return visitFailedFunction(valueRequirement, function, desiredOutput, satisfied, unsatisfiedAdditional);
} else if (unsatisfiedAdditional.isEmpty()) {
return visitFailedFunction(valueRequirement, function, desiredOutput, satisfied, unsatisfied);
} else {
final Set<ResolutionFailure> combined = new HashSet<ResolutionFailure>(unsatisfied);
combined.addAll(unsatisfiedAdditional);
return visitFailedFunction(valueRequirement, function, desiredOutput, satisfied, combined);
}
}
protected T visitFunction(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> satisfied, final Set<ResolutionFailure> unsatisfied, final Set<ResolutionFailure> unsatisfiedAdditional) {
if (unsatisfied.isEmpty() && unsatisfiedAdditional.isEmpty()) {
return visitSuccessfulFunction(valueRequirement, function, desiredOutput, satisfied);
} else {
return visitFailedFunction(valueRequirement, function, desiredOutput, satisfied, unsatisfied, unsatisfiedAdditional);
}
}
protected T visitGetAdditionalRequirementsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
return null;
}
protected T visitGetResultsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
return null;
}
protected T visitGetRequirementsFailed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput) {
return null;
}
protected T visitLateResolutionFailure(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
return null;
}
protected T visitBlacklistSuppressed(final ValueRequirement valueRequirement, final String function, final ValueSpecification desiredOutput,
final Map<ValueSpecification, ValueRequirement> requirements) {
return null;
}
}