Merge "Make RAW formatter configurable"
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 29e7bf7..473b740 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocGlobalConfig.java
@@ -26,6 +26,7 @@
   public static final String KEY_APPEND_CSS = "appendCss";
   public static final String KEY_ENABLED = "enabled";
   public static final String KEY_EXT = "ext";
+  public static final String KEY_FORMATTER = "formatter";
   public static final String KEY_INCLUDE_TOC = "includeToc";
   public static final String KEY_MIME_TYPE = "mimeType";
   public static final String KEY_PREFIX = "prefix";
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 0d6a77e..4e3c359 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
@@ -16,14 +16,12 @@
 
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_ENABLED;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_EXT;
+import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_FORMATTER;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_MIME_TYPE;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_PREFIX;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.KEY_PRIO;
 import static com.googlesource.gerrit.plugins.xdocs.XDocGlobalConfig.SECTION_FORMATTER;
 
-import org.apache.commons.io.FilenameUtils;
-import org.eclipse.jgit.lib.Config;
-
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.reviewdb.client.Project;
@@ -40,10 +38,17 @@
 
 import eu.medsea.mimeutil.MimeType;
 
+import org.apache.commons.io.FilenameUtils;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.Map.Entry;
 
 @Singleton
 public class Formatters {
+  private static final Logger log = LoggerFactory.getLogger(Formatters.class);
+
   public static final String RAW_FORMATTER = "RAW";
 
   private final String pluginName;
@@ -154,8 +159,7 @@
 
   public FormatterProvider getByName(String formatterName) {
     if (formatterName.equals(RAW_FORMATTER)) {
-      return new FormatterProvider(RAW_FORMATTER,
-          getByName(PlainTextFormatter.NAME).formatter);
+      return resolveRawFormatter();
     }
 
     for (String pluginName : formatters.plugins()) {
@@ -173,6 +177,28 @@
     return getByName(RAW_FORMATTER);
   }
 
+  private FormatterProvider resolveRawFormatter() {
+    XDocGlobalConfig globalCfg =
+        new XDocGlobalConfig(pluginCfgFactory.getGlobalPluginConfig(pluginName));
+    String formatterName =
+        globalCfg.getFormatterConfig(RAW_FORMATTER)
+            .getString(KEY_FORMATTER, PlainTextFormatter.NAME);
+    if (formatterName.equals(RAW_FORMATTER)) {
+      log.warn(String.format(
+          "%s plugin: Invalid '%s' formatter configuration, '%s' formatter cannot be set to '%s', using '%s' formatter",
+          pluginName, RAW_FORMATTER, RAW_FORMATTER, formatterName, PlainTextFormatter.NAME));
+      formatterName = PlainTextFormatter.NAME;
+    }
+    FormatterProvider formatter = getByName(formatterName);
+    if (formatter == null) {
+      log.warn(String.format(
+          "%s plugin: Invalid '%s' formatter configuration, formatter '%s' not found, using '%s' formatter",
+          pluginName, RAW_FORMATTER, formatterName, PlainTextFormatter.NAME));
+      formatter = getByName(PlainTextFormatter.NAME);
+    }
+    return new FormatterProvider(RAW_FORMATTER, formatter.formatter);
+  }
+
   public static class FormatterProvider {
     private final String name;
     private final Provider<Formatter> formatter;
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 9bb7cf1..3f802b9 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -226,3 +226,17 @@
 	Can be overridden on [project-level](#prio).
 
 	Default: `0`
+
+<a id="rawFormatter">
+formatter.RAW.formatter
+:	The name of the formatter that should be used as RAW formatter.
+
+	The RAW formatter is used when the `raw` URL parameter is appended
+	to the project documentation URL.
+
+	When this option is changed the `xdocs-x_doc_resources` cache must
+	be flushed.
+
+	*CANNOT* be overridden on project-level.
+
+	Default: `PLAIN_TEXT`