private ExtractorFactory() {
ClassLoader cl = ExtractorFactory.class.getClassLoader();
ServiceLoader.load(ExtractorProvider.class, cl).forEach(provider::add);
+
+ // loading of service-files is non-deterministic as it depends on order of loaded jars
+ // however we would like to "prefer" one Factory, so let's make sure the more
+ // powerful "ScratchpadProvider" is sorted first
+ provider.sort((o1, o2) -> {
+ if (o1.getClass() != o2.getClass()) {
+ if (o1.getClass().getSimpleName().equals("OLE2ScratchpadExtractorFactory")) {
+ return -1;
+ } else if (o2.getClass().getSimpleName().equals("OLE2ScratchpadExtractorFactory")) {
+ return 1;
+ }
+ }
+
+ return o1.getClass().getName().compareTo(o2.getClass().getName());
+ });
}
/**
* @param dirs a list to be filled with directory references holding embedded
* @param nonPOIFS a list to be filled with streams which aren't based on POIFS entries
*
- * @throws IOException when the format specific extraction fails because of invalid entires
+ * @throws IOException when the format specific extraction fails because of invalid entries
+ * @throws java.lang.IllegalArgumentException if implementations do not overwrite this method
*/
default void identifyEmbeddedResources(POIOLE2TextExtractor ext, List<Entry> dirs, List<InputStream> nonPOIFS) throws IOException {
throw new IllegalArgumentException("Error checking for Scratchpad embedded resources");