package org.jactr.extensions.cached.procedural.internal;
/*
* default logging
*/
import java.util.Collection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.module.procedural.six.DefaultProductionInstantiator;
import org.jactr.core.production.CannotInstantiateException;
import org.jactr.core.production.IInstantiation;
import org.jactr.core.production.IProduction;
import org.jactr.core.production.VariableBindings;
public class CachedProductionInstantiator extends DefaultProductionInstantiator
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(CachedProductionInstantiator.class);
private final InstantiationCache _cache;
private boolean _validate = false;
private long _instantiationRequests;
private long _actualInstantiationAttempts;
public CachedProductionInstantiator(InstantiationCache cache, boolean validate)
{
_cache = cache;
_validate = validate;
}
public Collection<IInstantiation> instantiate(IProduction production,
Collection<VariableBindings> provisionalBindings)
throws CannotInstantiateException
{
_instantiationRequests++;
if (!_validate) _cache.throwIfCached(production);
try
{
_actualInstantiationAttempts++;
Collection<IInstantiation> rtn = super.instantiate(production,
provisionalBindings);
if (_validate && _cache.contains(production))
{
LOGGER
.error(
String
.format(
"Production cache believes that %s should fail with %s, but it has yielded instantiations %s",
production, _cache.get(production), rtn), _cache
.get(production));
_cache.remove(production);
}
return rtn;
}
catch (CannotInstantiateException cie)
{
_cache.add(production, cie);
throw cie;
}
}
public long getInstantiationRequests()
{
return _instantiationRequests;
}
public long getInstantiationAttempts()
{
return _actualInstantiationAttempts;
}
}