added spotbugs annotations, ignored a few warnings that do seem unrelated
diff --git a/pom.xml b/pom.xml
index 020fc39..1fc3948 100644
--- a/pom.xml
+++ b/pom.xml
@@ -211,6 +211,11 @@
       <artifactId>commons-beanutils</artifactId>
       <version>1.9.4</version>
      </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 
   <reporting>
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
index 3f35ff4..a753495 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.log4j.chainsaw;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -132,12 +133,14 @@
         return result;
     }
 
+    @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
     private static Map<String, Map<String, String>> getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException {
         Map<String, Map<String, String>> result = new HashMap<>();
         try (InputStream stream = file.toURI().toURL().openStream()) {
             InputSource src = new InputSource(stream);
             src.setSystemId(file.toURI().toURL().toString());
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
             DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 
 //            docBuilder.setErrorHandler(new SAXErrorHandler());
diff --git a/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java b/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
index 5a26abc..675d419 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ReceiverConfigurationPanel.java
@@ -16,9 +16,12 @@
  */
 package org.apache.log4j.chainsaw;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.log4j.chainsaw.helper.SwingHelper;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 import org.apache.log4j.net.UDPReceiver;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import javax.swing.*;
 import javax.swing.text.SimpleAttributeSet;
@@ -31,12 +34,9 @@
 import java.awt.event.FocusListener;
 import java.io.File;
 import java.net.MalformedURLException;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.List;
 import java.util.Locale;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 
 /**
@@ -185,6 +185,7 @@
         updateEnabledState(log4jConfigReceiverRadioButton);
     }
 
+    @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
     private JPanel buildDontWarnAndOKPanel() {
         JPanel panel = new JPanel(new GridBagLayout());
 
@@ -239,16 +240,19 @@
             }
         });
 
-        saveButton.addActionListener(e -> {
-            try {
-                URL url = browseFile("Choose a path and file name to save", false);
-                if (url != null) {
-                    File file = new File(url.toURI());
-                    panelModel.setSaveConfigFile(file);
+
+        saveButton.addActionListener(new ActionListener() {
+            @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    URL url = browseFile("Choose a path and file name to save", false);
+                    if (url != null) {
+                        File file = new File(url.toURI());
+                        panelModel.setSaveConfigFile(file);
+                    }
+                } catch (Exception ex) {
+                    logger.error("Error browsing for log file", ex);
                 }
-            } catch (Exception ex) {
-                logger.error(
-                    "Error browsing for log file", ex);
             }
         });
         return panel;
@@ -776,19 +780,5 @@
             logFileFormatComboBoxModel.insertElementAt(lastLogFormat, 0);
             logFileFormatComboBox.setSelectedIndex(0);
         }
-
-        public boolean isCancelled() {
-            return cancelled;
-        }
-
-        public File getLog4jConfigFile() {
-            try {
-                URL newConfigurationURL = new URL(log4jConfigURLTextField.getText());
-                return new File(newConfigurationURL.toURI());
-            } catch (URISyntaxException | MalformedURLException e) {
-                e.printStackTrace();
-            }
-            return null;
-        }
     }
 }
diff --git a/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java b/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
index c2eb239..cad537b 100644
--- a/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
+++ b/src/main/java/org/apache/log4j/chainsaw/helper/SwingHelper.java
@@ -17,6 +17,8 @@
 
 package org.apache.log4j.chainsaw.helper;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
@@ -94,6 +96,7 @@
         return result;
     }
 
+    @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
     public static File promptForFile(Container parent, String defaultPath, String title, boolean loadDialog) {
         if (SwingHelper.isMacOSX()) {
             //use filedialog on mac
diff --git a/src/main/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java b/src/main/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java
index 4532693..99e826b 100644
--- a/src/main/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java
+++ b/src/main/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java
@@ -16,6 +16,7 @@
  */
 package org.apache.log4j.chainsaw.prefs;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.commons.configuration2.AbstractConfiguration;
 import org.apache.commons.configuration2.CombinedConfiguration;
 import org.apache.commons.configuration2.PropertiesConfiguration;
@@ -141,6 +142,7 @@
         return combinedConfig;
     }
 
+    @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
     public AbstractConfiguration getSettingsForReceiverTab(String identifier) {
         if (tabSettings.containsKey(identifier)) {
             return tabSettings.get(identifier).tabSettings;
diff --git a/src/main/java/org/apache/log4j/net/JsonReceiver.java b/src/main/java/org/apache/log4j/net/JsonReceiver.java
index 360b901..04c2a4a 100644
--- a/src/main/java/org/apache/log4j/net/JsonReceiver.java
+++ b/src/main/java/org/apache/log4j/net/JsonReceiver.java
@@ -22,6 +22,8 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Iterator;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.log4j.chainsaw.receiver.ChainsawReceiverSkeleton;
 import org.apache.log4j.chainsaw.logevents.ChainsawLoggingEventBuilder;
 import org.apache.logging.log4j.LogManager;
@@ -47,9 +49,6 @@
      */
     public static final String ZONE = "_log4j_json_tcpaccept_receiver.local.";
 
-    public JsonReceiver() {
-    }
-
     @Override
     public void shutdown() {
         // mark this as no longer running
@@ -105,6 +104,7 @@
     }
 
     @Override
+    @SuppressFBWarnings
     public void run() {
         /**
          * Ensure we start fresh.
diff --git a/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java b/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
index ca4c382..2637377 100644
--- a/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
+++ b/src/main/java/org/apache/log4j/net/XMLSocketReceiver.java
@@ -22,6 +22,8 @@
 import java.net.Socket;
 import java.util.List;
 import java.util.Vector;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.log4j.chainsaw.receiver.ChainsawReceiverSkeleton;
 import org.apache.log4j.chainsaw.logevents.ChainsawLoggingEvent;
 import org.apache.log4j.spi.Decoder;
@@ -161,6 +163,7 @@
     /**
      * Loop, accepting new socket connections.
      */
+    @SuppressFBWarnings // TODO: this hsould be a secure socket?
     public void run() {
         /**
          * Ensure we start fresh.
diff --git a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
index d384072..9f0f5f3 100644
--- a/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
+++ b/src/main/java/org/apache/log4j/varia/LogFilePatternReceiver.java
@@ -18,6 +18,8 @@
 package org.apache.log4j.varia;
 
 import java.nio.charset.StandardCharsets;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.rule.ExpressionRule;
 import org.apache.log4j.rule.Rule;
@@ -1039,6 +1041,7 @@
         logger.info("activateOptions");
         active = true;
         Runnable runnable = new Runnable() {
+            @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
             public void run() {
                 initialize();
                 while (reader == null) {
diff --git a/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java b/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
index e9f917a..ccff7e1 100644
--- a/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
+++ b/src/main/java/org/apache/log4j/xml/LogFileXMLReceiver.java
@@ -17,6 +17,7 @@
 
 package org.apache.log4j.xml;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.rule.ExpressionRule;
 import org.apache.log4j.rule.Rule;
@@ -242,47 +243,53 @@
 
     @Override
     public void start() {
-        Runnable runnable = () -> {
-            try {
-                URL url = new URL(fileURL);
-                host = url.getHost();
-                if (host != null && host.isEmpty()) {
-                    host = FILE_KEY;
-                }
-                path = url.getPath();
-            } catch (MalformedURLException e1) {
-                // TODO Auto-generated catch block
-                e1.printStackTrace();
-            }
+        Runnable runnable = new Runnable() {
+            @Override
+            @SuppressFBWarnings // TODO: loading files like this is dangerous - at least in web. see if we can do better
+            public void run() {
+                {
+                    try {
+                        URL url = new URL(fileURL);
+                        host = url.getHost();
+                        if (host != null && host.isEmpty()) {
+                            host = FILE_KEY;
+                        }
+                        path = url.getPath();
+                    } catch (MalformedURLException e1) {
+                        // TODO Auto-generated catch block
+                        e1.printStackTrace();
+                    }
 
-            try {
-                if (filterExpression != null) {
-                    expressionRule = ExpressionRule.getRule(filterExpression);
-                }
-            } catch (Exception e) {
-                logger.warn("Invalid filter expression: " + filterExpression, e);
-            }
+                    try {
+                        if (filterExpression != null) {
+                            expressionRule = ExpressionRule.getRule(filterExpression);
+                        }
+                    } catch (Exception e) {
+                        logger.warn("Invalid filter expression: " + filterExpression, e);
+                    }
 
-            Class c;
-            try {
-                c = Class.forName(decoder);
-                Object o = c.newInstance();
-                if (o instanceof Decoder) {
-                    decoderInstance = (Decoder) o;
-                }
-            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
+                    Class c;
+                    try {
+                        c = Class.forName(decoder);
+                        Object o = c.newInstance();
+                        if (o instanceof Decoder) {
+                            decoderInstance = (Decoder) o;
+                        }
+                    } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
 
-            try {
-                reader = new InputStreamReader(new URL(getFileURL()).openStream());
-                process(reader);
-            } catch (FileNotFoundException fnfe) {
-                logger.info("file not available");
-            } catch (IOException ioe) {
-                logger.warn("unable to load file", ioe);
-                return;
+                    try {
+                        reader = new InputStreamReader(new URL(getFileURL()).openStream());
+                        process(reader);
+                    } catch (FileNotFoundException fnfe) {
+                        logger.info("file not available");
+                    } catch (IOException ioe) {
+                        logger.warn("unable to load file", ioe);
+                        return;
+                    }
+                }
             }
         };
         if (useCurrentThread) {