001    package com.hammurapi.reasoning.impl;
002    
003    import java.lang.reflect.Method;
004    import java.util.Collection;
005    import java.util.Map;
006    
007    import com.hammurapi.reasoning.ReasoningException;
008    import com.hammurapi.reasoning.spi.InferenceContext;
009    
010    /**
011     * Delegates calls to thread local 
012     * @author Pavel Vlasov
013     *
014     */
015    public class InferenceContextDispatcher implements InferenceContext {
016            
017            private static ThreadLocal<InferenceContext> ictl = new ThreadLocal<InferenceContext>();
018            
019            static void setThreadInferenceContext(InferenceContext ic) {
020                    ictl.set(ic);           
021            }
022            
023            static void unsetThreadInferenceContext() {
024                    ictl.set(null);
025            }
026            
027            private InferenceContext getDelegate() {
028                    InferenceContext delegate = ictl.get();
029                    if (delegate==null) {
030                            throw new IllegalStateException("No inference context is set for current thread.");
031                    }
032                    return delegate;                
033            }
034    
035            public void addUndo(Runnable undoCommand) {
036                    getDelegate().addUndo(undoCommand);
037            }
038    
039            public boolean consumeInput(int position, boolean local) {
040                    return getDelegate().consumeInput(position, local);
041            }
042    
043            public boolean contains(Object fact) throws ReasoningException {
044                    return getDelegate().contains(fact);
045            }
046    
047            public Collection<?> getObjects() throws ReasoningException {
048                    return getDelegate().getObjects();
049            }
050    
051            public Map<String, ?> getProperties() throws ReasoningException {
052                    return getDelegate().getProperties();
053            }
054    
055            public int[] parameterIndices() {
056                    return getDelegate().parameterIndices();
057            }
058    
059            public void post(Object... conclusions) {
060                    getDelegate().post(conclusions);
061            }
062    
063            public void remove(Object fact) throws ReasoningException {
064                    getDelegate().remove(fact);
065            }
066    
067            public Method targetMethod() {
068                    return getDelegate().targetMethod();
069            }
070    
071            @Override
072            public void put(Object fact) throws ReasoningException {
073                    getDelegate().put(fact);                
074            }
075    
076            @Override
077            public void update(Object fact) throws ReasoningException {
078                    getDelegate().update(fact);
079            }
080    
081            @Override
082            public void update(Object originalFact, Object newFact) throws ReasoningException {
083                    getDelegate().update(originalFact, newFact);
084            }
085    }