Merge "BUG-326: quickfix: Log offending type and fallback to strings"
[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 com.google.common.base.Optional;
12
13 import static com.google.common.base.Preconditions.*;
14
15 public abstract class AbstractCachingSchemaSourceProvider<I, O> implements AdvancedSchemaSourceProvider<O>,
16         Delegator<AdvancedSchemaSourceProvider<I>> {
17
18     public class CompatibilitySchemaSourceProviderInstance implements SchemaSourceProvider<O> {
19
20         @Override
21         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
22             // TODO Auto-generated method stub
23             return null;
24         }
25
26     }
27
28     private final AdvancedSchemaSourceProvider<I> defaultDelegate;
29
30     protected AbstractCachingSchemaSourceProvider(AdvancedSchemaSourceProvider<I> delegate) {
31         this.defaultDelegate = delegate;
32     }
33
34     @Override
35     public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
36         checkNotNull(moduleName, "Module name should not be null.");
37         checkNotNull(revision, "Revision should not be null");
38         return getSchemaSource(SourceIdentifier.create(moduleName, revision));
39     }
40     
41     @Override
42     public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
43         return getSchemaSourceImpl(sourceIdentifier, defaultDelegate);
44     }
45
46     protected final Optional<O> getSchemaSourceImpl(SourceIdentifier identifier,
47             AdvancedSchemaSourceProvider<I> delegate) {
48         checkNotNull(identifier, "Source identifier name should not be null.");
49
50         Optional<O> cached = getCachedSchemaSource(identifier);
51         if (cached.isPresent()) {
52             return cached;
53         }
54         Optional<I> live = delegate.getSchemaSource(identifier);
55         return cacheSchemaSource(identifier, live);
56     }
57
58     abstract protected Optional<O> cacheSchemaSource(SourceIdentifier identifier, Optional<I> stream);
59
60     abstract protected Optional<O> getCachedSchemaSource(SourceIdentifier identifier);
61
62     public AdvancedSchemaSourceProvider<I> getDelegate() {
63         return defaultDelegate;
64     }
65
66     public SchemaSourceProvider<O> createInstanceFor(SchemaSourceProvider<I> delegate) {
67         checkNotNull(delegate, "Delegate should not be null");
68         return new SchemaSourceProviderInstance(SchemaSourceProviders.toAdvancedSchemaSourceProvider(delegate));
69             
70     }
71
72     private class SchemaSourceProviderInstance implements //
73     AdvancedSchemaSourceProvider<O>, 
74     Delegator<AdvancedSchemaSourceProvider<I>> {
75
76         private final AdvancedSchemaSourceProvider<I> delegate;
77
78         protected SchemaSourceProviderInstance(AdvancedSchemaSourceProvider<I> delegate) {
79             super();
80             this.delegate = delegate;
81         }
82
83         @Override
84         public Optional<O> getSchemaSource(String moduleName, Optional<String> revision) {
85             return getSchemaSource(SourceIdentifier.create(moduleName, revision));
86         }
87
88         @Override
89         public AdvancedSchemaSourceProvider<I> getDelegate() {
90             return delegate;
91         }
92
93         @Override
94         public Optional<O> getSchemaSource(SourceIdentifier sourceIdentifier) {
95             return getSchemaSourceImpl(sourceIdentifier, getDelegate());
96         }
97     }
98 }