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         checkNotNull(moduleName, "Module name should not be null.");
22         checkNotNull(revision, "Revision should not be null");
23         return getSchemaSource(SourceIdentifier.create(moduleName, revision));
24     }
25     
26     @Override
27     public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
28         return getSchemaSourceImpl(sourceIdentifier, defaultDelegate);
29     }
30
31     protected final Optional<O> getSchemaSourceImpl(SourceIdentifier identifier,
32             SchemaSourceProvider<I> delegate) {
33         checkNotNull(identifier, "Source identifier name should not be null.");
34
35         Optional<O> cached = getCachedSchemaSource(identifier);
36         if (cached.isPresent()) {
37             return cached;
38         }
39         Optional<I> live = delegate.getSchemaSource(identifier);
40         return cacheSchemaSource(identifier, live);
41     }
42
43     abstract protected Optional<O> cacheSchemaSource(SourceIdentifier identifier, Optional<I> stream);
44
45     abstract protected Optional<O> getCachedSchemaSource(SourceIdentifier identifier);
46
47     public SchemaSourceProvider<I> getDelegate() {
48         return defaultDelegate;
49     }
50
51     public SchemaSourceProvider<O> createInstanceFor(SchemaSourceProvider<I> delegate) {
52         checkNotNull(delegate, "Delegate should not be null");
53         return new SchemaSourceProviderInstance(delegate);
54     }
55
56     private class SchemaSourceProviderInstance implements //
57     SchemaSourceProvider<O>, 
58     Delegator<SchemaSourceProvider<I>> {
59
60         private final SchemaSourceProvider<I> delegate;
61
62         protected SchemaSourceProviderInstance(SchemaSourceProvider<I> delegate) {
63             super();
64             this.delegate = delegate;
65         }
66
67         @Override
68         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
69             return getSchemaSource(SourceIdentifier.create(moduleName, revision));
70         }
71
72         @Override
73         public SchemaSourceProvider<I> getDelegate() {
74             return delegate;
75         }
76
77         @Override
78         public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
79             return getSchemaSourceImpl(sourceIdentifier, getDelegate());
80         }
81     }
82 }