package org.opendaylight.yangtools.yang.model.util.repo; import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.Registration; import com.google.common.base.Optional; import static com.google.common.base.Preconditions.*; public abstract class AbstractCachingSchemaSourceProvider implements SchemaSourceProvider, Delegator> { private final SchemaSourceProvider defaultDelegate; protected AbstractCachingSchemaSourceProvider(SchemaSourceProvider delegate) { this.defaultDelegate = delegate; } @Override public Optional getSchemaSource(String moduleName, Optional revision) { return getSchemaSourceImpl(moduleName, revision, defaultDelegate); } private Optional getSchemaSourceImpl(String moduleName, Optional revision, SchemaSourceProvider delegate) { checkNotNull(moduleName, "Module name should not be null."); checkNotNull(revision, "Revision should not be null"); Optional cached = getCachedSchemaSource(moduleName, revision); if (cached.isPresent()) { return cached; } Optional live = delegate.getSchemaSource(moduleName, revision); return cacheSchemaSource(moduleName, revision, live); } abstract protected Optional cacheSchemaSource(String moduleName, Optional revision, Optional stream); abstract protected Optional getCachedSchemaSource(String moduleName, Optional revision); public SchemaSourceProvider getDelegate() { return defaultDelegate; } public SchemaSourceProvider createInstanceFor(SchemaSourceProvider delegate) { checkNotNull(delegate, "Delegate should not be null"); return new SchemaSourceProviderInstance(delegate); } private class SchemaSourceProviderInstance implements SchemaSourceProvider, Delegator> { private final SchemaSourceProvider delegate; protected SchemaSourceProviderInstance(SchemaSourceProvider delegate) { super(); this.delegate = delegate; } @Override public Optional getSchemaSource(String moduleName, Optional revision) { return getSchemaSourceImpl(moduleName, revision, getDelegate()); } @Override public SchemaSourceProvider getDelegate() { return delegate; } } }