001: /*
002: License $Id: MetaServer.java,v 1.5 2005/03/15 20:09:44 hendriks73 Exp $
003:
004: Copyright (c) 2001-2005 tagtraum industries.
005:
006: LGPL
007: ====
008:
009: jo! is free software; you can redistribute it and/or
010: modify it under the terms of the GNU Lesser General Public
011: License as published by the Free Software Foundation; either
012: version 2.1 of the License, or (at your option) any later version.
013:
014: jo! is distributed in the hope that it will be useful,
015: but WITHOUT ANY WARRANTY; without even the implied warranty of
016: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: Lesser General Public License for more details.
018:
019: You should have received a copy of the GNU Lesser General Public
020: License along with this library; if not, write to the Free Software
021: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022:
023: For LGPL see <http://www.fsf.org/copyleft/lesser.txt>
024:
025:
026: Sun license
027: ===========
028:
029: This release contains software by Sun Microsystems. Therefore
030: the following conditions have to be met, too. They apply to the
031: files
032:
033: - lib/mail.jar
034: - lib/activation.jar
035: - lib/jsse.jar
036: - lib/jcert.jar
037: - lib/jaxp.jar
038: - lib/crimson.jar
039: - lib/servlet.jar
040: - lib/jnet.jar
041: - lib/jaas.jar
042: - lib/jaasmod.jar
043:
044: contained in this release.
045:
046: a. Licensee may not modify the Java Platform
047: Interface (JPI, identified as classes contained within the javax
048: package or any subpackages of the javax package), by creating additional
049: classes within the JPI or otherwise causing the addition to or modification
050: of the classes in the JPI. In the event that Licensee creates any
051: Java-related API and distribute such API to others for applet or
052: application development, you must promptly publish broadly, an accurate
053: specification for such API for free use by all developers of Java-based
054: software.
055:
056: b. Software is confidential copyrighted information of Sun and
057: title to all copies is retained by Sun and/or its licensors. Licensee
058: shall not modify, decompile, disassemble, decrypt, extract, or otherwise
059: reverse engineer Software. Software may not be leased, assigned, or
060: sublicensed, in whole or in part. Software is not designed or intended
061: for use in on-line control of aircraft, air traffic, aircraft navigation
062: or aircraft communications; or in the design, construction, operation or
063: maintenance of any nuclear facility. Licensee warrants that it will not
064: use or redistribute the Software for such purposes.
065:
066: c. Software is provided "AS IS," without a warranty
067: of any kind. ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES,
068: INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
069: PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
070:
071: d. This License is effective until terminated. Licensee may
072: terminate this License at any time by destroying all copies of Software.
073: This License will terminate immediately without notice from Sun if Licensee
074: fails to comply with any provision of this License. Upon such termination,
075: Licensee must destroy all copies of Software.
076:
077: e. Software, including technical data, is subject to U.S.
078: export control laws, including the U.S. Export Administration Act and its
079: associated regulations, and may be subject to export or import regulations
080: in other countries. Licensee agrees to comply strictly with all such
081: regulations and acknowledges that it has the responsibility to obtain
082: licenses to export, re-export, or import Software. Software may not be
083: downloaded, or otherwise exported or re-exported (i) into, or to a national
084: or resident of, Cuba, Iraq, Iran, North Korea, Libya, Sudan, Syria or any
085: country to which the U.S. has embargoed goods; or (ii) to anyone on the
086: U.S. Treasury Department's list of Specially Designated Nations or the U.S.
087: Commerce Department's Table of Denial Orders.
088:
089:
090: Feedback
091: ========
092:
093: We encourage your feedback and suggestions and want to use your feedback to
094: improve the Software. Send all such feedback to:
095: <feedback@tagtraum.com>
096:
097: For more information on tagtraum industries and jo!
098: please see <http://www.tagtraum.com/>.
099:
100:
101: */
102: package com.tagtraum.metaserver;
103:
104: import com.tagtraum.framework.server.I_BasicService;
105: import com.tagtraum.framework.server.ServerException;
106: import com.tagtraum.framework.server.Service;
107: import com.tagtraum.framework.util.BuildException;
108: import com.tagtraum.framework.util.I_Builder;
109:
110: import java.net.InetAddress;
111: import java.util.Enumeration;
112: import java.util.Hashtable;
113: import java.util.Vector;
114:
115: /**
116: * Realisiert einen sehr simplen Meta-Service f�r Services, die
117: * {@link I_BasicService} implementieren.
118: * Dieser Admin-Service ist <b>nicht sicher</b>. Er schützt
119: * nicht sicher gegen unbefugten Zugriff.<p>
120: * F�r den Betrieb des AdminServices sind zwei
121: * Konfigurationsdateien erforderlich. Zum einen ist dies die
122: * übliche <code>server.cfg</code>, die jedoch um den Parameter
123: * <code>VALID_ADDRESSES</code> erweitert ist. Eine typische
124: * <code>server.cfg</code> sieht etwa so aus:
125: * <xmp>
126: * {
127: * PORT = 9090
128: * BINDADDRESS = "localhost"
129: * BACKLOG = 50
130: * MAXHANDLERTHREADS = 1
131: * MINHANDLERTHREADS = 1
132: * HANDLERCLASSNAME = "com.tagtraum.framework.server.AdminHandler"
133: * VALID_ADDRESSES = ("localhost","127.0.0.1")
134: * MAJORVERSION = 0
135: * MINORVERSION = 1
136: * }
137: * </xmp>
138: * Darüber hinaus ist noch eine Datei <code>services.cfg</code>
139: * n�tig. In ihr wird definiert, welche Services vom AdminService
140: * aus gestartet werden k�nnen und ob sie automatisch gestartet
141: * werden. Eine <code>services.cfg</code>-Datei sieht folgendermaßen
142: * aus:
143: * <xmp>
144: * {
145: * jo = {
146: * Class = "com.tagtraum.jo.JoServletService";
147: * AutoStart = true;
148: * }
149: * EchoService = {
150: * Class = "com.tagtraum.Examples.Server.EchoService";
151: * AutoStart = true;
152: * }
153: * }
154: * </xmp>
155: *
156: * @author Hendrik Schreiber
157: * @version 1.1beta1 $Id: MetaServer.java,v 1.5 2005/03/15 20:09:44 hendriks73 Exp $
158: * @see MetaClient
159: */
160: public class MetaServer extends Service {
161:
162: /**
163: * Source-Version
164: */
165: public static String vcid = "$Id: MetaServer.java,v 1.5 2005/03/15 20:09:44 hendriks73 Exp $";
166:
167: /**
168: * Liste mit "erlaubten" Adressen
169: */
170: protected Vector myValidAddresses = new Vector();
171:
172: /**
173: * Service-Hashtable
174: */
175: protected Hashtable myServices;
176:
177: /**
178: * Builder-Hashtable
179: */
180: protected Hashtable myBuilder;
181:
182: /**
183: * Constructor.
184: *
185: *
186: * @see
187: */
188: public MetaServer() {
189: super ();
190:
191: myServices = new Hashtable();
192: myBuilder = new Hashtable();
193: }
194:
195: /**
196: * �berpr�ft, ob ein Client mit einer bestimmten
197: * IP-Adresse das Recht hat den AdminService in Anspruch
198: * zu nehmen.
199: *
200: * @param aAddress Adresse des Clients
201: */
202: public boolean isValidAddress(InetAddress aAddress) {
203: return myValidAddresses.contains(aAddress);
204: }
205:
206: /**
207: * Adds an Inetaddress to the list of priviliged
208: * addresses.
209: *
210: * @param aAddress priviliges address
211: */
212: public void addValidAddress(InetAddress aAddress) {
213: myValidAddresses.add(aAddress);
214: }
215:
216: /**
217: * Method.
218: *
219: *
220: * @param aName
221: *
222: * @see
223: */
224: public void setName(String aName) {
225: myServices.remove(aName);
226: super .setName(aName);
227: myServices.put(aName, this );
228: }
229:
230: /**
231: * Stoppt zunächst alle vom AdminSevices verwalteten Services und
232: * dann den AdminService.
233: *
234: * @exception ServerException falls beim Stoppen etwas schiefgeht.
235: */
236: public synchronized void stop() throws ServerException {
237: stopAllServices();
238: super .stop();
239: }
240:
241: /**
242: * Startet den angegebenen Service.
243: *
244: * @param name Name des zu startenden Services
245: * @exception ServerException falls beim Starten etwas schiefgeht.
246: */
247: public synchronized void startService(String name)
248: throws ServerException, BuildException {
249: I_BasicService aService = (I_BasicService) myServices.get(name);
250:
251: if (aService != null) {
252: throw new ServerException("Service " + name
253: + " is already running.");
254: } else {
255: I_Builder theBuilder = (I_Builder) myBuilder.get(name);
256:
257: if (theBuilder == null) {
258: throw new ServerException("Service " + name
259: + " does not exist.");
260: }
261:
262: I_BasicService theService = (I_BasicService) theBuilder
263: .build();
264:
265: theService.start();
266: myServices.put(theBuilder.getName(), theService);
267: }
268: }
269:
270: /**
271: * Stoppt einen Service.
272: *
273: * @param name Name des zu stoppenden Services
274: * @exception ServerException falls beim Stoppen etwas schiefgeht.
275: */
276: public synchronized void stopService(String name)
277: throws ServerException {
278: I_BasicService aService = (I_BasicService) myServices.get(name);
279:
280: if (aService != null) {
281: if (!aService.isAlive()) {
282: throw new ServerException("Service " + name
283: + " is not running.");
284: }
285:
286: aService.stop();
287: myServices.remove(name);
288: } else {
289: throw new ServerException("Service " + name
290: + " does not exist.");
291: }
292: }
293:
294: /**
295: * Stoppt alle Services.
296: *
297: * @exception ServerException falls beim Stoppen etwas schiefgeht.
298: */
299: protected void stopAllServices() throws ServerException {
300: Enumeration e = myServices.elements();
301:
302: while (e.hasMoreElements()) {
303: I_BasicService aService = (I_BasicService) e.nextElement();
304:
305: if (aService != this && aService.isAlive()) {
306: aService.stop();
307: }
308: }
309:
310: myServices.clear();
311: }
312:
313: /**
314: * Method.
315: *
316: *
317: * @param aBuilder
318: *
319: * @see
320: */
321: public synchronized void addBuilder(I_Builder aBuilder) {
322: myBuilder.put(aBuilder.getName(), aBuilder);
323: }
324:
325: /**
326: * Method.
327: *
328: *
329: * @param aName
330: *
331: * @see
332: */
333: public synchronized void removeBuilder(String aName) {
334: myBuilder.remove(aName);
335: }
336:
337: }
|