Merge pull request #6107 from eclipse/jetty-10.0.x-JavaxWebSocketContainerProvider

Make the JavaxWebSocketClientContainer.getContainer(HttpClient) method static.
This commit is contained in:
Lachlan 2021-03-26 16:18:34 +11:00 committed by GitHub
commit b68a5fec2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 69 additions and 12 deletions

View File

@ -152,6 +152,46 @@ public interface Container
return Collections.unmodifiableList(new ArrayList<>(getBeans(EventListener.class))); return Collections.unmodifiableList(new ArrayList<>(getBeans(EventListener.class)));
} }
/**
* A utility method to add a bean to a container.
* @param parent the parent container.
* @param child the child bean.
* @return true if the child was added as a bean, false if parent was not instance of {@link Container} or bean was already present.
*/
static boolean addBean(Object parent, Object child)
{
if (parent instanceof Container)
return ((Container)parent).addBean(child);
return false;
}
/**
* A utility method to add a bean to a container.
* @param parent the parent container.
* @param child the child bean.
* @param managed whether to managed the lifecycle of the bean.
* @return true if the child was added as a bean, false if parent was not instance of {@link Container} or bean was already present.
*/
static boolean addBean(Object parent, Object child, boolean managed)
{
if (parent instanceof Container)
return ((Container)parent).addBean(child, managed);
return false;
}
/**
* A utility method to remove a bean from a container.
* @param parent the parent container.
* @param child the child bean.
* @return true if parent was an instance of {@link Container} and the bean was removed.
*/
static boolean removeBean(Object parent, Object child)
{
if (parent instanceof Container)
return ((Container)parent).removeBean(child);
return false;
}
/** /**
* A listener for Container events. * A listener for Container events.
* If an added bean implements this interface it will receive the events * If an added bean implements this interface it will receive the events

View File

@ -474,9 +474,9 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
if (listener instanceof InheritedListener && b.isManaged() && b._bean instanceof Container) if (listener instanceof InheritedListener && b.isManaged() && b._bean instanceof Container)
{ {
if (b._bean instanceof ContainerLifeCycle) if (b._bean instanceof ContainerLifeCycle)
((ContainerLifeCycle)b._bean).addBean(listener, false); Container.addBean(b._bean, listener, false);
else else
((Container)b._bean).addBean(listener); Container.addBean(b._bean, listener);
} }
} }
} }
@ -499,8 +499,8 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
{ {
cl.beanRemoved(this, b._bean); cl.beanRemoved(this, b._bean);
if (listener instanceof InheritedListener && b.isManaged() && b._bean instanceof Container) if (listener instanceof InheritedListener && b.isManaged())
((Container)b._bean).removeBean(listener); Container.removeBean(b._bean, listener);
} }
} }
return true; return true;
@ -541,9 +541,9 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
if (l instanceof InheritedListener) if (l instanceof InheritedListener)
{ {
if (bean._bean instanceof ContainerLifeCycle) if (bean._bean instanceof ContainerLifeCycle)
((ContainerLifeCycle)bean._bean).addBean(l, false); Container.addBean(bean._bean, l, false);
else else
((Container)bean._bean).addBean(l); Container.addBean(bean._bean, l);
} }
} }
} }
@ -579,7 +579,7 @@ public class ContainerLifeCycle extends AbstractLifeCycle implements Container,
for (Container.Listener l : _listeners) for (Container.Listener l : _listeners)
{ {
if (l instanceof InheritedListener) if (l instanceof InheritedListener)
((Container)bean._bean).removeBean(l); Container.removeBean(bean._bean, l);
} }
} }
bean._managed = Managed.UNMANAGED; bean._managed = Managed.UNMANAGED;

View File

@ -45,6 +45,17 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jmx</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -60,7 +60,7 @@ public class JavaxWebSocketClientContainerProvider extends ContainerProvider
* @param httpClient a pre-configured {@link HttpClient} to be used by the implementation. * @param httpClient a pre-configured {@link HttpClient} to be used by the implementation.
* @see #getContainer() * @see #getContainer()
*/ */
public WebSocketContainer getContainer(HttpClient httpClient) public static WebSocketContainer getContainer(HttpClient httpClient)
{ {
JavaxWebSocketClientContainer clientContainer = new JavaxWebSocketClientContainer(httpClient); JavaxWebSocketClientContainer clientContainer = new JavaxWebSocketClientContainer(httpClient);
// See: https://github.com/eclipse-ee4j/websocket-api/issues/212 // See: https://github.com/eclipse-ee4j/websocket-api/issues/212

View File

@ -13,6 +13,7 @@
package examples; package examples;
import java.lang.management.ManagementFactory;
import java.net.URI; import java.net.URI;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.websocket.ClientEndpointConfig; import javax.websocket.ClientEndpointConfig;
@ -21,9 +22,11 @@ import javax.websocket.WebSocketContainer;
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP; import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
import org.eclipse.jetty.io.ClientConnector; import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.util.component.Container;
import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.javax.client.internal.JavaxWebSocketClientContainer; import org.eclipse.jetty.websocket.javax.client.JavaxWebSocketClientContainerProvider;
public class SecureClientContainerExample public class SecureClientContainerExample
{ {
@ -76,9 +79,12 @@ public class SecureClientContainerExample
clientConnector.setSslContextFactory(ssl); clientConnector.setSslContextFactory(ssl);
HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP(clientConnector)); HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP(clientConnector));
JavaxWebSocketClientContainer clientContainer = new JavaxWebSocketClientContainer(httpClient); WebSocketContainer clientContainer = JavaxWebSocketClientContainerProvider.getContainer(httpClient);
clientContainer.addManaged(httpClient); // allow clientContainer to own httpClient (for start/stop lifecycle)
clientContainer.start(); // Components can be added as a bean to the WebSocketContainer with the Container static method.
MBeanContainer mbeanContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
Container.addBean(clientContainer, mbeanContainer);
return clientContainer; return clientContainer;
} }
} }