View Javadoc

1   package net.sf.josceleton.core.impl.async;
2   
3   import net.sf.josceleton.core.api.async.Listener;
4   
5   /**
6    * Child should protect any non-private method with a pre-condtion by invoking validateNotYetClosed() as the first stmt!
7    */
8   public abstract class CloseableAndAsyncSkeleton<L extends Listener>
9   	implements CloseableAsync<L> {
10  
11  	private final DefaultAsync<L> asyncDelegator = new SkeletonAsyncDelegator<L>(this);
12  	
13  	/** state-full property */
14  	private boolean yetClosed = false;
15  
16  
17  	/** {@inheritDoc} from {@link Async} */
18  	@Override public final void addListener(final L listener) {
19  		this.asyncDelegator.addListener(listener);
20  	}
21  
22  	/** {@inheritDoc} from {@link Async} */
23  	@Override public final void removeListener(final L listener) {
24  		this.asyncDelegator.removeListener(listener);
25  	}
26  
27  	protected final Iterable<L> getListeners() {
28  		return this.asyncDelegator.getListeners();
29  	}
30  	
31  	/** {@inheritDoc} from {@link Closeable} */
32  	@Override public final void close() {
33  		// assert(yetClosed == false); AOP
34  		this.validateNotYetClosed();
35  		this.prepareToClose();
36  		this.yetClosed = true;
37  	}
38  	
39  	/** Template method which will be invoked at most one-time when {@link #close()} is invoked. */
40  	protected abstract void prepareToClose();
41  	
42  	protected final void validateNotYetClosed() {
43  		if(this.yetClosed == true) {
44  			throw new IllegalStateException("Connection already closed!");
45  		}
46  	}
47  	
48  	protected final boolean isYetClosed() {
49  		return this.yetClosed;
50  	}
51  	
52  
53  	private static class SkeletonAsyncDelegator<L extends Listener> extends DefaultAsync<L> {
54  		
55  		private final CloseableAndAsyncSkeleton<L> skeleton;
56  		
57  		SkeletonAsyncDelegator(final CloseableAndAsyncSkeleton<L> skeleton) {
58  			this.skeleton = skeleton;
59  		}
60  		
61  		/** {@inheritDoc} from {@link DefaultAsync} */
62  		@Override protected final void beforeAddListener(final L listener) {
63  			this.skeleton.validateNotYetClosed();
64  		}
65  
66  		/** {@inheritDoc} from {@link DefaultAsync} */
67  		@Override protected final void beforeRemoveListener(final L listener) {
68  			this.skeleton.validateNotYetClosed();
69  		}
70  	}
71  }