Warn on and skip invalid commentlink.*.match regex

If commentlink.<subsection>.match is missing, a warning is logged.
However, if it contains an invalid regex, an exception is raised. This
is inconsistent.

This CL: a warning is logged if the regex is invalid.

Change-Id: Ic8e3586da5d64001473dbfadaefbee59c8d5248d
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java b/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
index 1a49a41..8225278 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Linkifier.java
@@ -29,9 +29,9 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -66,14 +66,12 @@
 
     List<CommentLinkInfo> list = new ArrayList<>();
     list.add(new CommentLinkInfo(HTTP_URL_PATTERN, "$0"));
-    Set<String> subsections = config.getSubsections(COMMENTLINK);
 
     List<String> patterns = new ArrayList<>();
-
     patterns.add(HTTP_URL_PATTERN.pattern());
     patterns.add(CHANGE_ID_PATTERN.pattern());
 
-    for (String subsection : subsections) {
+    for (String subsection : config.getSubsections(COMMENTLINK)) {
       String match = config.getString("commentlink", subsection, "match");
       String link = config.getString("commentlink", subsection, "link");
       String html = config.getString("commentlink", subsection, "html");
@@ -85,11 +83,17 @@
         log.warn("invalid commentlink.%s.match", subsection);
         continue;
       }
+      Pattern pattern;
+      try {
+        pattern = Pattern.compile(match);
+      } catch(PatternSyntaxException ex) {
+        log.warn("invalid commentlink." + subsection + ".match", ex);
+        continue;
+      }
       if (Strings.isNullOrEmpty(link)) {
         log.warn("invalid commentlink.%s.link", subsection);
         continue;
       }
-      Pattern pattern = Pattern.compile(match);
       list.add(new CommentLinkInfo(pattern, link));
       patterns.add(match);
     }
diff --git a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
index 9a04f9d..4cca863 100644
--- a/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
+++ b/gitiles-servlet/src/test/java/com/google/gitiles/LinkifierTest.java
@@ -152,4 +152,12 @@
         ImmutableMap.of("text", "&lt;p&rt;")),
         l.linkify(REQ, "http://weird/htmlified/?url&lt;p&rt;"));
   }
+
+  @Test
+  public void invalidCommentlinkMatchRegex() throws Exception {
+    Config config = new Config();
+    config.setString("commentlink", "foo", "match", "bad-regex(");
+    new Linkifier(TestGitilesUrls.URLS, config);
+    // Must not throw an exception
+  }
 }