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]