Support configuring formatters for file extensions

At the moment formatters can only be configured to handle files with a
certain mime type. The problem is that some formats don't have an own
standardized mime type. E.g. Asciidoc files often use the file
extension "*.adoc" but the mime type "text/x-asciidoc" for it is not
fully established and Gerrit doesn't recognize it.

Change-Id: Ifedbe393a66f3e53ad3b3c67efcb98a1208e303c
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java
index b7fadf4..1bb0e2b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.xdocs;
 
+import com.googlesource.gerrit.plugins.xdocs.formatter.AsciidoctorFormatter;
 import com.googlesource.gerrit.plugins.xdocs.formatter.MarkdownFormatter;
 import com.googlesource.gerrit.plugins.xdocs.formatter.PlainTextFormatter;
 
@@ -23,6 +24,7 @@
   private static final String SECTION_FORMATTER = "formatter";
 
   public static final String KEY_ALLOW_HTML = "allowHtml";
+  public static final String KEY_EXT = "ext";
   public static final String KEY_MIME_TYPE = "mimeType";
 
   private final Config cfg;
@@ -36,6 +38,7 @@
   }
 
   static void initialize(Config cfg) {
+    cfg.setString(SECTION_FORMATTER, AsciidoctorFormatter.NAME, KEY_EXT, "adoc");
     cfg.setString(SECTION_FORMATTER, MarkdownFormatter.NAME, KEY_MIME_TYPE,
         "text/x-markdown");
     cfg.setString(SECTION_FORMATTER, PlainTextFormatter.NAME, KEY_MIME_TYPE,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
index b338027..64e9fc1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/Formatters.java
@@ -14,8 +14,11 @@
 
 package com.googlesource.gerrit.plugins.xdocs.formatter;
 
+import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_EXT;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_MIME_TYPE;
 
+import org.apache.commons.io.FilenameUtils;
+
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.server.FileTypeRegistry;
@@ -53,6 +56,7 @@
     XDocGlobalConfig pluginCfg =
         new XDocGlobalConfig(pluginCfgFactory.getGlobalPluginConfig(pluginName));
     MimeType mimeType = fileTypeRegistry.getMimeType(fileName, null);
+    String extension = FilenameUtils.getExtension(fileName);
     for (String pluginName : formatters.plugins()) {
       for (Entry<String, Provider<Formatter>> e :
           formatters.byPlugin(pluginName).entrySet()) {
@@ -62,6 +66,12 @@
             return new FormatterProvider(e.getKey(), e.getValue());
           }
         }
+        for (String ext :
+          pluginCfg.getFormatterConfig(e.getKey()).getStringList(KEY_EXT)) {
+          if (extension.equals(ext)) {
+            return new FormatterProvider(e.getKey(), e.getValue());
+          }
+        }
       }
     }
     return null;
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 6b0389e..ff50605 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -34,6 +34,8 @@
 configuration.
 
 ```
+  [formatter "ASCIIDOCTOR"]
+    ext = adoc
   [formatter "MARKDOWN"]
     mimeType = text/x-markdown
   [formatter "PLAIN_TEXT"]
@@ -46,10 +48,15 @@
 * `MARKDOWN`
 * `PLAIN_TEXT`
 
+<a id="ext">
+formatter.<formatter>.ext
+:	Extension of files that will be rendered by this formatter.
+
+	Multiple extensions may be specified for a formatter.
 
 <a id="formatterMimeType">
 formatter.<formatter>.mimeType
-:	The mime type of files that you be rendered by this formatter.
+:	The mime type of files that will be rendered by this formatter.
 
 	Multiple mime types may be specified for a formatter.