3333import org .slf4j .Logger ;
3434import org .slf4j .LoggerFactory ;
3535
36+ import org .apache .tika .detect .EncodingDetector ;
3637import org .apache .tika .exception .TikaConfigException ;
3738import org .apache .tika .mime .MediaType ;
38- import org .apache .tika .mime . MediaTypeRegistry ;
39+ import org .apache .tika .parser . AbstractEncodingDetectorParser ;
3940import org .apache .tika .parser .CompositeParser ;
4041import org .apache .tika .parser .Parser ;
4142import org .apache .tika .parser .ParserDecorator ;
@@ -52,7 +53,7 @@ public class ParserLoader {
5253
5354 private final ClassLoader classLoader ;
5455 private final ObjectMapper objectMapper ;
55- private final MediaTypeRegistry mediaTypeRegistry ;
56+ private final EncodingDetector encodingDetector ;
5657
5758 /**
5859 * Holds parsed config data before decoration is applied.
@@ -71,10 +72,10 @@ private static class ParsedParserConfig {
7172 }
7273
7374 public ParserLoader (ClassLoader classLoader , ObjectMapper objectMapper ,
74- MediaTypeRegistry mediaTypeRegistry ) {
75+ EncodingDetector encodingDetector ) {
7576 this .classLoader = classLoader ;
7677 this .objectMapper = objectMapper ;
77- this .mediaTypeRegistry = mediaTypeRegistry ;
78+ this .encodingDetector = encodingDetector ;
7879 }
7980
8081 /**
@@ -85,6 +86,8 @@ public ParserLoader(ClassLoader classLoader, ObjectMapper objectMapper,
8586 * @throws TikaConfigException if loading fails
8687 */
8788 public CompositeParser load (TikaJsonConfig config ) throws TikaConfigException {
89+ //TODO -- need to handle multiparsers at some point
90+ //TODO -- add special handling for external parsers?
8891 List <Parser > parserList = new ArrayList <>();
8992
9093 // Load configured parsers
@@ -185,7 +188,7 @@ public CompositeParser load(TikaJsonConfig config) throws TikaConfigException {
185188 parserList .addAll (spiParsers );
186189 }
187190
188- return new CompositeParser (mediaTypeRegistry , parserList );
191+ return new CompositeParser (TikaLoader . getMediaTypeRegistry () , parserList );
189192 }
190193
191194 private ParsedParserConfig loadConfiguredParser (String name , JsonNode configNode ,
@@ -213,16 +216,32 @@ private Parser instantiateParser(Class<?> parserClass, String configJson)
213216 throws TikaConfigException {
214217
215218 try {
219+ Parser parser ;
220+
216221 // Try constructor with String parameter (JSON config)
217222 try {
223+ //TODO -- change this from String to JsonConfig or simple wrapper class
218224 Constructor <?> constructor = parserClass .getConstructor (String .class );
219- return (Parser ) constructor .newInstance (configJson );
225+ parser = (Parser ) constructor .newInstance (configJson );
220226 } catch (NoSuchMethodException e ) {
221- // TODO -- entrypoint for actual configuration
222- // Fall back to zero-arg constructor
223- return (Parser ) ServiceLoaderUtils .newInstance (parserClass ,
224- new org .apache .tika .config .ServiceLoader (classLoader ));
227+ // Try constructor with EncodingDetector parameter (for AbstractEncodingDetectorParser)
228+ if (AbstractEncodingDetectorParser .class .isAssignableFrom (parserClass )) {
229+ try {
230+ Constructor <?> constructor = parserClass .getConstructor (EncodingDetector .class );
231+ parser = (Parser ) constructor .newInstance (encodingDetector );
232+ } catch (NoSuchMethodException ex ) {
233+ // Fall back to zero-arg constructor
234+ parser = (Parser ) ServiceLoaderUtils .newInstance (parserClass ,
235+ new org .apache .tika .config .ServiceLoader (classLoader ));
236+ }
237+ } else {
238+ // Fall back to zero-arg constructor
239+ parser = (Parser ) ServiceLoaderUtils .newInstance (parserClass ,
240+ new org .apache .tika .config .ServiceLoader (classLoader ));
241+ }
225242 }
243+
244+ return parser ;
226245 } catch (InstantiationException | IllegalAccessException | InvocationTargetException e ) {
227246 throw new TikaConfigException ("Failed to instantiate parser: " +
228247 parserClass .getName (), e );
@@ -268,7 +287,7 @@ private Parser applyFallbacks(Parser parser, FrameworkConfig.ParserDecoration de
268287 fallbackParsers .add (fallbackConfig .parser );
269288 }
270289
271- return new FallbackParser (mediaTypeRegistry , MetadataPolicy .KEEP_ALL , fallbackParsers );
290+ return new FallbackParser (TikaLoader . getMediaTypeRegistry () , MetadataPolicy .KEEP_ALL , fallbackParsers );
272291 }
273292
274293 private List <Parser > loadSpiParsers (Set <Class <?>> excludeClasses ) {
0 commit comments