1 /***
2 * Copyright (c) 2003 held jointly by the individual authors.
3 *
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published
6 * by the Free Software Foundation; either version 2.1 of the License, or
7 * (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; with out even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * > http://www.gnu.org/copyleft/lesser.html
19 * > http://www.opensource.org/licenses/lgpl-license.php
20 */
21 package net.mlw.gfw.client;
22
23 import java.awt.BorderLayout;
24 import java.awt.Component;
25 import java.io.IOException;
26 import java.util.logging.Logger;
27
28 import javax.swing.JFrame;
29 import javax.swing.JPanel;
30
31 import net.mlw.gfw.Constants;
32 import net.mlw.gfw.event.EventHandlerTypeDelegator;
33 import net.mlw.gfw.event.impl.ConnectEvent;
34 import net.mlw.gfw.event.impl.DisconnectEvent;
35 import net.mlw.gfw.ext.basic.client.component.ChatPanel;
36 import net.mlw.gfw.ext.basic.client.component.PlayerListPanel;
37 import net.mlw.gfw.ext.basic.client.component.ServerOptionsPanel;
38 import net.mlw.gfw.ext.basic.event.ChatEvent;
39 import net.mlw.gfw.server.Server;
40 import net.mlw.gfw.server.impl.AsynchronousServerDecorator;
41 import net.mlw.gfw.server.impl.DefaultServer;
42 import net.mlw.gfw.server.impl.RemoteServer;
43 import net.mlw.gfw.server.impl.ServerEventHandlerTypeDelegator;
44 import net.mlw.gfw.server.impl.ServerSocketDecorator;
45 import net.mlw.gfw.server.impl.SimpleBroadcastConsumer;
46
47 /***
48 * @author Matthew L. Wilson
49 * @version $Revision: 1.13 $ $Date: 2004/07/01 14:31:41 $
50 */
51 public final class ClientUtils
52 {
53
54 private static Logger LOGGER = Logger.getLogger(ClientUtils.class.getName());
55
56 public static void getDefaultFrameImpl(Component mainComponent, EventHandlerTypeDelegator clientEventHandler)
57 {
58 getDefaultFrameImpl(mainComponent, clientEventHandler, null);
59 }
60
61 public static void getDefaultFrameImpl(
62 Component mainComponent,
63 EventHandlerTypeDelegator clientEventHandler,
64 ServerEventHandlerTypeDelegator serverEventHandler)
65 {
66 Server server = null;
67 JFrame frame = new JFrame();
68
69 final ServerOptionsPanel options = ServerOptionsPanel.prompt(frame);
70
71 SimpleBroadcastConsumer sbc = new SimpleBroadcastConsumer();
72
73 switch (options.getMode())
74 {
75 case Constants.SERVER_NONE :
76 LOGGER.info("starting a local server.");
77
78 DefaultServer nserver = new DefaultServer(serverEventHandler);
79 nserver.addEventHandler(ConnectEvent.class, sbc);
80 nserver.addEventHandler(DisconnectEvent.class, sbc);
81 nserver.addEventHandler(ChatEvent.class, sbc);
82 server = nserver;
83
84 break;
85
86 case Constants.SERVER_LOCAL :
87 LOGGER.info("starting a local server, with a listening port.");
88 DefaultServer lserver = new DefaultServer(serverEventHandler);
89 lserver.addEventHandler(ConnectEvent.class, sbc);
90 lserver.addEventHandler(DisconnectEvent.class, sbc);
91 lserver.addEventHandler(ChatEvent.class, sbc);
92 server = lserver;
93
94 final ServerSocketDecorator socket = new ServerSocketDecorator(server);
95 socket.setPort(options.getPort());
96 Thread lthread = new Thread(new Runnable()
97 {
98
99 public void run()
100 {
101 try
102 {
103 socket.accept();
104 }
105 catch (IOException e)
106 {
107 e.printStackTrace();
108 }
109 }
110 });
111 lthread.setDaemon(true);
112 lthread.start();
113 break;
114
115 case Constants.SERVER_REMOTE :
116 LOGGER.info("Connecting to a remote server.");
117 try
118 {
119 final RemoteServer remote = new RemoteServer();
120 remote.setPort(options.getPort());
121 remote.setHost(options.getHost());
122 Thread clientThread = new Thread(new Runnable()
123 {
124
125 public void run()
126 {
127 try
128 {
129 remote.listen();
130 }
131 catch (Exception e)
132 {
133 e.printStackTrace();
134 }
135 }
136 });
137 clientThread.setDaemon(true);
138 clientThread.start();
139 while (!remote.isListening())
140 {
141 Thread.sleep(100);
142 }
143 server = remote;
144 }
145 catch (Exception e)
146 {
147 e.printStackTrace();
148 }
149 break;
150 }
151
152 ClientContext clientContext = new ClientContext(options.getUserName());
153
154 ChatPanel chatPanel = new ChatPanel();
155 chatPanel.init(clientContext);
156
157 JPanel topPanel = new JPanel(new BorderLayout());
158 PlayerListPanel playerList = new PlayerListPanel();
159 playerList.init(clientContext);
160 topPanel.add(mainComponent, BorderLayout.CENTER);
161
162 JPanel southPanel = new JPanel(new BorderLayout());
163 southPanel.add(playerList, BorderLayout.EAST);
164 southPanel.add(chatPanel, BorderLayout.CENTER);
165
166 chatPanel.addEventHandler(server);
167 if (mainComponent instanceof ClientEventHandler)
168 {
169 ((ClientEventHandler) mainComponent).init(clientContext);
170 ((ClientEventHandler) mainComponent).addEventHandler(server);
171 }
172
173 frame.getContentPane().add(topPanel, BorderLayout.CENTER);
174 frame.getContentPane().add(southPanel, BorderLayout.SOUTH);
175
176 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
177 frame.pack();
178 frame.setVisible(true);
179
180 clientEventHandler.addEventHandler(ConnectEvent.class, playerList);
181 clientEventHandler.addEventHandler(DisconnectEvent.class, playerList);
182 clientEventHandler.addEventHandler(ChatEvent.class, chatPanel);
183
184 server.addClient(clientContext.getUserName(), clientEventHandler);
185 }
186
187 public static Server startServer(final ServerOptionsPanel options, Class server) throws InstantiationException, IllegalAccessException
188 {
189 switch (options.getMode())
190 {
191 case Constants.SERVER_LOCAL :
192 LOGGER.info("Starting a local server, with a listening port.");
193 final ServerSocketDecorator socketDecorator = new ServerSocketDecorator((Server) server.newInstance());
194
195 socketDecorator.setPort(options.getPort());
196 Thread lthread = new Thread(new Runnable()
197 {
198
199 public void run()
200 {
201 try
202 {
203 socketDecorator.accept();
204 }
205 catch (IOException e)
206 {
207 e.printStackTrace();
208 }
209 }
210 });
211 lthread.setDaemon(true);
212 lthread.start();
213
214 //Commented out so that a local client stil connects through the port.
215 //return socketDecorator;
216
217 case Constants.SERVER_REMOTE :
218 LOGGER.info("Connecting to a remote server.");
219 RemoteServer remoteServer = new RemoteServer(options.getHost(), options.getPort());
220 remoteServer.spawnThreadAndlisten();
221 return remoteServer;
222
223 default :
224 LOGGER.info("Starting a local server: (" + server + ")");
225
226 Server serverImpl = (Server) server.newInstance();
227 AsynchronousServerDecorator asynchronousServer = new AsynchronousServerDecorator(serverImpl);
228 asynchronousServer.start();
229 return asynchronousServer;
230
231 }
232
233 }
234 }
This page was automatically generated by Maven