From def1e4c7f22a8440e09e14cfdcb1c38abfb814cc Mon Sep 17 00:00:00 2001 From: Robert Panzer Date: Mon, 22 Oct 2018 15:44:02 +0200 Subject: [PATCH] Make Asciidoctor expose interfaces exclusively --- .../java/org/asciidoctor/Asciidoctor.java | 16 +- .../converter/JavaConverterRegistry.java | 80 +--- .../extension/JavaExtensionRegistry.java | 364 ++++-------------- .../extension/RubyExtensionRegistry.java | 85 +--- .../internal/JRubyAsciidoctor.java | 6 +- .../internal/JavaConverterRegistryImpl.java | 91 +++++ .../internal/JavaExtensionRegistryImpl.java | 335 ++++++++++++++++ .../internal/RubyExtensionRegistryImpl.java | 99 +++++ 8 files changed, 628 insertions(+), 448 deletions(-) create mode 100644 asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaConverterRegistryImpl.java create mode 100644 asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaExtensionRegistryImpl.java create mode 100644 asciidoctorj-core/src/main/java/org/asciidoctor/internal/RubyExtensionRegistryImpl.java diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/Asciidoctor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/Asciidoctor.java index d3ba6e2d9..0f154c4ba 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/Asciidoctor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/Asciidoctor.java @@ -1,13 +1,5 @@ package org.asciidoctor; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import org.asciidoctor.ast.Document; import org.asciidoctor.ast.DocumentHeader; import org.asciidoctor.ast.StructuredDocument; @@ -18,6 +10,14 @@ import org.asciidoctor.internal.JRubyAsciidoctor; import org.asciidoctor.log.LogHandler; +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.Collection; +import java.util.List; +import java.util.Map; + /** * * diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/converter/JavaConverterRegistry.java b/asciidoctorj-core/src/main/java/org/asciidoctor/converter/JavaConverterRegistry.java index 87316084c..6d74644e1 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/converter/JavaConverterRegistry.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/converter/JavaConverterRegistry.java @@ -1,82 +1,14 @@ package org.asciidoctor.converter; -import org.jruby.Ruby; -import org.jruby.RubyArray; -import org.jruby.RubyClass; - -import java.util.HashMap; import java.util.Map; -public class JavaConverterRegistry { - - private Ruby rubyRuntime; - - public JavaConverterRegistry(Ruby rubyRuntime) { - this.rubyRuntime = rubyRuntime; - } - - public & OutputFormatWriter> void register(final Class converterClass, String... backends) { - - RubyClass clazz = ConverterProxy.register(rubyRuntime, converterClass); - - ConverterFor converterForAnnotation = converterClass.getAnnotation(ConverterFor.class); - if (converterForAnnotation != null) { - // Backend annotation present => Register with name given in annotation - String backend = !ConverterFor.UNDEFINED.equals(converterForAnnotation.format()) ? converterForAnnotation.format() : converterForAnnotation.value(); - getConverterFactory() - .callMethod("register", clazz, rubyRuntime.newArray(rubyRuntime.newString(backend))); - - } else if (backends.length == 0) { - // No backend annotation and no backend defined => register as default backend - getConverterFactory() - .callMethod("register", clazz); - } - if (backends.length > 0) { - // Always additionally register with names passed to this method - final RubyArray rubyBackendNames = new RubyArray(rubyRuntime, backends.length); - for (String backend: backends) { - rubyBackendNames.add(rubyRuntime.newString(backend)); - } - getConverterFactory() - .callMethod("register", clazz, rubyBackendNames); - } - } - - public Class resolve(String backend) { - RubyClass rubyClass = (RubyClass) getConverterFactory() - .callMethod("resolve", rubyRuntime.newString(backend)); - - Class clazz = rubyClass.getReifiedClass(); - if (clazz != null) { - return clazz; - } else if (rubyClass.getAllocator() instanceof ConverterProxy.Allocator) { - ConverterProxy.Allocator allocator = (ConverterProxy.Allocator) rubyClass.getAllocator(); - return allocator.getConverterClass(); - } - return null; - } +public interface JavaConverterRegistry { - public void unregisterAll() { - getConverterFactory() - .callMethod("unregister_all"); - } + & OutputFormatWriter> void register(Class converterClass, String... backends); - private RubyClass getConverterFactory() { - return rubyRuntime.getModule("Asciidoctor") - .defineOrGetModuleUnder("Converter") - .getClass("Factory"); - } + Class resolve(String backend); - public Map> converters() { - final RubyArray rubyKeys = (RubyArray) getConverterFactory() - .callMethod("converters") - .callMethod(rubyRuntime.getCurrentContext(), "keys"); + void unregisterAll(); - Map> converters = new HashMap>(); - for (Object rubyBackend : rubyKeys) { - String backend = rubyBackend.toString(); - converters.put(backend, resolve(backend)); - } - return converters; - } -} \ No newline at end of file + Map> converters(); +} diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/extension/JavaExtensionRegistry.java b/asciidoctorj-core/src/main/java/org/asciidoctor/extension/JavaExtensionRegistry.java index 4deae2d2b..a4ceda2ff 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/extension/JavaExtensionRegistry.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/extension/JavaExtensionRegistry.java @@ -1,297 +1,73 @@ package org.asciidoctor.extension; -import org.asciidoctor.extension.processorproxies.BlockMacroProcessorProxy; -import org.asciidoctor.extension.processorproxies.BlockProcessorProxy; -import org.asciidoctor.extension.processorproxies.DocinfoProcessorProxy; -import org.asciidoctor.extension.processorproxies.IncludeProcessorProxy; -import org.asciidoctor.extension.processorproxies.InlineMacroProcessorProxy; -import org.asciidoctor.extension.processorproxies.PostprocessorProxy; -import org.asciidoctor.extension.processorproxies.PreprocessorProxy; -import org.asciidoctor.extension.processorproxies.TreeprocessorProxy; -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.internal.runtime.methods.DynamicMethod; - -import java.util.Map; - -public class JavaExtensionRegistry { - - private Ruby rubyRuntime; - - public JavaExtensionRegistry(final Ruby rubyRuntime) { - this.rubyRuntime = rubyRuntime; - } - - public JavaExtensionRegistry docinfoProcessor(Class docInfoProcessor) { - - RubyClass rubyClass = DocinfoProcessorProxy.register(rubyRuntime, docInfoProcessor); - getAsciidoctorModule() - .callMethod( "docinfo_processor", rubyClass); - return this; - } - - public JavaExtensionRegistry docinfoProcessor(DocinfoProcessor docInfoProcessor) { - RubyClass rubyClass = DocinfoProcessorProxy.register(rubyRuntime, docInfoProcessor); - getAsciidoctorModule() - .callMethod( "docinfo_processor", rubyClass); - return this; - } - - public JavaExtensionRegistry docinfoProcessor(String docInfoProcessor) { - try { - Class docinfoProcessorClass = (Class) Class.forName(docInfoProcessor); - docinfoProcessor(docinfoProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry preprocessor(Class preprocessor) { - RubyClass rubyClass = PreprocessorProxy.register(rubyRuntime, preprocessor); - getAsciidoctorModule() - .callMethod( "preprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry preprocessor(Preprocessor preprocessor) { - RubyClass rubyClass = PreprocessorProxy.register(rubyRuntime, preprocessor); - - getAsciidoctorModule() - .callMethod( "preprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry preprocessor(String preprocessor) { - try { - Class preprocessorClass = (Class) Class.forName(preprocessor); - preprocessor(preprocessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry postprocessor(String postprocessor) { - try { - Class postprocessorClass = (Class) Class.forName(postprocessor); - postprocessor(postprocessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry postprocessor(Class postprocessor) { - RubyClass rubyClass = PostprocessorProxy.register(rubyRuntime, postprocessor); - getAsciidoctorModule() - .callMethod( "postprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry postprocessor(Postprocessor postprocessor) { - RubyClass rubyClass = PostprocessorProxy.register(rubyRuntime, postprocessor); - getAsciidoctorModule() - .callMethod( "postprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry includeProcessor(String includeProcessor) { - try { - Class includeProcessorClass = (Class) Class.forName(includeProcessor); - includeProcessor(includeProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry includeProcessor( - Class includeProcessor) { - RubyClass rubyClass = IncludeProcessorProxy.register(rubyRuntime, includeProcessor); - getAsciidoctorModule() - .callMethod( "include_processor", rubyClass); - return this; - } - - public JavaExtensionRegistry includeProcessor(IncludeProcessor includeProcessor) { - RubyClass rubyClass = IncludeProcessorProxy.register(rubyRuntime, includeProcessor); - getAsciidoctorModule() - .callMethod( "include_processor", rubyClass); - return this; - } - - public JavaExtensionRegistry treeprocessor(Treeprocessor treeprocessor) { - RubyClass rubyClass = TreeprocessorProxy.register(rubyRuntime, treeprocessor); - getAsciidoctorModule() - .callMethod( "treeprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry treeprocessor(Class abstractTreeProcessor) { - RubyClass rubyClass = TreeprocessorProxy.register(rubyRuntime, abstractTreeProcessor); - getAsciidoctorModule() - .callMethod( "treeprocessor", rubyClass); - return this; - } - - public JavaExtensionRegistry treeprocessor(String treeProcessor) { - try { - Class treeProcessorClass = (Class) Class.forName(treeProcessor); - treeprocessor(treeProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry block(String blockName, - String blockProcessor) { - try { - Class blockProcessorClass = (Class) Class.forName(blockProcessor); - block(blockName, blockProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry block(String blockProcessor) { - try { - Class blockProcessorClass = (Class) Class.forName(blockProcessor); - block(blockProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry block(String blockName, - Class blockProcessor) { - RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); - getAsciidoctorModule() - .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockName)); - return this; - } - - public JavaExtensionRegistry block(Class blockProcessor) { - String name = getName(blockProcessor); - block(name, blockProcessor); - return this; - } - - public JavaExtensionRegistry block(BlockProcessor blockProcessor) { - RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); - getAsciidoctorModule() - .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockProcessor.getName())); - return this; - } - - public JavaExtensionRegistry block(String blockName, - BlockProcessor blockProcessor) { - RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); - getAsciidoctorModule() - .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockName)); - return this; - } - - public JavaExtensionRegistry blockMacro(String blockName, - Class blockMacroProcessor) { - RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); - getAsciidoctorModule() - .callMethod( "block_macro", rubyClass, rubyRuntime.newString(blockName)); - return this; - } - - public JavaExtensionRegistry blockMacro(Class blockMacroProcessor) { - String name = getName(blockMacroProcessor); - RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); - getAsciidoctorModule() - .callMethod( "block_macro", rubyClass, rubyRuntime.newString(name)); - return this; - } - - public JavaExtensionRegistry blockMacro(String blockName, - String blockMacroProcessor) { - try { - Class blockMacroProcessorClass = (Class) Class.forName(blockMacroProcessor); - blockMacro(blockName, blockMacroProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry blockMacro(String blockMacroProcessor) { - try { - Class blockMacroProcessorClass = (Class) Class.forName(blockMacroProcessor); - blockMacro(blockMacroProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry blockMacro(BlockMacroProcessor blockMacroProcessor) { - RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); - getAsciidoctorModule() - .callMethod( "block_macro", rubyClass, rubyRuntime.newString(blockMacroProcessor.getName())); - return this; - } - - public JavaExtensionRegistry inlineMacro(InlineMacroProcessor inlineMacroProcessor) { - RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); - getAsciidoctorModule() - .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(inlineMacroProcessor.getName())); - return this; - } - - public JavaExtensionRegistry inlineMacro(String blockName, - Class inlineMacroProcessor) { - RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); - getAsciidoctorModule() - .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(blockName)); - return this; - } - - public JavaExtensionRegistry inlineMacro(Class inlineMacroProcessor) { - String name = getName(inlineMacroProcessor); - RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); - getAsciidoctorModule() - .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(name)); - return this; - } - - public JavaExtensionRegistry inlineMacro(String blockName, String inlineMacroProcessor) { - try { - Class inlineMacroProcessorClass = (Class) Class.forName(inlineMacroProcessor); - inlineMacro(blockName, inlineMacroProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - public JavaExtensionRegistry inlineMacro(String inlineMacroProcessor) { - try { - Class inlineMacroProcessorClass = (Class) Class.forName(inlineMacroProcessor); - inlineMacro(inlineMacroProcessorClass); - return this; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - private String getName(Class clazz) { - Name nameAnnotation = clazz.getAnnotation(Name.class); - if (nameAnnotation == null || nameAnnotation.value() == null) { - throw new IllegalArgumentException(clazz + " must be registered with a name or it must have a Name annotation!"); - } - return nameAnnotation.value(); - } - - private RubyModule getAsciidoctorModule() { - return rubyRuntime.getModule("AsciidoctorModule"); - } +public interface JavaExtensionRegistry { + + JavaExtensionRegistry docinfoProcessor(Class docInfoProcessor); + + JavaExtensionRegistry docinfoProcessor(DocinfoProcessor docInfoProcessor); + + JavaExtensionRegistry docinfoProcessor(String docInfoProcessor); + + JavaExtensionRegistry preprocessor(Class preprocessor); + + JavaExtensionRegistry preprocessor(Preprocessor preprocessor); + + JavaExtensionRegistry preprocessor(String preprocessor); + + JavaExtensionRegistry postprocessor(String postprocessor); + + JavaExtensionRegistry postprocessor(Class postprocessor); + + JavaExtensionRegistry postprocessor(Postprocessor postprocessor); + + JavaExtensionRegistry includeProcessor(String includeProcessor); + + JavaExtensionRegistry includeProcessor( + Class includeProcessor); + + JavaExtensionRegistry includeProcessor(IncludeProcessor includeProcessor); + + JavaExtensionRegistry treeprocessor(Treeprocessor treeprocessor); + + JavaExtensionRegistry treeprocessor(Class abstractTreeProcessor); + + JavaExtensionRegistry treeprocessor(String treeProcessor); + + JavaExtensionRegistry block(String blockName, + String blockProcessor); + + JavaExtensionRegistry block(String blockProcessor); + + JavaExtensionRegistry block(String blockName, + Class blockProcessor); + + JavaExtensionRegistry block(Class blockProcessor); + + JavaExtensionRegistry block(BlockProcessor blockProcessor); + + JavaExtensionRegistry block(String blockName, + BlockProcessor blockProcessor); + + JavaExtensionRegistry blockMacro(String blockName, + Class blockMacroProcessor); + + JavaExtensionRegistry blockMacro(Class blockMacroProcessor); + + JavaExtensionRegistry blockMacro(String blockName, + String blockMacroProcessor); + + JavaExtensionRegistry blockMacro(String blockMacroProcessor); + + JavaExtensionRegistry blockMacro(BlockMacroProcessor blockMacroProcessor); + + JavaExtensionRegistry inlineMacro(InlineMacroProcessor inlineMacroProcessor); + + JavaExtensionRegistry inlineMacro(String blockName, + Class inlineMacroProcessor); + + JavaExtensionRegistry inlineMacro(Class inlineMacroProcessor); + + JavaExtensionRegistry inlineMacro(String blockName, String inlineMacroProcessor); + + JavaExtensionRegistry inlineMacro(String inlineMacroProcessor); } diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/extension/RubyExtensionRegistry.java b/asciidoctorj-core/src/main/java/org/asciidoctor/extension/RubyExtensionRegistry.java index 53c75f323..d575a1397 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/extension/RubyExtensionRegistry.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/extension/RubyExtensionRegistry.java @@ -1,86 +1,33 @@ package org.asciidoctor.extension; -import org.asciidoctor.internal.RubyUtils; -import org.jruby.Ruby; -import org.jruby.RubyModule; +import org.asciidoctor.internal.RubyExtensionRegistryImpl; import java.io.InputStream; -public class RubyExtensionRegistry { +public interface RubyExtensionRegistry { + RubyExtensionRegistryImpl requireLibrary(String requiredLibrary); + RubyExtensionRegistryImpl loadClass(InputStream rubyClassStream); - private Ruby rubyRuntime; + RubyExtensionRegistryImpl preprocessor(String preprocessor); - public RubyExtensionRegistry(final Ruby rubyRuntime) { - this.rubyRuntime = rubyRuntime; - } + RubyExtensionRegistryImpl postprocessor(String postprocessor); - public RubyExtensionRegistry requireLibrary(String requiredLibrary) { - RubyUtils.requireLibrary(rubyRuntime, requiredLibrary); - return this; - } - - public RubyExtensionRegistry loadClass(InputStream rubyClassStream) { - RubyUtils.loadRubyClass(rubyRuntime, rubyClassStream); - return this; - } + RubyExtensionRegistryImpl docinfoProcessor(String docinfoProcessor); - public RubyExtensionRegistry preprocessor(String preprocessor) { - getAsciidoctorModule().callMethod( "preprocessor", rubyRuntime.newString(preprocessor)); - return this; - } + RubyExtensionRegistryImpl includeProcessor(String includeProcessor); - public RubyExtensionRegistry postprocessor(String postprocessor) { - getAsciidoctorModule().callMethod( "postprocessor", rubyRuntime.newString(postprocessor)); - return this; - } + RubyExtensionRegistryImpl treeprocessor(String treeProcessor); - public RubyExtensionRegistry docinfoProcessor(String docinfoProcessor) { - getAsciidoctorModule().callMethod( "docinfo_processor", rubyRuntime.newString(docinfoProcessor)); - return this; - } + RubyExtensionRegistryImpl block(String blockName, String blockProcessor); - public RubyExtensionRegistry includeProcessor(String includeProcessor) { - getAsciidoctorModule().callMethod( "include_processor", rubyRuntime.newString(includeProcessor)); - return this; - } + RubyExtensionRegistryImpl block(String blockProcessor); - public RubyExtensionRegistry treeprocessor(String treeProcessor) { - getAsciidoctorModule().callMethod( "treeprocessor", rubyRuntime.newString(treeProcessor)); - return this; - } + RubyExtensionRegistryImpl blockMacro(String blockName, String blockMacroProcessor); - public RubyExtensionRegistry block(String blockName, String blockProcessor) { - getAsciidoctorModule().callMethod( "block_processor", rubyRuntime.newString(blockProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); - return this; - } + RubyExtensionRegistryImpl blockMacro(String blockMacroProcessor); - public RubyExtensionRegistry block(String blockProcessor) { - getAsciidoctorModule().callMethod( "block_processor", rubyRuntime.newString(blockProcessor)); - return this; - } + RubyExtensionRegistryImpl inlineMacro(String blockName, String inlineMacroProcessor); - public RubyExtensionRegistry blockMacro(String blockName, String blockMacroProcessor) { - getAsciidoctorModule().callMethod( "block_macro", rubyRuntime.newString(blockMacroProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); - return this; - } - - public RubyExtensionRegistry blockMacro(String blockMacroProcessor) { - getAsciidoctorModule().callMethod( "block_macro", rubyRuntime.newString(blockMacroProcessor)); - return this; - } - - public RubyExtensionRegistry inlineMacro(String blockName, String inlineMacroProcessor) { - getAsciidoctorModule().callMethod( "inline_macro", rubyRuntime.newString(inlineMacroProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); - return this; - } - - public RubyExtensionRegistry inlineMacro(String inlineMacroProcessor) { - getAsciidoctorModule().callMethod( "inline_macro", rubyRuntime.newString(inlineMacroProcessor)); - return this; - } - - private RubyModule getAsciidoctorModule() { - return rubyRuntime.getModule("AsciidoctorModule"); - } -} \ No newline at end of file + RubyExtensionRegistryImpl inlineMacro(String inlineMacroProcessor); +} diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JRubyAsciidoctor.java b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JRubyAsciidoctor.java index 9800b31af..400da8cc8 100644 --- a/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JRubyAsciidoctor.java +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JRubyAsciidoctor.java @@ -428,17 +428,17 @@ public void requireLibraries(Collection libraries) { @Override public JavaExtensionRegistry javaExtensionRegistry() { - return new JavaExtensionRegistry(rubyRuntime); + return new JavaExtensionRegistryImpl(rubyRuntime); } @Override public RubyExtensionRegistry rubyExtensionRegistry() { - return new RubyExtensionRegistry(rubyRuntime); + return new RubyExtensionRegistryImpl(rubyRuntime); } @Override public JavaConverterRegistry javaConverterRegistry() { - return new JavaConverterRegistry(rubyRuntime); + return new JavaConverterRegistryImpl(rubyRuntime); } @Override diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaConverterRegistryImpl.java b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaConverterRegistryImpl.java new file mode 100644 index 000000000..bf558fed9 --- /dev/null +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaConverterRegistryImpl.java @@ -0,0 +1,91 @@ +package org.asciidoctor.internal; + +import org.asciidoctor.converter.Converter; +import org.asciidoctor.converter.ConverterFor; +import org.asciidoctor.converter.ConverterProxy; +import org.asciidoctor.converter.JavaConverterRegistry; +import org.asciidoctor.converter.OutputFormatWriter; +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyClass; + +import java.util.HashMap; +import java.util.Map; + +public class JavaConverterRegistryImpl implements JavaConverterRegistry { + + private Ruby rubyRuntime; + + public JavaConverterRegistryImpl(Ruby rubyRuntime) { + this.rubyRuntime = rubyRuntime; + } + + @Override + public & OutputFormatWriter> void register(final Class converterClass, String... backends) { + + RubyClass clazz = ConverterProxy.register(rubyRuntime, converterClass); + + ConverterFor converterForAnnotation = converterClass.getAnnotation(ConverterFor.class); + if (converterForAnnotation != null) { + // Backend annotation present => Register with name given in annotation + String backend = !ConverterFor.UNDEFINED.equals(converterForAnnotation.format()) ? converterForAnnotation.format() : converterForAnnotation.value(); + getConverterFactory() + .callMethod("register", clazz, rubyRuntime.newArray(rubyRuntime.newString(backend))); + + } else if (backends.length == 0) { + // No backend annotation and no backend defined => register as default backend + getConverterFactory() + .callMethod("register", clazz); + } + if (backends.length > 0) { + // Always additionally register with names passed to this method + final RubyArray rubyBackendNames = new RubyArray(rubyRuntime, backends.length); + for (String backend: backends) { + rubyBackendNames.add(rubyRuntime.newString(backend)); + } + getConverterFactory() + .callMethod("register", clazz, rubyBackendNames); + } + } + + @Override + public Class resolve(String backend) { + RubyClass rubyClass = (RubyClass) getConverterFactory() + .callMethod("resolve", rubyRuntime.newString(backend)); + + Class clazz = rubyClass.getReifiedClass(); + if (clazz != null) { + return clazz; + } else if (rubyClass.getAllocator() instanceof ConverterProxy.Allocator) { + ConverterProxy.Allocator allocator = (ConverterProxy.Allocator) rubyClass.getAllocator(); + return allocator.getConverterClass(); + } + return null; + } + + @Override + public void unregisterAll() { + getConverterFactory() + .callMethod("unregister_all"); + } + + private RubyClass getConverterFactory() { + return rubyRuntime.getModule("Asciidoctor") + .defineOrGetModuleUnder("Converter") + .getClass("Factory"); + } + + @Override + public Map> converters() { + final RubyArray rubyKeys = (RubyArray) getConverterFactory() + .callMethod("converters") + .callMethod(rubyRuntime.getCurrentContext(), "keys"); + + Map> converters = new HashMap>(); + for (Object rubyBackend : rubyKeys) { + String backend = rubyBackend.toString(); + converters.put(backend, resolve(backend)); + } + return converters; + } +} \ No newline at end of file diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaExtensionRegistryImpl.java b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaExtensionRegistryImpl.java new file mode 100644 index 000000000..afdfbf174 --- /dev/null +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/JavaExtensionRegistryImpl.java @@ -0,0 +1,335 @@ +package org.asciidoctor.internal; + +import org.asciidoctor.extension.BlockMacroProcessor; +import org.asciidoctor.extension.BlockProcessor; +import org.asciidoctor.extension.DocinfoProcessor; +import org.asciidoctor.extension.IncludeProcessor; +import org.asciidoctor.extension.InlineMacroProcessor; +import org.asciidoctor.extension.JavaExtensionRegistry; +import org.asciidoctor.extension.Name; +import org.asciidoctor.extension.Postprocessor; +import org.asciidoctor.extension.Preprocessor; +import org.asciidoctor.extension.Treeprocessor; +import org.asciidoctor.extension.processorproxies.BlockMacroProcessorProxy; +import org.asciidoctor.extension.processorproxies.BlockProcessorProxy; +import org.asciidoctor.extension.processorproxies.DocinfoProcessorProxy; +import org.asciidoctor.extension.processorproxies.IncludeProcessorProxy; +import org.asciidoctor.extension.processorproxies.InlineMacroProcessorProxy; +import org.asciidoctor.extension.processorproxies.PostprocessorProxy; +import org.asciidoctor.extension.processorproxies.PreprocessorProxy; +import org.asciidoctor.extension.processorproxies.TreeprocessorProxy; +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; + +public class JavaExtensionRegistryImpl implements JavaExtensionRegistry { + + private Ruby rubyRuntime; + + public JavaExtensionRegistryImpl(final Ruby rubyRuntime) { + this.rubyRuntime = rubyRuntime; + } + + @Override + public JavaExtensionRegistry docinfoProcessor(Class docInfoProcessor) { + + RubyClass rubyClass = DocinfoProcessorProxy.register(rubyRuntime, docInfoProcessor); + getAsciidoctorModule() + .callMethod( "docinfo_processor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry docinfoProcessor(DocinfoProcessor docInfoProcessor) { + RubyClass rubyClass = DocinfoProcessorProxy.register(rubyRuntime, docInfoProcessor); + getAsciidoctorModule() + .callMethod( "docinfo_processor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry docinfoProcessor(String docInfoProcessor) { + try { + Class docinfoProcessorClass = (Class) Class.forName(docInfoProcessor); + docinfoProcessor(docinfoProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry preprocessor(Class preprocessor) { + RubyClass rubyClass = PreprocessorProxy.register(rubyRuntime, preprocessor); + getAsciidoctorModule() + .callMethod( "preprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry preprocessor(Preprocessor preprocessor) { + RubyClass rubyClass = PreprocessorProxy.register(rubyRuntime, preprocessor); + + getAsciidoctorModule() + .callMethod( "preprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry preprocessor(String preprocessor) { + try { + Class preprocessorClass = (Class) Class.forName(preprocessor); + preprocessor(preprocessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry postprocessor(String postprocessor) { + try { + Class postprocessorClass = (Class) Class.forName(postprocessor); + postprocessor(postprocessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry postprocessor(Class postprocessor) { + RubyClass rubyClass = PostprocessorProxy.register(rubyRuntime, postprocessor); + getAsciidoctorModule() + .callMethod( "postprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry postprocessor(Postprocessor postprocessor) { + RubyClass rubyClass = PostprocessorProxy.register(rubyRuntime, postprocessor); + getAsciidoctorModule() + .callMethod( "postprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry includeProcessor(String includeProcessor) { + try { + Class includeProcessorClass = (Class) Class.forName(includeProcessor); + includeProcessor(includeProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry includeProcessor( + Class includeProcessor) { + RubyClass rubyClass = IncludeProcessorProxy.register(rubyRuntime, includeProcessor); + getAsciidoctorModule() + .callMethod( "include_processor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry includeProcessor(IncludeProcessor includeProcessor) { + RubyClass rubyClass = IncludeProcessorProxy.register(rubyRuntime, includeProcessor); + getAsciidoctorModule() + .callMethod( "include_processor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry treeprocessor(Treeprocessor treeprocessor) { + RubyClass rubyClass = TreeprocessorProxy.register(rubyRuntime, treeprocessor); + getAsciidoctorModule() + .callMethod( "treeprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry treeprocessor(Class abstractTreeProcessor) { + RubyClass rubyClass = TreeprocessorProxy.register(rubyRuntime, abstractTreeProcessor); + getAsciidoctorModule() + .callMethod( "treeprocessor", rubyClass); + return this; + } + + @Override + public JavaExtensionRegistry treeprocessor(String treeProcessor) { + try { + Class treeProcessorClass = (Class) Class.forName(treeProcessor); + treeprocessor(treeProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry block(String blockName, + String blockProcessor) { + try { + Class blockProcessorClass = (Class) Class.forName(blockProcessor); + block(blockName, blockProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry block(String blockProcessor) { + try { + Class blockProcessorClass = (Class) Class.forName(blockProcessor); + block(blockProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry block(String blockName, + Class blockProcessor) { + RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); + getAsciidoctorModule() + .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockName)); + return this; + } + + @Override + public JavaExtensionRegistry block(Class blockProcessor) { + String name = getName(blockProcessor); + block(name, blockProcessor); + return this; + } + + @Override + public JavaExtensionRegistry block(BlockProcessor blockProcessor) { + RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); + getAsciidoctorModule() + .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockProcessor.getName())); + return this; + } + + @Override + public JavaExtensionRegistry block(String blockName, + BlockProcessor blockProcessor) { + RubyClass rubyClass = BlockProcessorProxy.register(rubyRuntime, blockProcessor); + getAsciidoctorModule() + .callMethod( "block_processor", rubyClass, rubyRuntime.newString(blockName)); + return this; + } + + @Override + public JavaExtensionRegistry blockMacro(String blockName, + Class blockMacroProcessor) { + RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); + getAsciidoctorModule() + .callMethod( "block_macro", rubyClass, rubyRuntime.newString(blockName)); + return this; + } + + @Override + public JavaExtensionRegistry blockMacro(Class blockMacroProcessor) { + String name = getName(blockMacroProcessor); + RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); + getAsciidoctorModule() + .callMethod( "block_macro", rubyClass, rubyRuntime.newString(name)); + return this; + } + + @Override + public JavaExtensionRegistry blockMacro(String blockName, + String blockMacroProcessor) { + try { + Class blockMacroProcessorClass = (Class) Class.forName(blockMacroProcessor); + blockMacro(blockName, blockMacroProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry blockMacro(String blockMacroProcessor) { + try { + Class blockMacroProcessorClass = (Class) Class.forName(blockMacroProcessor); + blockMacro(blockMacroProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry blockMacro(BlockMacroProcessor blockMacroProcessor) { + RubyClass rubyClass = BlockMacroProcessorProxy.register(rubyRuntime, blockMacroProcessor); + getAsciidoctorModule() + .callMethod( "block_macro", rubyClass, rubyRuntime.newString(blockMacroProcessor.getName())); + return this; + } + + @Override + public JavaExtensionRegistry inlineMacro(InlineMacroProcessor inlineMacroProcessor) { + RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); + getAsciidoctorModule() + .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(inlineMacroProcessor.getName())); + return this; + } + + @Override + public JavaExtensionRegistry inlineMacro(String blockName, + Class inlineMacroProcessor) { + RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); + getAsciidoctorModule() + .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(blockName)); + return this; + } + + @Override + public JavaExtensionRegistry inlineMacro(Class inlineMacroProcessor) { + String name = getName(inlineMacroProcessor); + RubyClass rubyClass = InlineMacroProcessorProxy.register(rubyRuntime, inlineMacroProcessor); + getAsciidoctorModule() + .callMethod( "inline_macro", rubyClass, rubyRuntime.newString(name)); + return this; + } + + @Override + public JavaExtensionRegistry inlineMacro(String blockName, String inlineMacroProcessor) { + try { + Class inlineMacroProcessorClass = (Class) Class.forName(inlineMacroProcessor); + inlineMacro(blockName, inlineMacroProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public JavaExtensionRegistry inlineMacro(String inlineMacroProcessor) { + try { + Class inlineMacroProcessorClass = (Class) Class.forName(inlineMacroProcessor); + inlineMacro(inlineMacroProcessorClass); + return this; + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private String getName(Class clazz) { + Name nameAnnotation = clazz.getAnnotation(Name.class); + if (nameAnnotation == null || nameAnnotation.value() == null) { + throw new IllegalArgumentException(clazz + " must be registered with a name or it must have a Name annotation!"); + } + return nameAnnotation.value(); + } + + private RubyModule getAsciidoctorModule() { + return rubyRuntime.getModule("AsciidoctorModule"); + } +} diff --git a/asciidoctorj-core/src/main/java/org/asciidoctor/internal/RubyExtensionRegistryImpl.java b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/RubyExtensionRegistryImpl.java new file mode 100644 index 000000000..99e73a52b --- /dev/null +++ b/asciidoctorj-core/src/main/java/org/asciidoctor/internal/RubyExtensionRegistryImpl.java @@ -0,0 +1,99 @@ +package org.asciidoctor.internal; + +import org.asciidoctor.extension.RubyExtensionRegistry; +import org.jruby.Ruby; +import org.jruby.RubyModule; + +import java.io.InputStream; + +public class RubyExtensionRegistryImpl implements RubyExtensionRegistry { + + + private Ruby rubyRuntime; + + public RubyExtensionRegistryImpl(final Ruby rubyRuntime) { + this.rubyRuntime = rubyRuntime; + } + + @Override + public RubyExtensionRegistryImpl requireLibrary(String requiredLibrary) { + RubyUtils.requireLibrary(rubyRuntime, requiredLibrary); + return this; + } + + @Override + public RubyExtensionRegistryImpl loadClass(InputStream rubyClassStream) { + RubyUtils.loadRubyClass(rubyRuntime, rubyClassStream); + return this; + } + + @Override + public RubyExtensionRegistryImpl preprocessor(String preprocessor) { + getAsciidoctorModule().callMethod( "preprocessor", rubyRuntime.newString(preprocessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl postprocessor(String postprocessor) { + getAsciidoctorModule().callMethod( "postprocessor", rubyRuntime.newString(postprocessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl docinfoProcessor(String docinfoProcessor) { + getAsciidoctorModule().callMethod( "docinfo_processor", rubyRuntime.newString(docinfoProcessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl includeProcessor(String includeProcessor) { + getAsciidoctorModule().callMethod( "include_processor", rubyRuntime.newString(includeProcessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl treeprocessor(String treeProcessor) { + getAsciidoctorModule().callMethod( "treeprocessor", rubyRuntime.newString(treeProcessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl block(String blockName, String blockProcessor) { + getAsciidoctorModule().callMethod( "block_processor", rubyRuntime.newString(blockProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); + return this; + } + + @Override + public RubyExtensionRegistryImpl block(String blockProcessor) { + getAsciidoctorModule().callMethod( "block_processor", rubyRuntime.newString(blockProcessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl blockMacro(String blockName, String blockMacroProcessor) { + getAsciidoctorModule().callMethod( "block_macro", rubyRuntime.newString(blockMacroProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); + return this; + } + + @Override + public RubyExtensionRegistryImpl blockMacro(String blockMacroProcessor) { + getAsciidoctorModule().callMethod( "block_macro", rubyRuntime.newString(blockMacroProcessor)); + return this; + } + + @Override + public RubyExtensionRegistryImpl inlineMacro(String blockName, String inlineMacroProcessor) { + getAsciidoctorModule().callMethod( "inline_macro", rubyRuntime.newString(inlineMacroProcessor), RubyUtils.toSymbol(rubyRuntime, blockName)); + return this; + } + + @Override + public RubyExtensionRegistryImpl inlineMacro(String inlineMacroProcessor) { + getAsciidoctorModule().callMethod( "inline_macro", rubyRuntime.newString(inlineMacroProcessor)); + return this; + } + + private RubyModule getAsciidoctorModule() { + return rubyRuntime.getModule("AsciidoctorModule"); + } +} \ No newline at end of file