You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ps...@apache.org on 2004/05/25 06:45:22 UTC
cvs commit: logging-log4j/src/java/org/apache/log4j/plugins PluginRegistry.java
psmith 2004/05/24 21:45:22
Modified: src/java/org/apache/log4j/net SocketHubReceiver.java
SocketNode.java SocketReceiver.java
src/java/org/apache/log4j/plugins PluginRegistry.java
Log:
[Please review this change, particularly the synchronization semantics]
This set of changes removes the dependancy on the EventListenerList
class which seems to be JDK1.3.
This should allow the non-chainsaw areas of log4j to be compiled under JDK 1.2,
although I do not have this installed, and cannot verify.
All the test cases (bar the Scheduler one, but I don't believe
that is related to this change) pass after this change.
Revision Changes Path
1.11 +17 -15 logging-log4j/src/java/org/apache/log4j/net/SocketHubReceiver.java
Index: SocketHubReceiver.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/net/SocketHubReceiver.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- SocketHubReceiver.java 25 May 2004 01:01:01 -0000 1.10
+++ SocketHubReceiver.java 25 May 2004 04:45:21 -0000 1.11
@@ -9,13 +9,15 @@
import java.io.IOException;
import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
-import javax.swing.event.EventListenerList;
-
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.plugins.Plugin;
import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.plugins.Plugin;
+import org.apache.log4j.plugins.Receiver;
+import org.apache.log4j.spi.LoggerRepository;
/**
SocketHubReceiver receives a remote logging event on a configured
@@ -44,7 +46,7 @@
protected Socket socket;
- private EventListenerList listenerList = new EventListenerList();
+ private List listenerList = Collections.synchronizedList(new ArrayList());
public SocketHubReceiver() { }
@@ -65,7 +67,7 @@
* @param l
*/
public void addSocketNodeEventListener(SocketNodeEventListener l){
- listenerList.add(SocketNodeEventListener.class, l);
+ listenerList.add(l);
}
/**
@@ -74,7 +76,7 @@
* @param l
*/
public void removeSocketNodeEventListener(SocketNodeEventListener l){
- listenerList.remove(SocketNodeEventListener.class, l);
+ listenerList.remove(l);
}
/**
@@ -221,13 +223,13 @@
socket = _socket;
SocketNode node = new SocketNode(socket, this);
node.addSocketNodeEventListener(this);
- SocketNodeEventListener[] listeners =
- (SocketNodeEventListener[]) listenerList.getListeners(
- SocketNodeEventListener.class);
-
- for (int i = 0; i < listeners.length; i++) {
- node.addSocketNodeEventListener(listeners[i]);
- }
+
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+ SocketNodeEventListener listener = (SocketNodeEventListener) iter.next();
+ node.addSocketNodeEventListener(listener);
+ }
+ }
new Thread(node).start();
}
1.31 +29 -34 logging-log4j/src/java/org/apache/log4j/net/SocketNode.java
Index: SocketNode.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/net/SocketNode.java,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- SocketNode.java 25 May 2004 01:01:01 -0000 1.30
+++ SocketNode.java 25 May 2004 04:45:21 -0000 1.31
@@ -16,21 +16,20 @@
package org.apache.log4j.net;
-import org.apache.log4j.Logger;
-import org.apache.log4j.plugins.Pauseable;
-import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
-
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
-
import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
-import java.util.EventListener;
-
-import javax.swing.event.EventListenerList;
+import org.apache.log4j.Logger;
+import org.apache.log4j.plugins.Pauseable;
+import org.apache.log4j.plugins.Receiver;
+import org.apache.log4j.spi.LoggerRepository;
+import org.apache.log4j.spi.LoggingEvent;
// Contributors: Moses Hohman <mm...@rainbow.uchicago.edu>
@@ -55,7 +54,7 @@
private LoggerRepository hierarchy;
private Receiver receiver;
private SocketNodeEventListener listener;
- private EventListenerList listenerList = new EventListenerList();
+ private List listenerList = Collections.synchronizedList(new ArrayList());
/**
Constructor for socket and logger repository. */
@@ -89,7 +88,7 @@
* @param listener the listener to add to the list
*/
public void addSocketNodeEventListener(SocketNodeEventListener listener) {
- listenerList.add(SocketNodeEventListener.class, listener);
+ listenerList.add(listener);
}
/**
@@ -100,7 +99,7 @@
* @param listener the SocketNodeEventListener to remove
*/
public void removeSocketNodeEventListener(SocketNodeEventListener listener) {
- listenerList.remove(SocketNodeEventListener.class, listener);
+ listenerList.remove(listener);
}
public void run() {
@@ -187,7 +186,7 @@
}
// send event to listener, if configured
- if (listener != null || listenerList.getListenerCount()>0) {
+ if (listener != null || listenerList.size()>0) {
fireSocketClosedEvent(listenerException);
}
}
@@ -197,16 +196,14 @@
* @param listenerException
*/
private void fireSocketClosedEvent(Exception listenerException) {
- EventListener[] listeners =
- listenerList.getListeners(SocketNodeEventListener.class);
-
- for (int i = 0; i < listeners.length; i++) {
- SocketNodeEventListener snel = (SocketNodeEventListener) listeners[i];
-
- if (snel != null) {
- snel.socketClosedEvent(listenerException);
- }
- }
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+ SocketNodeEventListener snel = (SocketNodeEventListener) iter.next();
+ if (snel != null) {
+ snel.socketClosedEvent(listenerException);
+ }
+ }
+ }
}
/**
@@ -214,16 +211,14 @@
* @param remoteInfo
*/
private void fireSocketOpened(String remoteInfo) {
- EventListener[] listeners =
- listenerList.getListeners(SocketNodeEventListener.class);
-
- for (int i = 0; i < listeners.length; i++) {
- SocketNodeEventListener snel = (SocketNodeEventListener) listeners[i];
-
- if (snel != null) {
- snel.socketOpened(remoteInfo);
- }
- }
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+ SocketNodeEventListener snel = (SocketNodeEventListener) iter.next();
+ if (snel != null) {
+ snel.socketOpened(remoteInfo);
+ }
+ }
+ }
}
public void setPaused(boolean paused) {
1.9 +20 -20 logging-log4j/src/java/org/apache/log4j/net/SocketReceiver.java
Index: SocketReceiver.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/net/SocketReceiver.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- SocketReceiver.java 27 Feb 2004 16:47:32 -0000 1.8
+++ SocketReceiver.java 25 May 2004 04:45:22 -0000 1.9
@@ -16,24 +16,24 @@
package org.apache.log4j.net;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.plugins.Pauseable;
-import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.plugins.Plugin;
-import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
-
import java.io.IOException;
-
import java.net.ServerSocket;
import java.net.Socket;
-
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Vector;
-import javax.swing.event.EventListenerList;
+import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.plugins.Pauseable;
+import org.apache.log4j.plugins.Plugin;
+import org.apache.log4j.plugins.Receiver;
+import org.apache.log4j.spi.LoggerRepository;
+import org.apache.log4j.spi.LoggingEvent;
/**
@@ -60,7 +60,7 @@
private ServerSocket serverSocket;
private Vector socketList = new Vector();
private SocketNodeEventListener listener = null;
- private EventListenerList listenerList = new EventListenerList();
+ private List listenerList = Collections.synchronizedList(new ArrayList());
public SocketReceiver() {
}
@@ -224,14 +224,14 @@
socketList.add(socket);
SocketNode node = new SocketNode(socket, this);
- SocketNodeEventListener[] listeners =
- (SocketNodeEventListener[]) listenerList.getListeners(
- SocketNodeEventListener.class);
-
- for (int i = 0; i < listeners.length; i++) {
- node.addSocketNodeEventListener(listeners[i]);
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter
+ .hasNext();) {
+ SocketNodeEventListener listener = (SocketNodeEventListener) iter.next();
+ node.addSocketNodeEventListener(listener);
+
+ }
}
-
socketMap.put(socket, node);
new Thread(node).start();
socket = null;
@@ -299,7 +299,7 @@
* @param listener the listener to add to the list
*/
public void addSocketNodeEventListener(SocketNodeEventListener listener) {
- listenerList.add(SocketNodeEventListener.class, listener);
+ listenerList.add(listener);
}
/**
@@ -310,7 +310,7 @@
* @param listener the SocketNodeEventListener to remove
*/
public void removeSocketNodeEventListener(SocketNodeEventListener listener) {
- listenerList.remove(SocketNodeEventListener.class, listener);
+ listenerList.remove(listener);
}
/**
1.13 +24 -27 logging-log4j/src/java/org/apache/log4j/plugins/PluginRegistry.java
Index: PluginRegistry.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/plugins/PluginRegistry.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- PluginRegistry.java 12 May 2004 15:39:03 -0000 1.12
+++ PluginRegistry.java 25 May 2004 04:45:22 -0000 1.13
@@ -16,13 +16,12 @@
package org.apache.log4j.plugins;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import javax.swing.event.EventListenerList;
-
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.LoggerRepositoryEventListener;
@@ -48,7 +47,7 @@
* the listener used to listen for repository events.
*/
private final RepositoryListener listener = new RepositoryListener();
- private final EventListenerList listenerList = new EventListenerList();
+ private final List listenerList = Collections.synchronizedList(new ArrayList());
public PluginRegistry(LoggerRepository loggerRepository) {
pluginMap = new HashMap();
@@ -108,17 +107,16 @@
* @param plugin The plugin that has been started.
*/
private void firePluginStarted(Plugin plugin) {
- PluginListener[] listeners = (PluginListener[])listenerList.getListeners(PluginListener.class);
-
- PluginEvent e = null;
-
- for (int i = 0; i < listeners.length; i++) {
- if (e == null) {
- e = new PluginEvent(plugin);
- }
-
- listeners[i].pluginStarted(e);
- }
+ PluginEvent e = null;
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+ PluginListener listener = (PluginListener) iter.next();
+ if (e == null) {
+ e = new PluginEvent(plugin);
+ }
+ listener.pluginStarted(e);
+ }
+ }
}
@@ -128,17 +126,16 @@
* @param plugin The plugin that has been stopped.
*/
private void firePluginStopped(Plugin plugin) {
- PluginListener[] listeners = (PluginListener[])listenerList.getListeners(PluginListener.class);
-
- PluginEvent e = null;
-
- for (int i = 0; i < listeners.length; i++) {
- if (e == null) {
- e = new PluginEvent(plugin);
- }
-
- listeners[i].pluginStopped(e);
- }
+ PluginEvent e = null;
+ synchronized(listenerList){
+ for (Iterator iter = listenerList.iterator(); iter.hasNext();) {
+ PluginListener listener = (PluginListener) iter.next();
+ if (e == null) {
+ e = new PluginEvent(plugin);
+ }
+ listener.pluginStopped(e);
+ }
+ }
}
@@ -239,7 +236,7 @@
* @param l PluginListener to add to this registry
*/
public final void addPluginListener(PluginListener l) {
- listenerList.add(PluginListener.class, l);
+ listenerList.add(l);
}
@@ -250,7 +247,7 @@
* @param l PluginListener to remove
*/
public final void removePluginListener(PluginListener l) {
- listenerList.remove(PluginListener.class, l);
+ listenerList.remove(l);
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org
Re: cvs commit:
logging-log4j/src/java/org/apache/log4j/plugins PluginRegistry.java
Posted by Ceki Gülcü <ce...@qos.ch>.
At 06:45 AM 5/25/2004, psmith@apache.org wrote:
>psmith 2004/05/24 21:45:22
>
> Modified: src/java/org/apache/log4j/net SocketHubReceiver.java
> SocketNode.java SocketReceiver.java
> src/java/org/apache/log4j/plugins PluginRegistry.java
> Log:
> [Please review this change, particularly the synchronization semantics]
Paul,
Thank you very much for taking the time to apply these corrections.
I think the changes are safe. Your changes follow the recommended
pattern, as described in the java.util.Collections class:
/**
* Returns a synchronized (thread-safe) list backed by the specified
* list. In order to guarantee serial access, it is critical that
* <strong>all</strong> access to the backing list is accomplished
* through the returned list.<p>
*
* It is imperative that the user manually synchronize on the returned
* list when iterating over it:
* <pre>
* List list = Collections.synchronizedList(new ArrayList());
* ...
* synchronized(list) {
* Iterator i = list.iterator(); // Must be in synchronized block
* while (i.hasNext())
* foo(i.next());
* }
* </pre>
* Failure to follow this advice may result in non-deterministic behavior.
*
* <p>The returned list will be serializable if the specified list is
* serializable.
*
* @param list the list to be "wrapped" in a synchronized list.
* @return a synchronized view of the specified list.
*/
public static List synchronizedList(List list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList(list) :
new SynchronizedList(list));
}
> This set of changes removes the dependancy on the EventListenerList
> class which seems to be JDK1.3.
>
> This should allow the non-chainsaw areas of log4j to be compiled under
> JDK 1.2,
> although I do not have this installed, and cannot verify.
The changes made a big difference in building the "build.core" target. Just
one problem remains:
Buildfile: build.xml
init:
clean:
[delete] Deleting directory C:\home\cgu\ASF\logging-log4j\dist\classes
[delete] Deleting directory C:\home\cgu\ASF\logging-log4j\examples\classes
init:
jndiCheck:
build.core:
[mkdir] Created dir: C:\home\cgu\ASF\logging-log4j\dist\classes
[javac] Compiling 219 source files to
C:\home\cgu\ASF\logging-log4j\dist\classes
[javac]
C:\home\cgu\ASF\logging-log4j\src\java\org\apache\log4j\net\UDPReceiver.java:210:
Variable active in class org.apache.log4j.plug
ins.PluginSkeleton not accessible from inner class
org.apache.log4j.net.UDPReceiver. UDPReceiverThread.
[javac] active = true;
[javac] ^
[javac] 1 error
BUILD FAILED
I think the problem is related to the different ways in which JDK 1.2 and
JDK 1.3+ view access rights of inner classes. In any case, the problem is
related to the Plugin.isActive issue. I'll look into this more closely.
There is another problem with the code I added just a few hours ago. The
Statement.getGeneratedKeys was introduced in JDBC API version 3.0 which is
bundled with JDK 1.4. I have not found a way to obtain JDBC 3.0 API
separately from JDK 1.4. Bummer.
build.db:
[javac] Compiling 9 source files to
C:\home\cgu\ASF\logging-log4j\dist\classes
[javac]
C:\home\cgu\ASF\logging-log4j\src\java\org\apache\log4j\db\ConnectionSourceSkeleton.java:52:
Reference to variable supportsGetGe
neratedKeys in interface java.sql.DatabaseMetaData as if it were a method.
[javac] supportsGetGeneratedKeys = meta.supportsGetGeneratedKeys();
[javac] ^
[javac]
C:\home\cgu\ASF\logging-log4j\src\java\org\apache\log4j\db\DataSourceConnectionSource.java:61:
Reference to variable supportsGet
GeneratedKeys in interface java.sql.DatabaseMetaData as if it were a method.
[javac] supportsGetGeneratedKeys
= meta.supportsGetGeneratedKeys();
[javac]
^
[javac]
C:\home\cgu\ASF\logging-log4j\src\java\org\apache\log4j\db\DBAppender.java:166:
Method getGeneratedKeys() not found in interface
java.sql.PreparedStatement.
[javac] rs = insertStatement.getGeneratedKeys();
[javac] ^
[javac] 3 errors
BUILD FAILED
>
> All the test cases (bar the Scheduler one, but I don't believe
> that is related to this change) pass after this change.
No it is not related. The SchedulerTest is very sensitive. If your machines
is a bit slow or busy the test tends to fail. I just changed it to be a bit
more lenient. It should work now.
--
Ceki Gülcü
For log4j documentation consider "The complete log4j manual"
ISBN: 2970036908 http://www.qos.ch/shop/products/clm_t.jsp
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org