Fix nullpointer in RtfExporter

Change-Id: I15636c23be3a80eefc2ff6d4685d2f7fc697e1c4
diff --git a/Changes b/Changes
index cd9bc03..4a9fcdd 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 0.2.4 2021-04-27
     - Fix temporary session-riding capabilities.
     - Introduced central tinylog.
+    - Fix nullpointer in RTF export.
 
 0.2.3 2021-03-24
     - Added trail info to RTF export.
\ No newline at end of file
diff --git a/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java b/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
index 81faa82..8422ca7 100644
--- a/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
+++ b/src/main/java/de/ids_mannheim/korap/plkexport/RtfExporter.java
@@ -117,34 +117,42 @@
 
             w.append("\\line ");
 
-            // Snippet
-            w.append("{\\pard\\fs20\\f0\\qj ");
-            if (s.hasMoreLeft()) {
-                w.append("[...] ");
+            if (s != null) {
+
+                // Snippet
+                w.append("{\\pard\\fs20\\f0\\qj ");
+                if (s.hasMoreLeft()) {
+                    w.append("[...] ");
+                };
+                rtfText(w, s.getLeft());
+                w.append("{\\b ");
+                rtfText(w, s.getMark());
+                if (s.isCutted()) {
+                    w.append(" [!]");
+                };
+                w.append("}");
+                rtfText(w, s.getRight());
+                if (s.hasMoreRight()) {
+                    w.append(" [...]");
+                };
+                w.append("\\par}");
             };
-            rtfText(w, s.getLeft());
-            w.append("{\\b ");
-            rtfText(w, s.getMark());
-            if (s.isCutted()) {
-                w.append(" [!]");
-            };
-            w.append("}");
-            rtfText(w, s.getRight());
-            if (s.hasMoreRight()) {
-                w.append(" [...]");
-            };
-            w.append("\\par}");
 
             // Reference
             w.append("{\\pard");
             w.append("\\qr\\fs18\\cf2\\f0 ");
             w.append("{\\b ");
             rtfText(w, match.getTitle());
-            w.append(" von ");
-            rtfText(w, match.getAuthor());
-            w.append(" (");
-            rtfText(w, match.getPubDate());
-            w.append(")}");
+            if (match.getAuthor() != null) {
+                w.append(" von ");
+                rtfText(w, match.getAuthor());
+            };
+            if (match.getPubDate() != null) {
+                w.append(" (");
+                rtfText(w, match.getPubDate());
+                w.append(")");
+            };
+            w.append("}");
             w.append("\\par}");
 
             // TextSigle
@@ -264,6 +272,9 @@
      * Based on jrtf by Christian Ullenboom
      */
     private static void rtfText(Writer w, String rawText) throws IOException {
+        if (rawText == null)
+            return;
+
         char c;
         for (int i = 0; i < rawText.length(); i++) {
             c = rawText.charAt( i ); 
diff --git a/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java b/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
index aa96c33..e4c5f46 100644
--- a/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
+++ b/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
@@ -96,6 +96,39 @@
     };
 
     @Test
+    public void testRtfText () throws IOException {
+        RtfExporter rtf = new RtfExporter();
+        rtf.init("{\"matches\":[{\"author\":\"Goethe\"}]}");
+        rtf.finish();
+
+        Response resp = rtf.serve().build();
+        String x = (String) resp.getEntity();
+        resp.close();
+
+        assertTrue(x.contains("{\\pard\\fs18\\f0"));
+
+        rtf = new RtfExporter();
+        rtf.init("{\"matches\":[{\"author\":\"\"}]}");
+        rtf.finish();
+
+        resp = rtf.serve().build();
+        x = (String) resp.getEntity();
+        resp.close();
+
+        assertTrue(x.contains("{\\pard\\fs18\\f0"));
+
+        rtf = new RtfExporter();
+        rtf.init("{\"versuch\":\"try\"}");
+        rtf.finish();
+
+        resp = rtf.serve().build();
+        x = (String) resp.getEntity();
+        resp.close();
+
+        assertTrue(x.contains("{\\pard\\fs18\\f0"));
+};
+
+    @Test
     public void testTrail () throws IOException {
 
         Properties properties = ExWSConf.properties(null);