001: /*
002: * <copyright>
003: *
004: * Copyright 2000-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026: package org.cougaar.lib.web.arch.leaf;
027:
028: import java.util.List;
029:
030: import javax.servlet.Servlet;
031: import javax.servlet.ServletConfig;
032: import javax.servlet.ServletException;
033: import javax.servlet.SingleThreadModel;
034:
035: import org.cougaar.lib.web.arch.ServletRegistry;
036: import org.cougaar.lib.web.arch.util.PrefixTable;
037: import org.cougaar.lib.web.arch.util.PrefixTableImpl;
038: import org.cougaar.lib.web.arch.util.SynchronizedServlet;
039:
040: /**
041: * A registry for leaf servlet paths.
042: */
043: public class LeafServletRegistry implements ServletRegistry {
044:
045: /**
046: * Table of (String, Servlet).
047: */
048: private final PrefixTable table = new PrefixTableImpl();
049:
050: private ServletConfig config;
051:
052: /**
053: */
054: public LeafServletRegistry() {
055: }
056:
057: /**
058: * Get a Servlet with the matching name.
059: */
060: public Object get(String name) {
061: return table.match(name);
062: }
063:
064: /**
065: * Get the registered paths.
066: */
067: public List listNames() {
068: return table.list();
069: }
070:
071: public void init(ServletConfig config) {
072: this .config = config;
073: }
074:
075: public ServletConfig getServletConfig() {
076: return config;
077: }
078:
079: /**
080: * Register a (name, servlet) for future "get(name)" requests.
081: * <p>
082: * The name must be HTTP-safe -- see RFC 1945 for details.
083: * <p>
084: * If the same Servlet is registered multiple times, or
085: * multiple threads attempt the simultaneous register
086: * and unregister of a Servlet, then the order of
087: * "Servlet.init()" and "Servlet.destroy()" is not
088: * defined.
089: *
090: * @see #unregister(String)
091: */
092: public void register(String name, Servlet servlet) {
093: if ((name == null) || (servlet == null)) {
094: throw new NullPointerException();
095: }
096:
097: // wrap if SingleThreadModel
098: if (servlet instanceof SingleThreadModel) {
099: servlet = new SynchronizedServlet(servlet);
100: }
101:
102: // init with config
103: try {
104: servlet.init(config);
105: } catch (ServletException se) {
106: throw new RuntimeException("Unable to initialize servlet: "
107: + se.getMessage());
108: }
109:
110: // add
111: if (!table.add(name, servlet)) {
112: throw new IllegalArgumentException("Name \"" + name
113: + "\" is already in use by another Servlet");
114: }
115: }
116:
117: /**
118: * Unregister and "Servlet.destroy()" the Servlet with the
119: * matching name.
120: *
121: * @see #register
122: */
123: public boolean unregister(String name) {
124: Servlet servlet = (Servlet) table.remove(name);
125:
126: if (servlet == null) {
127: // no such name
128: return false;
129: }
130:
131: // un-init
132: try {
133: servlet.destroy();
134: } catch (RuntimeException re) {
135: // ignore
136: }
137:
138: return true;
139: }
140:
141: public void unregisterAll() {
142: List l = table.removeAll();
143:
144: for (int i = 0; i < l.size(); i++) {
145: Servlet servlet = (Servlet) l.get(i);
146: // un-init
147: try {
148: servlet.destroy();
149: } catch (RuntimeException re) {
150: // ignore
151: }
152: }
153: }
154: }
|