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