{{{
/*
 * JBoss, the OpenSource J2EE webOS
 * 
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package org.jboss.aop.patterns.observable;

import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.FieldInvocation;
import org.jboss.aop.joinpoint.Invocation;

/**
 * A Subject Interceptor. Traps changes to the object
 * and fires change notifications.
 * 
 * @author <a href="adrian@jboss.com">Adrian Brock</a>
 * @version $Revision: 22230 $
 */
public class SubjectInterceptor implements Interceptor
{
   public String getName()
   {
      return "Observerable";
   }

   public Object invoke(Invocation invocation) throws Throwable
   {
      FieldInvocation fi = (FieldInvocation) invocation;
      Object before = fi.field.get(fi.targetObject);
      Object result = invocation.invokeNext();
      Object after = fi.field.get(fi.targetObject);

      // If it changed fire notifications
      if (before == null && after != null || before.equals(after) == false)
      {
         Subject observable = (Subject) fi.targetObject;
         observable.notifyObservers();
      }
      return result;
   }
}
}}}
