View Javadoc

1   //----------------------------------------------------------------------
2   // 
3   // PerfectJPattern: "Design patterns are good but components are better!" 
4   // AsynchronousSubject.java Copyright (c) 2009 Giovanni Azua Garcia
5   // bravegag@hotmail.com
6   //  
7   // This program is free software; you can redistribute it and/or
8   // modify it under the terms of the GNU General Public License
9   // as published by the Free Software Foundation; either version 3
10  // of the License, or (at your option) any later version.
11  //
12  // This program is distributed in the hope that it will be useful,
13  // but WITHOUT ANY WARRANTY; without even the implied warranty of
14  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  // GNU General Public License for more details.
16  //
17  // You should have received a copy of the GNU General Public License
18  // along with this program; if not, see <http://www.gnu.org/licenses/>.
19  //
20  //----------------------------------------------------------------------
21  package org.perfectjpattern.core.behavioral.observer;
22  
23  import org.apache.commons.lang.*;
24  import org.perfectjpattern.core.api.behavioral.observer.*;
25  
26  
27  /**
28   * Implementation of <code>ISubject</code> that notifies Observer instances 
29   * from separate threads of execution.
30   * <br/>
31   * 
32   * @see Subject
33   * 
34   * @param <E> Type of event data this <code>ISubject</code> 
35   * notifies with.
36   * 
37   * @author <a href="mailto:bravegag@hotmail.com">Giovanni Azua</a>
38   * @version $Revision: 1.0 $ $Date: Nov 13, 2007 10:28:42 PM $
39   */
40  public 
41  class AsynchronousSubject<E>
42  extends Subject<E>
43  {
44      //------------------------------------------------------------------------
45      // public
46      //------------------------------------------------------------------------
47      /** 
48       * {@inheritDoc}
49       */
50      @SuppressWarnings("unchecked")
51      @Override
52      public void 
53      notifyObservers(final E anEventData)
54      {
55          Validate.notNull(anEventData, "'anEventData' must not be null");
56          
57          IObserver<E>[] myObservers = getObservers().toArray(EMPTY_ARRAY);
58          
59          for (final IObserver<E> myObserver : myObservers) 
60          {
61              new Thread(
62                  new Runnable()
63                  {
64                      //--------------------------------------------------------
65                      public void 
66                      run()
67                      {
68                          try 
69                          {
70                              myObserver.update(anEventData);
71                          } 
72                          // CHECKSTYLE:OFF
73                          catch (Throwable anException) 
74                          // CHECKSTYLE:ON
75                          {
76                              detach(myObserver);
77                          }
78                      }                    
79                  }
80              ).start();
81          }            
82      }    
83  }