Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
AbstractParser |
|
| 1.2727272727272727;1,273 |
1 | package org.apache.maven.doxia.parser; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import java.io.File; | |
23 | import java.io.IOException; | |
24 | import java.io.InputStream; | |
25 | import java.io.StringReader; | |
26 | ||
27 | import java.util.Properties; | |
28 | ||
29 | import org.apache.maven.doxia.logging.Log; | |
30 | import org.apache.maven.doxia.logging.SystemStreamLog; | |
31 | import org.apache.maven.doxia.macro.Macro; | |
32 | import org.apache.maven.doxia.macro.MacroExecutionException; | |
33 | import org.apache.maven.doxia.macro.MacroRequest; | |
34 | import org.apache.maven.doxia.macro.manager.MacroManager; | |
35 | import org.apache.maven.doxia.macro.manager.MacroNotFoundException; | |
36 | import org.apache.maven.doxia.sink.Sink; | |
37 | ||
38 | /** | |
39 | * An abstract base class that defines some convenience methods for parsers. | |
40 | * Provides a macro mechanism to give dynamic functionalities for the parsing. | |
41 | * | |
42 | * @author Jason van Zyl | |
43 | * @version $Id: AbstractParser.java 1094965 2011-04-19 09:30:13Z ltheussl $ | |
44 | * @since 1.0 | |
45 | * @plexus.component | |
46 | */ | |
47 | 44 | public abstract class AbstractParser |
48 | implements Parser | |
49 | { | |
50 | /** Indicates that a second parsing is required. */ | |
51 | 44 | private boolean secondParsing = false; |
52 | ||
53 | /** @plexus.requirement */ | |
54 | private MacroManager macroManager; | |
55 | ||
56 | /** Log instance. */ | |
57 | private Log logger; | |
58 | ||
59 | private static final String DOXIA_VERSION; | |
60 | ||
61 | static | |
62 | { | |
63 | 2 | final Properties props = new Properties(); |
64 | 2 | final InputStream is = AbstractParser.class.getResourceAsStream( "/build-info.properties" ); |
65 | ||
66 | 2 | if ( is == null ) |
67 | { | |
68 | 0 | props.setProperty( "version", "unknown" ); // should not happen |
69 | } | |
70 | else | |
71 | { | |
72 | try | |
73 | { | |
74 | 2 | props.load( is ); |
75 | } | |
76 | 0 | catch ( IOException ex ) |
77 | { | |
78 | 0 | props.setProperty( "version", "unknown" ); // should not happen |
79 | } | |
80 | finally | |
81 | { | |
82 | 0 | try |
83 | { | |
84 | 2 | is.close(); |
85 | } | |
86 | 0 | catch ( IOException ex ) |
87 | { | |
88 | // oh well... | |
89 | 2 | } |
90 | 0 | } |
91 | } | |
92 | ||
93 | 2 | DOXIA_VERSION = props.getProperty( "version" ); |
94 | 2 | } |
95 | ||
96 | /** {@inheritDoc} */ | |
97 | public int getType() | |
98 | { | |
99 | 0 | return UNKNOWN_TYPE; |
100 | } | |
101 | ||
102 | /** | |
103 | * Execute a macro on the given sink. | |
104 | * | |
105 | * @param macroId An id to lookup the macro. | |
106 | * @param request The corresponding MacroRequest. | |
107 | * @param sink The sink to receive the events. | |
108 | * @throws org.apache.maven.doxia.macro.MacroExecutionException if an error occurred during execution. | |
109 | * @throws org.apache.maven.doxia.macro.manager.MacroNotFoundException if the macro could not be found. | |
110 | */ | |
111 | // Made public right now because of the structure of the APT parser and | |
112 | // all its inner classes. | |
113 | public void executeMacro( String macroId, MacroRequest request, Sink sink ) | |
114 | throws MacroExecutionException, MacroNotFoundException | |
115 | { | |
116 | 0 | Macro macro = getMacroManager().getMacro( macroId ); |
117 | ||
118 | 0 | macro.enableLogging( getLog() ); |
119 | ||
120 | 0 | macro.execute( sink, request ); |
121 | 0 | } |
122 | ||
123 | /** | |
124 | * Returns the current base directory. | |
125 | * | |
126 | * @return The base directory. | |
127 | * | |
128 | * @deprecated this does not work in multi-module builds, see DOXIA-373 | |
129 | */ | |
130 | protected File getBasedir() | |
131 | { | |
132 | // TODO: This is baaad, it should come in with the request. | |
133 | // (this is only used for macro requests, see AptParser) | |
134 | ||
135 | 0 | String basedir = System.getProperty( "basedir" ); |
136 | ||
137 | 0 | if ( basedir != null ) |
138 | { | |
139 | 0 | return new File( basedir ); |
140 | } | |
141 | ||
142 | 0 | return new File( new File( "" ).getAbsolutePath() ); |
143 | } | |
144 | ||
145 | /** | |
146 | * Convenience method to parse an arbitrary string and emit events into the given sink. | |
147 | * | |
148 | * @param string A string that provides the source input. | |
149 | * @param sink A sink that consumes the Doxia events. | |
150 | * @throws org.apache.maven.doxia.parser.ParseException if the string could not be parsed. | |
151 | * @since 1.1 | |
152 | */ | |
153 | public void parse( String string, Sink sink ) | |
154 | throws ParseException | |
155 | { | |
156 | 46 | parse( new StringReader( string ), sink ); |
157 | 46 | } |
158 | ||
159 | /** | |
160 | * Set <code>secondParsing</code> to true, if we need a second parsing. | |
161 | * | |
162 | * @param second True for second parsing. | |
163 | */ | |
164 | public void setSecondParsing( boolean second ) | |
165 | { | |
166 | 110 | this.secondParsing = second; |
167 | 110 | } |
168 | ||
169 | /** | |
170 | * Indicates if we are currently parsing a second time. | |
171 | * | |
172 | * @return true if we are currently parsing a second time. | |
173 | * @since 1.1 | |
174 | */ | |
175 | protected boolean isSecondParsing() | |
176 | { | |
177 | 0 | return secondParsing; |
178 | } | |
179 | ||
180 | /** {@inheritDoc} */ | |
181 | public void enableLogging( Log log ) | |
182 | { | |
183 | 0 | this.logger = log; |
184 | 0 | } |
185 | ||
186 | /** | |
187 | * Returns the current logger for this parser. | |
188 | * If no logger has been configured yet, a new SystemStreamLog is returned. | |
189 | * | |
190 | * @return Log | |
191 | * @since 1.1 | |
192 | */ | |
193 | protected Log getLog() | |
194 | { | |
195 | 174 | if ( logger == null ) |
196 | { | |
197 | 44 | logger = new SystemStreamLog(); |
198 | } | |
199 | ||
200 | 174 | return logger; |
201 | } | |
202 | ||
203 | /** | |
204 | * Gets the current {@link MacroManager}. | |
205 | * | |
206 | * @return The current {@link MacroManager}. | |
207 | * @since 1.1 | |
208 | */ | |
209 | protected MacroManager getMacroManager() | |
210 | { | |
211 | 0 | return macroManager; |
212 | } | |
213 | ||
214 | /** | |
215 | * Initialize the parser. This is called first by | |
216 | * {@link #parse(java.io.Reader, org.apache.maven.doxia.sink.Sink)} and can be used | |
217 | * to set the parser into a clear state so it can be re-used. | |
218 | * | |
219 | * @since 1.1.2 | |
220 | */ | |
221 | protected void init() | |
222 | { | |
223 | // nop | |
224 | 208 | } |
225 | ||
226 | /** | |
227 | * The current Doxia version. | |
228 | * | |
229 | * @return the current Doxia version as a String. | |
230 | * | |
231 | * @since 1.2 | |
232 | */ | |
233 | protected static String doxiaVersion() | |
234 | { | |
235 | 4 | return DOXIA_VERSION; |
236 | } | |
237 | } |