[jbosscache-commits] JBoss Cache SVN: r7618 - in core/branches/flat/src: main/java/org/horizon/commands/write and 20 other directories.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Fri Jan 30 19:32:23 EST 2009


Author: manik.surtani at jboss.com
Date: 2009-01-30 19:32:22 -0500 (Fri, 30 Jan 2009)
New Revision: 7618

Added:
   core/branches/flat/src/main/java/org/horizon/notifications/IncorrectListenerException.java
   core/branches/flat/src/main/java/org/horizon/notifications/Listener.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifier.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifierImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifier.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStarted.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStopped.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/ViewChanged.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStartedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStoppedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/Event.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/EventImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/ViewChangedEvent.java
   core/branches/flat/src/test/java/org/horizon/notifications/
   core/branches/flat/src/test/java/org/horizon/notifications/AsyncNotificationTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerCacheLoaderTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerPassivationTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerRemovalTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/CacheManagerNotifierTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/ConcurrentNotificationTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/
   core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheListener.java
   core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheNotifierImplTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/ListenerRegistrationTest.java
   core/branches/flat/src/test/java/org/horizon/notifications/cachemanagerlistener/
   core/branches/flat/src/test/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImplTest.java
Removed:
   core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifier.java
   core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifierImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifier.java
   core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifierImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/EventLog.java
   core/branches/flat/src/main/java/org/horizon/notifications/IncorrectCacheListenerException.java
   core/branches/flat/src/main/java/org/horizon/notifications/annotation/
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStarted.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStopped.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/Listener.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/ViewChanged.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStartedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStoppedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/ViewChangedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/event/
   core/branches/flat/src/test/java/org/horizon/util/internals/ViewChangeListener.java
Modified:
   core/branches/flat/src/main/java/org/horizon/CacheDelegate.java
   core/branches/flat/src/main/java/org/horizon/CacheSPI.java
   core/branches/flat/src/main/java/org/horizon/commands/write/EvictCommand.java
   core/branches/flat/src/main/java/org/horizon/commands/write/InvalidateCommand.java
   core/branches/flat/src/main/java/org/horizon/commands/write/PutKeyValueCommand.java
   core/branches/flat/src/main/java/org/horizon/commands/write/PutMapCommand.java
   core/branches/flat/src/main/java/org/horizon/commands/write/RemoveCommand.java
   core/branches/flat/src/main/java/org/horizon/context/EntryLookup.java
   core/branches/flat/src/main/java/org/horizon/eviction/EvictionWatcher.java
   core/branches/flat/src/main/java/org/horizon/factories/ComponentRegistry.java
   core/branches/flat/src/main/java/org/horizon/factories/GlobalComponentRegistry.java
   core/branches/flat/src/main/java/org/horizon/loader/SingletonStoreCacheLoader.java
   core/branches/flat/src/main/java/org/horizon/manager/DefaultCacheManager.java
   core/branches/flat/src/main/java/org/horizon/notifications/Listenable.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionCompleted.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionRegistered.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryInvalidatedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionCompletedEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionRegisteredEvent.java
   core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionalEvent.java
   core/branches/flat/src/main/java/org/horizon/remoting/RPCManagerImpl.java
   core/branches/flat/src/main/java/org/horizon/util/TestingUtil.java
   core/branches/flat/src/test/java/org/horizon/replication/SyncCacheListenerTest.java
Log:
Started work on notifications

Modified: core/branches/flat/src/main/java/org/horizon/CacheDelegate.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/CacheDelegate.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/CacheDelegate.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -50,7 +50,7 @@
 import org.horizon.logging.LogFactory;
 import org.horizon.manager.CacheManager;
 import org.horizon.marshall.Marshaller;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 import org.horizon.remoting.RPCManager;
 import org.horizon.statetransfer.StateTransferManager;
 import org.horizon.transaction.GlobalTransaction;

Modified: core/branches/flat/src/main/java/org/horizon/CacheSPI.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/CacheSPI.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/CacheSPI.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -29,7 +29,7 @@
 import org.horizon.loader.CacheLoaderManager;
 import org.horizon.lock.LockManager;
 import org.horizon.marshall.Marshaller;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 import org.horizon.remoting.RPCManager;
 import org.horizon.statetransfer.StateTransferManager;
 import org.horizon.transaction.GlobalTransaction;
@@ -141,7 +141,7 @@
     * From 2.1.0, Interceptor authors should obtain this by injection rather than this method.  See the {@link
     * org.horizon.factories.annotations.Inject} annotation.
     *
-    * @return the notifier attached with this instance of the cache.  See {@link org.horizon.notifications.CacheNotifier},
+    * @return the notifier attached with this instance of the cache.  See {@link org.horizon.notifications.cachelistener.CacheNotifier},
     *         a class that is responsible for emitting notifications to registered CacheListeners.
     */
    CacheNotifier getNotifier();

Modified: core/branches/flat/src/main/java/org/horizon/commands/write/EvictCommand.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/commands/write/EvictCommand.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/commands/write/EvictCommand.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -23,7 +23,7 @@
 
 import org.horizon.commands.Visitor;
 import org.horizon.context.InvocationContext;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 
 /**
  * @author Mircea.Markus at jboss.com
@@ -53,7 +53,7 @@
    }
 
    @Override
-   public void notify(InvocationContext ctx, boolean isPre) {
+   public void notify(InvocationContext ctx, Object value, boolean isPre) {
       notifier.notifyCacheEntryEvicted(key, isPre, ctx);
    }
 

Modified: core/branches/flat/src/main/java/org/horizon/commands/write/InvalidateCommand.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/commands/write/InvalidateCommand.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/commands/write/InvalidateCommand.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -25,7 +25,7 @@
 import org.horizon.context.InvocationContext;
 import org.horizon.logging.Log;
 import org.horizon.logging.LogFactory;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 
 import java.util.Arrays;
 
@@ -67,7 +67,7 @@
    }
 
    @Override
-   protected void notify(InvocationContext ctx, boolean isPre) {
+   protected void notify(InvocationContext ctx, Object value, boolean isPre) {
       notifier.notifyCacheEntryInvalidated(key, isPre, ctx);
    }
 

Modified: core/branches/flat/src/main/java/org/horizon/commands/write/PutKeyValueCommand.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/commands/write/PutKeyValueCommand.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/commands/write/PutKeyValueCommand.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -27,7 +27,7 @@
 import org.horizon.commands.read.AbstractDataCommand;
 import org.horizon.container.MVCCEntry;
 import org.horizon.context.InvocationContext;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 
 /**
  * Implements functionality defined by {@link org.horizon.Cache#put(Object, Object)}
@@ -76,7 +76,7 @@
          successful = false;
          return e.getValue();
       } else {
-         notifier.notifyCacheEntryModified(key, true, ctx);
+         notifier.notifyCacheEntryModified(key, e.getValue(), true, ctx);
 
          if (value instanceof Delta) {
             // magic
@@ -89,7 +89,7 @@
          } else {
             o = e.setValue(value);
          }
-         notifier.notifyCacheEntryModified(key, false, ctx);
+         notifier.notifyCacheEntryModified(key, e.getValue(), false, ctx);
       }
       return o;
    }

Modified: core/branches/flat/src/main/java/org/horizon/commands/write/PutMapCommand.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/commands/write/PutMapCommand.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/commands/write/PutMapCommand.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -24,7 +24,7 @@
 import org.horizon.commands.Visitor;
 import org.horizon.container.MVCCEntry;
 import org.horizon.context.InvocationContext;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -59,9 +59,9 @@
       for (Entry<Object, Object> e : map.entrySet()) {
          Object key = e.getKey();
          MVCCEntry me = ctx.lookupEntry(key);
-         notifier.notifyCacheEntryModified(key, true, ctx);
-         if (me != null) me.setValue(e.getValue());
-         notifier.notifyCacheEntryModified(key, false, ctx);
+         notifier.notifyCacheEntryModified(key, me.getValue(), true, ctx);
+         me.setValue(e.getValue());
+         notifier.notifyCacheEntryModified(key, me.getValue(), false, ctx);
       }
       return null;
    }

Modified: core/branches/flat/src/main/java/org/horizon/commands/write/RemoveCommand.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/commands/write/RemoveCommand.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/commands/write/RemoveCommand.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -25,7 +25,7 @@
 import org.horizon.commands.read.AbstractDataCommand;
 import org.horizon.container.MVCCEntry;
 import org.horizon.context.InvocationContext;
-import org.horizon.notifications.CacheNotifier;
+import org.horizon.notifications.cachelistener.CacheNotifier;
 
 
 /**
@@ -71,15 +71,15 @@
          return false;
       }
 
-      notify(ctx, true);
+      notify(ctx, e.getValue(), true);
       e.setDeleted(true);
       e.setValid(false);
-      notify(ctx, false);
+      notify(ctx, null, false);
       return value == null ? e.getValue() : true;
    }
 
-   protected void notify(InvocationContext ctx, boolean isPre) {
-      notifier.notifyCacheEntryRemoved(key, isPre, ctx);
+   protected void notify(InvocationContext ctx, Object value, boolean isPre) {
+      notifier.notifyCacheEntryRemoved(key, value, isPre, ctx);
    }
 
    public byte getCommandId() {

Modified: core/branches/flat/src/main/java/org/horizon/context/EntryLookup.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/context/EntryLookup.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/context/EntryLookup.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -26,7 +26,7 @@
 import java.util.Map;
 
 /**
- * // TODO: MANIK: Document this
+ * Interface that can look up MVCC wrapped entries.
  *
  * @author Manik Surtani (<a href="mailto:manik at jboss.org">manik at jboss.org</a>)
  * @since 1.0

Modified: core/branches/flat/src/main/java/org/horizon/eviction/EvictionWatcher.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/eviction/EvictionWatcher.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/eviction/EvictionWatcher.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,9 +1,9 @@
 package org.horizon.eviction;
 
 import org.horizon.Cache;
-import org.horizon.notifications.annotation.CacheEntryEvicted;
-import org.horizon.notifications.annotation.Listener;
-import org.horizon.notifications.event.CacheEntryEvictedEvent;
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryEvicted;
+import org.horizon.notifications.cachelistener.event.CacheEntryEvictedEvent;
 import org.horizon.tree.Fqn;
 
 import java.util.ArrayList;

Modified: core/branches/flat/src/main/java/org/horizon/factories/ComponentRegistry.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/factories/ComponentRegistry.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/factories/ComponentRegistry.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -5,10 +5,12 @@
 import org.horizon.ComponentStatus;
 import org.horizon.config.Configuration;
 import org.horizon.config.ConfigurationException;
+import org.horizon.factories.annotations.Inject;
 import org.horizon.factories.scopes.ScopeDetector;
 import org.horizon.factories.scopes.Scopes;
 import org.horizon.logging.Log;
 import org.horizon.logging.LogFactory;
+import org.horizon.notifications.cachemanagerlistener.CacheManagerNotifier;
 
 import java.util.Map;
 
@@ -23,7 +25,13 @@
    GlobalComponentRegistry globalComponents;
    String cacheName;
    Log log = LogFactory.getLog(ComponentRegistry.class);
+   CacheManagerNotifier cacheManagerNotifier;
 
+   @Inject
+   public void setCacheManagerNotifier(CacheManagerNotifier cacheManagerNotifier) {
+      this.cacheManagerNotifier = cacheManagerNotifier;
+   }
+
    /**
     * Creates an instance of the component registry.  The configuration passed in is automatically registered.
     *
@@ -102,11 +110,13 @@
       }
       super.start();
       globalComponents.registerNamedComponentRegistry(this, cacheName);
+      cacheManagerNotifier.notifyCacheStarted(cacheName);
    }
 
    @Override
    public void stop() {
       if (state.stopAllowed()) globalComponents.unregisterNamedComponentRegistry(cacheName);
       super.stop();
+      cacheManagerNotifier.notifyCacheStopped(cacheName);
    }
 }

Modified: core/branches/flat/src/main/java/org/horizon/factories/GlobalComponentRegistry.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/factories/GlobalComponentRegistry.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/factories/GlobalComponentRegistry.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -107,4 +107,13 @@
    public void unregisterNamedComponentRegistry(String name) {
       componentLookup.remove(NAMED_REGISTRY_PREFIX + name);
    }
+
+   public void rewireNamedRegistries() {
+      for (String name : componentLookup.keySet()) {
+         if (name.startsWith(NAMED_REGISTRY_PREFIX)) {
+            Component c = componentLookup.get(name);
+            ((ComponentRegistry) c.instance).rewire();
+         }
+      }
+   }
 }

Modified: core/branches/flat/src/main/java/org/horizon/loader/SingletonStoreCacheLoader.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/loader/SingletonStoreCacheLoader.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/loader/SingletonStoreCacheLoader.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -25,12 +25,12 @@
 import org.horizon.config.CacheLoaderConfig.IndividualCacheLoaderConfig.SingletonStoreConfig;
 import org.horizon.logging.Log;
 import org.horizon.logging.LogFactory;
-import org.horizon.notifications.annotation.CacheStarted;
-import org.horizon.notifications.annotation.CacheStopped;
-import org.horizon.notifications.annotation.Listener;
-import org.horizon.notifications.annotation.ViewChanged;
-import org.horizon.notifications.event.Event;
-import org.horizon.notifications.event.ViewChangedEvent;
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.event.Event;
+import org.horizon.notifications.cachemanagerlistener.annotation.CacheStarted;
+import org.horizon.notifications.cachemanagerlistener.annotation.CacheStopped;
+import org.horizon.notifications.cachemanagerlistener.annotation.ViewChanged;
+import org.horizon.notifications.cachemanagerlistener.event.ViewChangedEvent;
 import org.horizon.remoting.transport.Address;
 import org.horizon.tree.Fqn;
 

Modified: core/branches/flat/src/main/java/org/horizon/manager/DefaultCacheManager.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/manager/DefaultCacheManager.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/manager/DefaultCacheManager.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -35,7 +35,7 @@
 import org.horizon.factories.scopes.Scope;
 import org.horizon.factories.scopes.Scopes;
 import org.horizon.lifecycle.Lifecycle;
-import org.horizon.notifications.CacheManagerNotifier;
+import org.horizon.notifications.cachemanagerlistener.CacheManagerNotifier;
 import org.horizon.remoting.RPCManager;
 import org.horizon.remoting.transport.Address;
 
@@ -93,7 +93,6 @@
    private final ConcurrentMap<String, Configuration> configurationOverrides = new ConcurrentHashMap<String, Configuration>();
    private GlobalComponentRegistry globalComponentRegistry;
 
-
    /**
     * Constructs and starts a default instance of the CacheManager, using configuration defaults.
     */

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifier.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifier.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifier.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,19 +0,0 @@
-package org.horizon.notifications;
-
-import org.horizon.remoting.transport.Address;
-
-import java.util.List;
-
-/**
- * Notifications for the cache manager
- *
- * @author Manik Surtani
- * @since 1.0
- */
-public interface CacheManagerNotifier extends Listenable {
-   /**
-    * Notifies all registered listeners of a viewChange event.  Note that viewChange notifications are ALWAYS sent
-    * immediately.
-    */
-   void notifyViewChange(List<Address> members, Address myAddress);
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifierImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifierImpl.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifierImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,36 +0,0 @@
-package org.horizon.notifications;
-
-import org.horizon.factories.annotations.NonVolatile;
-import org.horizon.factories.scopes.Scope;
-import org.horizon.factories.scopes.Scopes;
-import org.horizon.remoting.transport.Address;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Global, shared notifications.  Typically on the CacheManager.  See
- *
- * @author Manik Surtani
- * @since 1.0
- */
- at NonVolatile
- at Scope(Scopes.GLOBAL)
-public class CacheManagerNotifierImpl implements CacheManagerNotifier {
-
-   public void notifyViewChange(List<Address> members, Address myAddress) {
-      // TODO: Manik: Customise this generated block
-   }
-
-   public void addListener(Object listener) {
-      // TODO: Manik: Customise this generated block
-   }
-
-   public void removeListener(Object listener) {
-      // TODO: Manik: Customise this generated block
-   }
-
-   public Set<Object> getListeners() {
-      return null;  // TODO: Manik: Customise this generated block
-   }
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifier.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifier.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifier.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,94 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications;
-
-import org.horizon.context.InvocationContext;
-
-import javax.transaction.Transaction;
-
-/**
- * Public interface with all allowed notifications.
- *
- * @author Mircea.Markus at jboss.com
- * @since 1.0
- */
-public interface CacheNotifier extends Listenable {
-   /**
-    * Notifies all registered listeners of a CacheEntryCreated event.
-    */
-   void notifyCacheEntryCreated(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryModified event.
-    */
-   void notifyCacheEntryModified(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryRemoved event.
-    */
-   void notifyCacheEntryRemoved(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryVisited event.
-    */
-   void notifyCacheEntryVisited(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryEvicted event.
-    */
-   void notifyCacheEntryEvicted(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryInvalidated event.
-    */
-   void notifyCacheEntryInvalidated(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryLoaded event.
-    */
-   void notifyCacheEntryLoaded(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryActivated event.
-    */
-   void notifyCacheEntryActivated(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a CacheEntryPassivated event.
-    */
-   void notifyCacheEntryPassivated(Object key, boolean pre, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a transaction completion event.
-    *
-    * @param transaction the transaction that has just completed
-    * @param successful  if true, the transaction committed.  If false, this is a rollback event
-    */
-   void notifyTransactionCompleted(Transaction transaction, boolean successful, InvocationContext ctx);
-
-   /**
-    * Notifies all registered listeners of a transaction registration event.
-    *
-    * @param transaction the transaction that has just completed
-    */
-   void notifyTransactionRegistered(Transaction transaction, InvocationContext ctx);
-}
\ No newline at end of file

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifierImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifierImpl.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifierImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,524 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications;
-
-import org.horizon.Cache;
-import org.horizon.CacheException;
-import org.horizon.CacheSPI;
-import org.horizon.config.Configuration;
-import org.horizon.context.InvocationContext;
-import org.horizon.factories.KnownComponentNames;
-import org.horizon.factories.annotations.ComponentName;
-import org.horizon.factories.annotations.Destroy;
-import org.horizon.factories.annotations.Inject;
-import org.horizon.factories.annotations.NonVolatile;
-import org.horizon.factories.annotations.Start;
-import org.horizon.factories.annotations.Stop;
-import org.horizon.factories.scopes.Scope;
-import org.horizon.factories.scopes.Scopes;
-import org.horizon.logging.Log;
-import org.horizon.logging.LogFactory;
-import org.horizon.notifications.annotation.*;
-import org.horizon.notifications.event.*;
-import static org.horizon.notifications.event.Event.Type.*;
-import org.horizon.util.ReflectionUtil;
-import org.horizon.util.concurrent.WithinThreadExecutor;
-
-import javax.transaction.Transaction;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Helper class that handles all notifications to registered listeners.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani (manik at jboss.org)</a>
- * @since 1.0
- */
- at NonVolatile
- at Scope(Scopes.NAMED_CACHE)
-public class CacheNotifierImpl implements CacheNotifier {
-   private static final Log log = LogFactory.getLog(CacheNotifierImpl.class);
-
-   private static final Class[] allowedMethodAnnotations =
-         {
-               CacheStarted.class, CacheStopped.class, CacheEntryCreated.class, CacheEntryRemoved.class, CacheEntryVisited.class, CacheEntryModified.class,
-               CacheEntryActivated.class, CacheEntryPassivated.class, CacheEntryLoaded.class, CacheEntryEvicted.class, TransactionRegistered.class, TransactionCompleted.class,
-               CacheEntryInvalidated.class
-         };
-   private static final Class[] parameterTypes =
-         {
-               CacheStartedEvent.class, CacheStoppedEvent.class, CacheEntryCreatedEvent.class, CacheEntryRemovedEvent.class, CacheEntryVisitedEvent.class, CacheEntryModifiedEvent.class,
-               CacheEntryActivatedEvent.class, CacheEntryPassivatedEvent.class, CacheEntryLoadedEvent.class, CacheEntryEvictedEvent.class, TransactionRegisteredEvent.class, TransactionCompletedEvent.class,
-               CacheEntryInvalidatedEvent.class
-         };
-
-   final Map<Class<? extends Annotation>, List<ListenerInvocation>> listenersMap = new HashMap<Class<? extends Annotation>, List<ListenerInvocation>>(16, 0.99f);
-   final List<ListenerInvocation> cacheStartedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheStoppedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryCreatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryRemovedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryVisitedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryModifiedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryActivatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryPassivatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryLoadedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryInvalidatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> cacheEntryEvictedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> transactionRegisteredListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-   final List<ListenerInvocation> transactionCompletedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
-
-   private Cache cache;
-   private Configuration config;
-   // two separate executor services, one for sync and one for async listeners
-   private ExecutorService syncProcessor;
-   private ExecutorService asyncProcessor;
-   private static final AtomicInteger asyncNotifierThreadNumber = new AtomicInteger(0);
-
-   public CacheNotifierImpl() {
-      listenersMap.put(CacheStarted.class, cacheStartedListeners);
-      listenersMap.put(CacheStopped.class, cacheStoppedListeners);
-      listenersMap.put(CacheEntryCreated.class, cacheEntryCreatedListeners);
-      listenersMap.put(CacheEntryRemoved.class, cacheEntryRemovedListeners);
-      listenersMap.put(CacheEntryVisited.class, cacheEntryVisitedListeners);
-      listenersMap.put(CacheEntryModified.class, cacheEntryModifiedListeners);
-      listenersMap.put(CacheEntryActivated.class, cacheEntryActivatedListeners);
-      listenersMap.put(CacheEntryPassivated.class, cacheEntryPassivatedListeners);
-      listenersMap.put(CacheEntryLoaded.class, cacheEntryLoadedListeners);
-      listenersMap.put(CacheEntryEvicted.class, cacheEntryEvictedListeners);
-      listenersMap.put(TransactionRegistered.class, transactionRegisteredListeners);
-      listenersMap.put(TransactionCompleted.class, transactionCompletedListeners);
-      listenersMap.put(CacheEntryInvalidated.class, cacheEntryInvalidatedListeners);
-   }
-
-   @Inject
-   void injectDependencies(CacheSPI cache, Configuration config,
-                           @ComponentName(KnownComponentNames.ASYNC_NOTIFICATION_EXECUTOR) ExecutorService executor) {
-      this.cache = cache;
-      this.config = config;
-      this.asyncProcessor = executor;
-   }
-
-   @Stop
-   void stop() {
-      syncProcessor.shutdownNow();
-      asyncProcessor.shutdownNow();
-   }
-
-   @Destroy
-   void destroy() {
-      removeAllCacheListeners();
-   }
-
-   @Start
-   void start() {
-      syncProcessor = new WithinThreadExecutor();
-   }
-
-   /**
-    * Loops through all valid methods on the object passed in, and caches the relevant methods as {@link
-    * CacheNotifierImpl.ListenerInvocation} for invocation by reflection.
-    *
-    * @param listener object to be considered as a listener.
-    */
-   @SuppressWarnings("unchecked")
-   private void validateAndAddListenerInvocation(Object listener) {
-      boolean sync = testListenerClassValidity(listener.getClass());
-
-      boolean foundMethods = false;
-      // now try all methods on the listener for anything that we like.  Note that only PUBLIC methods are scanned.
-      for (Method m : listener.getClass().getMethods()) {
-         // loop through all valid method annotations
-         for (int i = 0; i < allowedMethodAnnotations.length; i++) {
-            if (m.isAnnotationPresent(allowedMethodAnnotations[i])) {
-               testListenerMethodValidity(m, parameterTypes[i], allowedMethodAnnotations[i].getName());
-               addListenerInvocation(allowedMethodAnnotations[i], new ListenerInvocation(listener, m, sync));
-               foundMethods = true;
-            }
-         }
-      }
-
-      if (!foundMethods && log.isWarnEnabled())
-         log.warn("Attempted to register listener of class " + listener.getClass() + ", but no valid, public methods annotated with method-level event annotations found! Ignoring listener.");
-   }
-
-   /**
-    * Tests if a class is properly annotated as a CacheListener and returns whether callbacks on this class should be
-    * invoked synchronously or asynchronously.
-    *
-    * @param listenerClass class to inspect
-    * @return true if callbacks on this class should use the syncProcessor; false if it should use the asyncProcessor.
-    */
-   private static boolean testListenerClassValidity(Class<?> listenerClass) {
-      Listener l = ReflectionUtil.getAnnotation(listenerClass, Listener.class);
-      if (l == null)
-         throw new IncorrectCacheListenerException("Cache listener class MUST be annotated with org.horizon.notifications.annotation.Listener");
-      if (!Modifier.isPublic(listenerClass.getModifiers()))
-         throw new IncorrectCacheListenerException("Cache listener class MUST be public!");
-      return l.sync();
-   }
-
-   private static void testListenerMethodValidity(Method m, Class allowedParameter, String annotationName) {
-      if (m.getParameterTypes().length != 1 || !m.getParameterTypes()[0].isAssignableFrom(allowedParameter))
-         throw new IncorrectCacheListenerException("Methods annotated with " + annotationName + " must accept exactly one parameter, of assignable from type " + allowedParameter.getName());
-      if (!m.getReturnType().equals(void.class))
-         throw new IncorrectCacheListenerException("Methods annotated with " + annotationName + " should have a return type of void.");
-   }
-
-   private void addListenerInvocation(Class annotation, ListenerInvocation li) {
-      List<ListenerInvocation> result = getListenerCollectionForAnnotation(annotation);
-      result.add(li);
-   }
-
-   public void addListener(Object listener) {
-      validateAndAddListenerInvocation(listener);
-   }
-
-   public void removeListener(Object listener) {
-      for (Class annotation : allowedMethodAnnotations) removeListenerInvocation(annotation, listener);
-   }
-
-   private void removeListenerInvocation(Class annotation, Object listener) {
-      if (listener == null) return;
-      List<ListenerInvocation> l = getListenerCollectionForAnnotation(annotation);
-      Set<Object> markedForRemoval = new HashSet<Object>();
-      for (ListenerInvocation li : l) {
-         if (listener.equals(li.target)) markedForRemoval.add(li);
-      }
-      l.removeAll(markedForRemoval);
-   }
-
-   /**
-    * Removes all listeners from the notifier, including the evictionPolicyListener.
-    */
-   @Stop(priority = 99)
-   public void removeAllCacheListeners() {
-      cacheStartedListeners.clear();
-      cacheStoppedListeners.clear();
-      cacheEntryCreatedListeners.clear();
-      cacheEntryRemovedListeners.clear();
-      cacheEntryVisitedListeners.clear();
-      cacheEntryModifiedListeners.clear();
-      cacheEntryActivatedListeners.clear();
-      cacheEntryPassivatedListeners.clear();
-      cacheEntryLoadedListeners.clear();
-      cacheEntryEvictedListeners.clear();
-      transactionRegisteredListeners.clear();
-      transactionCompletedListeners.clear();
-   }
-
-   public Set<Object> getListeners() {
-      Set<Object> result = new HashSet<Object>();
-      for (List<ListenerInvocation> list : listenersMap.values()) {
-         for (ListenerInvocation li : list) result.add(li.target);
-      }
-      return Collections.unmodifiableSet(result);
-   }
-
-   public void notifyCacheEntryCreated(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryCreatedListeners.isEmpty()) {
-         boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_CREATED);
-         for (ListenerInvocation listener : cacheEntryCreatedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryModified(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryModifiedListeners.isEmpty()) {
-         boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_MODIFIED);
-         for (ListenerInvocation listener : cacheEntryModifiedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryRemoved(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryRemovedListeners.isEmpty()) {
-         boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_REMOVED);
-         for (ListenerInvocation listener : cacheEntryRemovedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryVisited(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryVisitedListeners.isEmpty()) {
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_VISITED);
-         for (ListenerInvocation listener : cacheEntryVisitedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryEvicted(final Object key, final boolean pre, InvocationContext ctx) {
-      if (!cacheEntryEvictedListeners.isEmpty()) {
-         final boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_EVICTED);
-         for (ListenerInvocation listener : cacheEntryEvictedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryInvalidated(final Object key, final boolean pre, InvocationContext ctx) {
-      if (!cacheEntryInvalidatedListeners.isEmpty()) {
-         final boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_INVALIDATED);
-         for (ListenerInvocation listener : cacheEntryInvalidatedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryLoaded(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryLoadedListeners.isEmpty()) {
-         boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_LOADED);
-         for (ListenerInvocation listener : cacheEntryLoadedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryActivated(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryActivatedListeners.isEmpty()) {
-         boolean originLocal = ctx.isOriginLocal();
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(originLocal);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_ACTIVATED);
-         for (ListenerInvocation listener : cacheEntryActivatedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyCacheEntryPassivated(Object key, boolean pre, InvocationContext ctx) {
-      if (!cacheEntryPassivatedListeners.isEmpty()) {
-         Transaction tx = ctx.getTransaction();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setPre(pre);
-         e.setKey(key);
-         e.setTransaction(tx);
-         e.setType(CACHE_ENTRY_PASSIVATED);
-         for (ListenerInvocation listener : cacheEntryPassivatedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   /**
-    * Notifies all registered listeners of a cacheStarted event.
-    */
-   @Start(priority = 99)
-   public void notifyCacheStarted() {
-      if (!cacheStartedListeners.isEmpty()) {
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setType(CACHE_STARTED);
-         for (ListenerInvocation listener : cacheStartedListeners) listener.invoke(e);
-      }
-   }
-
-   /**
-    * Notifies all registered listeners of a cacheStopped event.
-    */
-   @Stop(priority = 98)
-   public void notifyCacheStopped() {
-      if (!cacheStoppedListeners.isEmpty()) {
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setType(CACHE_STOPPED);
-         for (ListenerInvocation listener : cacheStoppedListeners) listener.invoke(e);
-      }
-   }
-
-   public void notifyTransactionCompleted(Transaction transaction, boolean successful, InvocationContext ctx) {
-      if (!transactionCompletedListeners.isEmpty()) {
-         boolean isOriginLocal = ctx.isOriginLocal();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(isOriginLocal);
-         e.setTransaction(transaction);
-         e.setSuccessful(successful);
-         e.setType(TRANSACTION_COMPLETED);
-         for (ListenerInvocation listener : transactionCompletedListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   public void notifyTransactionRegistered(Transaction transaction, InvocationContext ctx) {
-      if (!transactionRegisteredListeners.isEmpty()) {
-         boolean isOriginLocal = ctx.isOriginLocal();
-         InvocationContext backup = resetInvocationContext(ctx);
-         EventImpl e = new EventImpl();
-         e.setCache(cache);
-         e.setOriginLocal(isOriginLocal);
-         e.setTransaction(transaction);
-         e.setType(TRANSACTION_REGISTERED);
-         for (ListenerInvocation listener : transactionRegisteredListeners) listener.invoke(e);
-         restoreInvocationContext(backup);
-      }
-   }
-
-   private void restoreInvocationContext(InvocationContext backup) {
-      InvocationContext currentIC = cache.getInvocationContext();
-      backup.clearLookedUpEntries();
-      backup.putLookedUpEntries(currentIC.getLookedUpEntries());
-      cache.setInvocationContext(backup);
-   }
-
-   /**
-    * Resets the current (passed-in) invocation, and returns a temp InvocationContext containing its state so it can be
-    * restored later using {@link #restoreInvocationContext(InvocationContext)}
-    *
-    * @param ctx the current context to be reset
-    * @return a clone of ctx, before it was reset
-    */
-   private InvocationContext resetInvocationContext(InvocationContext ctx) {
-      // wipe current context.
-      cache.setInvocationContext(null);
-      // get a new Invocation Context
-      InvocationContext newContext = cache.getInvocationContext();
-      newContext.putLookedUpEntries(ctx.getLookedUpEntries());
-      return ctx;
-   }
-
-   /**
-    * Class that encapsulates a valid invocation for a given registered listener - containing a reference to the method
-    * to be invoked as well as the target object.
-    */
-   class ListenerInvocation {
-      private final Object target;
-      private final Method method;
-      private final boolean sync;
-
-      public ListenerInvocation(Object target, Method method, boolean sync) {
-         this.target = target;
-         this.method = method;
-         this.sync = sync;
-      }
-
-      public void invoke(final Event e) {
-         Runnable r = new Runnable() {
-
-            public void run() {
-               try {
-                  method.invoke(target, e);
-               }
-               catch (InvocationTargetException exception) {
-                  Throwable cause = exception.getCause();
-                  if (cause != null)
-                     throw new CacheException("Caught exception invoking method " + method + " on listener instance " + target, cause);
-                  else
-                     throw new CacheException("Caught exception invoking method " + method + " on listener instance " + target, exception);
-               }
-               catch (IllegalAccessException exception) {
-                  log.warn("Unable to invoke method " + method + " on Object instance " + target + " - removing this target object from list of listeners!", exception);
-                  removeListener(target);
-               }
-            }
-         };
-
-         if (sync)
-            syncProcessor.execute(r);
-         else
-            asyncProcessor.execute(r);
-
-      }
-
-   }
-
-   private List<ListenerInvocation> getListenerCollectionForAnnotation(Class<? extends Annotation> annotation) {
-      List<ListenerInvocation> list = listenersMap.get(annotation);
-      if (list == null) throw new CacheException("Unknown listener annotation: " + annotation);
-      return list;
-   }
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/EventLog.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/EventLog.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/EventLog.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,42 +0,0 @@
-package org.horizon.notifications;
-
-import org.horizon.notifications.annotation.*;
-import org.horizon.notifications.event.Event;
-import org.horizon.notifications.event.EventImpl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
- at Listener
-public class EventLog {
-   public final List<Event> events = new ArrayList<Event>();
-
-   @CacheEntryCreated
-   @CacheEntryRemoved
-   @CacheEntryModified
-   @CacheEntryVisited
-   @TransactionCompleted
-   @TransactionRegistered
-   @CacheEntryEvicted
-   @CacheEntryPassivated
-   @CacheEntryActivated
-   @CacheEntryInvalidated
-   public void callback(Event e) {
-      events.add(e);
-   }
-
-   public String toString() {
-      return "EventLog{" +
-            "events=" + events +
-            '}';
-   }
-
-   /**
-    * Done when we don't have a Transaction reference to compare with, e.g., when using implicit transactions in opt
-    * locking.
-    */
-   public void scrubImplicitTransactions() {
-      for (Event e : events) ((EventImpl) e).setTransaction(null);
-   }
-}
\ No newline at end of file

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/IncorrectCacheListenerException.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/IncorrectCacheListenerException.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/IncorrectCacheListenerException.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,40 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications;
-
-import org.horizon.CacheException;
-
-/**
- * Thrown when an incorrectly annotated class is added as a cache listener using the {@link
- * org.horizon.Cache#addCacheListener(Object)} API.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public class IncorrectCacheListenerException extends CacheException {
-
-   private static final long serialVersionUID = 3847404572671886703L;
-
-   public IncorrectCacheListenerException(String s) {
-      super(s);
-   }
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/IncorrectListenerException.java (from rev 7607, core/branches/flat/src/main/java/org/horizon/notifications/IncorrectCacheListenerException.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/IncorrectListenerException.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/IncorrectListenerException.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications;
+
+import org.horizon.CacheException;
+
+/**
+ * Thrown when an incorrectly annotated class is added as a cache listener using the {@link
+ * org.horizon.notifications.Listenable#addListener(Object)} API.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public class IncorrectListenerException extends CacheException {
+
+   private static final long serialVersionUID = 3847404572671886703L;
+
+   public IncorrectListenerException(String s) {
+      super(s);
+   }
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/IncorrectListenerException.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: core/branches/flat/src/main/java/org/horizon/notifications/Listenable.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/Listenable.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/notifications/Listenable.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -11,11 +11,10 @@
 public interface Listenable {
 
    /**
-    * Adds a listener to the component.  Typically, listeners would need to be annotated with {@link
-    * org.horizon.notifications.annotation.Listener} and further to that, contain methods annotated appropriately,
-    * otherwise the listener will not be registered.
+    * Adds a listener to the component.  Typically, listeners would need to be annotated with {@link Listener} and
+    * further to that, contain methods annotated appropriately, otherwise the listener will not be registered.
     * <p/>
-    * See the {@link org.horizon.notifications.annotation.Listener} annotation for more information.
+    * See the {@link Listener} annotation for more information.
     * <p/>
     *
     * @param listener must not be null.

Added: core/branches/flat/src/main/java/org/horizon/notifications/Listener.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/Listener.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/Listener.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,238 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Class-level annotation used to annotate an object as being a valid cache listener.  Used with the {@link
+ * org.horizon.Cache#addListener(Object)} and related APIs. <p/> Note that even if a class is annotated with this
+ * annotation, it still needs method-level annotation (such as {@link org.horizon.notifications.cachemanagerlistener.annotation.CacheStarted})
+ * to actually receive notifications. <p/> Objects annotated with this annotation - listeners - can be attached to a
+ * running {@link org.horizon.Cache} so users can be notified of {@link org.horizon.Cache} events. <p/> <p/> There can
+ * be multiple methods that are annotated to receive the same event, and a method may receive multiple events by using a
+ * super type. </p> <p/> <h4>Delivery Semantics</h4> <p/> An event is delivered immediately after the respective
+ * operation, but before the underlying cache call returns. For this reason it is important to keep listener processing
+ * logic short-lived. If a long running task needs to be performed, it's recommended to use another thread. </p> <p/>
+ * <h4>Transactional Semantics</h4> <p/> Since the event is delivered during the actual cache call, the transactional
+ * outcome is not yet known. For this reason, <i>events are always delivered, even if the changes they represent are
+ * discarded by their containing transaction</i>. For applications that must only process events that represent changes
+ * in a completed transaction, {@link org.horizon.notifications.cachelistener.event.TransactionalEvent#getTransaction()}
+ * can be used, along with {@link org.horizon.notifications.cachelistener.event.TransactionCompletedEvent#isTransactionSuccessful()}
+ * to record events and later process them once the transaction has been successfully committed. Example 4 demonstrates
+ * this. </p> <p/> <h4>Threading Semantics</h4> <p/> A listener implementation must be capable of handling concurrent
+ * invocations. Local notifications reuse the calling thread; remote notifications reuse the network thread. </p> <p/>
+ * Since notifications reuse the calling or network thread, it is important to realise that if your listener
+ * implementation blocks or performs a long-running task, the original caller which triggered the cache event may block
+ * until the listener callback completes.  It is therefore a good idea to use the listener to be notified of an event
+ * but to perform any long running tasks in a separate thread so as not to block the original caller. </p> <p/> In
+ * addition, any locks acquired for the operation being performed will still be held for the callback.  This needs to be
+ * kept in mind as locks may be held longer than necessary or intended to and may cause deadlocking in certain
+ * situations.  See above paragraph on long-running tasks that should be run in a separate thread. </p> <b>Note</b>:
+ * Since 3.0, a new parameter, <tt>sync</tt>, has been introduced on this annotation.  This defaults to <tt>true</tt>
+ * which provides the above semantics.  Alternatively, if you set <tt>sync</tt> to <tt>false</tt>, then invocations are
+ * made in a <i>separate</i> thread, which will not cause any blocking on the caller or network thread.  The separate
+ * thread is taken from a pool, which can be configured using {@link org.horizon.config.GlobalConfiguration#setAsyncListenerExecutorProperties(java.util.Properties)}
+ * and {@link org.horizon.config.GlobalConfiguration#setAsyncListenerExecutorFactoryClass(String)}.
+ * <p/>
+ * <b>Summary of Notification Annotations</b> <table border="1" cellpadding="1" cellspacing="1" summary="Summary of
+ * notification annotations"> <tr> <th bgcolor="#CCCCFF" align="left">Annotation</th> <th bgcolor="#CCCCFF"
+ * align="left">Event</th> <th bgcolor="#CCCCFF" align="left">Description</th> </tr> <tr> <td valign="top">{@link
+ * org.horizon.notifications.cachemanagerlistener.annotation.CacheStarted}</td> <td valign="top">{@link
+ * org.horizon.notifications.cachemanagerlistener.event.CacheStartedEvent}</td> <td valign="top">A cache was
+ * started</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachemanagerlistener.annotation.CacheStopped}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachemanagerlistener.event.CacheStoppedEvent}</td> <td
+ * valign="top">A cache was stopped</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryModified}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryModifiedEvent}</td> <td
+ * valign="top">A cache entry was modified</td> </tr> <tr> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.annotation.CacheEntryCreated}</td> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryCreatedEvent}</td> <td valign="top">A cache entry was
+ * created</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryRemovedEvent}</td> <td valign="top">A
+ * cache entry was removed</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryVisited}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryVisitedEvent}</td> <td valign="top">A
+ * cache entry was visited</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryLoaded}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryLoadedEvent}</td> <td valign="top">A
+ * cache entry was loaded</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryEvicted}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryEvictedEvent}</td> <td valign="top">A
+ * cache entry was evicted</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.CacheEntryActivated}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachelistener.event.CacheEntryActivatedEvent}</td> <td
+ * valign="top">A cache entry was activated</td> </tr> <tr> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.annotation.CacheEntryPassivated}</td> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryPassivatedEvent}</td> <td valign="top">A cache entry was
+ * passivated</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachemanagerlistener.annotation.ViewChanged}</td>
+ * <td valign="top">{@link org.horizon.notifications.cachemanagerlistener.event.ViewChangedEvent}</td> <td
+ * valign="top">A view change event was detected</td> </tr> <tr> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.annotation.TransactionRegistered}</td> <td valign@="top">{@link
+ * org.horizon.notifications.cachelistener.event.TransactionRegisteredEvent}</td> <td valign="top">The cache has started
+ * to participate in a transaction</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.cachelistener.annotation.TransactionCompleted}</td>
+ * <td valign=@"top">{@link org.horizon.notifications.cachelistener.event.TransactionCompletedEvent}</td> <td
+ * valign="top">The cache has completed its participation in a transaction</td> </tr> <tr> <td valign="top">{@link
+ * org.horizon.notifications.cachelistener.annotation.CacheEntryInvalidated}</td> <td valign=@"top">{@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryInvalidatedEvent}</td> <td valign="top">A cache entry was
+ * invalidated by a remote cache.  Only if cache mode is INVALIDATION_SYNC or INVALIDATION_ASYNC.</td> </tr>
+ * <p/>
+ * </table>
+ * <p/>
+ * <h4>Example 1 - Method receiving a single event</h4>
+ * <pre>
+ *    &#064;Listener
+ *    public class SingleEventListener
+ *    {
+ *       &#064;CacheStarted
+ *       public void doSomething(Event event)
+ *       {
+ *          System.out.println(&quot;Cache started.  Details = &quot; + event);
+ *       }
+ *    }
+ * </pre>
+ * <p/>
+ * <h4>Example 2 - Method receiving multiple events</h4>
+ * <pre>
+ *    &#064;Listener
+ *    public class MultipleEventListener
+ *    {
+ *       &#064;CacheStarted
+ *       &#064;CacheStopped
+ *       public void doSomething(Event event)
+ *       {
+ *          if (event.getType() == Event.Type.CACHE_STARTED)
+ *             System.out.println(&quot;Cache started.  Details = &quot; + event);
+ *          else if (event.getType() == Event.Type.CACHE_STOPPED)
+ *             System.out.println(&quot;Cache stopped.  Details = &quot; + event);
+ *       }
+ *    }
+ * </pre>
+ * <p/>
+ * <h4>Example 3 - Multiple methods receiving the same event</h4>
+ * <pre>
+ *    &#064;Listener
+ *    public class SingleEventListener
+ *    {
+ *       &#064;CacheStarted
+ *       public void handleStart(Event event)
+ *       {
+ *          System.out.println(&quot;Cache started&quot;);
+ *       }
+ * <p/>
+ *       &#064;CacheStarted
+ *       &#064;CacheStopped
+ *       &#064;CacheBlocked
+ *       &#064;CacheUnblocked
+ *       &#064;ViewChanged
+ *       public void logEvent(Event event)
+ *       {
+ *          logSystem.logEvent(event.getType());
+ *       }
+ *    }
+ * </pre>
+ * <p/>
+ * <p/>
+ * <b>Example 4 - Processing only events with a committed transaction.</b>
+ * <p/>
+ * <pre>
+ *    &#064;Listener
+ *    public class TxGuaranteedListener
+ *    {
+ *       private class TxEventQueue
+ *       {
+ *          private ConcurrentMap&lt;Transaction, Queue&lt;Event&gt;&gt; map = new ConcurrentHashMap&lt;Transaction,
+ * Queue&lt;Event&gt;&gt;();
+ * <p/>
+ *          public void offer(Event event)
+ *          {
+ *             Queue&lt;Event&gt; queue = getQueue(event.getContext().getTransaction());
+ *             queue.offer(event);
+ *          }
+ * <p/>
+ *          private Queue&lt;Event&gt; getQueue(Transaction transaction)
+ *          {
+ *             Queue&lt;Event&gt; queue = map.get(transaction);
+ *             if (queue == null)
+ *             {
+ *                queue = new ConcurrentLinkedQueue&lt;Event&gt;();
+ *                map.putIfAbsent(transaction, queue);
+ *             }
+ * <p/>
+ *             return queue;
+ *          }
+ * <p/>
+ *          public Queue&lt;Event&gt; takeAll(Transaction transaction)
+ *          {
+ *             return map.remove(transaction);
+ *          }
+ *       }
+ * <p/>
+ *       private TxEventQueue events = new TxEventQueue();
+ * <p/>
+ *       &#064;CacheEntryModified
+ *       &#064;CacheEntryCreated
+ *       &#064;CacheEntryRemoved
+ *       public void handle(Event event)
+ *       {
+ *          events.offer(event);
+ *       }
+ * <p/>
+ *       &#064;TransactionCompleted
+ *       public void handleTx(TransactionCompletedEvent event)
+ *       {
+ *          Queue&lt;Event&gt; completed = events.takeAll(event.getTransaction());
+ *          if (completed != null &amp;&amp; event.isSuccessful())
+ *             System.out.println("Comitted events = " + completed);
+ *       }
+ *    }
+ * </pre>
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @author Jason T. Greene
+ * @see org.horizon.notifications.cachemanagerlistener.annotation.CacheStarted
+ * @see org.horizon.notifications.cachemanagerlistener.annotation.CacheStopped
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryModified
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryCreated
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryVisited
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryLoaded
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryEvicted
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryActivated
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryPassivated
+ * @see org.horizon.notifications.cachemanagerlistener.annotation.ViewChanged
+ * @see org.horizon.notifications.cachelistener.annotation.TransactionCompleted
+ * @see org.horizon.notifications.cachelistener.annotation.TransactionRegistered
+ * @see org.horizon.notifications.cachelistener.annotation.CacheEntryInvalidated
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.TYPE)
+public @interface Listener {
+   /**
+    * Specifies whether callbacks on any class annotated with this annotation happens synchronously (in the caller's
+    * thread) or asynchronously (using a separate thread).  Defaults to <tt>true</tt>.
+    *
+    * @return true if the expectation is that callbacks are called using the caller's thread; false if they are to be
+    *         made in a separate thread.
+    * @since 1.0
+    */
+   boolean sync() default true;
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/Listener.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifier.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifier.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifier.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifier.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,95 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener;
+
+import org.horizon.context.InvocationContext;
+import org.horizon.notifications.Listenable;
+
+import javax.transaction.Transaction;
+
+/**
+ * Public interface with all allowed notifications.
+ *
+ * @author Mircea.Markus at jboss.com
+ * @since 1.0
+ */
+public interface CacheNotifier extends Listenable {
+   /**
+    * Notifies all registered listeners of a CacheEntryCreated event.
+    */
+   void notifyCacheEntryCreated(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryModified event.
+    */
+   void notifyCacheEntryModified(Object key, Object value, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryRemoved event.
+    */
+   void notifyCacheEntryRemoved(Object key, Object value, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryVisited event.
+    */
+   void notifyCacheEntryVisited(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryEvicted event.
+    */
+   void notifyCacheEntryEvicted(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryInvalidated event.
+    */
+   void notifyCacheEntryInvalidated(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryLoaded event.
+    */
+   void notifyCacheEntryLoaded(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryActivated event.
+    */
+   void notifyCacheEntryActivated(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a CacheEntryPassivated event.
+    */
+   void notifyCacheEntryPassivated(Object key, boolean pre, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a transaction completion event.
+    *
+    * @param transaction the transaction that has just completed
+    * @param successful  if true, the transaction committed.  If false, this is a rollback event
+    */
+   void notifyTransactionCompleted(Transaction transaction, boolean successful, InvocationContext ctx);
+
+   /**
+    * Notifies all registered listeners of a transaction registration event.
+    *
+    * @param transaction the transaction that has just completed
+    */
+   void notifyTransactionRegistered(Transaction transaction, InvocationContext ctx);
+}
\ No newline at end of file


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifier.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifierImpl.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/CacheNotifierImpl.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifierImpl.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifierImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,489 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener;
+
+import org.horizon.Cache;
+import org.horizon.CacheException;
+import org.horizon.CacheSPI;
+import org.horizon.context.InvocationContext;
+import org.horizon.factories.KnownComponentNames;
+import org.horizon.factories.annotations.ComponentName;
+import org.horizon.factories.annotations.Destroy;
+import org.horizon.factories.annotations.Inject;
+import org.horizon.factories.annotations.NonVolatile;
+import org.horizon.factories.annotations.Start;
+import org.horizon.factories.annotations.Stop;
+import org.horizon.factories.scopes.Scope;
+import org.horizon.factories.scopes.Scopes;
+import org.horizon.logging.Log;
+import org.horizon.logging.LogFactory;
+import org.horizon.notifications.IncorrectListenerException;
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.annotation.*;
+import org.horizon.notifications.cachelistener.event.*;
+import static org.horizon.notifications.cachelistener.event.Event.Type.*;
+import org.horizon.util.ReflectionUtil;
+import org.horizon.util.concurrent.WithinThreadExecutor;
+
+import javax.transaction.Transaction;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Helper class that handles all notifications to registered listeners.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani (manik at jboss.org)</a>
+ * @since 1.0
+ */
+ at NonVolatile
+ at Scope(Scopes.NAMED_CACHE)
+public class CacheNotifierImpl implements CacheNotifier {
+   private static final Log log = LogFactory.getLog(CacheNotifierImpl.class);
+
+   private static final Class[] allowedMethodAnnotations =
+         {
+               CacheEntryCreated.class, CacheEntryRemoved.class, CacheEntryVisited.class, CacheEntryModified.class,
+               CacheEntryActivated.class, CacheEntryPassivated.class, CacheEntryLoaded.class, CacheEntryEvicted.class, TransactionRegistered.class, TransactionCompleted.class,
+               CacheEntryInvalidated.class
+         };
+   private static final Class[] parameterTypes =
+         {
+               CacheEntryCreatedEvent.class, CacheEntryRemovedEvent.class, CacheEntryVisitedEvent.class, CacheEntryModifiedEvent.class,
+               CacheEntryActivatedEvent.class, CacheEntryPassivatedEvent.class, CacheEntryLoadedEvent.class, CacheEntryEvictedEvent.class, TransactionRegisteredEvent.class, TransactionCompletedEvent.class,
+               CacheEntryInvalidatedEvent.class
+         };
+
+   final Map<Class<? extends Annotation>, List<ListenerInvocation>> listenersMap = new HashMap<Class<? extends Annotation>, List<ListenerInvocation>>(16, 0.99f);
+   final List<ListenerInvocation> cacheEntryCreatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryRemovedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryVisitedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryModifiedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryActivatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryPassivatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryLoadedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryInvalidatedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> cacheEntryEvictedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> transactionRegisteredListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+   final List<ListenerInvocation> transactionCompletedListeners = new CopyOnWriteArrayList<ListenerInvocation>();
+
+   private Cache cache;
+   // two separate executor services, one for sync and one for async listeners
+   private ExecutorService syncProcessor;
+   private ExecutorService asyncProcessor;
+
+   public CacheNotifierImpl() {
+      listenersMap.put(CacheEntryCreated.class, cacheEntryCreatedListeners);
+      listenersMap.put(CacheEntryRemoved.class, cacheEntryRemovedListeners);
+      listenersMap.put(CacheEntryVisited.class, cacheEntryVisitedListeners);
+      listenersMap.put(CacheEntryModified.class, cacheEntryModifiedListeners);
+      listenersMap.put(CacheEntryActivated.class, cacheEntryActivatedListeners);
+      listenersMap.put(CacheEntryPassivated.class, cacheEntryPassivatedListeners);
+      listenersMap.put(CacheEntryLoaded.class, cacheEntryLoadedListeners);
+      listenersMap.put(CacheEntryEvicted.class, cacheEntryEvictedListeners);
+      listenersMap.put(TransactionRegistered.class, transactionRegisteredListeners);
+      listenersMap.put(TransactionCompleted.class, transactionCompletedListeners);
+      listenersMap.put(CacheEntryInvalidated.class, cacheEntryInvalidatedListeners);
+   }
+
+   @Inject
+   void injectDependencies(CacheSPI cache,
+                           @ComponentName(KnownComponentNames.ASYNC_NOTIFICATION_EXECUTOR) ExecutorService executor) {
+      this.cache = cache;
+      this.asyncProcessor = executor;
+   }
+
+   @Stop
+   void stop() {
+      syncProcessor.shutdownNow();
+      asyncProcessor.shutdownNow();
+   }
+
+   @Destroy
+   void destroy() {
+      removeAllCacheListeners();
+   }
+
+   @Start
+   void start() {
+      syncProcessor = new WithinThreadExecutor();
+   }
+
+   /**
+    * Loops through all valid methods on the object passed in, and caches the relevant methods as {@link
+    * CacheNotifierImpl.ListenerInvocation} for invocation by reflection.
+    *
+    * @param listener object to be considered as a listener.
+    */
+   @SuppressWarnings("unchecked")
+   private void validateAndAddListenerInvocation(Object listener) {
+      boolean sync = testListenerClassValidity(listener.getClass());
+
+      boolean foundMethods = false;
+      // now try all methods on the listener for anything that we like.  Note that only PUBLIC methods are scanned.
+      for (Method m : listener.getClass().getMethods()) {
+         // loop through all valid method annotations
+         for (int i = 0; i < allowedMethodAnnotations.length; i++) {
+            if (m.isAnnotationPresent(allowedMethodAnnotations[i])) {
+               testListenerMethodValidity(m, parameterTypes[i], allowedMethodAnnotations[i].getName());
+               addListenerInvocation(allowedMethodAnnotations[i], new ListenerInvocation(listener, m, sync));
+               foundMethods = true;
+            }
+         }
+      }
+
+      if (!foundMethods && log.isWarnEnabled())
+         log.warn("Attempted to register listener of class " + listener.getClass() + ", but no valid, public methods annotated with method-level event annotations found! Ignoring listener.");
+   }
+
+   /**
+    * Tests if a class is properly annotated as a CacheListener and returns whether callbacks on this class should be
+    * invoked synchronously or asynchronously.
+    *
+    * @param listenerClass class to inspect
+    * @return true if callbacks on this class should use the syncProcessor; false if it should use the asyncProcessor.
+    */
+   private static boolean testListenerClassValidity(Class<?> listenerClass) {
+      Listener l = ReflectionUtil.getAnnotation(listenerClass, Listener.class);
+      if (l == null)
+         throw new IncorrectListenerException("Cache listener class MUST be annotated with org.horizon.notifications.annotation.Listener");
+      if (!Modifier.isPublic(listenerClass.getModifiers()))
+         throw new IncorrectListenerException("Cache listener class MUST be public!");
+      return l.sync();
+   }
+
+   private static void testListenerMethodValidity(Method m, Class allowedParameter, String annotationName) {
+      if (m.getParameterTypes().length != 1 || !m.getParameterTypes()[0].isAssignableFrom(allowedParameter))
+         throw new IncorrectListenerException("Methods annotated with " + annotationName + " must accept exactly one parameter, of assignable from type " + allowedParameter.getName());
+      if (!m.getReturnType().equals(void.class))
+         throw new IncorrectListenerException("Methods annotated with " + annotationName + " should have a return type of void.");
+   }
+
+   private void addListenerInvocation(Class annotation, ListenerInvocation li) {
+      List<ListenerInvocation> result = getListenerCollectionForAnnotation(annotation);
+      result.add(li);
+   }
+
+   public void addListener(Object listener) {
+      validateAndAddListenerInvocation(listener);
+   }
+
+   public void removeListener(Object listener) {
+      for (Class annotation : allowedMethodAnnotations) removeListenerInvocation(annotation, listener);
+   }
+
+   private void removeListenerInvocation(Class annotation, Object listener) {
+      if (listener == null) return;
+      List<ListenerInvocation> l = getListenerCollectionForAnnotation(annotation);
+      Set<Object> markedForRemoval = new HashSet<Object>();
+      for (ListenerInvocation li : l) {
+         if (listener.equals(li.target)) markedForRemoval.add(li);
+      }
+      l.removeAll(markedForRemoval);
+   }
+
+   /**
+    * Removes all listeners from the notifier, including the evictionPolicyListener.
+    */
+   @Stop(priority = 99)
+   public void removeAllCacheListeners() {
+      cacheEntryCreatedListeners.clear();
+      cacheEntryRemovedListeners.clear();
+      cacheEntryVisitedListeners.clear();
+      cacheEntryModifiedListeners.clear();
+      cacheEntryActivatedListeners.clear();
+      cacheEntryPassivatedListeners.clear();
+      cacheEntryLoadedListeners.clear();
+      cacheEntryEvictedListeners.clear();
+      transactionRegisteredListeners.clear();
+      transactionCompletedListeners.clear();
+   }
+
+   public Set<Object> getListeners() {
+      Set<Object> result = new HashSet<Object>();
+      for (List<ListenerInvocation> list : listenersMap.values()) {
+         for (ListenerInvocation li : list) result.add(li.target);
+      }
+      return Collections.unmodifiableSet(result);
+   }
+
+   public void notifyCacheEntryCreated(Object key, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryCreatedListeners.isEmpty()) {
+         boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_CREATED);
+         for (ListenerInvocation listener : cacheEntryCreatedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryModified(Object key, Object value, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryModifiedListeners.isEmpty()) {
+         boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setValue(value);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_MODIFIED);
+         for (ListenerInvocation listener : cacheEntryModifiedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryRemoved(Object key, Object value, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryRemovedListeners.isEmpty()) {
+         boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setValue(value);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_REMOVED);
+         for (ListenerInvocation listener : cacheEntryRemovedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryVisited(Object key, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryVisitedListeners.isEmpty()) {
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_VISITED);
+         for (ListenerInvocation listener : cacheEntryVisitedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryEvicted(final Object key, final boolean pre, InvocationContext ctx) {
+      if (!cacheEntryEvictedListeners.isEmpty()) {
+         final boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_EVICTED);
+         for (ListenerInvocation listener : cacheEntryEvictedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryInvalidated(final Object key, final boolean pre, InvocationContext ctx) {
+      if (!cacheEntryInvalidatedListeners.isEmpty()) {
+         final boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_INVALIDATED);
+         for (ListenerInvocation listener : cacheEntryInvalidatedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryLoaded(Object key, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryLoadedListeners.isEmpty()) {
+         boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_LOADED);
+         for (ListenerInvocation listener : cacheEntryLoadedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryActivated(Object key, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryActivatedListeners.isEmpty()) {
+         boolean originLocal = ctx.isOriginLocal();
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(originLocal);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_ACTIVATED);
+         for (ListenerInvocation listener : cacheEntryActivatedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyCacheEntryPassivated(Object key, boolean pre, InvocationContext ctx) {
+      if (!cacheEntryPassivatedListeners.isEmpty()) {
+         Transaction tx = ctx.getTransaction();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setPre(pre);
+         e.setKey(key);
+         e.setTransaction(tx);
+         e.setType(CACHE_ENTRY_PASSIVATED);
+         for (ListenerInvocation listener : cacheEntryPassivatedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyTransactionCompleted(Transaction transaction, boolean successful, InvocationContext ctx) {
+      if (!transactionCompletedListeners.isEmpty()) {
+         boolean isOriginLocal = ctx.isOriginLocal();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(isOriginLocal);
+         e.setTransaction(transaction);
+         e.setTransactionSuccessful(successful);
+         e.setType(TRANSACTION_COMPLETED);
+         for (ListenerInvocation listener : transactionCompletedListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   public void notifyTransactionRegistered(Transaction transaction, InvocationContext ctx) {
+      if (!transactionRegisteredListeners.isEmpty()) {
+         boolean isOriginLocal = ctx.isOriginLocal();
+         InvocationContext backup = resetInvocationContext(ctx);
+         EventImpl e = new EventImpl();
+         e.setCache(cache);
+         e.setOriginLocal(isOriginLocal);
+         e.setTransaction(transaction);
+         e.setType(TRANSACTION_REGISTERED);
+         for (ListenerInvocation listener : transactionRegisteredListeners) listener.invoke(e);
+         restoreInvocationContext(backup);
+      }
+   }
+
+   private void restoreInvocationContext(InvocationContext backup) {
+      InvocationContext currentIC = cache.getInvocationContext();
+      backup.clearLookedUpEntries();
+      backup.putLookedUpEntries(currentIC.getLookedUpEntries());
+      cache.setInvocationContext(backup);
+   }
+
+   /**
+    * Resets the current (passed-in) invocation, and returns a temp InvocationContext containing its state so it can be
+    * restored later using {@link #restoreInvocationContext(InvocationContext)}
+    *
+    * @param ctx the current context to be reset
+    * @return a clone of ctx, before it was reset
+    */
+   private InvocationContext resetInvocationContext(InvocationContext ctx) {
+      // wipe current context.
+      cache.setInvocationContext(null);
+      // get a new Invocation Context
+      InvocationContext newContext = cache.getInvocationContext();
+      newContext.putLookedUpEntries(ctx.getLookedUpEntries());
+      return ctx;
+   }
+
+   /**
+    * Class that encapsulates a valid invocation for a given registered listener - containing a reference to the method
+    * to be invoked as well as the target object.
+    */
+   class ListenerInvocation {
+      private final Object target;
+      private final Method method;
+      private final boolean sync;
+
+      public ListenerInvocation(Object target, Method method, boolean sync) {
+         this.target = target;
+         this.method = method;
+         this.sync = sync;
+      }
+
+      public void invoke(final Event e) {
+         Runnable r = new Runnable() {
+
+            public void run() {
+               try {
+                  method.invoke(target, e);
+               }
+               catch (InvocationTargetException exception) {
+                  Throwable cause = exception.getCause();
+                  if (cause != null)
+                     throw new CacheException("Caught exception invoking method " + method + " on listener instance " + target, cause);
+                  else
+                     throw new CacheException("Caught exception invoking method " + method + " on listener instance " + target, exception);
+               }
+               catch (IllegalAccessException exception) {
+                  log.warn("Unable to invoke method " + method + " on Object instance " + target + " - removing this target object from list of listeners!", exception);
+                  removeListener(target);
+               }
+            }
+         };
+
+         if (sync)
+            syncProcessor.execute(r);
+         else
+            asyncProcessor.execute(r);
+      }
+   }
+
+   private List<ListenerInvocation> getListenerCollectionForAnnotation(Class<? extends Annotation> annotation) {
+      List<ListenerInvocation> list = listenersMap.get(annotation);
+      if (list == null) throw new CacheException("Unknown listener annotation: " + annotation);
+      return list;
+   }
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/CacheNotifierImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation (from rev 7607, core/branches/flat/src/main/java/org/horizon/notifications/annotation)

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryActivated.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is activated.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeActivatedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @see org.horizon.notifications.annotation.NodePassivated
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryActivated {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryActivated.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryActivated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is activated.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryActivatedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @see CacheEntryPassivated
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryActivated {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryCreated.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is created.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeCreatedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryCreated {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryCreated.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryCreated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is created.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryCreatedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryCreated {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryEvicted.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is evicted.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeEvictedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @see org.horizon.notifications.annotation.NodeLoaded
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryEvicted {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryEvicted.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryEvicted.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is evicted.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryEvictedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @see CacheEntryLoaded
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryEvicted {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryInvalidated.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is invalidated.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeInvalidatedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryInvalidated {
-}
\ No newline at end of file

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryInvalidated.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryInvalidated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is invalidated.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryInvalidatedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryInvalidated {
+}
\ No newline at end of file

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryLoaded.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is loaded from a {@link
- * org.horizon.loader.CacheLoader}.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeEvictedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryLoaded {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryLoaded.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryLoaded.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is loaded from a {@link
+ * org.horizon.loader.CacheLoader}.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryLoadedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryLoaded {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryModified.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node has been modified.
- * <p/>
- * Methods annotated with this annotation should be public and take in a single parameter, a {@link
- * org.horizon.notifications.event.NodeModifiedEvent} otherwise an {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your cache listener.
- * <p/>
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheEntryModified {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryModified.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryModified.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry has been modified.
+ * <p/>
+ * Methods annotated with this annotation should be public and take in a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryModifiedEvent} otherwise an {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your cache listener.
+ * <p/>
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheEntryModified {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryPassivated.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,45 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is passivated.
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.NodePassivatedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
-// ensure this annotation is available at runtime.
- at Retention(RetentionPolicy.RUNTIME)
-// ensure that this annotation is applied to classes.
- at Target(ElementType.METHOD)
-public @interface CacheEntryPassivated {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryPassivated.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryPassivated.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is passivated.
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryPassivatedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+// ensure this annotation is available at runtime.
+ at Retention(RetentionPolicy.RUNTIME)
+// ensure that this annotation is applied to classes.
+ at Target(ElementType.METHOD)
+public @interface CacheEntryPassivated {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryRemoved.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,45 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is removed from the cache.
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.TransactionRegisteredEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
-// ensure this annotation is available at runtime.
- at Retention(RetentionPolicy.RUNTIME)
-// ensure that this annotation is applied to classes.
- at Target(ElementType.METHOD)
-public @interface CacheEntryRemoved {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryRemoved.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryRemoved.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is removed from the cache.
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryRemovedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+// ensure this annotation is available at runtime.
+ at Retention(RetentionPolicy.RUNTIME)
+// ensure that this annotation is applied to classes.
+ at Target(ElementType.METHOD)
+public @interface CacheEntryRemoved {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryVisited.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,45 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a node is visited.
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.NodeVisitedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
-// ensure this annotation is available at runtime.
- at Retention(RetentionPolicy.RUNTIME)
-// ensure that this annotation is applied to classes.
- at Target(ElementType.METHOD)
-public @interface CacheEntryVisited {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheEntryVisited.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheEntryVisited.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache entry is visited.
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachelistener.event.CacheEntryVisitedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+// ensure this annotation is available at runtime.
+ at Retention(RetentionPolicy.RUNTIME)
+// ensure that this annotation is applied to classes.
+ at Target(ElementType.METHOD)
+public @interface CacheEntryVisited {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStarted.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheStarted.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStarted.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a cache is started.
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.CacheStartedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheStarted {
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStopped.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/CacheStopped.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/CacheStopped.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when a cache is stopped.
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.CacheStoppedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CacheStopped {
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/Listener.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/Listener.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/Listener.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,239 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Class-level annotation used to annotate an object as being a valid cache listener.  Used with the {@link
- * org.horizon.Cache_Legacy#addCacheListener(Object)} and related APIs. <p/> Note that even if a class is annotated with
- * this annotation, it still needs method-level annotation (such as {@link org.horizon.notifications.annotation.CacheStarted})
- * to actually receive notifications. <p/> Objects annotated with this annotation - listeners - can be attached to a
- * running {@link org.horizon.Cache_Legacy} so users can be notified of {@link org.horizon.Cache_Legacy} events. <p/>
- * <p/> There can be multiple methods that are annotated to receive the same event, and a method may receive multiple
- * events by using a super type. </p> <p/> <h4>Delivery Semantics</h4> <p/> An event is delivered immediately after the
- * respective operation, but before the underlying cache call returns. For this reason it is important to keep listener
- * processing logic short-lived. If a long running task needs to be performed, it's recommended to use another thread.
- * </p> <p/> <h4>Transactional Semantics</h4> <p/> Since the event is delivered during the actual cache call, the
- * transactional outcome is not yet known. For this reason, <i>events are always delivered, even if the changes they
- * represent are discarded by their containing transaction</i>. For applications that must only process events that
- * represent changes in a completed transaction, {@link org.horizon.notifications.event.TransactionalEvent#getTransaction()}
- * can be used, along with {@link org.horizon.notifications.event.TransactionCompletedEvent#isSuccessful()} to record
- * events and later process them once the transaction has been successfully committed. Example 4 demonstrates this. </p>
- * <p/> <h4>Threading Semantics</h4> <p/> A listener implementation must be capable of handling concurrent invocations.
- * Local notifications reuse the calling thread; remote notifications reuse the network thread. </p> <p/> Since
- * notifications reuse the calling or network thread, it is important to realise that if your listener implementation
- * blocks or performs a long-running task, the original caller which triggered the cache event may block until the
- * listener callback completes.  It is therefore a good idea to use the listener to be notified of an event but to
- * perform any long running tasks in a separate thread so as not to block the original caller. </p> <p/> In addition,
- * any locks acquired for the operation being performed will still be held for the callback.  This needs to be kept in
- * mind as locks may be held longer than necessary or intended to and may cause deadlocking in certain situations.  See
- * above paragraph on long-running tasks that should be run in a separate thread. </p> <b>Note</b>: Since 3.0, a new
- * parameter, <tt>sync</tt>, has been introduced on this annotation.  This defaults to <tt>true</tt> which provides the
- * above semantics.  Alternatively, if you set <tt>sync</tt> to <tt>false</tt>, then invocations are made in a
- * <i>separate</i> thread, which will not cause any blocking on the caller or network thread.  The separate thread is
- * taken from a pool, which can be configured using {@link org.horizon.config.Configuration#setListenerAsyncPoolSize(int)}.
- * <p/>
- * <b>Summary of Notification Annotations</b> <table border="1" cellpadding="1" cellspacing="1" summary="Summary of
- * notification annotations"> <tr> <th bgcolor="#CCCCFF" align="left">Annotation</th> <th bgcolor="#CCCCFF"
- * align="left">Event</th> <th bgcolor="#CCCCFF" align="left">Description</th> </tr> <tr> <td valign="top">{@link
- * CacheStarted}</td> <td valign="top">{@link org.horizon.notifications.event.CacheStartedEvent}</td> <td valign="top">A
- * cache was started</td> </tr> <tr> <td valign="top">{@link CacheStopped}</td> <td valign="top">{@link
- * org.horizon.notifications.event.CacheStoppedEvent}</td> <td valign="top">A cache was stopped</td> </tr> <tr> <td
- * valign="top">{@link CacheEntryModified}</td> <td valign="top">{@link org.horizon.notifications.event.NodeModifiedEvent}</td>
- * <td valign="top">A node was modified</td> </tr> <tr> <td valign="top">{@link NodeMoved}</td> <td valign="top">{@link
- * org.horizon.notifications.event.NodeMovedEvent}</td> <td valign="top">A node was moved</td> </tr> <tr> <td
- * valign="top">{@link CacheEntryCreated}</td> <td valign="top">{@link org.horizon.notifications.event.NodeCreatedEvent}</td>
- * <td valign="top">A node was created</td> </tr> <tr> <td valign="top">{@link CacheEntryRemoved}</td> <td
- * valign="top">{@link org.horizon.notifications.event.NodeRemovedEvent}</td> <td valign="top">A node was removed</td>
- * </tr> <tr> <td valign="top">{@link CacheEntryVisited}</td> <td valign="top">{@link
- * org.horizon.notifications.event.NodeVisitedEvent}</td> <td valign="top">A node was visited</td> </tr> <tr> <td
- * valign="top">{@link CacheEntryLoaded}</td> <td valign="top">{@link org.horizon.notifications.event.NodeLoadedEvent}</td>
- * <td valign="top">A node was loaded</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.annotation.NodeEvicted}</td>
- * <td valign="top">{@link org.horizon.notifications.event.NodeEvictedEvent}</td> <td valign="top">A node was
- * evicted</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.annotation.NodeActivated}</td> <td
- * valign="top">{@link org.horizon.notifications.event.NodeActivatedEvent}</td> <td valign="top">A node was
- * activated</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.annotation.NodePassivated}</td> <td
- * valign="top">{@link org.horizon.notifications.event.NodePassivatedEvent}</td> <td valign="top">A node was
- * passivated</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.annotation.ViewChanged}</td> <td
- * valign="top">{@link org.horizon.notifications.event.ViewChangedEvent}</td> <td valign="top">A view change event was
- * detected</td> </tr> <tr> <td valign="top">{@link org.horizon.notifications.annotation.CacheBlocked}</td> <td
- * valign="top">{@link org.horizon.notifications.event.CacheBlockedEvent}</td> <td valign="top">A cache block event was
- * detected</td> </tr> <tr> <td valign="top">{@link CacheUnblocked}</td> <td valign="top">{@link
- * org.horizon.notifications.event.CacheUnblockedEvent}</td> <td valign="top">A cache unblock event was detected</td>
- * </tr> <tr> <td valign="top">{@link TransactionRegistered}</td> <td valign@="top">{@link
- * org.horizon.notifications.event.TransactionRegisteredEvent}</td> <td valign="top">The cache has started to
- * participate in a transaction</td> </tr> <tr> <td valign="top">{@link TransactionCompleted}</td> <td
- * valign=@"top">{@link org.horizon.notifications.event.TransactionCompletedEvent}</td> <td valign="top">The cache has
- * completed its participation in a transaction</td> </tr> <tr> <td valign="top">{@link BuddyGroupChanged}</td> <td
- * valign=@"top">{@link org.horizon.notifications.event.BuddyGroupChangedEvent}</td> <td valign="top">Buddy replication
- * is enabled and one of the buddy groups that the instance is a member of has changed its membership.</td> </tr> <tr>
- * <td valign="top">{@link CacheEntryInvalidated}</td> <td valign=@"top">{@link org.horizon.notifications.event.NodeInvalidatedEvent}</td>
- * <td valign="top">A node was invalidated by a remote cache.  Only if cache mode is INVALIDATION_SYNC or
- * INVALIDATION_ASYNC.</td> </tr>
- * <p/>
- * </table>
- * <p/>
- * <h4>Example 1 - Method receiving a single event</h4>
- * <pre>
- *    &#064;CacheListener
- *    public class SingleEventListener
- *    {
- *       &#064;CacheStarted
- *       public void doSomething(Event event)
- *       {
- *          System.out.println(&quot;Cache started.  Details = &quot; + event);
- *       }
- *    }
- * </pre>
- * <p/>
- * <h4>Example 2 - Method receiving multiple events</h4>
- * <pre>
- *    &#064;CacheListener
- *    public class MultipleEventListener
- *    {
- *       &#064;CacheStarted
- *       &#064;CacheStopped
- *       public void doSomething(Event event)
- *       {
- *          if (event.getType() == Event.Type.CACHE_STARTED)
- *             System.out.println(&quot;Cache started.  Details = &quot; + event);
- *          else if (event.getType() == Event.Type.CACHE_STOPPED)
- *             System.out.println(&quot;Cache stopped.  Details = &quot; + event);
- *       }
- *    }
- * </pre>
- * <p/>
- * <h4>Example 3 - Multiple methods receiving the same event</h4>
- * <pre>
- *    &#064;CAcheListener
- *    public class SingleEventListener
- *    {
- *       &#064;CacheStarted
- *       public void handleStart(Event event)
- *       {
- *          System.out.println(&quot;Cache started&quot;);
- *       }
- * <p/>
- *       &#064;CacheStarted
- *       &#064;CacheStopped
- *       &#064;CacheBlocked
- *       &#064;CacheUnblocked
- *       &#064;ViewChanged
- *       public void logEvent(Event event)
- *       {
- *          logSystem.logEvent(event.getType());
- *       }
- *    }
- * </pre>
- * <p/>
- * <p/>
- * <b>Example 4 - Processing only events with a committed transaction.</b>
- * <p/>
- * <pre>
- *    &#064;CacheListener
- *    public class TxGuaranteedListener
- *    {
- *       private class TxEventQueue
- *       {
- *          private ConcurrentMap&lt;Transaction, Queue&lt;Event&gt;&gt; map = new ConcurrentHashMap&lt;Transaction,
- * Queue&lt;Event&gt;&gt;();
- * <p/>
- *          public void offer(Event event)
- *          {
- *             Queue&lt;Event&gt; queue = getQueue(event.getContext().getTransaction());
- *             queue.offer(event);
- *          }
- * <p/>
- *          private Queue&lt;Event&gt; getQueue(Transaction transaction)
- *          {
- *             Queue&lt;Event&gt; queue = map.get(transaction);
- *             if (queue == null)
- *             {
- *                queue = new ConcurrentLinkedQueue&lt;Event&gt;();
- *                map.putIfAbsent(transaction, queue);
- *             }
- * <p/>
- *             return queue;
- *          }
- * <p/>
- *          public Queue&lt;Event&gt; takeAll(Transaction transaction)
- *          {
- *             return map.remove(transaction);
- *          }
- *       }
- * <p/>
- *       private TxEventQueue events = new TxEventQueue();
- * <p/>
- *       &#064;NodeModified
- *       &#064;NodeMoved
- *       &#064;NodeCreated
- *       &#064;NodeRemoved
- *       public void handle(Event event)
- *       {
- *          events.offer(event);
- *       }
- * <p/>
- *       &#064;TransactionCompleted
- *       public void handleTx(TransactionCompletedEvent event)
- *       {
- *          Queue&lt;Event&gt; completed = events.takeAll(event.getTransaction());
- *          if (completed != null &amp;&amp; event.isSuccessful())
- *             System.out.println("Comitted events = " + completed);
- *       }
- *    }
- * </pre>
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @author Jason T. Greene
- * @see CacheStarted
- * @see CacheStopped
- * @see CacheEntryModified
- * @see CacheEntryCreated
- * @see CacheEntryRemoved
- * @see CacheEntryVisited
- * @see CacheEntryLoaded
- * @see CacheEntryEvicted
- * @see CacheEntryActivated
- * @see CacheEntryPassivated
- * @see ViewChanged
- * @see TransactionCompleted
- * @see TransactionRegistered
- * @see CacheEntryInvalidated
- * @since 1.0
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.TYPE)
-public @interface Listener {
-   /**
-    * Specifies whether callbacks on any class annotated with this annotation happens synchronously (in the caller's
-    * thread) or asynchronously (using a separate thread).  Defaults to <tt>true</tt>.
-    *
-    * @return true if the expectation is that callbacks are called using the caller's thread; false if they are to be
-    *         made in a separate thread.
-    * @since 1.0
-    */
-   boolean sync() default true;
-}

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionCompleted.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/TransactionCompleted.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionCompleted.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.annotation;
+package org.horizon.notifications.cachelistener.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -31,14 +31,14 @@
  * transaction and the transaction completes, either with a commit or a rollback.
  * <p/>
  * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.TransactionCompletedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
+ * org.horizon.notifications.cachelistener.event.TransactionCompletedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
  * <p/>
  * Note that methods marked with this annotation will only be fired <i>after the fact</i>, i.e., your method will never
- * be called with {@link org.horizon.notifications.event.Event#isPre()} being set to <tt>true</tt>.
+ * be called with {@link org.horizon.notifications.cachelistener.event.Event#isPre()} being set to <tt>true</tt>.
  *
  * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
+ * @see org.horizon.notifications.Listener
  * @since 1.0
  */
 // ensure this annotation is available at runtime.

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionRegistered.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/TransactionRegistered.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/TransactionRegistered.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.annotation;
+package org.horizon.notifications.cachelistener.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -32,14 +32,14 @@
  * javax.transaction.TransactionManager}.
  * <p/>
  * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.TransactionRegisteredEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
+ * org.horizon.notifications.cachelistener.event.TransactionRegisteredEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
  * <p/>
  * Note that methods marked with this annotation will only be fired <i>after the fact</i>, i.e., your method will never
- * be called with {@link org.horizon.notifications.event.Event#isPre()} being set to <tt>true</tt>.
+ * be called with {@link org.horizon.notifications.cachelistener.event.Event#isPre()} being set to <tt>true</tt>.
  *
  * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
+ * @see org.horizon.notifications.Listener
  * @since 1.0
  */
 // ensure this annotation is available at runtime.

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/ViewChanged.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/annotation/ViewChanged.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/annotation/ViewChanged.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,46 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation should be used on methods that need to be notified when the cache is used in a cluster and the
- * cluster topology changes (i.e., a member joins or leaves the cluster).
- * <p/>
- * Methods annotated with this annotation should accept a single parameter, a {@link
- * org.horizon.notifications.event.ViewChangedEvent} otherwise a {@link org.horizon.notifications.IncorrectCacheListenerException}
- * will be thrown when registering your listener.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @see Listener
- * @since 1.0
- */
-// ensure this annotation is available at runtime.
- at Retention(RetentionPolicy.RUNTIME)
-// ensure that this annotation is applied to classes.
- at Target(ElementType.METHOD)
-public @interface ViewChanged {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event (from rev 7607, core/branches/flat/src/main/java/org/horizon/notifications/event)

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryActivatedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeActivated}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryActivatedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryActivatedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryActivatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryActivated}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryActivatedEvent extends CacheEntryEvent {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryCreatedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeCreated}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryCreatedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryCreatedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryCreatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryCreated}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryCreatedEvent extends CacheEntryEvent {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,35 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * Transactional events that additionally expose an Fqn as such events pertain to a specific node.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryEvent extends TransactionalEvent {
-   /**
-    * @return the Fqn pointing to the node that is affected.
-    */
-   Object getKey();
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java (from rev 7617, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * Transactional events that additionally expose a key as such events pertain to a specific cache entry.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryEvent extends TransactionalEvent {
+   /**
+    * @return the key to the affected cache entry.
+    */
+   Object getKey();
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryEvictedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeEvicted}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryEvictedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryEvictedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryEvictedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryEvicted}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryEvictedEvent extends CacheEntryEvent {
+}

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryInvalidatedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryInvalidatedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryInvalidatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.event;
+package org.horizon.notifications.cachelistener.event;
 
 /**
  * Notifies a listener of an invalidation event

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryLoadedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeLoaded}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryLoadedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryLoadedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryLoadedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryLoaded}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryLoadedEvent extends CacheEntryEvent {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryModifiedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeModified}
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryModifiedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryModifiedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryModifiedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryModified}
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryModifiedEvent extends CacheEntryEvent {
+   Object getValue();
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryPassivatedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodePassivated}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryPassivatedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryPassivatedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryPassivatedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryPassivated}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryPassivatedEvent extends CacheEntryEvent {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryRemovedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeRemoved}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryRemovedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryRemovedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryRemovedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryRemovedEvent extends CacheEntryEvent {
+   Object getValue();
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryVisitedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.NodeVisited}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheEntryVisitedEvent extends CacheEntryEvent {
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/CacheEntryVisitedEvent.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheEntryVisitedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.CacheEntryVisited}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheEntryVisitedEvent extends CacheEntryEvent {
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStartedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheStartedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStartedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.CacheStarted}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheStartedEvent extends Event {
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStoppedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/CacheStoppedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/CacheStoppedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.CacheStopped}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface CacheStoppedEvent extends Event {
-}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/Event.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,53 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-import org.horizon.Cache;
-
-/**
- * An interface that defines common characteristics of events
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface Event {
-   static enum Type {
-      CACHE_STARTED, CACHE_STOPPED, CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED,
-      CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, CACHE_ENTRY_REMOVED, CACHE_ENTRY_MODIFIED,
-      TRANSACTION_COMPLETED, TRANSACTION_REGISTERED, VIEW_CHANGED, BUDDY_GROUP_CHANGED, CACHE_ENTRY_INVALIDATED
-   }
-
-   /**
-    * @return the type of event represented by this instance.
-    */
-   Type getType();
-
-   /**
-    * @return true if the notification is before the event has occured, false if after the event has occured.
-    */
-   boolean isPre();
-
-   /**
-    * @return a handle to the cache instance that generated this notification.
-    */
-   Cache getCache();
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java (from rev 7616, core/branches/flat/src/main/java/org/horizon/notifications/event/Event.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/Event.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+import org.horizon.Cache;
+
+/**
+ * An interface that defines common characteristics of events
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface Event {
+   static enum Type {
+      CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED,
+      CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, CACHE_ENTRY_REMOVED, CACHE_ENTRY_MODIFIED,
+      TRANSACTION_COMPLETED, TRANSACTION_REGISTERED, CACHE_ENTRY_INVALIDATED
+   }
+
+   /**
+    * @return the type of event represented by this instance.
+    */
+   Type getType();
+
+   /**
+    * @return true if the notification is before the event has occured, false if after the event has occured.
+    */
+   boolean isPre();
+
+   /**
+    * @return a handle to the cache instance that generated this notification.
+    */
+   Cache getCache();
+}

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/EventImpl.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,193 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-import org.horizon.Cache;
-import org.horizon.remoting.transport.Address;
-import org.horizon.tree.Fqn;
-
-import javax.transaction.Transaction;
-import java.util.List;
-
-/**
- * Basic implementation of an event that covers all event types.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public class EventImpl implements CacheStartedEvent, CacheStoppedEvent,
-                                  CacheEntryActivatedEvent, CacheEntryCreatedEvent, CacheEntryEvictedEvent, CacheEntryLoadedEvent, CacheEntryModifiedEvent,
-                                  CacheEntryPassivatedEvent, CacheEntryRemovedEvent, CacheEntryVisitedEvent, TransactionCompletedEvent, TransactionRegisteredEvent,
-                                  ViewChangedEvent, CacheEntryInvalidatedEvent {
-   private boolean pre = false; // by default events are after the fact
-   private Cache cache;
-   private Object key;
-   private Transaction transaction;
-   private boolean originLocal = true; // by default events all originate locally
-   private Fqn targetFqn;
-   private boolean successful;
-   private Type type;
-   private List<Address> members;
-   Address localAddress;
-
-   public EventImpl(boolean pre, Cache cache, Object key, Transaction transaction, boolean originLocal, Fqn targetFqn, boolean successful, List<Address> members, Address localAddress, Type type) {
-      this.pre = pre;
-      this.cache = cache;
-      this.key = key;
-      this.transaction = transaction;
-      this.originLocal = originLocal;
-      this.targetFqn = targetFqn;
-      this.successful = successful;
-      this.type = type;
-      this.members = members;
-      this.localAddress = localAddress;
-   }
-
-   public EventImpl() {
-   }
-
-   public Type getType() {
-      return type;
-   }
-
-   public boolean isPre() {
-      return pre;
-   }
-
-   public Cache getCache() {
-      return cache;
-   }
-
-   public Object getKey() {
-      return key;
-   }
-
-   public Transaction getTransaction() {
-      return transaction;
-   }
-
-   public boolean isOriginLocal() {
-      return originLocal;
-   }
-
-   public Fqn getTargetFqn() {
-      return targetFqn;
-   }
-
-   public boolean isSuccessful() {
-      return successful;
-   }
-
-   // ------------------------------ setters -----------------------------
-
-   public void setPre(boolean pre) {
-      this.pre = pre;
-   }
-
-   public void setCache(Cache cache) {
-      this.cache = cache;
-   }
-
-   public void setKey(Object key) {
-      this.key = key;
-   }
-
-   public void setTransaction(Transaction transaction) {
-      this.transaction = transaction;
-   }
-
-   public void setOriginLocal(boolean originLocal) {
-      this.originLocal = originLocal;
-   }
-
-   public void setTargetFqn(Fqn targetFqn) {
-      this.targetFqn = targetFqn;
-   }
-
-   public void setSuccessful(boolean successful) {
-      this.successful = successful;
-   }
-
-   public void setType(Type type) {
-      this.type = type;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-
-      EventImpl event = (EventImpl) o;
-
-      if (originLocal != event.originLocal) return false;
-      if (pre != event.pre) return false;
-      if (successful != event.successful) return false;
-      if (cache != null ? !cache.equals(event.cache) : event.cache != null) return false;
-      if (key != null ? !key.equals(event.key) : event.key != null) return false;
-      if (localAddress != null ? !localAddress.equals(event.localAddress) : event.localAddress != null) return false;
-      if (members != null ? !members.equals(event.members) : event.members != null) return false;
-      if (targetFqn != null ? !targetFqn.equals(event.targetFqn) : event.targetFqn != null) return false;
-      if (transaction != null ? !transaction.equals(event.transaction) : event.transaction != null) return false;
-      if (type != event.type) return false;
-
-      return true;
-   }
-
-   @Override
-   public int hashCode() {
-      int result = (pre ? 1 : 0);
-      result = 31 * result + (cache != null ? cache.hashCode() : 0);
-      result = 31 * result + (key != null ? key.hashCode() : 0);
-      result = 31 * result + (transaction != null ? transaction.hashCode() : 0);
-      result = 31 * result + (originLocal ? 1 : 0);
-      result = 31 * result + (targetFqn != null ? targetFqn.hashCode() : 0);
-      result = 31 * result + (successful ? 1 : 0);
-      result = 31 * result + (type != null ? type.hashCode() : 0);
-      result = 31 * result + (members != null ? members.hashCode() : 0);
-      result = 31 * result + (localAddress != null ? localAddress.hashCode() : 0);
-      return result;
-   }
-
-   @Override
-   public String toString() {
-      return "EventImpl{" +
-            "type=" + type +
-            ",pre=" + pre +
-            ", cache=" + cache +
-            ", key=" + key +
-            ", transaction=" + transaction +
-            ", originLocal=" + originLocal +
-            ", targetFqn=" + targetFqn +
-            ", successful=" + successful +
-            ", members=" + members +
-            ", localAddress=" + localAddress +
-            '}';
-   }
-
-   public List<Address> getNewMemberList() {
-      return members;
-   }
-
-   public Address getLocalAddress() {
-      return localAddress;
-   }
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java (from rev 7617, core/branches/flat/src/main/java/org/horizon/notifications/event/EventImpl.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/EventImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,170 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachelistener.event;
+
+import org.horizon.Cache;
+
+import javax.transaction.Transaction;
+
+/**
+ * Basic implementation of an event that covers all event types.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public class EventImpl implements CacheEntryActivatedEvent, CacheEntryCreatedEvent, CacheEntryEvictedEvent, CacheEntryLoadedEvent, CacheEntryModifiedEvent,
+                                  CacheEntryPassivatedEvent, CacheEntryRemovedEvent, CacheEntryVisitedEvent, TransactionCompletedEvent, TransactionRegisteredEvent,
+                                  CacheEntryInvalidatedEvent {
+   private boolean pre = false; // by default events are after the fact
+   private Cache cache;
+   private Object key;
+   private Transaction transaction;
+   private boolean originLocal = true; // by default events all originate locally
+   private boolean transactionSuccessful;
+   private Type type;
+   private Object value;
+
+   public EventImpl(boolean pre, Cache cache, Object key, Transaction transaction, boolean originLocal, boolean successful, Type type, Object value) {
+      this.pre = pre;
+      this.cache = cache;
+      this.key = key;
+      this.transaction = transaction;
+      this.originLocal = originLocal;
+      this.transactionSuccessful = successful;
+      this.type = type;
+      this.value = value;
+   }
+
+   public EventImpl() {
+   }
+
+   public Type getType() {
+      return type;
+   }
+
+   public boolean isPre() {
+      return pre;
+   }
+
+   public Cache getCache() {
+      return cache;
+   }
+
+   public Object getKey() {
+      return key;
+   }
+
+   public Transaction getTransaction() {
+      return transaction;
+   }
+
+   public boolean isOriginLocal() {
+      return originLocal;
+   }
+
+   public boolean isTransactionSuccessful() {
+      return transactionSuccessful;
+   }
+
+   // ------------------------------ setters -----------------------------
+
+   public void setPre(boolean pre) {
+      this.pre = pre;
+   }
+
+   public void setCache(Cache cache) {
+      this.cache = cache;
+   }
+
+   public void setKey(Object key) {
+      this.key = key;
+   }
+
+   public void setTransaction(Transaction transaction) {
+      this.transaction = transaction;
+   }
+
+   public void setOriginLocal(boolean originLocal) {
+      this.originLocal = originLocal;
+   }
+
+   public void setTransactionSuccessful(boolean transactionSuccessful) {
+      this.transactionSuccessful = transactionSuccessful;
+   }
+
+   public void setType(Type type) {
+      this.type = type;
+   }
+
+   public Object getValue() {
+      return value;
+   }
+
+   public void setValue(Object value) {
+      this.value = value;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      EventImpl event = (EventImpl) o;
+
+      if (originLocal != event.originLocal) return false;
+      if (pre != event.pre) return false;
+      if (transactionSuccessful != event.transactionSuccessful) return false;
+      if (cache != null ? !cache.equals(event.cache) : event.cache != null) return false;
+      if (key != null ? !key.equals(event.key) : event.key != null) return false;
+      if (transaction != null ? !transaction.equals(event.transaction) : event.transaction != null) return false;
+      if (type != event.type) return false;
+      if (value != null ? !value.equals(event.value) : event.value != null) return false;
+
+      return true;
+   }
+
+   @Override
+   public int hashCode() {
+      int result = (pre ? 1 : 0);
+      result = 31 * result + (cache != null ? cache.hashCode() : 0);
+      result = 31 * result + (key != null ? key.hashCode() : 0);
+      result = 31 * result + (transaction != null ? transaction.hashCode() : 0);
+      result = 31 * result + (originLocal ? 1 : 0);
+      result = 31 * result + (transactionSuccessful ? 1 : 0);
+      result = 31 * result + (type != null ? type.hashCode() : 0);
+      result = 31 * result + (value != null ? value.hashCode() : 0);
+      return result;
+   }
+
+   @Override
+   public String toString() {
+      return "EventImpl{" +
+            "pre=" + pre +
+            ", key=" + key +
+            ", transaction=" + transaction +
+            ", originLocal=" + originLocal +
+            ", transactionSuccessful=" + transactionSuccessful +
+            ", type=" + type +
+            ", value=" + value +
+            '}';
+   }
+}

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionCompletedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/TransactionCompletedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionCompletedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,10 +19,10 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.event;
+package org.horizon.notifications.cachelistener.event;
 
 /**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.TransactionCompleted}.
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.TransactionCompleted}.
  * <p/>
  * Note that this event is only delivered <i>after the fact</i>, i.e., you will never see an instance of this event with
  * {@link #isPre()} being set to <tt>true</tt>.
@@ -35,5 +35,5 @@
     * @return if <tt>true</tt>, the transaction completed by committing successfully.  If <tt>false</tt>, the
     *         transaction completed with a rollback.
     */
-   boolean isSuccessful();
+   boolean isTransactionSuccessful();
 }

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionRegisteredEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/TransactionRegisteredEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionRegisteredEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,10 +19,10 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.event;
+package org.horizon.notifications.cachelistener.event;
 
 /**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.TransactionRegistered}.
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachelistener.annotation.TransactionRegistered}.
  * <p/>
  * Note that this event is only delivered <i>after the fact</i>, i.e., you will never see an instance of this event with
  * {@link #isPre()} being set to <tt>true</tt>.

Modified: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionalEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/TransactionalEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/TransactionalEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -19,7 +19,7 @@
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
-package org.horizon.notifications.event;
+package org.horizon.notifications.cachelistener.event;
 
 import javax.transaction.Transaction;
 

Deleted: core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/ViewChangedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/event/ViewChangedEvent.java	2009-01-28 18:27:32 UTC (rev 7607)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachelistener/event/ViewChangedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,41 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.horizon.notifications.event;
-
-import org.horizon.remoting.transport.Address;
-
-import java.util.List;
-
-/**
- * This event is passed in to any method annotated with {@link org.horizon.notifications.annotation.ViewChanged}.
- *
- * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
- * @since 1.0
- */
-public interface ViewChangedEvent extends Event {
-   /**
-    * @return the new view associated with this view change.
-    */
-   List<Address> getNewMemberList();
-
-   Address getLocalAddress();
-}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifier.java (from rev 7607, core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifier.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifier.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifier.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,29 @@
+package org.horizon.notifications.cachemanagerlistener;
+
+import org.horizon.factories.annotations.NonVolatile;
+import org.horizon.factories.scopes.Scope;
+import org.horizon.factories.scopes.Scopes;
+import org.horizon.notifications.Listenable;
+import org.horizon.remoting.transport.Address;
+
+import java.util.List;
+
+/**
+ * Notifications for the cache manager
+ *
+ * @author Manik Surtani
+ * @since 1.0
+ */
+ at NonVolatile
+ at Scope(Scopes.GLOBAL)
+public interface CacheManagerNotifier extends Listenable {
+   /**
+    * Notifies all registered listeners of a viewChange event.  Note that viewChange notifications are ALWAYS sent
+    * immediately.
+    */
+   void notifyViewChange(List<Address> members, Address myAddress);
+
+   void notifyCacheStarted(String cacheName);
+
+   void notifyCacheStopped(String cacheName);
+}

Copied: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImpl.java (from rev 7607, core/branches/flat/src/main/java/org/horizon/notifications/CacheManagerNotifierImpl.java)
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImpl.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,39 @@
+package org.horizon.notifications.cachemanagerlistener;
+
+import org.horizon.remoting.transport.Address;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Global, shared notifications.  Typically on the CacheManager.  See
+ *
+ * @author Manik Surtani
+ * @since 1.0
+ */
+public class CacheManagerNotifierImpl implements CacheManagerNotifier {
+
+   public void notifyViewChange(List<Address> members, Address myAddress) {
+      // TODO: Manik: Customise this generated block
+   }
+
+   public void notifyCacheStarted(String cacheName) {
+      // TODO: Manik: Customise this generated block
+   }
+
+   public void notifyCacheStopped(String cacheName) {
+      // TODO: Manik: Customise this generated block
+   }
+
+   public void addListener(Object listener) {
+      // TODO: Manik: Customise this generated block
+   }
+
+   public void removeListener(Object listener) {
+      // TODO: Manik: Customise this generated block
+   }
+
+   public Set<Object> getListeners() {
+      return null;  // TODO: Manik: Customise this generated block
+   }
+}

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStarted.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStarted.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStarted.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache is started.
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachemanagerlistener.event.CacheStartedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheStarted {
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStarted.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStopped.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStopped.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStopped.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when a cache is stopped.
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachemanagerlistener.event.CacheStoppedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(ElementType.METHOD)
+public @interface CacheStopped {
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/CacheStopped.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/ViewChanged.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/ViewChanged.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/ViewChanged.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation should be used on methods that need to be notified when the cache is used in a cluster and the
+ * cluster topology changes (i.e., a member joins or leaves the cluster).
+ * <p/>
+ * Methods annotated with this annotation should accept a single parameter, a {@link
+ * org.horizon.notifications.cachemanagerlistener.event.ViewChangedEvent} otherwise a {@link
+ * org.horizon.notifications.IncorrectListenerException} will be thrown when registering your listener.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @see org.horizon.notifications.Listener
+ * @since 1.0
+ */
+// ensure this annotation is available at runtime.
+ at Retention(RetentionPolicy.RUNTIME)
+// ensure that this annotation is applied to classes.
+ at Target(ElementType.METHOD)
+public @interface ViewChanged {
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/annotation/ViewChanged.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStartedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStartedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStartedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachemanagerlistener.annotation.CacheStarted}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheStartedEvent extends Event {
+   String getCacheName();
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStartedEvent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStoppedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStoppedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStoppedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.event;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachemanagerlistener.annotation.CacheStopped}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface CacheStoppedEvent extends Event {
+   String getCacheName();
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/CacheStoppedEvent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/Event.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/Event.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/Event.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,19 @@
+package org.horizon.notifications.cachemanagerlistener.event;
+
+import org.horizon.manager.CacheManager;
+
+/**
+ * Common characteristics of events that occur on a cache manager
+ *
+ * @author Manik Surtani
+ * @since 1.0
+ */
+public interface Event {
+   public enum Type {
+      CACHE_STARTED, CACHE_STOPPED, VIEW_CHANGED
+   }
+
+   CacheManager getCacheManager();
+
+   Type getType();
+}

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/EventImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/EventImpl.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/EventImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,109 @@
+package org.horizon.notifications.cachemanagerlistener.event;
+
+import org.horizon.manager.CacheManager;
+import org.horizon.remoting.transport.Address;
+
+import java.util.List;
+
+/**
+ * Implementation of cache manager events
+ *
+ * @author Manik Surtani
+ * @since 1.0
+ */
+public class EventImpl implements CacheStartedEvent, CacheStoppedEvent, ViewChangedEvent {
+
+   String cacheName;
+   CacheManager cacheManager;
+   Type type;
+   List<Address> newMemberList;
+   Address localAddress;
+
+   public EventImpl() {
+   }
+
+   public EventImpl(String cacheName, CacheManager cacheManager, Type type, List<Address> newMemberList, Address localAddress) {
+      this.cacheName = cacheName;
+      this.cacheManager = cacheManager;
+      this.type = type;
+      this.newMemberList = newMemberList;
+      this.localAddress = localAddress;
+   }
+
+   public String getCacheName() {
+      return cacheName;
+   }
+
+   public void setCacheName(String cacheName) {
+      this.cacheName = cacheName;
+   }
+
+   public CacheManager getCacheManager() {
+      return cacheManager;
+   }
+
+   public void setCacheManager(CacheManager cacheManager) {
+      this.cacheManager = cacheManager;
+   }
+
+   public Type getType() {
+      return type;
+   }
+
+   public void setType(Type type) {
+      this.type = type;
+   }
+
+   public List<Address> getNewMemberList() {
+      return newMemberList;
+   }
+
+   public void setNewMemberList(List<Address> newMemberList) {
+      this.newMemberList = newMemberList;
+   }
+
+   public Address getLocalAddress() {
+      return localAddress;
+   }
+
+   public void setLocalAddress(Address localAddress) {
+      this.localAddress = localAddress;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      EventImpl event = (EventImpl) o;
+
+      if (cacheManager != null ? !cacheManager.equals(event.cacheManager) : event.cacheManager != null) return false;
+      if (cacheName != null ? !cacheName.equals(event.cacheName) : event.cacheName != null) return false;
+      if (localAddress != null ? !localAddress.equals(event.localAddress) : event.localAddress != null) return false;
+      if (newMemberList != null ? !newMemberList.equals(event.newMemberList) : event.newMemberList != null)
+         return false;
+      if (type != event.type) return false;
+
+      return true;
+   }
+
+   @Override
+   public int hashCode() {
+      int result = cacheName != null ? cacheName.hashCode() : 0;
+      result = 31 * result + (cacheManager != null ? cacheManager.hashCode() : 0);
+      result = 31 * result + (type != null ? type.hashCode() : 0);
+      result = 31 * result + (newMemberList != null ? newMemberList.hashCode() : 0);
+      result = 31 * result + (localAddress != null ? localAddress.hashCode() : 0);
+      return result;
+   }
+
+   @Override
+   public String toString() {
+      return "EventImpl{" +
+            "cacheName='" + cacheName + '\'' +
+            ", type=" + type +
+            ", newMemberList=" + newMemberList +
+            ", localAddress=" + localAddress +
+            '}';
+   }
+}

Added: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/ViewChangedEvent.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/ViewChangedEvent.java	                        (rev 0)
+++ core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/ViewChangedEvent.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.horizon.notifications.cachemanagerlistener.event;
+
+import org.horizon.remoting.transport.Address;
+
+import java.util.List;
+
+/**
+ * This event is passed in to any method annotated with {@link org.horizon.notifications.cachemanagerlistener.annotation.ViewChanged}.
+ *
+ * @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
+ * @since 1.0
+ */
+public interface ViewChangedEvent extends Event {
+   /**
+    * @return the new view associated with this view change.
+    */
+   List<Address> getNewMemberList();
+
+   Address getLocalAddress();
+}


Property changes on: core/branches/flat/src/main/java/org/horizon/notifications/cachemanagerlistener/event/ViewChangedEvent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: core/branches/flat/src/main/java/org/horizon/remoting/RPCManagerImpl.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/remoting/RPCManagerImpl.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/remoting/RPCManagerImpl.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -11,7 +11,7 @@
 import org.horizon.factories.annotations.Start;
 import org.horizon.factories.annotations.Stop;
 import org.horizon.marshall.Marshaller;
-import org.horizon.notifications.CacheManagerNotifier;
+import org.horizon.notifications.cachemanagerlistener.CacheManagerNotifier;
 import org.horizon.remoting.transport.Address;
 import org.horizon.remoting.transport.Transport;
 

Modified: core/branches/flat/src/main/java/org/horizon/util/TestingUtil.java
===================================================================
--- core/branches/flat/src/main/java/org/horizon/util/TestingUtil.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/main/java/org/horizon/util/TestingUtil.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -14,6 +14,7 @@
 import org.horizon.commands.CommandsFactory;
 import org.horizon.commands.VisitableCommand;
 import org.horizon.factories.ComponentRegistry;
+import org.horizon.factories.GlobalComponentRegistry;
 import org.horizon.interceptors.InterceptorChain;
 import org.horizon.interceptors.base.CommandInterceptor;
 import org.horizon.lock.LockManager;
@@ -462,6 +463,10 @@
       return (ComponentRegistry) extractField(cache, "componentRegistry");
    }
 
+   public static GlobalComponentRegistry extractGlobalComponentRegistry(CacheManager cacheManager) {
+      return (GlobalComponentRegistry) extractField(cacheManager, "globalComponentRegistry");
+   }
+
    public static LockManager extractLockManager(Cache cache) {
       return extractComponentRegistry(cache).getComponent(LockManager.class);
    }
@@ -576,4 +581,41 @@
    public static TransactionManager getTransactionManager(Cache cache) {
       return cache == null ? null : extractComponent(cache, TransactionManager.class);
    }
+
+   /**
+    * Replaces a component in a running cache
+    *
+    * @param cache                cache in which to replace component
+    * @param componentType        component type of which to replace
+    * @param replacementComponent new instance
+    * @param rewire               if true, ComponentRegistry.rewire() is called after replacing.
+    * @return the original component that was replaced
+    */
+   public static <T> T replaceComponent(Cache<?, ?> cache, Class<T> componentType, T replacementComponent, boolean rewire) {
+      ComponentRegistry cr = extractComponentRegistry(cache);
+      T old = cr.getComponent(componentType);
+      cr.registerComponent(replacementComponent, componentType);
+      if (rewire) cr.rewire();
+      return old;
+   }
+
+   /**
+    * Replaces a component in a running cache manager (global component registry)
+    *
+    * @param cacheManager         cache in which to replace component
+    * @param componentType        component type of which to replace
+    * @param replacementComponent new instance
+    * @param rewire               if true, ComponentRegistry.rewire() is called after replacing.
+    * @return the original component that was replaced
+    */
+   public static <T> T replaceComponent(CacheManager cacheManager, Class<T> componentType, T replacementComponent, boolean rewire) {
+      GlobalComponentRegistry cr = extractGlobalComponentRegistry(cacheManager);
+      T old = cr.getComponent(componentType);
+      cr.registerComponent(replacementComponent, componentType);
+      if (rewire) {
+         cr.rewire();
+         cr.rewireNamedRegistries();
+      }
+      return old;
+   }
 }

Added: core/branches/flat/src/test/java/org/horizon/notifications/AsyncNotificationTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/AsyncNotificationTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/AsyncNotificationTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,83 @@
+package org.horizon.notifications;
+
+import org.horizon.Cache;
+import org.horizon.manager.CacheManager;
+import org.horizon.manager.DefaultCacheManager;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryCreated;
+import org.horizon.notifications.cachelistener.event.CacheEntryCreatedEvent;
+import org.horizon.util.TestingUtil;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.concurrent.CountDownLatch;
+
+ at Test(groups = "functional", sequential = true)
+public class AsyncNotificationTest {
+   Cache<String, String> c;
+   CacheManager cm;
+
+   @BeforeMethod
+   public void setUp() {
+      cm = new DefaultCacheManager();
+      c = cm.getCache();
+   }
+
+   @AfterMethod
+   public void tearDown() {
+      TestingUtil.killCacheManagers(cm);
+   }
+
+   public void testAsyncNotification() throws InterruptedException {
+
+      CountDownLatch latch = new CountDownLatch(2);
+      AbstractListener syncListener = new SyncListener(latch);
+      AbstractListener asyncListener = new AsyncListener(latch);
+      c.addListener(syncListener);
+      c.addListener(asyncListener);
+      c.put("k", "v");
+      latch.await();
+      assert syncListener.caller == Thread.currentThread();
+      assert asyncListener.caller != Thread.currentThread();
+   }
+
+   public abstract static class AbstractListener {
+      Thread caller;
+      CountDownLatch latch;
+
+      protected AbstractListener(CountDownLatch latch) {
+         this.latch = latch;
+      }
+   }
+
+   @Listener(sync = true)
+   public static class SyncListener extends AbstractListener {
+      public SyncListener(CountDownLatch latch) {
+         super(latch);
+      }
+
+      @CacheEntryCreated
+      public void handle(CacheEntryCreatedEvent e) {
+         if (e.isPre()) {
+            caller = Thread.currentThread();
+            latch.countDown();
+         }
+      }
+   }
+
+   @Listener(sync = false)
+   public static class AsyncListener extends AbstractListener {
+      public AsyncListener(CountDownLatch latch) {
+         super(latch);
+      }
+
+      @CacheEntryCreated
+      public void handle(CacheEntryCreatedEvent e) {
+         if (e.isPre()) {
+            caller = Thread.currentThread();
+            latch.countDown();
+         }
+      }
+   }
+
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerCacheLoaderTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerCacheLoaderTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerCacheLoaderTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,184 @@
+package org.horizon.notifications;
+
+import org.testng.annotations.Test;
+
+ at Test(groups = "functional", sequential = true)
+public class CacheListenerCacheLoaderTest {
+   // TODO implement me!
+//   private Cache<Object, Object> cache;
+//   private EventLog eventLog = new EventLog();
+//   private TransactionManager tm;
+//   private Fqn fqn = Fqn.fromString("/test");
+//
+//   @BeforeMethod(alwaysRun = true)
+//   public void setUp() throws Exception
+//   {
+//      Configuration c = new Configuration();
+//      c.setIsolationLevel(IsolationLevel.REPEATABLE_READ);
+//      c.setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+//
+//      CacheLoaderConfig clc = new CacheLoaderConfig();
+//      IndividualCacheLoaderConfig iclc = new IndividualCacheLoaderConfig();
+//      iclc.setClassName(DummyInMemoryCacheLoader.class.getName());
+//      clc.addIndividualCacheLoaderConfig(iclc);
+//      clc.setPassivation(true);
+//
+//      c.setCacheLoaderConfig(clc);
+//      cache = new UnitTestCacheFactory<Object, Object>().createCache(c, getClass());
+//      eventLog.events.clear();
+//      cache.addCacheListener(eventLog);
+//      tm = cache.getConfiguration().getRuntimeConfig().getTransactionManager();
+//   }
+//
+//   @AfterMethod(alwaysRun = true)
+//   public void tearDown() throws Exception
+//   {
+//      TestingUtil.killCaches(cache);
+//      cache = null;
+//   }
+//
+//   public void testActivationAndPassivation() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      cache.get(fqn, "DOES_NOT_EXIST");
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, null, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_VISITED));
+//
+//      assertEquals(expected, eventLog.events);
+//   }
+//
+//   public void testActivationAndPassivationTxNoMods() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.get(fqn, "DOES_NOT_EXIST");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//   }
+//
+//   public void testActivationAndPassivationTxMods() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.put(fqn, "key2", "value2");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, PUT_DATA, data, fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, PUT_DATA, Collections.singletonMap("key2", "value2"), fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//
+//      assert cache.get(fqn, "key").equals("value");
+//      assert cache.get(fqn, "key2").equals("value2");
+//   }
+//
+//   public void testActivationAndPassivationTxModsWithChildren() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      cache.put(Fqn.fromRelativeElements(fqn, "child"), "key3", "value3");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.put(fqn, "key2", "value2");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, PUT_DATA, data, fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, PUT_DATA, Collections.singletonMap("key2", "value2"), fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//
+//      assert cache.get(fqn, "key").equals("value");
+//      assert cache.get(fqn, "key2").equals("value2");
+//   }
+}
\ No newline at end of file

Added: core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerPassivationTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerPassivationTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerPassivationTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,184 @@
+package org.horizon.notifications;
+
+import org.testng.annotations.Test;
+
+ at Test(groups = "functional", sequential = true)
+public class CacheListenerPassivationTest {
+   // TODO implement me!
+//   private Cache<Object, Object> cache;
+//   private EventLog eventLog = new EventLog();
+//   private TransactionManager tm;
+//   private Fqn fqn = Fqn.fromString("/test");
+//
+//   @BeforeMethod(alwaysRun = true)
+//   public void setUp() throws Exception
+//   {
+//      Configuration c = new Configuration();
+//      c.setIsolationLevel(IsolationLevel.REPEATABLE_READ);
+//      c.setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+//
+//      CacheLoaderConfig clc = new CacheLoaderConfig();
+//      IndividualCacheLoaderConfig iclc = new IndividualCacheLoaderConfig();
+//      iclc.setClassName(DummyInMemoryCacheLoader.class.getName());
+//      clc.addIndividualCacheLoaderConfig(iclc);
+//      clc.setPassivation(true);
+//
+//      c.setCacheLoaderConfig(clc);
+//      cache = new UnitTestCacheFactory<Object, Object>().createCache(c, getClass());
+//      eventLog.events.clear();
+//      cache.addCacheListener(eventLog);
+//      tm = cache.getConfiguration().getRuntimeConfig().getTransactionManager();
+//   }
+//
+//   @AfterMethod(alwaysRun = true)
+//   public void tearDown() throws Exception
+//   {
+//      TestingUtil.killCaches(cache);
+//      cache = null;
+//   }
+//
+//   public void testActivationAndPassivation() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      cache.get(fqn, "DOES_NOT_EXIST");
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, null, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_VISITED));
+//
+//      assertEquals(expected, eventLog.events);
+//   }
+//
+//   public void testActivationAndPassivationTxNoMods() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.get(fqn, "DOES_NOT_EXIST");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_VISITED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//   }
+//
+//   public void testActivationAndPassivationTxMods() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.put(fqn, "key2", "value2");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, tx, true, null, false, null, NODE_CREATED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, PUT_DATA, data, fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, PUT_DATA, Collections.singletonMap("key2", "value2"), fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//
+//      assert cache.get(fqn, "key").equals("value");
+//      assert cache.get(fqn, "key2").equals("value2");
+//   }
+//
+//   public void testActivationAndPassivationTxModsWithChildren() throws Exception
+//   {
+//      assertEquals("Event log should be empty", Collections.emptyList(), eventLog.events);
+//      cache.put(fqn, "key", "value");
+//      cache.put(Fqn.fromRelativeElements(fqn, "child"), "key3", "value3");
+//      Map<Object, Object> data = new HashMap<Object, Object>();
+//      data.put("key", "value");
+//
+//      List<Event> expected = new ArrayList<Event>();
+//
+//      // now evict the node - which should cause a passivation
+//      eventLog.events.clear();
+//      cache.evict(fqn);
+//      expected.add(new EventImpl(true, cache, null, data, fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(false, cache, null, Collections.emptyMap(), fqn, null, true, null, false, null, NODE_PASSIVATED));
+//      expected.add(new EventImpl(true, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      expected.add(new EventImpl(false, cache, null, null, fqn, null, true, null, false, null, NODE_EVICTED));
+//      assertEquals(expected, eventLog.events);
+//
+//      // now load the node.
+//      expected.clear();
+//      eventLog.events.clear();
+//      tm.begin();
+//      Transaction tx = tm.getTransaction();
+//      cache.put(fqn, "key2", "value2");
+//      tm.commit();
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, false, null, TRANSACTION_REGISTERED));
+//      expected.add(new EventImpl(true, cache, null, Collections.emptyMap(), fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(false, cache, null, data, fqn, tx, true, null, false, null, NODE_ACTIVATED));
+//      expected.add(new EventImpl(true, cache, PUT_DATA, data, fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, PUT_DATA, Collections.singletonMap("key2", "value2"), fqn, tx, true, null, false, null, NODE_MODIFIED));
+//      expected.add(new EventImpl(false, cache, null, null, null, tx, true, null, true, null, TRANSACTION_COMPLETED));
+//      assertEquals(expected, eventLog.events);
+//
+//      assert cache.get(fqn, "key").equals("value");
+//      assert cache.get(fqn, "key2").equals("value2");
+//   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerRemovalTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerRemovalTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerRemovalTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,68 @@
+package org.horizon.notifications;
+
+import org.horizon.Cache;
+import org.horizon.manager.CacheManager;
+import org.horizon.manager.DefaultCacheManager;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryVisited;
+import org.horizon.notifications.cachelistener.event.Event;
+import org.horizon.util.TestingUtil;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author Manik Surtani
+ */
+ at Test(groups = "functional")
+public class CacheListenerRemovalTest {
+   Cache<String, String> cache;
+   CacheManager cm;
+
+   @BeforeMethod
+   public void setUp() {
+      cm = new DefaultCacheManager();
+      cache = cm.getCache();
+   }
+
+   @AfterMethod
+   public void tearDown() {
+      TestingUtil.killCacheManagers(cm);
+   }
+
+   public void testListenerRemoval() {
+      cache.put("x", "y");
+      AtomicInteger i = new AtomicInteger(0);
+      assert 0 == cache.getListeners().size();
+      CacheListener l = new CacheListener(i);
+      cache.addListener(l);
+      assert 1 == cache.getListeners().size();
+      assert cache.getListeners().iterator().next() == l;
+      assert 0 == i.get();
+      cache.get("x");
+      assert 1 == i.get();
+
+      // remove the listener
+      cache.removeListener(l);
+      assert 0 == cache.getListeners().size();
+      i.set(0);
+      assert 0 == i.get();
+      cache.get("x");
+      assert 0 == i.get();
+   }
+
+   @Listener
+   public static class CacheListener {
+      AtomicInteger i;
+
+      private CacheListener(AtomicInteger i) {
+         this.i = i;
+      }
+
+      @CacheEntryVisited
+      public void listen(Event e) {
+         if (e.isPre()) i.incrementAndGet();
+      }
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/CacheListenerTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,211 @@
+package org.horizon.notifications;
+
+import static org.easymock.EasyMock.*;
+import org.horizon.Cache;
+import org.horizon.config.Configuration;
+import org.horizon.context.InvocationContext;
+import org.horizon.lock.IsolationLevel;
+import org.horizon.manager.CacheManager;
+import org.horizon.manager.DefaultCacheManager;
+import org.horizon.notifications.cachelistener.CacheNotifier;
+import org.horizon.transaction.DummyTransactionManagerLookup;
+import org.horizon.util.TestingUtil;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+ at Test(groups = "functional", sequential = true)
+public class CacheListenerTest {
+   private Cache<Object, Object> cache;
+   private TransactionManager tm;
+   private CacheNotifier mockNotifier;
+   private CacheNotifier origNotifier;
+
+   @BeforeMethod(alwaysRun = true)
+   public void setUp() throws Exception {
+      Configuration c = new Configuration();
+      c.setCacheMode(Configuration.CacheMode.LOCAL);
+      c.setIsolationLevel(IsolationLevel.REPEATABLE_READ);
+      c.setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+
+      CacheManager cm = new DefaultCacheManager(c);
+
+      cache = cm.getCache();
+      tm = TestingUtil.getTransactionManager(cache);
+      mockNotifier = createMock(CacheNotifier.class);
+      origNotifier = TestingUtil.replaceComponent(cache, CacheNotifier.class, mockNotifier, true);
+   }
+
+   @AfterMethod(alwaysRun = true)
+   public void tearDown() throws Exception {
+      TestingUtil.replaceComponent(cache, CacheNotifier.class, origNotifier, true);
+      TestingUtil.killCaches(cache);
+   }
+
+   private void initCacheData(Object key, Object value) {
+      initCacheData(Collections.singletonMap(key, value));
+   }
+
+   private void initCacheData(Map data) {
+      mockNotifier.notifyCacheEntryCreated(anyObject(), anyBoolean(), isA(InvocationContext.class));
+      expectLastCall().anyTimes();
+      mockNotifier.notifyCacheEntryModified(anyObject(), anyObject(), anyBoolean(), isA(InvocationContext.class));
+      expectLastCall().anyTimes();
+      replay(mockNotifier);
+      cache.putAll(data);
+      verify(mockNotifier);
+
+      // now reset the mock
+      reset(mockNotifier);
+   }
+
+   private void expectSingleEntryCreated(Object key, Object value) {
+      mockNotifier.notifyCacheEntryCreated(eq(key), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryCreated(eq(key), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryModified(eq(key), isNull(), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryModified(eq(key), eq(value), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+   }
+
+   private void expectTransactionBoundaries(boolean successful) {
+      mockNotifier.notifyTransactionRegistered(isA(Transaction.class), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyTransactionCompleted(isA(Transaction.class), eq(successful), isA(InvocationContext.class));
+      expectLastCall().once();
+   }
+
+
+   // simple tests first
+
+   public void testCreation() throws Exception {
+      expectSingleEntryCreated("key", "value");
+      replay(mockNotifier);
+      cache.put("key", "value");
+      verify(mockNotifier);
+   }
+
+   public void testOnlyModification() throws Exception {
+      initCacheData("key", "value");
+
+      mockNotifier.notifyCacheEntryModified(eq("key"), eq("value"), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryModified(eq("key"), eq("value2"), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+
+      replay(mockNotifier);
+      cache.put("key", "value2");
+      verify(mockNotifier);
+   }
+
+   public void testNonexistentRemove() throws Exception {
+      cache.remove("doesNotExist");
+      replay(mockNotifier);
+      verify(mockNotifier);
+   }
+
+   public void testRemoveData() throws Exception {
+      Map data = new HashMap();
+      data.put("key", "value");
+      data.put("key2", "value2");
+      initCacheData(data);
+
+      mockNotifier.notifyCacheEntryRemoved(eq("key2"), eq("value2"), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryRemoved(eq("key2"), isNull(), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+      replay(mockNotifier);
+
+      cache.remove("key2");
+
+      verify(mockNotifier);
+   }
+
+   public void testPutMap() throws Exception {
+      Map<Object, Object> data = new HashMap<Object, Object>();
+      data.put("key", "value");
+      data.put("key2", "value2");
+      expectSingleEntryCreated("key", "value");
+      expectSingleEntryCreated("key2", "value2");
+
+      replay(mockNotifier);
+
+      cache.putAll(data);
+      verify(mockNotifier);
+   }
+
+   // -- now the transactional ones
+
+   public void testTxNonexistentRemove() throws Exception {
+      expectTransactionBoundaries(true);
+      replay(mockNotifier);
+      tm.begin();
+      cache.remove("doesNotExist");
+      tm.commit();
+      verify(mockNotifier);
+   }
+
+   public void testTxCreationCommit() throws Exception {
+      expectTransactionBoundaries(true);
+      expectSingleEntryCreated("key", "value");
+      replay(mockNotifier);
+      tm.begin();
+      cache.put("key", "value");
+      tm.commit();
+      verify(mockNotifier);
+   }
+
+   public void testTxCreationRollback() throws Exception {
+      expectTransactionBoundaries(false);
+      expectSingleEntryCreated("key", "value");
+      replay(mockNotifier);
+      tm.begin();
+      cache.put("key", "value");
+      tm.rollback();
+      verify(mockNotifier);
+   }
+
+   public void testTxOnlyModification() throws Exception {
+      initCacheData("key", "value");
+      expectTransactionBoundaries(true);
+      mockNotifier.notifyCacheEntryModified(eq("key"), eq("value"), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryModified(eq("key"), eq("value2"), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+
+      replay(mockNotifier);
+
+      tm.begin();
+      cache.put("key", "value2");
+      tm.commit();
+
+      verify(mockNotifier);
+   }
+
+   public void testTxRemoveData() throws Exception {
+      Map data = new HashMap();
+      data.put("key", "value");
+      data.put("key2", "value2");
+      initCacheData(data);
+      expectTransactionBoundaries(true);
+      mockNotifier.notifyCacheEntryRemoved(eq("key2"), eq("value2"), eq(true), isA(InvocationContext.class));
+      expectLastCall().once();
+      mockNotifier.notifyCacheEntryRemoved(eq("key2"), isNull(), eq(false), isA(InvocationContext.class));
+      expectLastCall().once();
+      replay(mockNotifier);
+
+      tm.begin();
+      cache.remove("key2");
+      tm.commit();
+
+      verify(mockNotifier);
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/CacheManagerNotifierTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/CacheManagerNotifierTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/CacheManagerNotifierTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,70 @@
+package org.horizon.notifications;
+
+import static org.easymock.EasyMock.*;
+import org.horizon.BaseClusteredTest;
+import org.horizon.Cache;
+import org.horizon.config.Configuration;
+import org.horizon.config.GlobalConfiguration;
+import org.horizon.manager.CacheManager;
+import org.horizon.notifications.cachemanagerlistener.CacheManagerNotifier;
+import org.horizon.remoting.transport.Address;
+import org.horizon.util.TestingUtil;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+ at Test(groups = "unit", sequential = true, testName = "notifications.CacheManagerNotifierTest")
+public class CacheManagerNotifierTest extends BaseClusteredTest {
+   public void testViewChange() {
+      CacheManager cm1 = addClusterEnabledCacheManager();
+      CacheManager cm2 = addClusterEnabledCacheManager();
+      Configuration c = new Configuration();
+      c.setCacheMode(Configuration.CacheMode.REPL_SYNC);
+      defineCacheOnAllManagers("cache", c);
+
+      Cache c1 = cm1.getCache("cache");
+
+      // this will mean only 1 cache in the cluster so far
+      assert cm1.getMembers().size() == 1;
+      Address myAddress = cm1.getAddress();
+      assert cm1.getMembers().contains(myAddress);
+
+      // now attach a mock notifier
+      CacheManagerNotifier mockNotifier = createMock(CacheManagerNotifier.class);
+      CacheManagerNotifier origNotifier = TestingUtil.replaceComponent(cm1, CacheManagerNotifier.class, mockNotifier, true);
+      try {
+         mockNotifier.notifyViewChange(isA(List.class), eq(myAddress));
+         replay(mockNotifier);
+         // start a second cache.
+         Cache c2 = cm2.getCache("cache");
+         TestingUtil.blockUntilViewsReceived(60000, cm1, cm2);
+         verify(mockNotifier);
+
+      } finally {
+         TestingUtil.replaceComponent(cm1, CacheManagerNotifier.class, origNotifier, true);
+      }
+   }
+
+   public void testCacheStartedAndStopped() {
+      CacheManager cm1 = addCacheManager(GlobalConfiguration.getNonClusteredDefault());
+      Cache defCache = cm1.getCache();
+      CacheManagerNotifier mockNotifier = createMock(CacheManagerNotifier.class);
+      CacheManagerNotifier origNotifier = TestingUtil.replaceComponent(cm1, CacheManagerNotifier.class, mockNotifier, true);
+      try {
+         cm1.defineCache("testCache", new Configuration());
+         mockNotifier.notifyCacheStarted("testCache");
+         replay(mockNotifier);
+         // start a second cache.
+         Cache testCache = cm1.getCache("testCache");
+         verify(mockNotifier);
+
+         reset(mockNotifier);
+         mockNotifier.notifyCacheStopped("testCache");
+         replay(mockNotifier);
+         testCache.stop();
+         verify(mockNotifier);
+      } finally {
+         TestingUtil.replaceComponent(cm1, CacheManagerNotifier.class, origNotifier, true);
+      }
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/ConcurrentNotificationTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/ConcurrentNotificationTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/ConcurrentNotificationTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,107 @@
+package org.horizon.notifications;
+
+import org.horizon.Cache;
+import org.horizon.manager.CacheManager;
+import org.horizon.manager.DefaultCacheManager;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryCreated;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryModified;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryVisited;
+import org.horizon.notifications.cachelistener.event.Event;
+import org.horizon.util.TestingUtil;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+
+ at Test(groups = {"functional"}, sequential = true, testName = "notifications.ConcurrentNotificationTest")
+public class ConcurrentNotificationTest {
+   Cache<String, String> cache;
+   CacheManager cm;
+   CacheListener listener;
+
+   @BeforeMethod
+   public void setUp() {
+      cm = new DefaultCacheManager();
+      cache = cm.getCache();
+      listener = new CacheListener();
+      cache.addListener(listener);
+   }
+
+   @AfterMethod
+   public void tearDown() {
+      TestingUtil.killCacheManagers(cm);
+   }
+
+   public void testThreads() throws Exception {
+      Thread workers[] = new Thread[20];
+      final List<Exception> exceptions = new LinkedList<Exception>();
+      final int loops = 100;
+      final CountDownLatch latch = new CountDownLatch(1);
+
+      for (int i = 0; i < workers.length; i++) {
+         workers[i] = new Thread() {
+            public void run() {
+               try {
+                  latch.await();
+               }
+               catch (InterruptedException e) {
+               }
+
+               for (int j = 0; j < loops; j++) {
+                  try {
+                     cache.put("key", "value");
+                  }
+                  catch (Exception e) {
+                     exceptions.add(new Exception("Caused on thread " + getName() + " in loop " + j + " when doing a put()", e));
+                  }
+
+                  try {
+                     cache.remove("key");
+                  }
+                  catch (Exception e) {
+                     exceptions.add(new Exception("Caused on thread " + getName() + " in loop " + j + " when doing a remove()", e));
+                  }
+
+                  try {
+                     cache.get("key");
+                  }
+                  catch (Exception e) {
+                     exceptions.add(new Exception("Caused on thread " + getName() + " in loop " + j + " when doing a get()", e));
+                  }
+               }
+            }
+         };
+
+         workers[i].start();
+      }
+
+      latch.countDown();
+
+      for (Thread t : workers)
+         t.join();
+
+      for (Exception e : exceptions)
+         throw e;
+
+      assert 4 * loops * workers.length == listener.counter.get();
+   }
+
+   @Listener
+   public class CacheListener {
+      private AtomicInteger counter = new AtomicInteger(0);
+
+      @CacheEntryModified
+      @CacheEntryRemoved
+      @CacheEntryVisited
+      @CacheEntryCreated
+      public void catchEvent(Event e) {
+         if (e.isPre())
+            counter.getAndIncrement();
+      }
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheListener.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheListener.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheListener.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,69 @@
+package org.horizon.notifications.cachelistener;
+
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.annotation.*;
+import org.horizon.notifications.cachelistener.event.Event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Listens to everything
+ *
+ * @author Manik Surtani
+ * @since 1.0
+ */
+ at Listener
+public class CacheListener {
+   List<Event> events = new ArrayList<Event>();
+   boolean receivedPre;
+   boolean receivedPost;
+   int invocationCount;
+
+   public void reset() {
+      events.clear();
+      receivedPost = false;
+      receivedPre = false;
+      invocationCount = 0;
+   }
+
+   public List<Event> getEvents() {
+      return events;
+   }
+
+   public boolean isReceivedPre() {
+      return receivedPre;
+   }
+
+   public boolean isReceivedPost() {
+      return receivedPost;
+   }
+
+   public int getInvocationCount() {
+      return invocationCount;
+   }
+
+
+   // handler
+
+   @CacheEntryActivated
+   @CacheEntryCreated
+   @CacheEntryEvicted
+   @CacheEntryInvalidated
+   @CacheEntryLoaded
+   @CacheEntryModified
+   @CacheEntryPassivated
+   @CacheEntryRemoved
+   @CacheEntryVisited
+   @TransactionCompleted
+   @TransactionRegistered
+   public void handle(Event e) {
+      events.add(e);
+      if (e.isPre())
+         receivedPre = true;
+      else
+         receivedPost = true;
+
+      invocationCount++;
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheNotifierImplTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheNotifierImplTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/CacheNotifierImplTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,209 @@
+package org.horizon.notifications.cachelistener;
+
+import org.easymock.EasyMock;
+import static org.easymock.EasyMock.createNiceMock;
+import org.horizon.CacheSPI;
+import org.horizon.context.InvocationContext;
+import org.horizon.context.InvocationContextImpl;
+import org.horizon.notifications.cachelistener.event.CacheEntryEvent;
+import org.horizon.notifications.cachelistener.event.CacheEntryModifiedEvent;
+import org.horizon.notifications.cachelistener.event.CacheEntryRemovedEvent;
+import org.horizon.notifications.cachelistener.event.Event;
+import org.horizon.notifications.cachelistener.event.TransactionCompletedEvent;
+import org.horizon.notifications.cachelistener.event.TransactionRegisteredEvent;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import javax.transaction.Transaction;
+
+ at Test(groups = "unit", sequential = true)
+public class CacheNotifierImplTest {
+   CacheNotifierImpl n;
+   CacheSPI mockCache;
+   CacheListener cl;
+   InvocationContext ctx;
+
+   @BeforeMethod
+   public void setUp() {
+      n = new CacheNotifierImpl();
+      mockCache = createNiceMock(CacheSPI.class);
+      EasyMock.expect(mockCache.getInvocationContext()).andReturn(new InvocationContextImpl()).anyTimes();
+      EasyMock.replay(mockCache);
+      n.injectDependencies(mockCache, null);
+      cl = new CacheListener();
+      n.start();
+      n.addListener(cl);
+      ctx = new InvocationContextImpl();
+   }
+
+   public void testNotifyCacheEntryCreated() {
+      n.notifyCacheEntryCreated("k", true, ctx);
+      n.notifyCacheEntryCreated("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_CREATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_CREATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyCacheEntryModified() {
+      n.notifyCacheEntryModified("k", "v1", true, ctx);
+      n.notifyCacheEntryModified("k", "v2", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_MODIFIED;
+      assert ((CacheEntryModifiedEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert ((CacheEntryModifiedEvent) cl.getEvents().get(0)).getValue().equals("v1");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_MODIFIED;
+      assert ((CacheEntryModifiedEvent) cl.getEvents().get(1)).getKey().equals("k");
+      assert ((CacheEntryModifiedEvent) cl.getEvents().get(1)).getValue().equals("v2");
+   }
+
+   public void testNotifyCacheEntryRemoved() {
+      n.notifyCacheEntryRemoved("k", "v", true, ctx);
+      n.notifyCacheEntryRemoved("k", null, false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_REMOVED;
+      assert ((CacheEntryRemovedEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert ((CacheEntryRemovedEvent) cl.getEvents().get(0)).getValue().equals("v");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_REMOVED;
+      assert ((CacheEntryRemovedEvent) cl.getEvents().get(1)).getKey().equals("k");
+      assert ((CacheEntryRemovedEvent) cl.getEvents().get(1)).getValue() == null;
+   }
+
+   public void testNotifyCacheEntryVisited() {
+      n.notifyCacheEntryVisited("k", true, ctx);
+      n.notifyCacheEntryVisited("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_VISITED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_VISITED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+
+   }
+
+   public void testNotifyCacheEntryEvicted() {
+      n.notifyCacheEntryEvicted("k", true, ctx);
+      n.notifyCacheEntryEvicted("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_EVICTED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_EVICTED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyCacheEntryInvalidated() {
+      n.notifyCacheEntryInvalidated("k", true, ctx);
+      n.notifyCacheEntryInvalidated("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_INVALIDATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_INVALIDATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyCacheEntryLoaded() {
+      n.notifyCacheEntryLoaded("k", true, ctx);
+      n.notifyCacheEntryLoaded("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_LOADED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_LOADED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyCacheEntryActivated() {
+      n.notifyCacheEntryActivated("k", true, ctx);
+      n.notifyCacheEntryActivated("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_ACTIVATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_ACTIVATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyCacheEntryPassivated() {
+      n.notifyCacheEntryPassivated("k", true, ctx);
+      n.notifyCacheEntryPassivated("k", false, ctx);
+
+      assert cl.isReceivedPost();
+      assert cl.isReceivedPre();
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.CACHE_ENTRY_PASSIVATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(0)).getKey().equals("k");
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.CACHE_ENTRY_PASSIVATED;
+      assert ((CacheEntryEvent) cl.getEvents().get(1)).getKey().equals("k");
+   }
+
+   public void testNotifyTransactionCompleted() {
+      Transaction tx = createNiceMock(Transaction.class);
+      n.notifyTransactionCompleted(tx, true, ctx);
+      n.notifyTransactionCompleted(tx, false, ctx);
+
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.TRANSACTION_COMPLETED;
+      assert ((TransactionCompletedEvent) cl.getEvents().get(0)).isTransactionSuccessful();
+      assert ((TransactionCompletedEvent) cl.getEvents().get(0)).getTransaction() == tx;
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.TRANSACTION_COMPLETED;
+      assert !((TransactionCompletedEvent) cl.getEvents().get(1)).isTransactionSuccessful();
+      assert ((TransactionCompletedEvent) cl.getEvents().get(1)).getTransaction() == tx;
+   }
+
+   public void testNotifyTransactionRegistered() {
+      InvocationContext ctx = new InvocationContextImpl();
+      Transaction tx = createNiceMock(Transaction.class);
+      n.notifyTransactionRegistered(tx, ctx);
+      n.notifyTransactionRegistered(tx, ctx);
+
+      assert cl.getInvocationCount() == 2;
+      assert cl.getEvents().get(0).getCache() == mockCache;
+      assert cl.getEvents().get(0).getType() == Event.Type.TRANSACTION_REGISTERED;
+      assert ((TransactionRegisteredEvent) cl.getEvents().get(0)).getTransaction() == tx;
+      assert cl.getEvents().get(1).getCache() == mockCache;
+      assert cl.getEvents().get(1).getType() == Event.Type.TRANSACTION_REGISTERED;
+      assert ((TransactionRegisteredEvent) cl.getEvents().get(1)).getTransaction() == tx;
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/ListenerRegistrationTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/ListenerRegistrationTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/cachelistener/ListenerRegistrationTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,283 @@
+package org.horizon.notifications.cachelistener;
+
+import org.horizon.notifications.IncorrectListenerException;
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryVisited;
+import org.horizon.notifications.cachelistener.event.CacheEntryRemovedEvent;
+import org.horizon.notifications.cachelistener.event.Event;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+ at Test(groups = "unit")
+public class ListenerRegistrationTest {
+   public void testControl() {
+      Object l = new TestControlListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+      assertEquals(1, n.getListeners().size());
+   }
+
+   public void testCacheListenerNoMethods() {
+      Object l = new TestCacheListenerNoMethodsListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+      assertEquals("Hello", l.toString());
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty()); // since the valid listener has no methods to listen
+   }
+
+   public void testNonAnnotatedListener() {
+      Object l = new TestNonAnnotatedListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept an un-annotated cache listener");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testNonPublicListener() {
+      Object l = new TestNonPublicListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a private callback class");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testNonPublicListenerMethod() {
+      Object l = new TestNonPublicListenerMethodListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+
+      // should not fail, should just not register anything
+
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testNonVoidReturnTypeMethod() {
+      Object l = new TestNonVoidReturnTypeMethodListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a listener method with a return type");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testIncorrectMethodSignature1() {
+      Object l = new TestIncorrectMethodSignature1Listener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a cache listener with a bad method signature");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testIncorrectMethodSignature2() {
+      Object l = new TestIncorrectMethodSignature2Listener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a cache listener with a bad method signature");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testIncorrectMethodSignature3() {
+      Object l = new TestIncorrectMethodSignature3Listener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a cache listener with a bad method signature");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testUnassignableMethodSignature() {
+      Object l = new TestUnassignableMethodSignatureListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a cache listener with a bad method signature");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+      assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
+   }
+
+   public void testPartlyUnassignableMethodSignature() {
+      Object l = new TestPartlyUnassignableMethodSignatureListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      try {
+         n.addListener(l);
+         fail("Should not accept a cache listener with a bad method signature");
+      }
+      catch (IncorrectListenerException icle) {
+         // expected
+      }
+   }
+
+   public void testMultipleMethods() {
+      Object l = new TestMultipleMethodsListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+      List invocations = n.cacheEntryVisitedListeners;
+      assertEquals(1, invocations.size());
+      invocations = n.cacheEntryRemovedListeners;
+      assertEquals(1, invocations.size());
+      assertEquals(1, n.getListeners().size());
+   }
+
+   public void testMultipleAnnotationsOneMethod() {
+      Object l = new TestMultipleAnnotationsOneMethodListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+      List invocations = n.cacheEntryVisitedListeners;
+      assertEquals(1, invocations.size());
+      invocations = n.cacheEntryRemovedListeners;
+      assertEquals(1, invocations.size());
+      assertEquals(1, n.getListeners().size());
+   }
+
+   public void testMultipleMethodsOneAnnotation() {
+      Object l = new TestMultipleMethodsOneAnnotationListener();
+      CacheNotifierImpl n = new CacheNotifierImpl();
+      n.addListener(l);
+      List invocations = n.cacheEntryVisitedListeners;
+      assertEquals(2, invocations.size());
+      assertEquals(1, n.getListeners().size());
+   }
+
+   @Listener
+   public class TestControlListener {
+      @CacheEntryVisited
+      @CacheEntryRemoved
+      public void callback(Event e) {
+      }
+   }
+
+   @Listener
+   public class TestCacheListenerNoMethodsListener {
+      public String toString() {
+         return "Hello";
+      }
+   }
+
+   public class TestNonAnnotatedListener {
+      public String toString() {
+         return "Hello";
+      }
+   }
+
+   @Listener
+   protected class TestNonPublicListener {
+      @CacheEntryVisited
+      public void callback() {
+      }
+   }
+
+   @Listener
+   public class TestNonPublicListenerMethodListener {
+      @CacheEntryVisited
+      protected void callback(Event e) {
+      }
+   }
+
+   @Listener
+   public class TestNonVoidReturnTypeMethodListener {
+      @CacheEntryVisited
+      public String callback(Event e) {
+         return "Hello";
+      }
+   }
+
+   @Listener
+   public class TestIncorrectMethodSignature1Listener {
+      @CacheEntryVisited
+      public void callback() {
+      }
+   }
+
+   @Listener
+   public class TestIncorrectMethodSignature2Listener {
+      @CacheEntryVisited
+      public void callback(Event e, String s) {
+      }
+   }
+
+   @Listener
+   public class TestIncorrectMethodSignature3Listener {
+      @CacheEntryVisited
+      public void callback(Event e, String... s) {
+      }
+   }
+
+   @Listener
+   public class TestUnassignableMethodSignatureListener {
+      @CacheEntryVisited
+      public void callback(CacheEntryRemovedEvent e) {
+      }
+   }
+
+   @Listener
+   public class TestPartlyUnassignableMethodSignatureListener {
+      @CacheEntryVisited
+      @CacheEntryRemoved
+      public void callback(CacheEntryRemovedEvent e) {
+      }
+   }
+
+   @Listener
+   public class TestMultipleMethodsListener {
+      @CacheEntryVisited
+      public void callback1(Event e) {
+      }
+
+      @CacheEntryRemoved
+      public void callback2(Event e) {
+      }
+   }
+
+   @Listener
+   public class TestMultipleAnnotationsOneMethodListener {
+      @CacheEntryRemoved
+      @CacheEntryVisited
+      public void callback(Event nme) {
+      }
+   }
+
+   @Listener
+   public class TestMultipleMethodsOneAnnotationListener {
+      @CacheEntryVisited
+      public void callback1(Event e) {
+      }
+
+      @CacheEntryVisited
+      public void callback2(Event e) {
+      }
+   }
+}

Added: core/branches/flat/src/test/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImplTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImplTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/horizon/notifications/cachemanagerlistener/CacheManagerNotifierImplTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -0,0 +1,8 @@
+package org.horizon.notifications.cachemanagerlistener;
+
+import org.testng.annotations.Test;
+
+ at Test(groups = "unit")
+public class CacheManagerNotifierImplTest {
+   // TODO implement me!
+}

Modified: core/branches/flat/src/test/java/org/horizon/replication/SyncCacheListenerTest.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/replication/SyncCacheListenerTest.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/test/java/org/horizon/replication/SyncCacheListenerTest.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -14,11 +14,11 @@
 import org.horizon.lock.IsolationLevel;
 import org.horizon.logging.Log;
 import org.horizon.logging.LogFactory;
-import org.horizon.notifications.annotation.CacheEntryModified;
-import org.horizon.notifications.annotation.CacheEntryRemoved;
-import org.horizon.notifications.annotation.Listener;
-import org.horizon.notifications.event.Event;
-import org.horizon.notifications.event.TransactionalEvent;
+import org.horizon.notifications.Listener;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryModified;
+import org.horizon.notifications.cachelistener.annotation.CacheEntryRemoved;
+import org.horizon.notifications.cachelistener.event.Event;
+import org.horizon.notifications.cachelistener.event.TransactionalEvent;
 import org.horizon.transaction.DummyTransactionManagerLookup;
 import org.horizon.util.TestingUtil;
 import static org.testng.AssertJUnit.*;

Deleted: core/branches/flat/src/test/java/org/horizon/util/internals/ViewChangeListener.java
===================================================================
--- core/branches/flat/src/test/java/org/horizon/util/internals/ViewChangeListener.java	2009-01-30 17:06:45 UTC (rev 7617)
+++ core/branches/flat/src/test/java/org/horizon/util/internals/ViewChangeListener.java	2009-01-31 00:32:22 UTC (rev 7618)
@@ -1,55 +0,0 @@
-package org.horizon.util.internals;
-
-import org.horizon.manager.CacheManager;
-import org.horizon.notifications.annotation.Listener;
-import org.horizon.notifications.annotation.ViewChanged;
-import org.horizon.notifications.event.ViewChangedEvent;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A class that registers a cache listener with a given cache, and waits for a view change on the cache.
- * <p/>
- * Sample usage:
- * <pre>
- *    Cache c = getCache();
- *    ViewChangeListener vcl = new ViewChangeListener(c);
- *    assert vcl.waitForViewChange(60, TimeUnit.SECONDS); // will block for up to 60 seconds for a view change on cache
- * c
- * </pre>
- *
- * @author (various)
- * @since 1.0
- */
- at Listener
-public class ViewChangeListener {
-   CountDownLatch latch;
-
-   /**
-    * Constructs a view change listener
-    *
-    * @param cache cache to listen on for view change events
-    */
-   public ViewChangeListener(CacheManager cacheManager) {
-      this.latch = new CountDownLatch(1);
-      cacheManager.addListener(this);
-   }
-
-   @ViewChanged
-   public void handleViewChange(ViewChangedEvent e) {
-      if (!e.isPre()) latch.countDown();
-   }
-
-   /**
-    * Waits for up to millis milliseconds for a view change to be received.
-    *
-    * @param timeout length of time to wait for a view change
-    * @param unit    time unit to use
-    * @return true if a view change is received, false otherwise.
-    * @throws InterruptedException
-    */
-   public boolean waitForViewChange(long timeout, TimeUnit unit) throws InterruptedException {
-      return latch.await(timeout, unit);
-   }
-}
\ No newline at end of file




More information about the jbosscache-commits mailing list