package org.jactr.modules.declarative; /* * default logging */ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.chunk.IChunk; import org.jactr.core.chunktype.IChunkType; import org.jactr.core.model.IModel; import org.jactr.core.module.IllegalModuleStateException; import org.jactr.core.module.declarative.IDeclarativeModule; import org.jactr.core.module.declarative.associative.IAssociativeLinkageSystem; import org.jactr.core.module.declarative.event.IDeclarativeModuleListener; import org.jactr.core.module.declarative.search.filter.IChunkFilter; import org.jactr.core.production.request.ChunkTypeRequest; import org.jactr.core.utils.parameter.IParameterized; import org.jactr.core.utils.parameter.ParameterHandler; public class DelegatedDeclarativeModule implements IDeclarativeModule, IParameterized { static final transient Log LOGGER = LogFactory .getLog(DelegatedDeclarativeModule.class); protected IDeclarativeModule _delegate; protected IModel _model; protected Map<String, String> _deferredParameters; public static final String DECLARATIVE_DELEGATE_PARAM = "DeclarativeDelegateClass"; public DelegatedDeclarativeModule() { _deferredParameters = new TreeMap<String, String>(); } public IDeclarativeModule getDelegate() { return _delegate; } public void install(IModel model) { if (_delegate == null) throw new IllegalModuleStateException( "There must be a primary declarative module installed"); _model = model; /* * apply the deferred parameters */ for (Map.Entry<String, String> param : _deferredParameters.entrySet()) if (_delegate instanceof IParameterized) ((IParameterized) _delegate).setParameter(param.getKey(), param.getValue()); _delegate.install(model); } public void initialize() { _delegate.initialize(); } public String getName() { return _delegate.getName(); } public IModel getModel() { return _model; } public void dispose() { _delegate.dispose(); } public void reset() { _delegate.reset(); } public void uninstall(IModel model) { _model = null; _delegate.uninstall(model); } public Object getAdapter(Class adapterClass) { Object rtn = null; if (adapterClass.isAssignableFrom(getClass())) rtn = this; if (rtn == null) // check delegates rtn = _delegate.getAdapter(adapterClass); return rtn; } public void setParameter(String key, String value) { if (DECLARATIVE_DELEGATE_PARAM.equalsIgnoreCase(key)) try { _delegate = (IDeclarativeModule) ParameterHandler.classInstance() .coerce(value).newInstance(); } catch (Exception e) { LOGGER.error( String.format("Could not create primary delegate %s %s", value, e.getMessage()), e); throw new IllegalModuleStateException(String.format( "Could not create primary delegate %s %s", value, e.getMessage())); } else _deferredParameters.put(key, value); } public String getParameter(String key) { if (key.equals(DECLARATIVE_DELEGATE_PARAM)) return _delegate.getClass().toString(); else return ((IParameterized) _delegate).getParameter(key); } public Collection<String> getPossibleParameters() { return getSetableParameters(); } public Collection<String> getSetableParameters() { Collection<String> params = ((IParameterized) _delegate) .getSetableParameters(); params.add(DECLARATIVE_DELEGATE_PARAM); return params; } @SuppressWarnings("unchecked") public CompletableFuture<IChunkType> createChunkType(IChunkType parent, String name) { return createChunkType(parent == null ? Collections.EMPTY_LIST : Collections.singleton(parent), name); } public CompletableFuture<IChunkType> createChunkType( Collection<IChunkType> parents, String name) { return _delegate.createChunkType(parents, name); } public CompletableFuture<IChunkType> addChunkType(IChunkType chunkType) { return _delegate.addChunkType(chunkType); } public CompletableFuture<IChunkType> getChunkType(String name) { return _delegate.getChunkType(name); } public CompletableFuture<Collection<IChunkType>> getChunkTypes() { return _delegate.getChunkTypes(); } public CompletableFuture<IChunk> createChunk(IChunkType parent, String name) { return _delegate.createChunk(parent, name); } public void dispose(IChunk chunk) { _delegate.dispose(chunk); } public IAssociativeLinkageSystem getAssociativeLinkageSystem() { return _delegate.getAssociativeLinkageSystem(); } public void setAssociativeLinkageSystem( IAssociativeLinkageSystem linkageSystem) { _delegate.setAssociativeLinkageSystem(linkageSystem); } public CompletableFuture<IChunk> copyChunk(IChunk sourceChunk) { return _delegate.copyChunk(sourceChunk); } public CompletableFuture<IChunk> copyChunk(IChunk sourceChunk, boolean copySubsymbolics) { return _delegate.copyChunk(sourceChunk, copySubsymbolics); } public CompletableFuture<IChunk> addChunk(IChunk chunk) { return _delegate.addChunk(chunk); } public boolean willEncode(IChunk chunk) { return _delegate.willEncode(chunk); } public CompletableFuture<IChunk> getChunk(String name) { return _delegate.getChunk(name); } public CompletableFuture<Collection<IChunk>> getChunks() { return _delegate.getChunks(); } public long getNumberOfChunks() { return _delegate.getNumberOfChunks(); } public CompletableFuture<Collection<IChunk>> findExactMatches( ChunkTypeRequest request, Comparator<IChunk> sorter, IChunkFilter filter) { return _delegate.findExactMatches(request, sorter, filter); } public CompletableFuture<Collection<IChunk>> findPartialMatches( ChunkTypeRequest request, Comparator<IChunk> sorter, IChunkFilter filter) { return _delegate.findPartialMatches(request, sorter, filter); } public IChunk getBusyChunk() { return _delegate.getBusyChunk(); } public IChunk getEmptyChunk() { return _delegate.getEmptyChunk(); } public IChunk getErrorChunk() { return _delegate.getErrorChunk(); } public IChunk getFreeChunk() { return _delegate.getFreeChunk(); } public IChunk getFullChunk() { return _delegate.getFullChunk(); } public IChunk getNewChunk() { return _delegate.getNewChunk(); } public IChunk getRequestedChunk() { return _delegate.getRequestedChunk(); } public IChunk getUnrequestedChunk() { return _delegate.getUnrequestedChunk(); } public void addListener(IDeclarativeModuleListener listener, Executor executor) { _delegate.addListener(listener, executor); } public void removeListener(IDeclarativeModuleListener listener) { _delegate.removeListener(listener); } public void flush() { _delegate.flush(); } }