diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index b00e004c..301a8418 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -13,6 +13,10 @@ For a detailed view of what has changed, refer to the {uri-repo}/commits/master[ == Unreleased +Bug Fixes:: + +* When creating an AsciidoctorJ instance with classloader parameter, extensions are not discovered (@ahus1) (#942) + == 2.4.0 (2020-07-19) Improvement:: diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/converter/internal/ConverterRegistryExecutor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/converter/internal/ConverterRegistryExecutor.java index 6e9b93c8..fcc9b20f 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/converter/internal/ConverterRegistryExecutor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/converter/internal/ConverterRegistryExecutor.java @@ -14,8 +14,12 @@ public ConverterRegistryExecutor(AsciidoctorJRuby asciidoctor) { } public void registerAllConverters() { + registerAllConverters(Thread.currentThread().getContextClassLoader()); + } + + public void registerAllConverters(ClassLoader classloader) { ServiceLoader converterRegistryServiceLoader = ServiceLoader - .load(ConverterRegistry.class); + .load(ConverterRegistry.class, classloader); for (ConverterRegistry converterRegistry : converterRegistryServiceLoader) { converterRegistry.register(asciidoctor); diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/extension/internal/ExtensionRegistryExecutor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/extension/internal/ExtensionRegistryExecutor.java index 5141029f..33cde92f 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/extension/internal/ExtensionRegistryExecutor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/extension/internal/ExtensionRegistryExecutor.java @@ -14,9 +14,13 @@ public ExtensionRegistryExecutor(AsciidoctorJRuby asciidoctor) { } public void registerAllExtensions() { + registerAllExtensions(Thread.currentThread().getContextClassLoader()); + } + + public void registerAllExtensions(ClassLoader classloader) { ServiceLoader extensionRegistryServiceLoader = ServiceLoader - .load(ExtensionRegistry.class); - + .load(ExtensionRegistry.class, classloader); + for (ExtensionRegistry extensionRegistry : extensionRegistryServiceLoader) { extensionRegistry.register(asciidoctor); } diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/JRubyAsciidoctor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/JRubyAsciidoctor.java index eff33ed1..8955fff2 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/JRubyAsciidoctor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/internal/JRubyAsciidoctor.java @@ -74,11 +74,15 @@ public static JRubyAsciidoctor create(List loadPaths) { } public static JRubyAsciidoctor create(ClassLoader classloader) { - return processRegistrations(createJRubyAsciidoctorInstance(null, new ArrayList<>(), classloader)); + return processRegistrations( + createJRubyAsciidoctorInstance(null, new ArrayList<>(), classloader), + classloader); } public static JRubyAsciidoctor create(ClassLoader classloader, String gemPath) { - return processRegistrations(createJRubyAsciidoctorInstance(Collections.singletonMap(GEM_PATH, gemPath), new ArrayList<>(), classloader)); + return processRegistrations( + createJRubyAsciidoctorInstance(Collections.singletonMap(GEM_PATH, gemPath), new ArrayList<>(), classloader), + classloader); } public static JRubyAsciidoctor create(List loadPaths, String gemPath) { @@ -96,22 +100,49 @@ private static JRubyAsciidoctor processRegistrations(JRubyAsciidoctor asciidocto return asciidoctor; } + private static JRubyAsciidoctor processRegistrations(JRubyAsciidoctor asciidoctor, ClassLoader classloader) { + registerExtensions(asciidoctor, classloader); + registerConverters(asciidoctor, classloader); + registerSyntaxHighlighters(asciidoctor, classloader); + registerLogHandlers(asciidoctor, classloader); + + JavaLogger.install(asciidoctor.getRubyRuntime(), asciidoctor); + + return asciidoctor; + } + private static void registerConverters(AsciidoctorJRuby asciidoctor) { new ConverterRegistryExecutor(asciidoctor).registerAllConverters(); } + private static void registerConverters(AsciidoctorJRuby asciidoctor, ClassLoader classloader) { + new ConverterRegistryExecutor(asciidoctor).registerAllConverters(classloader); + } + private static void registerExtensions(AsciidoctorJRuby asciidoctor) { new ExtensionRegistryExecutor(asciidoctor).registerAllExtensions(); } + private static void registerExtensions(AsciidoctorJRuby asciidoctor, ClassLoader classloader) { + new ExtensionRegistryExecutor(asciidoctor).registerAllExtensions(classloader); + } + private static void registerSyntaxHighlighters(AsciidoctorJRuby asciidoctor) { new SyntaxHighlighterRegistryExecutor(asciidoctor).registerAllSyntaxHighlighter(); } + private static void registerSyntaxHighlighters(AsciidoctorJRuby asciidoctor, ClassLoader classloader) { + new SyntaxHighlighterRegistryExecutor(asciidoctor).registerAllSyntaxHighlighter(classloader); + } + private static void registerLogHandlers(AsciidoctorJRuby asciidoctor) { new LogHandlerRegistryExecutor(asciidoctor).registerAllLogHandlers(); } + private static void registerLogHandlers(AsciidoctorJRuby asciidoctor, ClassLoader classloader) { + new LogHandlerRegistryExecutor(asciidoctor).registerAllLogHandlers(classloader); + } + private static JRubyAsciidoctor createJRubyAsciidoctorInstance(Map environmentVars, List loadPaths, ClassLoader classloader) { Ruby rubyRuntime = createRubyRuntime(environmentVars, loadPaths, classloader); return new JRubyAsciidoctor(rubyRuntime); diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/log/internal/LogHandlerRegistryExecutor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/log/internal/LogHandlerRegistryExecutor.java index 74613c9a..947ffba7 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/log/internal/LogHandlerRegistryExecutor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/log/internal/LogHandlerRegistryExecutor.java @@ -6,8 +6,6 @@ import java.util.ServiceLoader; public class LogHandlerRegistryExecutor { - private static ServiceLoader logHandlerServiceLoader = ServiceLoader - .load(LogHandler.class); private AsciidoctorJRuby asciidoctor; @@ -16,6 +14,13 @@ public LogHandlerRegistryExecutor(AsciidoctorJRuby asciidoctor) { } public void registerAllLogHandlers() { + registerAllLogHandlers(Thread.currentThread().getContextClassLoader()); + } + + public void registerAllLogHandlers(ClassLoader classloader) { + ServiceLoader logHandlerServiceLoader = ServiceLoader + .load(LogHandler.class, classloader); + for (LogHandler logHandler: logHandlerServiceLoader) { asciidoctor.registerLogHandler(logHandler); } diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/syntaxhighlighter/internal/SyntaxHighlighterRegistryExecutor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/syntaxhighlighter/internal/SyntaxHighlighterRegistryExecutor.java index 5923935c..590d83f7 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/syntaxhighlighter/internal/SyntaxHighlighterRegistryExecutor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/jruby/syntaxhighlighter/internal/SyntaxHighlighterRegistryExecutor.java @@ -15,9 +15,13 @@ public SyntaxHighlighterRegistryExecutor(AsciidoctorJRuby asciidoctor) { } public void registerAllSyntaxHighlighter() { + registerAllSyntaxHighlighter(Thread.currentThread().getContextClassLoader()); + } + + public void registerAllSyntaxHighlighter(ClassLoader classLoader) { ServiceLoader serviceLoader = ServiceLoader - .load(SyntaxHighlighterRegistry.class); - + .load(SyntaxHighlighterRegistry.class, classLoader); + for (SyntaxHighlighterRegistry extensionRegistry : serviceLoader) { extensionRegistry.register(asciidoctor); }