1 /***
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions are
4 * met :
5 *
6 * . Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 *
9 * . Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * . The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id: Peer.java,v 1.1 2005/09/04 20:56:28 mat007 Exp $
29 */
30
31 package jtge.engine.net;
32
33 import jtge.engine.command.ICommand;
34 import jtge.engine.handler.IConsumer;
35 import jtge.engine.handler.Subject;
36 import jtge.engine.io.ChannelManager;
37 import jtge.engine.io.IChannelObserver;
38 import jtge.engine.io.IStatusObserver;
39 import jtge.engine.io.InputStarter;
40 import jtge.engine.io.OutputRegistrer;
41 import jtge.engine.io.SessionManager;
42
43 /***
44 * Captures client and server common behaviours.
45 *
46 * @author Mathieu Champlon
47 * @version $Revision: 1.1 $ $Date: 2005/09/04 20:56:28 $
48 */
49 public class Peer implements IClosable, IConsumer
50 {
51 private final SessionManager manager;
52 private final Subject subject;
53 private final ChannelManager channelManager;
54 private final IClosable peer;
55
56 /***
57 * Create an abstract peer.
58 *
59 * @param factory the peer factory
60 */
61 public Peer( final IPeerFactory factory )
62 {
63 manager = new SessionManager();
64 subject = new Subject();
65 peer = factory.create( manager );
66 channelManager = new ChannelManager();
67 manager.register( new OutputRegistrer( subject ) );
68 manager.register( new InputStarter() );
69 manager.register( channelManager );
70 }
71
72 /***
73 * Hook a consumer to receive commands sent to the peer.
74 *
75 * @param consumer the consumer
76 */
77 public final void register( final IConsumer consumer )
78 {
79 subject.register( consumer );
80 }
81
82 /***
83 * Register a channel observer.
84 *
85 * @param observer the observer
86 */
87 public final void register( final IChannelObserver observer )
88 {
89 channelManager.register( observer );
90 }
91
92 /***
93 * Register a status observer.
94 *
95 * @param observer the observer
96 */
97 public final void register( final IStatusObserver observer )
98 {
99 channelManager.register( observer );
100 }
101
102 /***
103 * {@inheritDoc}
104 */
105 public final void close()
106 {
107 manager.close();
108 peer.close();
109 onClose();
110 }
111
112 /***
113 * Perform custom close.
114 */
115 protected void onClose()
116 {
117 }
118
119 /***
120 * {@inheritDoc}
121 */
122 public final void handle( final ICommand command )
123 {
124 subject.handle( command );
125 }
126 }