Removing duplicate literal
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / test / TestStatementSource.java
1 /*
2  * Copyright (c) 2015 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/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.stmt.test;
9
10 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.CONTAINER;
11 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.IMPORT;
12 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.MODULE;
13 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.NAMESPACE;
14 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.PREFIX;
15 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.REVISION;
16 import static org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping.REVISION_DATE;
17 import java.util.Arrays;
18 import java.util.List;
19 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
20 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
21 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
22 import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
23 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
24 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
25 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
26 import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
27
28 class TestStatementSource implements StatementStreamSource {
29
30     public static class ModuleEntry {
31
32         private final String name;
33         private final String revision;
34
35         public ModuleEntry(String name, String revision) {
36
37             this.name = name;
38             this.revision = revision;
39         }
40
41         public String getName() {
42
43             return name;
44         }
45
46         public String getRevision() {
47
48             return revision;
49         }
50     }
51
52     private static final String NS_PREFIX = "urn:org:opendaylight:yangtools:test:";
53
54     private final String name;
55     private final String revision;
56     private final List<ModuleEntry> imports;
57     private String container;
58     private StatementWriter writer;
59     private StatementSourceReference REF = new StatementSourceReference() {
60
61         @Override
62         public StatementSource getStatementSource() {
63             return StatementSource.DECLARATION;
64         }
65     };
66
67     public TestStatementSource(ModuleEntry module, ModuleEntry... imports) {
68
69         this.name = module.getName();
70         this.revision = module.getRevision();
71         this.imports = Arrays.asList(imports);
72     }
73
74     public void setContainer(String container) {
75
76         this.container = container;
77     }
78
79     @Override
80     public void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes)
81             throws SourceException {
82         this.writer = writer;
83         header();
84         extensions();
85         body();
86         end();
87     }
88
89     @Override
90     public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) throws SourceException {
91         this.writer = writer;
92         header().end();
93     }
94
95     @Override
96     public void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef,
97             PrefixToModule prefixes) throws SourceException {
98         this.writer = writer;
99         header();
100         extensions();
101         end();
102     }
103
104     protected void extensions() throws SourceException {
105
106     }
107
108     protected void body() throws SourceException {
109
110         if (container != null)
111             stmt(CONTAINER).arg(container).end();
112     }
113
114     TestStatementSource header() throws SourceException {
115
116         stmt(MODULE).arg(name);
117         {
118             stmt(NAMESPACE).arg(getNamespace()).end();
119             stmt(PREFIX).arg(name).end();
120
121             if (revision != null) {
122                 stmt(REVISION).arg(revision).end();
123             }
124
125             for (ModuleEntry impEntry : imports) {
126
127                 String imp = impEntry.getName();
128                 String rev = impEntry.getRevision();
129
130                 stmt(IMPORT).arg(imp);
131                 {
132                     stmt(PREFIX).arg(imp).end();
133
134                     if (rev != null) {
135                         stmt(REVISION_DATE).arg(rev).end();
136                     }
137                 }
138                 end();
139             }
140         }
141         return this;
142     }
143
144     private String getNamespace() {
145         return NS_PREFIX + name;
146     }
147
148     protected TestStatementSource arg(String arg) throws SourceException {
149         writer.argumentValue(arg, REF);
150         return this;
151     }
152
153     protected TestStatementSource stmt(Rfc6020Mapping stmt) throws SourceException {
154         writer.startStatement(stmt.getStatementName(), REF);
155         return this;
156     }
157
158     protected TestStatementSource end() throws SourceException {
159         writer.endStatement(REF);
160         return this;
161     }
162 }