Merge "Revert "Added support for parsing submodules & added dependency utility parser""
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / repo / AbstractCachingSchemaSourceProvider.java
1 package org.opendaylight.yangtools.yang.model.util.repo;
2
3 import org.opendaylight.yangtools.concepts.Delegator;
4 import org.opendaylight.yangtools.concepts.Registration;
5
6 import com.google.common.base.Optional;
7
8 import static com.google.common.base.Preconditions.*;
9
10 public abstract class AbstractCachingSchemaSourceProvider<I, O> implements SchemaSourceProvider<O>,
11         Delegator<SchemaSourceProvider<I>> {
12
13     private final SchemaSourceProvider<I> defaultDelegate;
14
15     protected AbstractCachingSchemaSourceProvider(SchemaSourceProvider<I> delegate) {
16         this.defaultDelegate = delegate;
17     }
18
19     @Override
20     public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
21         return getSchemaSourceImpl(moduleName, revision, defaultDelegate);
22     }
23
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");
28
29         Optional<O> cached = getCachedSchemaSource(moduleName, revision);
30         if (cached.isPresent()) {
31             return cached;
32         }
33         Optional<I> live = delegate.getSchemaSource(moduleName, revision);
34         return cacheSchemaSource(moduleName, revision, live);
35     }
36
37     abstract protected Optional<O> cacheSchemaSource(String moduleName, Optional<String> revision, Optional<I> stream);
38
39     abstract protected Optional<O> getCachedSchemaSource(String moduleName, Optional<String> revision);
40
41     public SchemaSourceProvider<I> getDelegate() {
42         return defaultDelegate;
43     }
44
45     public SchemaSourceProvider<O> createInstanceFor(SchemaSourceProvider<I> delegate) {
46         checkNotNull(delegate, "Delegate should not be null");
47         return new SchemaSourceProviderInstance(delegate);
48     }
49
50     private class SchemaSourceProviderInstance implements SchemaSourceProvider<O>, Delegator<SchemaSourceProvider<I>> {
51
52         private final SchemaSourceProvider<I> delegate;
53
54         protected SchemaSourceProviderInstance(SchemaSourceProvider<I> delegate) {
55             super();
56             this.delegate = delegate;
57         }
58
59         @Override
60         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
61             return getSchemaSourceImpl(moduleName, revision, getDelegate());
62         }
63
64         @Override
65         public SchemaSourceProvider<I> getDelegate() {
66             return delegate;
67         }
68     }
69 }