1 package org.opendaylight.yangtools.yang.model.util.repo;
3 import org.opendaylight.yangtools.concepts.Delegator;
4 import org.opendaylight.yangtools.concepts.Registration;
6 import com.google.common.base.Optional;
8 import static com.google.common.base.Preconditions.*;
10 public abstract class AbstractCachingSchemaSourceProvider<I, O> implements SchemaSourceProvider<O>,
11 Delegator<SchemaSourceProvider<I>> {
13 private final SchemaSourceProvider<I> defaultDelegate;
15 protected AbstractCachingSchemaSourceProvider(SchemaSourceProvider<I> delegate) {
16 this.defaultDelegate = delegate;
20 public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
21 return getSchemaSourceImpl(moduleName, revision, defaultDelegate);
24 private Optional<O> getSchemaSourceImpl(String moduleName, Optional<String> revision,
25 SchemaSourceProvider<I> delegate) {
26 checkNotNull(moduleName, "Module name should not be null.");
27 checkNotNull(revision, "Revision should not be null");
29 Optional<O> cached = getCachedSchemaSource(moduleName, revision);
30 if (cached.isPresent()) {
33 Optional<I> live = delegate.getSchemaSource(moduleName, revision);
34 return cacheSchemaSource(moduleName, revision, live);
37 abstract protected Optional<O> cacheSchemaSource(String moduleName, Optional<String> revision, Optional<I> stream);
39 abstract protected Optional<O> getCachedSchemaSource(String moduleName, Optional<String> revision);
41 public SchemaSourceProvider<I> getDelegate() {
42 return defaultDelegate;
45 public SchemaSourceProvider<O> createInstanceFor(SchemaSourceProvider<I> delegate) {
46 checkNotNull(delegate, "Delegate should not be null");
47 return new SchemaSourceProviderInstance(delegate);
50 private class SchemaSourceProviderInstance implements SchemaSourceProvider<O>, Delegator<SchemaSourceProvider<I>> {
52 private final SchemaSourceProvider<I> delegate;
54 protected SchemaSourceProviderInstance(SchemaSourceProvider<I> delegate) {
56 this.delegate = delegate;
60 public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
61 return getSchemaSourceImpl(moduleName, revision, getDelegate());
65 public SchemaSourceProvider<I> getDelegate() {