1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.doxia.parser;
20
21 import javax.inject.Inject;
22
23 import java.io.File;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.io.Reader;
27 import java.io.StringReader;
28 import java.util.ArrayList;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.LinkedList;
32 import java.util.List;
33 import java.util.Properties;
34
35 import org.apache.maven.doxia.macro.Macro;
36 import org.apache.maven.doxia.macro.MacroExecutionException;
37 import org.apache.maven.doxia.macro.MacroRequest;
38 import org.apache.maven.doxia.macro.manager.MacroManager;
39 import org.apache.maven.doxia.macro.manager.MacroNotFoundException;
40 import org.apache.maven.doxia.sink.Sink;
41 import org.apache.maven.doxia.sink.impl.CreateAnchorsForIndexEntriesFactory;
42 import org.apache.maven.doxia.sink.impl.SinkWrapperFactory;
43 import org.apache.maven.doxia.sink.impl.SinkWrapperFactoryComparator;
44
45
46
47
48
49
50
51
52 public abstract class AbstractParser implements Parser {
53
54 private boolean secondParsing = false;
55
56 @Inject
57 private MacroManager macroManager;
58
59 @Inject
60 private Collection<SinkWrapperFactory> automaticallyRegisteredSinkWrapperFactories;
61
62 private final Collection<SinkWrapperFactory> manuallyRegisteredSinkWrapperFactories = new LinkedList<>();
63
64
65
66
67 private boolean emitComments = true;
68
69 private boolean emitAnchors = false;
70
71 private static final String DOXIA_VERSION;
72
73 static {
74 final Properties props = new Properties();
75 final InputStream is = AbstractParser.class.getResourceAsStream(
76 "/META-INF/maven/org.apache.maven.doxia/doxia-core/pom.properties");
77
78 if (is == null) {
79 props.setProperty("version", "unknown");
80 } else {
81 try {
82 props.load(is);
83 } catch (IOException ex) {
84 props.setProperty("version", "unknown");
85 } finally {
86 try {
87 is.close();
88 } catch (IOException ex) {
89
90 }
91 }
92 }
93
94 DOXIA_VERSION = props.getProperty("version");
95 }
96
97
98
99
100
101
102 public int getType() {
103 return UNKNOWN_TYPE;
104 }
105
106
107 public void setEmitComments(boolean emitComments) {
108 this.emitComments = emitComments;
109 }
110
111
112
113
114
115
116 public boolean isEmitComments() {
117 return emitComments;
118 }
119
120 @Override
121 public boolean isEmitAnchorsForIndexableEntries() {
122 return emitAnchors;
123 }
124
125 @Override
126 public void setEmitAnchorsForIndexableEntries(boolean emitAnchors) {
127 this.emitAnchors = emitAnchors;
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141 public void executeMacro(String macroId, MacroRequest request, Sink sink)
142 throws MacroExecutionException, MacroNotFoundException {
143 Macro macro = getMacroManager().getMacro(macroId);
144
145 macro.execute(sink, request);
146 }
147
148
149
150
151
152
153
154 protected File getBasedir() {
155
156
157
158 String basedir = System.getProperty("basedir");
159
160 if (basedir != null) {
161 return new File(basedir);
162 }
163
164 return new File(new File("").getAbsolutePath());
165 }
166
167
168
169
170
171
172
173
174
175 public void parse(String string, Sink sink) throws ParseException {
176 this.parse(string, sink, null);
177 }
178
179
180
181
182
183
184
185
186
187
188 public void parse(String string, Sink sink, String reference) throws ParseException {
189 parse(new StringReader(string), sink, reference);
190 }
191
192
193 @Override
194 public void parse(Reader source, Sink sink) throws ParseException {
195 parse(source, sink, null);
196 }
197
198
199
200
201
202
203
204 protected Sink getWrappedSink(Sink sink) {
205
206 if (secondParsing) {
207 return sink;
208 }
209 Sink currentSink = sink;
210 for (SinkWrapperFactory factory : getSinkWrapperFactories()) {
211 currentSink = factory.createWrapper(currentSink);
212 }
213 return currentSink;
214 }
215
216
217
218
219
220
221 public void setSecondParsing(boolean second) {
222 this.secondParsing = second;
223 }
224
225
226
227
228
229
230
231 protected boolean isSecondParsing() {
232 return secondParsing;
233 }
234
235 @Override
236 public void addSinkWrapperFactory(SinkWrapperFactory factory) {
237 manuallyRegisteredSinkWrapperFactories.add(factory);
238 }
239
240
241
242
243
244
245
246 protected List<SinkWrapperFactory> getSinkWrapperFactories() {
247 List<SinkWrapperFactory> effectiveSinkWrapperFactories = new ArrayList<>();
248 if (automaticallyRegisteredSinkWrapperFactories != null) {
249 effectiveSinkWrapperFactories.addAll(automaticallyRegisteredSinkWrapperFactories);
250 }
251 effectiveSinkWrapperFactories.addAll(manuallyRegisteredSinkWrapperFactories);
252 if (emitAnchors) {
253 effectiveSinkWrapperFactories.add(new CreateAnchorsForIndexEntriesFactory());
254 }
255 Collections.sort(effectiveSinkWrapperFactories, Collections.reverseOrder(new SinkWrapperFactoryComparator()));
256 return effectiveSinkWrapperFactories;
257 }
258
259
260
261
262
263
264
265 protected MacroManager getMacroManager() {
266 return macroManager;
267 }
268
269
270
271
272
273
274
275
276 protected void init() {
277
278 }
279
280
281
282
283
284
285
286 protected static String doxiaVersion() {
287 return DOXIA_VERSION;
288 }
289 }