Committing in-progress work to support Log4j2  fileappender configurations advertised via Multicast DNS


git-svn-id: https://svn.apache.org/repos/asf/logging/chainsaw/trunk@1451138 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 182eab5..29ea0ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -389,10 +389,10 @@
       <version>1.2.16</version>

     </dependency>

     <dependency>

-      <groupId>jmdns</groupId>

+      <groupId>javax.jmdns</groupId>

       <artifactId>jmdns</artifactId>

-      <version>1.0</version>

-    </dependency>    

+      <version>3.4.1</version>

+    </dependency>

     <dependency>

       <groupId>xstream</groupId>

       <artifactId>xstream</artifactId>

diff --git a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
index 369e9d8..9fedd69 100644
--- a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
+++ b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
@@ -52,11 +52,13 @@
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.chainsaw.ChainsawConstants;
+import org.apache.log4j.chainsaw.LogFilePatternLayoutBuilder;
 import org.apache.log4j.chainsaw.SmallButton;
 import org.apache.log4j.chainsaw.help.HelpManager;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.chainsaw.plugins.GUIPluginSkeleton;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
+import org.apache.log4j.chainsaw.vfs.VFSLogFilePatternReceiver;
 import org.apache.log4j.helpers.LogLog;
 import org.apache.log4j.net.MulticastReceiver;
 import org.apache.log4j.net.SocketHubReceiver;
@@ -116,6 +118,9 @@
     private static final String XML_SOCKET_APPENDER_SERVICE_NAME = "_log4j_xml_tcpconnect_appender.local.";
     private static final String SOCKET_APPENDER_SERVICE_NAME = "_log4j_obj_tcpconnect_appender.local.";
     private static final String SOCKETHUB_APPENDER_SERVICE_NAME = "_log4j_obj_tcpaccept_appender.local.";
+    private static final String TCP_APPENDER_SERVICE_NAME = "_log4j._tcp.local.";
+    private static final String NEW_UDP_APPENDER_SERVICE_NAME = "_log4j._udp.local.";
+
     private JmDNS jmDNS;
 
     public ZeroConfPlugin() {
@@ -125,7 +130,11 @@
 
     public void shutdown() {
         if (jmDNS != null) {
-            jmDNS.close();
+            try {
+                jmDNS.close();
+            } catch (Exception e) {
+                LOG.error("Unable to close JMDNS", e);
+            }
         }
         save();
     }
@@ -207,6 +216,8 @@
         serviceNames.add(SOCKETHUB_APPENDER_SERVICE_NAME);
         serviceNames.add(UDP_APPENDER_SERVICE_NAME);
         serviceNames.add(XML_SOCKET_APPENDER_SERVICE_NAME);
+        serviceNames.add(TCP_APPENDER_SERVICE_NAME);
+        serviceNames.add(NEW_UDP_APPENDER_SERVICE_NAME);
 
         for (Iterator iter = serviceNames.iterator(); iter.hasNext();) {
             String serviceName = iter.next().toString();
@@ -489,6 +500,41 @@
         String name = info.getName();
         String decoderClass = info.getPropertyString("decoder");
 
+        if (NEW_UDP_APPENDER_SERVICE_NAME.equals(zone))
+        {
+            UDPReceiver receiver = new UDPReceiver();
+            receiver.setPort(port);
+            receiver.setName(name + "-receiver");
+            return receiver;
+        }
+        //FileAppender or socketappender
+        //TODO: add more checks (actual layout format, etc)
+        if (TCP_APPENDER_SERVICE_NAME.equals(zone)) {
+            //CHECK content type
+            //application/octet-stream = SocketReceiver
+            //text/plain = VFSLogFilePatternReceiver (if structured=false)
+            String contentType = info.getPropertyString("contentType").toLowerCase();
+            //won't work with log4j2, as Chainsaw depends on log4j1.x
+            if ("application/octet-stream".equals(contentType))
+            {
+                SocketReceiver receiver = new SocketReceiver();
+                receiver.setPort(port);
+                receiver.setName(name + "-receiver");
+                return receiver;
+            }
+            //this will work - regular text log files are fine
+            if ("text/plain".equals(contentType))
+            {
+                VFSLogFilePatternReceiver receiver = new VFSLogFilePatternReceiver();
+                receiver.setAppendNonMatches(true);
+                receiver.setFileURL(info.getPropertyString("fileURI"));
+                receiver.setLogFormat(LogFilePatternLayoutBuilder.getLogFormatFromPatternLayout(info.getPropertyString("format")));
+                receiver.setTimestampFormat(LogFilePatternLayoutBuilder.getTimeStampFormat(info.getPropertyString("format")));
+                receiver.setName(name + "-receiver");
+                return receiver;
+            }
+        }
+
         //MulticastAppender
         if (MULTICAST_APPENDER_SERVICE_NAME.equals(zone)) {
             MulticastReceiver receiver = new MulticastReceiver();