1 package net.sf.josceleton.core.impl.async;
2
3 import net.sf.josceleton.core.api.async.Listener;
4
5
6
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
14 private boolean yetClosed = false;
15
16
17
18 @Override public final void addListener(final L listener) {
19 this.asyncDelegator.addListener(listener);
20 }
21
22
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
32 @Override public final void close() {
33
34 this.validateNotYetClosed();
35 this.prepareToClose();
36 this.yetClosed = true;
37 }
38
39
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
62 @Override protected final void beforeAddListener(final L listener) {
63 this.skeleton.validateNotYetClosed();
64 }
65
66
67 @Override protected final void beforeRemoveListener(final L listener) {
68 this.skeleton.validateNotYetClosed();
69 }
70 }
71 }