Skip to content

Commit e4a599d

Browse files
committed
Made the "transports" and "allowedTransports" options be handled by BayeuxServerImpl instead of CometDServlet.
1 parent d0c5a47 commit e4a599d

13 files changed

Lines changed: 143 additions & 149 deletions

File tree

cometd-archetypes/dojo-jetty9/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
<servlet>
1111
<servlet-name>cometd</servlet-name>
1212
<servlet-class>org.cometd.server.CometDServlet</servlet-class>
13-
<init-param>
14-
<param-name>transports</param-name>
15-
<param-value>org.cometd.websocket.server.JettyWebSocketTransport</param-value>
16-
</init-param>
1713
<load-on-startup>1</load-on-startup>
1814
</servlet>
1915
<servlet-mapping>

cometd-archetypes/jquery-jetty9/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
<servlet>
1111
<servlet-name>cometd</servlet-name>
1212
<servlet-class>org.cometd.server.CometDServlet</servlet-class>
13-
<init-param>
14-
<param-name>transports</param-name>
15-
<param-value>org.cometd.websocket.server.JettyWebSocketTransport</param-value>
16-
</init-param>
1713
<load-on-startup>1</load-on-startup>
1814
</servlet>
1915
<servlet-mapping>

cometd-demo/src/main/webapp/WEB-INF/web.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@
4747
<param-name>long-polling.multiSessionInterval</param-name>
4848
<param-value>2000</param-value>
4949
</init-param>
50-
<init-param>
51-
<param-name>transports</param-name>
52-
<param-value>org.cometd.websocket.server.JettyWebSocketTransport</param-value>
53-
</init-param>
5450
<init-param>
5551
<param-name>services</param-name>
5652
<param-value>org.cometd.examples.ChatService</param-value>

cometd-java/cometd-java-annotations/src/test/java/org/cometd/annotation/ClientAnnotationProcessorTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ public static void startServer() throws Exception
6565
connector.setIdleTimeout(30000);
6666
server.addConnector(connector);
6767

68-
String contextPath = "";
69-
ServletContextHandler context = new ServletContextHandler(server, contextPath);
68+
ServletContextHandler context = new ServletContextHandler(server, "/");
7069

7170
// CometD servlet
7271
ServletHolder cometdServletHolder = new ServletHolder(CometDServlet.class);
@@ -79,7 +78,7 @@ public static void startServer() throws Exception
7978

8079
server.start();
8180
int port = connector.getLocalPort();
82-
cometdURL = "http://localhost:" + port + contextPath + cometdServletPath;
81+
cometdURL = "http://localhost:" + port + cometdServletPath;
8382

8483
httpClient = new HttpClient();
8584
httpClient.start();

cometd-java/cometd-java-examples/src/main/java/org/cometd/examples/CometDDemo.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ public static void main(String[] args) throws Exception
9090
comet.setInitParameter("maxInterval", "10000");
9191
comet.setInitParameter("multiSessionInterval", "5000");
9292
comet.setInitParameter("services", "org.cometd.examples.ChatService");
93-
comet.setInitParameter("transports", "org.cometd.websocket.server.WebSocketTransport");
9493
comet.setInitOrder(2);
9594

9695
ServletHolder demo = context.addServlet(CometDDemoServlet.class, "/demo");

cometd-java/cometd-java-oort/src/test/java/org/cometd/oort/JMXTest.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,12 @@
3131
import org.cometd.bayeux.server.BayeuxServer;
3232
import org.cometd.server.BayeuxServerImpl;
3333
import org.cometd.server.CometDServlet;
34-
import org.cometd.websocket.server.JettyWebSocketTransport;
35-
import org.cometd.websocket.server.WebSocketTransport;
3634
import org.eclipse.jetty.jmx.MBeanContainer;
3735
import org.eclipse.jetty.server.Server;
3836
import org.eclipse.jetty.server.ServerConnector;
3937
import org.eclipse.jetty.servlet.ServletContextHandler;
4038
import org.eclipse.jetty.servlet.ServletHolder;
4139
import org.eclipse.jetty.websocket.jsr356.server.WebSocketConfiguration;
42-
import org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter;
4340
import org.junit.Assert;
4441
import org.junit.Test;
4542

@@ -56,10 +53,9 @@ public void testJMX() throws Exception
5653
MBeanContainer mbeanContainer = new MBeanContainer(mbeanServer);
5754
server.addBean(mbeanContainer);
5855

59-
String contextPath = "";
60-
ServletContextHandler context = new ServletContextHandler(server, contextPath);
56+
ServletContextHandler context = new ServletContextHandler(server, "/");
6157

62-
WebSocketUpgradeFilter.configureContext(context);
58+
WebSocketConfiguration.configureContext(context);
6359

6460
String value = BayeuxServerImpl.ATTRIBUTE + "," + Oort.OORT_ATTRIBUTE + "," + Seti.SETI_ATTRIBUTE;
6561
context.setInitParameter(ServletContextHandler.MANAGED_ATTRIBUTES, value);
@@ -69,13 +65,12 @@ public void testJMX() throws Exception
6965
String cometdURLMapping = cometdServletPath + "/*";
7066
ServletHolder cometdServletHolder = new ServletHolder(CometDServlet.class);
7167
cometdServletHolder.setInitParameter("timeout", "10000");
72-
cometdServletHolder.setInitParameter("transports", JettyWebSocketTransport.class.getName());
7368
cometdServletHolder.setInitParameter("ws.cometdURLMapping", cometdURLMapping);
7469
cometdServletHolder.setInitOrder(1);
7570
context.addServlet(cometdServletHolder, cometdURLMapping);
7671

7772
ServletHolder oortServletHolder = new ServletHolder(OortStaticConfigServlet.class);
78-
oortServletHolder.setInitParameter(OortConfigServlet.OORT_URL_PARAM, "http://localhost" + contextPath + cometdServletPath);
73+
oortServletHolder.setInitParameter(OortConfigServlet.OORT_URL_PARAM, "http://localhost" + cometdServletPath);
7974
oortServletHolder.setInitOrder(2);
8075
context.addServlet(oortServletHolder, "/oort");
8176

@@ -119,8 +114,7 @@ public void testPortableJMX() throws Exception
119114
ServerConnector connector = new ServerConnector(server);
120115
server.addConnector(connector);
121116

122-
String contextPath = "";
123-
ServletContextHandler context = new ServletContextHandler(server, contextPath);
117+
ServletContextHandler context = new ServletContextHandler(server, "/");
124118

125119
WebSocketConfiguration.configureContext(context);
126120

@@ -132,7 +126,6 @@ public void testPortableJMX() throws Exception
132126
String cometdURLMapping = cometdServletPath + "/*";
133127
ServletHolder cometdServletHolder = new ServletHolder(CometDServlet.class);
134128
cometdServletHolder.setInitParameter("timeout", "10000");
135-
cometdServletHolder.setInitParameter("transports", WebSocketTransport.class.getName());
136129
cometdServletHolder.setInitParameter("ws.cometdURLMapping", cometdURLMapping);
137130
cometdServletHolder.setInitOrder(1);
138131
context.addServlet(cometdServletHolder, cometdURLMapping);

cometd-java/cometd-java-oort/src/test/java/org/cometd/oort/OortDemo.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
import java.lang.management.ManagementFactory;
2020

2121
import org.cometd.server.CometDServlet;
22-
import org.cometd.server.transport.JSONPTransport;
23-
import org.cometd.server.transport.JSONTransport;
24-
import org.cometd.websocket.server.JettyWebSocketTransport;
2522
import org.eclipse.jetty.jmx.MBeanContainer;
2623
import org.eclipse.jetty.server.Server;
2724
import org.eclipse.jetty.server.ServerConnector;
@@ -83,8 +80,6 @@ public OortDemo(int port) throws Exception
8380
cometd_holder.setInitParameter("interval", "100");
8481
cometd_holder.setInitParameter("maxInterval", "100000");
8582
cometd_holder.setInitParameter("multiSessionInterval", "1500");
86-
cometd_holder.setInitParameter("transports", JettyWebSocketTransport.class.getName());
87-
cometd_holder.setInitParameter("allowedTransports", JettyWebSocketTransport.NAME + "," + JSONTransport.NAME + "," + JSONPTransport.NAME);
8883
cometd_holder.setInitOrder(1);
8984
context.addServlet(cometd_holder, "/cometd/*");
9085

cometd-java/cometd-java-oort/src/test/java/org/cometd/oort/OortTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.cometd.client.BayeuxClient;
3232
import org.cometd.client.transport.LongPollingTransport;
3333
import org.cometd.server.CometDServlet;
34+
import org.cometd.server.transport.JSONTransport;
3435
import org.cometd.websocket.server.JettyWebSocketTransport;
3536
import org.cometd.websocket.server.WebSocketTransport;
3637
import org.eclipse.jetty.client.HttpClient;
@@ -83,8 +84,7 @@ protected Server startServer(int port, Map<String, String> options) throws Excep
8384
connector.setPort(port);
8485
server.addConnector(connector);
8586

86-
String contextPath = "";
87-
ServletContextHandler context = new ServletContextHandler(server, contextPath, ServletContextHandler.SESSIONS);
87+
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
8888

8989
WebSocketConfiguration.configureContext(context);
9090

@@ -93,15 +93,16 @@ protected Server startServer(int port, Map<String, String> options) throws Excep
9393
String cometdURLMapping = cometdServletPath + "/*";
9494
ServletHolder cometdServletHolder = new ServletHolder(CometDServlet.class);
9595
cometdServletHolder.setInitParameter("timeout", "10000");
96-
cometdServletHolder.setInitParameter("transports", serverTransport);
96+
String transports = serverTransport + "," + JSONTransport.class.getName();
97+
cometdServletHolder.setInitParameter("transports", transports);
9798
cometdServletHolder.setInitParameter("ws.cometdURLMapping", cometdURLMapping);
9899
for (Map.Entry<String, String> entry : options.entrySet())
99100
cometdServletHolder.setInitParameter(entry.getKey(), entry.getValue());
100101
cometdServletHolder.setInitOrder(1);
101102
context.addServlet(cometdServletHolder, cometdURLMapping);
102103

103104
server.start();
104-
String url = "http://localhost:" + connector.getLocalPort() + contextPath + cometdServletPath;
105+
String url = "http://localhost:" + connector.getLocalPort() + cometdServletPath;
105106
server.setAttribute(OortConfigServlet.OORT_URL_PARAM, url);
106107
BayeuxServer bayeux = (BayeuxServer)context.getServletContext().getAttribute(BayeuxServer.ATTRIBUTE);
107108
server.setAttribute(BayeuxServer.ATTRIBUTE, bayeux);

cometd-java/cometd-java-server/src/main/java/org/cometd/server/BayeuxServerImpl.java

Lines changed: 111 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
package org.cometd.server;
1818

19+
import java.lang.reflect.Constructor;
1920
import java.security.SecureRandom;
2021
import java.util.ArrayList;
2122
import java.util.Arrays;
2223
import java.util.Collections;
2324
import java.util.HashSet;
25+
import java.util.LinkedHashMap;
2426
import java.util.List;
2527
import java.util.ListIterator;
2628
import java.util.Map;
@@ -30,6 +32,7 @@
3032
import java.util.concurrent.ConcurrentMap;
3133
import java.util.concurrent.CopyOnWriteArrayList;
3234
import java.util.concurrent.TimeUnit;
35+
import javax.servlet.http.HttpServletRequest;
3336

3437
import org.cometd.bayeux.Channel;
3538
import org.cometd.bayeux.ChannelId;
@@ -49,8 +52,9 @@
4952
import org.cometd.bayeux.server.ServerSession;
5053
import org.cometd.bayeux.server.ServerTransport;
5154
import org.cometd.common.JSONContext;
52-
import org.cometd.server.transport.AsyncJSONTransport;
55+
import org.cometd.server.transport.HttpTransport;
5356
import org.cometd.server.transport.JSONPTransport;
57+
import org.cometd.server.transport.JSONTransport;
5458
import org.eclipse.jetty.util.annotation.ManagedAttribute;
5559
import org.eclipse.jetty.util.annotation.ManagedObject;
5660
import org.eclipse.jetty.util.annotation.ManagedOperation;
@@ -64,49 +68,32 @@
6468
@ManagedObject("The CometD server")
6569
public class BayeuxServerImpl extends AbstractLifeCycle implements BayeuxServer
6670
{
71+
public static final String ALLOWED_TRANSPORTS_OPTION = "allowedTransports";
6772
public static final String SWEEP_PERIOD_OPTION = "sweepPeriod";
73+
public static final String TRANSPORTS_OPTION = "transports";
6874

6975
private final Logger _logger = LoggerFactory.getLogger(getClass().getName() + "." + Integer.toHexString(System.identityHashCode(this)));
7076
private final SecureRandom _random = new SecureRandom();
7177
private final List<BayeuxServerListener> _listeners = new CopyOnWriteArrayList<>();
7278
private final List<Extension> _extensions = new CopyOnWriteArrayList<>();
7379
private final ConcurrentMap<String, ServerSessionImpl> _sessions = new ConcurrentHashMap<>();
7480
private final ConcurrentMap<String, ServerChannelImpl> _channels = new ConcurrentHashMap<>();
75-
private final ConcurrentMap<String, ServerTransport> _transports = new ConcurrentHashMap<>();
76-
private final List<String> _allowedTransports = new CopyOnWriteArrayList<>();
81+
private final Map<String, ServerTransport> _transports = new LinkedHashMap<>(); // Order is important
82+
private final List<String> _allowedTransports = new ArrayList<>();
7783
private final ThreadLocal<AbstractServerTransport> _currentTransport = new ThreadLocal<>();
7884
private final Map<String, Object> _options = new TreeMap<>();
7985
private final Scheduler _scheduler = new ScheduledExecutorScheduler("BayeuxServer" + hashCode() + " Scheduler", false);
8086
private SecurityPolicy _policy = new DefaultSecurityPolicy();
8187
private JSONContext.Server _jsonContext;
8288

83-
public BayeuxServerImpl()
84-
{
85-
// TODO: consider making this module dependent on WebSocket and add the WS transport too ?
86-
addTransport(new AsyncJSONTransport(this));
87-
// addTransport(new JSONTransport(this));
88-
addTransport(new JSONPTransport(this));
89-
}
90-
9189
@Override
9290
protected void doStart() throws Exception
9391
{
9492
super.doStart();
9593

9694
initializeMetaChannels();
9795
initializeJSONContext();
98-
initializeAllowedTransports();
99-
100-
List<String> allowedTransportNames = getAllowedTransports();
101-
if (allowedTransportNames.isEmpty())
102-
throw new IllegalStateException("No allowed transport names are configured, there must be at least one");
103-
104-
for (String allowedTransportName : allowedTransportNames)
105-
{
106-
ServerTransport allowedTransport = getTransport(allowedTransportName);
107-
if (allowedTransport instanceof AbstractServerTransport)
108-
((AbstractServerTransport)allowedTransport).init();
109-
}
96+
initializeServerTransports();
11097

11198
_scheduler.start();
11299

@@ -186,14 +173,92 @@ else if (option instanceof JSONContext.Server)
186173
_options.put(AbstractServerTransport.JSON_CONTEXT_OPTION, _jsonContext);
187174
}
188175

189-
protected void initializeAllowedTransports()
176+
protected void initializeServerTransports()
177+
{
178+
if (_transports.isEmpty())
179+
{
180+
String option = (String)getOption(TRANSPORTS_OPTION);
181+
if (option == null)
182+
{
183+
// Order is important, see #findHttpTransport()
184+
ServerTransport transport = newWebSocketTransport();
185+
if (transport != null)
186+
addTransport(transport);
187+
addTransport(new JSONTransport(this));
188+
addTransport(new JSONPTransport(this));
189+
}
190+
else
191+
{
192+
for (String className : option.split(","))
193+
{
194+
ServerTransport transport = newServerTransport(className.trim());
195+
if (transport != null)
196+
addTransport(transport);
197+
}
198+
199+
if (_transports.isEmpty())
200+
throw new IllegalArgumentException("Option '" + TRANSPORTS_OPTION +
201+
"' does not contain a valid list of server transport class names");
202+
}
203+
}
204+
205+
if (_allowedTransports.isEmpty())
206+
{
207+
String option = (String)getOption(ALLOWED_TRANSPORTS_OPTION);
208+
if (option == null)
209+
{
210+
_allowedTransports.addAll(_transports.keySet());
211+
}
212+
else
213+
{
214+
for (String transportName : option.split(","))
215+
{
216+
if (_transports.containsKey(transportName))
217+
_allowedTransports.add(transportName);
218+
}
219+
220+
if (_allowedTransports.isEmpty())
221+
throw new IllegalArgumentException("Option '" + ALLOWED_TRANSPORTS_OPTION +
222+
"' does not contain at least one configured server transport name");
223+
}
224+
}
225+
226+
for (String transportName : _allowedTransports)
227+
{
228+
ServerTransport serverTransport = getTransport(transportName);
229+
if (serverTransport instanceof AbstractServerTransport)
230+
((AbstractServerTransport)serverTransport).init();
231+
}
232+
}
233+
234+
private ServerTransport newWebSocketTransport()
235+
{
236+
try
237+
{
238+
ClassLoader loader = Thread.currentThread().getContextClassLoader();
239+
loader.loadClass("javax.websocket.server.ServerContainer");
240+
return newServerTransport("org.cometd.websocket.server.WebSocketTransport");
241+
}
242+
catch (Exception x)
243+
{
244+
return null;
245+
}
246+
}
247+
248+
private ServerTransport newServerTransport(String className)
190249
{
191-
if (_allowedTransports.size() == 0)
250+
try
192251
{
193-
for (ServerTransport t : _transports.values())
194-
_allowedTransports.add(t.getName());
252+
ClassLoader loader = Thread.currentThread().getContextClassLoader();
253+
@SuppressWarnings("unchecked")
254+
Class<? extends ServerTransport> klass = (Class<? extends ServerTransport>)loader.loadClass(className);
255+
Constructor<? extends ServerTransport> constructor = klass.getConstructor(BayeuxServerImpl.class);
256+
return constructor.newInstance(this);
257+
}
258+
catch (Exception x)
259+
{
260+
return null;
195261
}
196-
_logger.debug("Allowed Transports: {}", _allowedTransports);
197262
}
198263

199264
public Scheduler.Task schedule(Runnable task, long delay)
@@ -995,6 +1060,24 @@ public List<ServerTransport> getTransports()
9951060
return new ArrayList<>(_transports.values());
9961061
}
9971062

1063+
@SuppressWarnings("ForLoopReplaceableByForEach")
1064+
protected HttpTransport findHttpTransport(HttpServletRequest request)
1065+
{
1066+
// Avoid allocation of the Iterator
1067+
for (int i = 0; i < _allowedTransports.size(); ++i)
1068+
{
1069+
String transportName = _allowedTransports.get(i);
1070+
ServerTransport serverTransport = getTransport(transportName);
1071+
if (serverTransport instanceof HttpTransport)
1072+
{
1073+
HttpTransport transport = (HttpTransport)serverTransport;
1074+
if (transport.accept(request))
1075+
return transport;
1076+
}
1077+
}
1078+
return null;
1079+
}
1080+
9981081
@ManagedAttribute(value = "The transports allowed by this server", readonly = true)
9991082
public List<String> getAllowedTransports()
10001083
{

0 commit comments

Comments
 (0)