Skip to content
Snippets Groups Projects
Commit a3815f14 authored by ribeaudc's avatar ribeaudc
Browse files

add:

- Spring 'BeanPostProcessor' implementation for registering 'ChangeListener' coming from 'RoleBasedAccessController': SynchronizerPostProcessor
change:
- Extract 'IRolesManager' and 'DefaultRolesManager' from 'RoleBasedAccessController'
- lets Spring create the timer for file watchers

SVN: 1421
parent be32bd62
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,7 @@ import java.util.HashMap; ...@@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.WeakHashMap;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
...@@ -35,8 +36,9 @@ import ch.systemsx.cisd.common.logging.LogFactory; ...@@ -35,8 +36,9 @@ import ch.systemsx.cisd.common.logging.LogFactory;
* Kind of <code>FileWatcher</code> extension that allow registration of multiple <code>ChangeListener</code> for * Kind of <code>FileWatcher</code> extension that allow registration of multiple <code>ChangeListener</code> for
* one file watched. * one file watched.
* <p> * <p>
* You can use this class as <i>singleton</i> calling {@link #getInstance()} or you may instance it with a constructor. * You can use this class as <i>singleton</i> calling {@link #getInstance()} or you may instance it with a constructor.<br />
* Note that access to this class is <i>synchronized</i>. * Note that access to this class is <i>synchronized</i> and that this class internally uses a {@link WeakHashMap} to
* store the registered <code>ChangeListener</code>s.
* </p> * </p>
* *
* @author Christian Ribeaud * @author Christian Ribeaud
...@@ -44,6 +46,8 @@ import ch.systemsx.cisd.common.logging.LogFactory; ...@@ -44,6 +46,8 @@ import ch.systemsx.cisd.common.logging.LogFactory;
public final class FileWatcherSynchronizer extends TimerTask public final class FileWatcherSynchronizer extends TimerTask
{ {
private static final ChangeListener[] LISTENER_EMPTY_ARRAY = new ChangeListener[0];
private static final Logger operationLog = private static final Logger operationLog =
LogFactory.getLogger(LogCategory.OPERATION, FileWatcherSynchronizer.class); LogFactory.getLogger(LogCategory.OPERATION, FileWatcherSynchronizer.class);
...@@ -68,6 +72,15 @@ public final class FileWatcherSynchronizer extends TimerTask ...@@ -68,6 +72,15 @@ public final class FileWatcherSynchronizer extends TimerTask
return instance; return instance;
} }
private final synchronized void fireStateChanged(FileWatcher fileWatcher)
{
final ChangeEvent event = new ChangeEvent(fileWatcher.getFileToWatch());
for (ChangeListener listener : fileWatcherListeners.get(fileWatcher))
{
listener.stateChanged(event);
}
}
public final synchronized void addChangeListener(final File file, final ChangeListener changeListener) public final synchronized void addChangeListener(final File file, final ChangeListener changeListener)
{ {
FileWatcher fileWatcher = fileWatchers.get(file); FileWatcher fileWatcher = fileWatchers.get(file);
...@@ -102,7 +115,7 @@ public final class FileWatcherSynchronizer extends TimerTask ...@@ -102,7 +115,7 @@ public final class FileWatcherSynchronizer extends TimerTask
if (operationLog.isDebugEnabled()) if (operationLog.isDebugEnabled())
{ {
operationLog.debug(String.format( operationLog.debug(String.format(
"A new listener has been registered for file '%s'. Currently %d listeners registered.", file, "A new listener has been registered for file '%s'. Currently %d listener(s) registered.", file,
listeners.size())); listeners.size()));
} }
} }
...@@ -120,21 +133,44 @@ public final class FileWatcherSynchronizer extends TimerTask ...@@ -120,21 +133,44 @@ public final class FileWatcherSynchronizer extends TimerTask
return; return;
} }
listeners.remove(changeListener); listeners.remove(changeListener);
int size = listeners.size();
if (operationLog.isDebugEnabled()) if (operationLog.isDebugEnabled())
{ {
operationLog.debug(String.format( operationLog.debug(String.format(
"A listener for file '%s' has been removed. Currently %d listeners registered.", file, listeners "A listener for file '%s' has been removed. Currently %d listener(s) registered.", file, size));
.size())); }
if (size == 0)
{
fileWatchers.remove(file);
} }
} }
private final synchronized void fireStateChanged(FileWatcher fileWatcher) /**
* For given <var>file</var> returns the registered <code>ChangeListener</code>s.
*
* @return <code>null</code> if given <var>file</var> is unknown or if no <code>ChangeListener</code> could be
* found for given <var>file</var>.
*/
public final synchronized ChangeListener[] getChangeListeners(final File file)
{ {
final ChangeEvent event = new ChangeEvent(fileWatcher.getFileToWatch()); FileWatcher fileWatcher = fileWatchers.get(file);
for (ChangeListener listener : fileWatcherListeners.get(fileWatcher)) if (fileWatcher == null)
{ {
listener.stateChanged(event); return null;
}
List<ChangeListener> listeners = fileWatcherListeners.get(fileWatcher);
if (listeners == null)
{
return null;
} }
return listeners.toArray(LISTENER_EMPTY_ARRAY);
}
/** Clears the <code>Map</code>s used internally. */
public final synchronized void destroy()
{
fileWatcherListeners.clear();
fileWatchers.clear();
} }
// //
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment