View Javadoc

1   package net.sf.josceleton.core.impl.async;
2   
3   import java.util.HashSet;
4   import java.util.Set;
5   
6   import net.sf.josceleton.core.api.async.Async;
7   import net.sf.josceleton.core.api.async.Listener;
8   
9   import org.apache.commons.logging.Log;
10  import org.apache.commons.logging.LogFactory;
11  
12  /**
13   * Can either be used as an super class (and extending from it) or by delegating to a private member instance. 
14   */
15  public class DefaultAsync<L extends Listener> implements Async<L> {
16  	
17  	private static final Log LOG = LogFactory.getLog(DefaultAsync.class);
18  	
19  	private final Set<L> registeredListeners = new HashSet<L>();
20  	
21  	
22  	protected final Iterable<L> getListeners() {
23  		return this.registeredListeners;
24  	}
25  
26  	/** {@inheritDoc} from {@link Async} */
27  	@Override public final void addListener(final L listener) {
28  		this.beforeAddListener(listener);
29  		
30  		final boolean wasChanged = this.registeredListeners.add(listener);
31  		if(wasChanged == false) {
32  			LOG.warn("Not added listener [" + listener + "] as it was yet added!");
33  		}
34  	}
35  
36  	/** {@inheritDoc} from {@link Async} */
37  	@Override public final void removeListener(final L listener) {
38  		this.beforeRemoveListener(listener);
39  		
40  		final boolean wasRemoved = this.registeredListeners.remove(listener);
41  		if(wasRemoved == false) {
42  			LOG.warn("Not removed listener [" + listener + "] as it was not yet added!");
43  		}
44  	}
45  
46  	/**
47  	 * Will be used to check if <code>Closeable</code> was not yet closed.
48  	 */
49  	protected void beforeAddListener(@SuppressWarnings("unused") final L listener) {
50  		// can be overridden
51  	}
52  
53  	/**
54  	 * Will be used to check if <code>Closeable</code> was not yet closed.
55  	 */
56  	protected void beforeRemoveListener(@SuppressWarnings("unused") final L listener) {
57  		// can be overridden
58  	}
59  }