Author: psmith
Date: Thu Dec  1 02:40:10 2005
New Revision: 350224

URL: http://svn.apache.org/viewcvs?rev=350224&view=rev
Log:
ZeroConfPlugin now getting some basic model details, and can save/restore it's 
preferences
via XStream.

Tweaked the HTML help file.

When a device that has been registered as an auto-connect candidate appears
then a thread is started to auto-connect it.

Double-clicking the GUI item in the plugin connects/disconnects the Receiver,
this also prevents multiple receivers from being created for the same device.

Removed the property "ZeroConfDeviceName" because an Appender already has a 
Name property.

Added:
    
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
Modified:
    
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTest.java
    
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTestBed.java
    
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.html
    
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
    
logging/chainsaw/trunk/zeroconf/org/apache/log4j/net/ZeroConfSocketHubAppender.java

Modified: 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTest.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTest.java?rev=350224&r1=350223&r2=350224&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTest.java
 (original)
+++ 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTest.java
 Thu Dec  1 02:40:10 2005
@@ -52,7 +52,7 @@
                 
             }});
         ZeroConfSocketHubAppender appender = new ZeroConfSocketHubAppender();
-        appender.setZeroConfDeviceName("SimpleTest");
+        appender.setName("SimpleTest");
         appender.activateOptions();
         
         Thread.sleep(DEFAULT_TIMEOUT_FOR_ZEROCONF_EVENTS_TO_APPEAR);

Modified: 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTestBed.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTestBed.java?rev=350224&r1=350223&r2=350224&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTestBed.java
 (original)
+++ 
logging/chainsaw/trunk/tests/org/apache/log4j/net/ZeroConfSocketHubAppenderTestBed.java
 Thu Dec  1 02:40:10 2005
@@ -15,6 +15,7 @@
 
     public static void main(String[] args) throws Exception {
         ZeroConfSocketHubAppender appender = new ZeroConfSocketHubAppender();
+        appender.setName("foo");
         appender.activateOptions();
         Logger LOG = LogManager.getRootLogger();
         LOG.addAppender(appender);

Modified: 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.html
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.html?rev=350224&r1=350223&r2=350224&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.html
 (original)
+++ 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.html
 Thu Dec  1 02:40:10 2005
@@ -5,7 +5,7 @@
 </HEAD>
 
 <BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" 
ALINK="#FF00FF" BACKGROUND="?">
-<h1>ZeroConf (Zero Configuration)</h1>
+<h2>ZeroConf (Zero Configuration)</h2>
 <p>One of the hardest parts of any network-based application is configuring 
which bits connect to what, and how 
 do they connect to each other.  Each device that can be connected 
<emphasis>to</emphasis> already knows
 the configuration details required to connect to it, but every other device 
that may wish to connect to it
@@ -22,23 +22,29 @@
 JmDNS to broadcast Appender information so that a matching Receiver can be 
easily created to connect to each other
 to stream logging messages into Chainsaw.  
 </p>
-<h1>Interesting... So what do I need to use ZeroConf with Chainsaw & 
log4j?</h1>
 <p>
-TODO
+<ul>
+<li><a href="http://www.zeroconf.org"; 
target="_new">http://www.zeroconf.org</a></li>
+<li><a href="http://jmdns.sf.net"; target="_new">http://jmdns.sf.net</a></li>
+</ul>
 </p>
-<h1></h1>
-<h1>Cool... But I have some applications that use log4j 1.2.x.  Will it still 
work?</h1>
-<p>Yes.  We have designed a backward compatible mechanism to expose log4j 
1.2.x SocketHubAppender so that Chainsaw can detect it automatically.  
-You just need to download the <code>log4j-zeroconf.jar</code> and the JmDNS 
package.  Then change your references from <code>SocketHubAppender</code>
+<h2>Interesting... So what do I need to use ZeroConf with Chainsaw & 
log4j?</h2>
+<p>
+The log4j team has created an additional JAR file that can be added to your 
existing
+application to enable ZeroConf configuration. You just need to download the 
<code>log4j-zeroconf.jar</code> and the JmDNS package.  Then change your 
references from <code>SocketHubAppender</code>
 to <code>ZeroConfSocketHubAppender</code>. (We recommend you change the 'name' 
propety from it's default to make it easy for you to use, other
-wise it's name will appear as the default 'SocketHubAppender'.</p>
+wise it's name will appear as the default 'SocketHubAppender').
+</p>
+<h2>Cool... But I have some applications that use log4j 1.2.x.  Will it still 
work?</h2>
+<p>Yes.  We have designed a backward compatible mechanism to expose log4j 
1.2.x SocketHubAppender so that Chainsaw can detect it automatically.  
+</p>
 
-<h1>But... Surely there's a catch?</h1>
-<p>A little.  Because it's based on a multicast protocol, routers tend to 
block these packets, and so it's likely that your production computers,
+<h2>But... Surely there's a catch?</h2>
+<p>A small catch.  Because it's based on a multicast protocol, routers tend to 
block these packets, and so it's likely that your production computers,
 which are usually in a heavily protected network won't be able to broadcast 
their configuration information.  If you have a VPN
 into this sort of network it is possible that these multicast packets can 
traverse the network.</p>
 
-<h1>Oh... So is this even useful?</h1>
+<h2>Oh... So is this even useful?</h2>
 <p>It's extremely useful for development, QA and staging environments.  
Usually the QA/Staging environment is isolated from your development
 team, but having them monitor logs from these machines would be handy.  Or 
your QA team may want to copy/paste some ERROR messages from
 QA/staging to notify the dev team.  ZeroConf gives your whole software 
development team an easy way to get access to your logging events.</p>

Modified: 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java?rev=350224&r1=350223&r2=350224&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
 (original)
+++ 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
 Thu Dec  1 02:40:10 2005
@@ -7,6 +7,9 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -48,6 +51,7 @@
 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.net.SocketHubReceiver;
 import org.apache.log4j.net.ZeroConfSocketHubAppender;
 import org.apache.log4j.net.ZeroConfSocketHubAppenderTestBed;
@@ -58,6 +62,9 @@
 import org.apache.log4j.plugins.PluginRegistry;
 import org.apache.log4j.xml.Log4jEntityResolver;
 
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
 /**
  * This plugin is designed to detect specific Zeroconf zones 
(Rendevouz/Bonjour,
  * whatever people are calling it) and allow the user to double click on
@@ -87,6 +94,7 @@
 
     private JmDNS jmDNS;
 
+    private ZeroConfPreferenceModel preferenceModel;
     
     private Map serviceInfoToReceiveMap = new HashMap();
 
@@ -108,6 +116,21 @@
 
     public void shutdown() {
         Zeroconf4log4j.shutdown();
+        save();
+    }
+
+    private void save() {
+        File fileLocation = getPreferenceFileLocation();
+        XStream stream = new XStream(new DomDriver());
+        try {
+            stream.toXML(preferenceModel, new FileWriter(fileLocation));
+        } catch (Exception e) {
+            LOG.error("Failed to save ZeroConfPlugin configuration file",e);
+        }
+    }
+
+    private File getPreferenceFileLocation() {
+        return new File(SettingsManager.getInstance().getSettingsDirectory(), 
"zeroconfprefs.xml");
     }
 
     public void activateOptions() {
@@ -159,6 +182,18 @@
                 discoveredDevices.fireContentsChanged();
             }});
 
+        File fileLocation = getPreferenceFileLocation();
+        XStream stream = new XStream(new DomDriver());
+        if (fileLocation.exists()) {
+            try {
+                this.preferenceModel = (ZeroConfPreferenceModel) stream
+                        .fromXML(new FileReader(fileLocation));
+            } catch (Exception e) {
+                LOG.error("Failed to load ZeroConfPlugin configuration 
file",e);
+            }
+        }else {
+            this.preferenceModel = new ZeroConfPreferenceModel();
+        }
     }
 
     /**
@@ -215,7 +250,11 @@
     }
 
     private void deviceDiscovered(final ServiceInfo info) {
-        String name = info.getName();
+        final String name = info.getName();
+//        TODO currently adding ALL devices to autoConnectlist
+//        preferenceModel.addAutoConnectDevice(name);
+        
+        
         JMenuItem connectToDeviceMenuItem = new JMenuItem(new 
AbstractAction(info.getName()) {
 
             public void actionPerformed(ActionEvent e) {
@@ -249,6 +288,16 @@
             discoveredDevices.addElement(info);
             connectToMenu.insert(connectToDeviceMenuItem,0);
         }
+//         if the device name is one of the autoconnect devices, then connect 
immediately
+        if (preferenceModel.getAutoConnectDevices().contains(name)) {
+            new Thread(new Runnable() {
+
+                public void run() {
+                    LOG.info("Auto-connecting to " + name);
+                    connectTo(info);
+                }
+            }).start();
+        }
     }
     
     private void deviceRemoved(String name) {
@@ -276,7 +325,7 @@
         public void serviceAdded(final ServiceEvent event) {
             LOG.info("Service Added: " + event);
             /**
-             * TODO it's not very clear whether we should do the resolving in a
+             * it's not very clear whether we should do the resolving in a
              * background thread or not.. All it says is to NOT do it in the 
AWT
              * thread, so I'm thinking it probably should be a background 
thread
              */
@@ -335,7 +384,6 @@
             
             
             // TODO add autoconnect label
-
             panel.setBorder(BorderFactory.createEtchedBorder());
 
         }
@@ -352,7 +400,7 @@
             ServiceInfo info = (ServiceInfo) value;
             nameLabel.setText(info.getName());
             detailLabel.setText(info.getHostAddress() + ":" + info.getPort());
-            
iconLabel.setIcon(serviceInfoToReceiveMap.containsKey(info)?ICON:null);
+            iconLabel.setIcon(isConnectedTo(info)?ICON:null);
             return panel;
         }
 
@@ -366,12 +414,35 @@
                 ListModel dlm = discoveredDevices;
                 ServiceInfo info = (ServiceInfo) dlm.getElementAt(index);
                 listBox.ensureIndexIsVisible(index);
-                connectTo(info);
+                if(!isConnectedTo(info)) {
+                    connectTo(info);
+                }else {
+                    disconnectFrom(info);
+                }
             }
         }
 
+
+    }
+
+    private void disconnectFrom(ServiceInfo info) {
+        if(!isConnectedTo(info)) {
+            return; // not connected, who cares
+        }
+        Plugin plugin;
+        synchronized (serviceInfoToReceiveMap) {
+            plugin = (Plugin) serviceInfoToReceiveMap.get(info);
+        }
+        
LogManager.getLoggerRepository().getPluginRegistry().stopPlugin(plugin.getName());
+    }
+    /**
+     * returns true if the serviceInfo record already has a matching connected 
receiver
+     * @param info
+     * @return
+     */
+    private boolean isConnectedTo(ServiceInfo info) {
+        return serviceInfoToReceiveMap.containsKey(info);
     }
-    
     /**
      * Starts a receiver to the appender referenced within the ServiceInfo
      * @param info

Added: 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java?rev=350224&view=auto
==============================================================================
--- 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
 (added)
+++ 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/chainsaw/zeroconf/ZeroConfPreferenceModel.java
 Thu Dec  1 02:40:10 2005
@@ -0,0 +1,44 @@
+package org.apache.log4j.chainsaw.zeroconf;
+
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ZeroConfPreferenceModel {
+
+    private List monitoredZones = new ArrayList();
+    private Set autoConnectDevices = new HashSet();
+    
+    private transient PropertyChangeSupport propertySupport = new 
PropertyChangeSupport(this);
+//   TODO expose addPropertyChangeListener
+    
+    public void addAutoConnectDevice(String deviceName) {
+//        TODO  fire property changes
+        autoConnectDevices.add(deviceName);
+    }
+    
+    public void addMonitoredZone(String zone) {
+//        TODO fire property change events
+        monitoredZones.add(zone);
+    }
+
+    public Set getAutoConnectDevices() {
+        return autoConnectDevices;
+    }
+
+    public void setAutoConnectDevices(Set autoConnectDevices) {
+        this.autoConnectDevices = autoConnectDevices;
+    }
+
+    public List getMonitoredZones() {
+        return monitoredZones;
+    }
+
+    public void setMonitoredZones(List monitoredZones) {
+        this.monitoredZones = monitoredZones;
+    }
+    
+    
+}

Modified: 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/net/ZeroConfSocketHubAppender.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/zeroconf/org/apache/log4j/net/ZeroConfSocketHubAppender.java?rev=350224&r1=350223&r2=350224&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/net/ZeroConfSocketHubAppender.java
 (original)
+++ 
logging/chainsaw/trunk/zeroconf/org/apache/log4j/net/ZeroConfSocketHubAppender.java
 Thu Dec  1 02:40:10 2005
@@ -23,13 +23,12 @@
     public static final String DEFAULT_ZEROCONF_ZONE="_log4j._tcp.local.";
     private String zeroConfZone = DEFAULT_ZEROCONF_ZONE;
     
-    private String zeroConfDeviceName = "SocketHubAppender";
-    
     private Object logger;
     private Method logInfoMethod;
     private Method logErrorMethod;
     
     public ZeroConfSocketHubAppender() {
+        setName("SocketHubAppender");
         try {
             Method getLoggerMethod = this.getClass().getMethod("getLogger", 
new Class[0]);
             logger = getLoggerMethod.invoke(this, new Object[0]);
@@ -52,7 +51,7 @@
         }
     }
     private ServiceInfo buildServiceInfo() {
-        return new ServiceInfo(zeroConfZone, zeroConfDeviceName, getPort(), 
"SocketHubAppender on port " + getPort() );
+        return new ServiceInfo(zeroConfZone, getName(), getPort(), 
"SocketHubAppender on port " + getPort() );
     }
     
     private void logWithlog4j12Compatibility(Level level, String message) {
@@ -71,30 +70,6 @@
             }
         }
     }
-
-    /**
-     * Sets the name of this appender as it would appear in a ZeroConf browser.
-     * @see #setZeroConfDeviceName(String)
-     * @return String deviceName
-     */
-    public String getZeroConfDeviceName() {
-        return zeroConfDeviceName;
-    }
-
-
-
-
-    /**
-     * Configures the name/label of this appender so that it will appear 
nicely in a ZeroConf browser, the default
-     * being "SocketHubAppender"
-     * @param zeroConfDeviceName
-     */
-    public void setZeroConfDeviceName(String zeroConfDeviceName) {
-        this.zeroConfDeviceName = zeroConfDeviceName;
-    }
-
-
-
 
     /**
      * Returns the ZeroConf domain that will be used to register this 'device'.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to