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 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/eplv10.html
7  */
8 package org.opendaylight.yangtools.yang.model.util.repo;
9
10 import org.opendaylight.yangtools.concepts.Delegator;
11 import org.opendaylight.yangtools.concepts.Registration;
12
13 import com.google.common.base.Optional;
14
15 import static com.google.common.base.Preconditions.*;
16
17 public abstract class AbstractCachingSchemaSourceProvider<I, O> implements AdvancedSchemaSourceProvider<O>,
18         Delegator<AdvancedSchemaSourceProvider<I>> {
19
20     public class CompatibilitySchemaSourceProviderInstance implements SchemaSourceProvider<O> {
21
22         @Override
23         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
24             // TODO Auto-generated method stub
25             return null;
26         }
27
28     }
29
30     private final AdvancedSchemaSourceProvider<I> defaultDelegate;
31
32     protected AbstractCachingSchemaSourceProvider(AdvancedSchemaSourceProvider<I> delegate) {
33         this.defaultDelegate = delegate;
34     }
35
36     @Override
37     public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
38         checkNotNull(moduleName, "Module name should not be null.");
39         checkNotNull(revision, "Revision should not be null");
40         return getSchemaSource(SourceIdentifier.create(moduleName, revision));
41     }
42     
43     @Override
44     public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
45         return getSchemaSourceImpl(sourceIdentifier, defaultDelegate);
46     }
47
48     protected final Optional<O> getSchemaSourceImpl(SourceIdentifier identifier,
49             AdvancedSchemaSourceProvider<I> delegate) {
50         checkNotNull(identifier, "Source identifier name should not be null.");
51
52         Optional<O> cached = getCachedSchemaSource(identifier);
53         if (cached.isPresent()) {
54             return cached;
55         }
56         Optional<I> live = delegate.getSchemaSource(identifier);
57         return cacheSchemaSource(identifier, live);
58     }
59
60     abstract protected Optional<O> cacheSchemaSource(SourceIdentifier identifier, Optional<I> stream);
61
62     abstract protected Optional<O> getCachedSchemaSource(SourceIdentifier identifier);
63
64     public AdvancedSchemaSourceProvider<I> getDelegate() {
65         return defaultDelegate;
66     }
67
68     public SchemaSourceProvider<O> createInstanceFor(SchemaSourceProvider<I> delegate) {
69         checkNotNull(delegate, "Delegate should not be null");
70         return new SchemaSourceProviderInstance(SchemaSourceProviders.toAdvancedSchemaSourceProvider(delegate));
71             
72     }
73
74     private class SchemaSourceProviderInstance implements //
75     AdvancedSchemaSourceProvider<O>, 
76     Delegator<AdvancedSchemaSourceProvider<I>> {
77
78         private final AdvancedSchemaSourceProvider<I> delegate;
79
80         protected SchemaSourceProviderInstance(AdvancedSchemaSourceProvider<I> delegate) {
81             super();
82             this.delegate = delegate;
83         }
84
85         @Override
86         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
87             return getSchemaSource(SourceIdentifier.create(moduleName, revision));
88         }
89
90         @Override
91         public AdvancedSchemaSourceProvider<I> getDelegate() {
92             return delegate;
93         }
94
95         @Override
96         public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
97             return getSchemaSourceImpl(sourceIdentifier, getDelegate());
98         }
99     }
100 }