001 /**
002 *
003 * Copyright 2003-2004 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.jetty;
019
020 import java.util.HashMap;
021 import java.util.Map;
022
023 import javax.management.j2ee.statistics.Stats;
024
025 import org.apache.geronimo.gbean.GBeanInfo;
026 import org.apache.geronimo.gbean.GBeanInfoBuilder;
027 import org.apache.geronimo.gbean.GBeanLifecycle;
028 import org.apache.geronimo.management.StatisticsProvider;
029 import org.apache.geronimo.management.geronimo.NetworkConnector;
030 import org.apache.geronimo.management.geronimo.WebManager;
031 import org.apache.geronimo.webservices.SoapHandler;
032 import org.apache.geronimo.webservices.WebServiceContainer;
033 import org.mortbay.http.HttpContext;
034 import org.mortbay.http.HttpListener;
035 import org.mortbay.http.RequestLog;
036 import org.mortbay.jetty.Server;
037
038 /**
039 * @version $Rev: 431706 $ $Date: 2006-08-15 14:19:27 -0700 (Tue, 15 Aug 2006) $
040 */
041 public class JettyContainerImpl implements JettyContainer, SoapHandler, GBeanLifecycle, StatisticsProvider {
042 private final Server server;
043 private final Map webServices = new HashMap();
044 private final String objectName;
045 private final WebManager manager;
046 private JettyWebContainerStatsImpl stats;
047 private final Map realms = new HashMap();
048
049 public JettyContainerImpl(String objectName, WebManager manager) {
050 this.objectName = objectName;
051 server = new JettyServer();
052 stats = new JettyWebContainerStatsImpl();
053 this.manager = manager;
054 }
055
056 public String getObjectName() {
057 return objectName;
058 }
059
060 public boolean isStateManageable() {
061 return true;
062 }
063
064 public boolean isStatisticsProvider() {
065 return true;
066 }
067
068 public boolean isEventProvider() {
069 return true;
070 }
071
072 public NetworkConnector[] getConnectors() {
073 return manager.getConnectorsForContainer(this);
074 }
075
076 public NetworkConnector[] getConnectors(String protocol) {
077 return manager.getConnectorsForContainer(this, protocol);
078 }
079
080 public void resetStatistics() {
081 server.statsReset();
082 }
083
084 public void setCollectStatistics(boolean on) {
085 server.setStatsOn(on);
086 stats.setStatsOn(on);
087 }
088
089 public boolean getCollectStatistics() {
090 return server.getStatsOn();
091 }
092
093 public long getCollectStatisticsStarted() {
094 return server.getStatsOnMs();
095 }
096
097 public Stats getStats() {
098 if (getCollectStatistics()) {
099
100 /* set active request count */
101 stats.getTotalRequestCountImpl().setCount(server.getRequests());
102
103 /* set total connection count */
104 stats.getTotalConnectionCountImpl().setCount(server.getConnections());
105
106 /* set total error count */
107 stats.getTotalErrorCountImpl().setCount(server.getErrors());
108
109 /* set active request range values */
110 stats.getActiveRequestCountImpl().setCurrent(server.getRequestsActive());
111 stats.getActiveRequestCountImpl().setLowWaterMark(server.getRequestsActiveMin());
112 stats.getActiveRequestCountImpl().setHighWaterMark(server.getRequestsActiveMax());
113
114 /* set connection requests range values */
115 // stats.getConnectionRequestCountImpl().setCurrent(server.getConnectionsRequestsCurrent()); // temporarily removed until added by jetty
116 stats.getConnectionRequestCountImpl().setCurrent(server.getConnectionsOpen());
117 stats.getConnectionRequestCountImpl().setLowWaterMark(server.getConnectionsRequestsMin());
118 stats.getConnectionRequestCountImpl().setHighWaterMark(server.getConnectionsRequestsMax());
119
120 /* set open connection range values */
121 stats.getOpenConnectionCountImpl().setCurrent(server.getConnectionsOpen());
122 stats.getOpenConnectionCountImpl().setLowWaterMark(server.getConnectionsOpenMin());
123 stats.getOpenConnectionCountImpl().setHighWaterMark(server.getConnectionsOpenMax());
124
125 /* set request duration time values */
126 stats.getRequestDurationImpl().setMinTime(server.getRequestsDurationMin());
127 stats.getRequestDurationImpl().setMaxTime(server.getRequestsDurationMax());
128 // stats.getRequestDurationImpl().setCount(server.getRequestsDurationCount()); // temporarily removed until added by jetty
129 stats.getRequestDurationImpl().setCount(stats.getTotalRequestCount().getCount());
130 stats.getRequestDurationImpl().setTotalTime(server.getRequestsDurationTotal());
131
132 /* set connection duration Time values */
133 stats.getConnectionDurationImpl().setMinTime(server.getConnectionsDurationMin());
134 stats.getConnectionDurationImpl().setMaxTime(server.getConnectionsDurationMax());
135 // stats.getConnectionDurationImpl().setCount(server.getConnectionsDurationCount()); // temporarily removed until added by jetty
136 stats.getConnectionDurationImpl().setCount(stats.getTotalConnectionCount().getCount());
137 stats.getConnectionDurationImpl().setTotalTime(server.getConnectionsDurationTotal());
138
139 } else {
140 // should probably set the stats object to all zero/null values to avoid unpredicable results
141 }
142 return stats;
143 }
144
145 public void addListener(HttpListener listener) {
146 server.addListener(listener);
147 }
148
149 public void removeListener(HttpListener listener) {
150 server.removeListener(listener);
151 }
152
153 public void addContext(HttpContext context) {
154 server.addContext(context);
155 }
156
157 public void removeContext(HttpContext context) {
158 server.removeContext(context);
159 }
160
161 public InternalJAASJettyRealm addRealm(String realmName) {
162 InternalJAASJettyRealm realm = (InternalJAASJettyRealm) realms.get(realmName);
163 if (realm == null) {
164 realm = new InternalJAASJettyRealm(realmName);
165 realms.put(realmName, realm);
166 } else {
167 realm.addUse();
168 }
169 return realm;
170 }
171
172 public void removeRealm(String realmName) {
173 InternalJAASJettyRealm realm = (InternalJAASJettyRealm) realms.get(realmName);
174 if (realm != null) {
175 if (realm.removeUse() == 0){
176 realms.remove(realmName);
177 }
178 }
179 }
180
181 public void addWebService(String contextPath, String[] virtualHosts, WebServiceContainer webServiceContainer, String securityRealmName, String realmName, String transportGuarantee, String authMethod, ClassLoader classLoader) throws Exception {
182 InternalJAASJettyRealm internalJAASJettyRealm = securityRealmName == null? null:addRealm(securityRealmName);
183 JettyEJBWebServiceContext webServiceContext = new JettyEJBWebServiceContext(contextPath, webServiceContainer, internalJAASJettyRealm, realmName, transportGuarantee, authMethod, classLoader);
184 webServiceContext.setHosts(virtualHosts);
185 addContext(webServiceContext);
186 webServiceContext.start();
187 webServices.put(contextPath, webServiceContext);
188 }
189
190 public void removeWebService(String contextPath) {
191 JettyEJBWebServiceContext webServiceContext = (JettyEJBWebServiceContext) webServices.remove(contextPath);
192 String securityRealmName = webServiceContext.getSecurityRealmName();
193 if (securityRealmName != null) {
194 removeRealm(securityRealmName);
195 }
196 removeContext(webServiceContext);
197 }
198
199 public void setRequestLog(RequestLog log) {
200 server.setRequestLog(log);
201 }
202
203 /* ------------------------------------------------------------ */
204 public RequestLog getRequestLog() {
205 return server.getRequestLog();
206 }
207
208 public void doStart() throws Exception {
209 server.start();
210 }
211
212 public void doStop() {
213 try {
214 server.stop(true);
215 } catch (InterruptedException e) {
216 }
217 }
218
219 public void doFail() {
220 try {
221 server.stop(false);
222 } catch (InterruptedException e) {
223 // continue
224 }
225 }
226
227 public static final GBeanInfo GBEAN_INFO;
228
229 static {
230 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic("Jetty Web Container", JettyContainerImpl.class);
231 infoBuilder.addAttribute("collectStatistics", Boolean.TYPE, true);
232 infoBuilder.addAttribute("collectStatisticsStarted", Long.TYPE, false);
233 infoBuilder.addOperation("resetStatistics");
234
235 infoBuilder.addAttribute("requestLog", RequestLog.class, false, false);
236
237 infoBuilder.addOperation("addListener", new Class[]{HttpListener.class});
238 infoBuilder.addOperation("removeListener", new Class[]{HttpListener.class});
239 infoBuilder.addOperation("addContext", new Class[]{HttpContext.class});
240 infoBuilder.addOperation("removeContext", new Class[]{HttpContext.class});
241 infoBuilder.addOperation("addRealm", new Class[]{String.class});
242 infoBuilder.addOperation("removeRealm", new Class[]{String.class});
243
244 infoBuilder.addAttribute("objectName", String.class, false);
245 infoBuilder.addReference("WebManager", WebManager.class);
246
247 infoBuilder.addInterface(SoapHandler.class);
248 infoBuilder.addInterface(JettyContainer.class);
249 infoBuilder.addInterface(StatisticsProvider.class);
250 infoBuilder.setConstructor(new String[]{"objectName", "WebManager"});
251
252 GBEAN_INFO = infoBuilder.getBeanInfo();
253 }
254
255 public static GBeanInfo getGBeanInfo() {
256 return GBEAN_INFO;
257 }
258
259 }