/*******************************************************************************
* Copyright (c) 2004-2010 Gabor Bergmann and Daniel Varro
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Gabor Bergmann - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.runtime.rete.construction.psystem;
import java.util.Set;
import org.eclipse.incquery.runtime.rete.construction.RetePatternBuildException;
import org.eclipse.incquery.runtime.rete.construction.Stub;
/**
* Any constraint that can only be checked on certain stubs (e.g. those stubs that already contain some variables).
*
* @author Bergmann Gábor
*
*/
public abstract class DeferredPConstraint<PatternDescription, StubHandle> extends
BasePConstraint<PatternDescription, StubHandle> {
public DeferredPConstraint(PSystem<PatternDescription, StubHandle, ?> pSystem, Set<PVariable> affectedVariables) {
super(pSystem, affectedVariables);
}
public abstract boolean isReadyAt(Stub<StubHandle> stub);
/**
* @pre this.isReadyAt(stub);
*/
public Stub<StubHandle> checkOn(Stub<StubHandle> stub) throws RetePatternBuildException {
Stub<StubHandle> newStub = doCheckOn(stub);
newStub.addConstraint(this);
return newStub;
}
protected abstract Stub<StubHandle> doCheckOn(Stub<StubHandle> stub) throws RetePatternBuildException;
/**
* Called when the constraint is not ready, but cannot be deferred further.
*
* @param stub
* @throws RetePatternBuildException
* to indicate the error in detail. PRE: !isReady(stub)
*/
public abstract void raiseForeverDeferredError(Stub<StubHandle> stub) throws RetePatternBuildException;
}