Search in sources :

Example 46 with ServerEndpointConfig

use of javax.websocket.server.ServerEndpointConfig in project undertow by undertow-io.

the class ServerWebSocketContainer method addEndpointInternal.

private synchronized void addEndpointInternal(final Class<?> endpoint, boolean requiresCreation) throws DeploymentException {
    ServerEndpoint serverEndpoint = endpoint.getAnnotation(ServerEndpoint.class);
    ClientEndpoint clientEndpoint = endpoint.getAnnotation(ClientEndpoint.class);
    if (serverEndpoint != null) {
        JsrWebSocketLogger.ROOT_LOGGER.addingAnnotatedServerEndpoint(endpoint, serverEndpoint.value());
        final PathTemplate template = PathTemplate.create(serverEndpoint.value());
        if (seenPaths.contains(template)) {
            PathTemplate existing = null;
            for (PathTemplate p : seenPaths) {
                if (p.compareTo(template) == 0) {
                    existing = p;
                    break;
                }
            }
            throw JsrWebSocketMessages.MESSAGES.multipleEndpointsWithOverlappingPaths(template, existing);
        }
        seenPaths.add(template);
        Class<? extends ServerEndpointConfig.Configurator> configuratorClass = serverEndpoint.configurator();
        EncodingFactory encodingFactory = EncodingFactory.createFactory(classIntrospecter, serverEndpoint.decoders(), serverEndpoint.encoders());
        AnnotatedEndpointFactory annotatedEndpointFactory = AnnotatedEndpointFactory.create(endpoint, encodingFactory, template.getParameterNames());
        InstanceFactory<?> instanceFactory = null;
        try {
            instanceFactory = classIntrospecter.createInstanceFactory(endpoint);
        } catch (Exception e) {
            // so it is possible that this is still valid if a custom configurator is in use
            if (configuratorClass == ServerEndpointConfig.Configurator.class) {
                throw JsrWebSocketMessages.MESSAGES.couldNotDeploy(e);
            } else {
                instanceFactory = new InstanceFactory<Object>() {

                    @Override
                    public InstanceHandle<Object> createInstance() throws InstantiationException {
                        throw JsrWebSocketMessages.MESSAGES.endpointDoesNotHaveAppropriateConstructor(endpoint);
                    }
                };
            }
        }
        ServerEndpointConfig.Configurator configurator;
        if (configuratorClass != ServerEndpointConfig.Configurator.class) {
            try {
                configurator = classIntrospecter.createInstanceFactory(configuratorClass).createInstance().getInstance();
            } catch (InstantiationException | NoSuchMethodException e) {
                throw JsrWebSocketMessages.MESSAGES.couldNotDeploy(e);
            }
        } else {
            configurator = DefaultContainerConfigurator.INSTANCE;
        }
        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(endpoint, serverEndpoint.value()).decoders(Arrays.asList(serverEndpoint.decoders())).encoders(Arrays.asList(serverEndpoint.encoders())).subprotocols(Arrays.asList(serverEndpoint.subprotocols())).extensions(Collections.<Extension>emptyList()).configurator(configurator).build();
        ConfiguredServerEndpoint confguredServerEndpoint = new ConfiguredServerEndpoint(config, instanceFactory, template, encodingFactory, annotatedEndpointFactory, installedExtensions);
        configuredServerEndpoints.add(confguredServerEndpoint);
        handleAddingFilterMapping();
    } else if (clientEndpoint != null) {
        JsrWebSocketLogger.ROOT_LOGGER.addingAnnotatedClientEndpoint(endpoint);
        EncodingFactory encodingFactory = EncodingFactory.createFactory(classIntrospecter, clientEndpoint.decoders(), clientEndpoint.encoders());
        InstanceFactory<?> instanceFactory;
        try {
            instanceFactory = classIntrospecter.createInstanceFactory(endpoint);
        } catch (Exception e) {
            try {
                // this endpoint cannot be created by the container, the user will instantiate it
                instanceFactory = new ConstructorInstanceFactory<>(endpoint.getConstructor());
            } catch (NoSuchMethodException e1) {
                if (requiresCreation) {
                    throw JsrWebSocketMessages.MESSAGES.couldNotDeploy(e);
                } else {
                    instanceFactory = new InstanceFactory<Object>() {

                        @Override
                        public InstanceHandle<Object> createInstance() throws InstantiationException {
                            throw new InstantiationException();
                        }
                    };
                }
            }
        }
        AnnotatedEndpointFactory factory = AnnotatedEndpointFactory.create(endpoint, encodingFactory, Collections.<String>emptySet());
        ClientEndpointConfig.Configurator configurator = null;
        try {
            configurator = classIntrospecter.createInstanceFactory(clientEndpoint.configurator()).createInstance().getInstance();
        } catch (InstantiationException | NoSuchMethodException e) {
            throw JsrWebSocketMessages.MESSAGES.couldNotDeploy(e);
        }
        ClientEndpointConfig config = ClientEndpointConfig.Builder.create().decoders(Arrays.asList(clientEndpoint.decoders())).encoders(Arrays.asList(clientEndpoint.encoders())).preferredSubprotocols(Arrays.asList(clientEndpoint.subprotocols())).configurator(configurator).build();
        ConfiguredClientEndpoint configuredClientEndpoint = new ConfiguredClientEndpoint(config, factory, encodingFactory, instanceFactory);
        clientEndpoints.put(endpoint, configuredClientEndpoint);
    } else {
        throw JsrWebSocketMessages.MESSAGES.classWasNotAnnotated(endpoint);
    }
}
Also used : ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) PathTemplate(io.undertow.util.PathTemplate) ServerEndpoint(javax.websocket.server.ServerEndpoint) ServletException(javax.servlet.ServletException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) DeploymentException(javax.websocket.DeploymentException) ClosedChannelException(java.nio.channels.ClosedChannelException) IOException(java.io.IOException) UpgradeFailedException(org.xnio.http.UpgradeFailedException) AnnotatedEndpointFactory(io.undertow.websockets.jsr.annotated.AnnotatedEndpointFactory) ConstructorInstanceFactory(io.undertow.servlet.util.ConstructorInstanceFactory) InstanceFactory(io.undertow.servlet.api.InstanceFactory) ClientEndpointConfig(javax.websocket.ClientEndpointConfig) ClientEndpoint(javax.websocket.ClientEndpoint)

Example 47 with ServerEndpointConfig

use of javax.websocket.server.ServerEndpointConfig in project undertow by undertow-io.

the class ServerWebSocketContainer method doUpgrade.

public void doUpgrade(HttpServletRequest request, HttpServletResponse response, final ServerEndpointConfig sec, Map<String, String> pathParams) throws ServletException, IOException {
    ServerEndpointConfig.Configurator configurator = sec.getConfigurator();
    try {
        EncodingFactory encodingFactory = EncodingFactory.createFactory(classIntrospecter, sec.getDecoders(), sec.getEncoders());
        PathTemplate pt = PathTemplate.create(sec.getPath());
        InstanceFactory<?> instanceFactory = null;
        try {
            instanceFactory = classIntrospecter.createInstanceFactory(sec.getEndpointClass());
        } catch (Exception e) {
            // so it is possible that this is still valid if a custom configurator is in use
            if (configurator == null || configurator.getClass() == ServerEndpointConfig.Configurator.class) {
                throw JsrWebSocketMessages.MESSAGES.couldNotDeploy(e);
            } else {
                instanceFactory = new InstanceFactory<Object>() {

                    @Override
                    public InstanceHandle<Object> createInstance() throws InstantiationException {
                        throw JsrWebSocketMessages.MESSAGES.endpointDoesNotHaveAppropriateConstructor(sec.getEndpointClass());
                    }
                };
            }
        }
        if (configurator == null) {
            configurator = DefaultContainerConfigurator.INSTANCE;
        }
        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(sec.getEndpointClass(), sec.getPath()).decoders(sec.getDecoders()).encoders(sec.getEncoders()).subprotocols(sec.getSubprotocols()).extensions(sec.getExtensions()).configurator(configurator).build();
        AnnotatedEndpointFactory annotatedEndpointFactory = null;
        if (!Endpoint.class.isAssignableFrom(sec.getEndpointClass())) {
            annotatedEndpointFactory = AnnotatedEndpointFactory.create(sec.getEndpointClass(), encodingFactory, pt.getParameterNames());
        }
        ConfiguredServerEndpoint confguredServerEndpoint;
        if (annotatedEndpointFactory == null) {
            confguredServerEndpoint = new ConfiguredServerEndpoint(config, instanceFactory, null, encodingFactory);
        } else {
            confguredServerEndpoint = new ConfiguredServerEndpoint(config, instanceFactory, null, encodingFactory, annotatedEndpointFactory, installedExtensions);
        }
        WebSocketHandshakeHolder hand;
        WebSocketDeploymentInfo info = (WebSocketDeploymentInfo) request.getServletContext().getAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME);
        if (info == null || info.getExtensions() == null) {
            hand = ServerWebSocketContainer.handshakes(confguredServerEndpoint);
        } else {
            hand = ServerWebSocketContainer.handshakes(confguredServerEndpoint, info.getExtensions());
        }
        final ServletWebSocketHttpExchange facade = new ServletWebSocketHttpExchange(request, response, new HashSet<WebSocketChannel>());
        Handshake handshaker = null;
        for (Handshake method : hand.handshakes) {
            if (method.matches(facade)) {
                handshaker = method;
                break;
            }
        }
        if (handshaker != null) {
            if (isClosed()) {
                response.sendError(StatusCodes.SERVICE_UNAVAILABLE);
                return;
            }
            facade.putAttachment(HandshakeUtil.PATH_PARAMS, pathParams);
            final Handshake selected = handshaker;
            facade.upgradeChannel(new HttpUpgradeListener() {

                @Override
                public void handleUpgrade(StreamConnection streamConnection, HttpServerExchange exchange) {
                    WebSocketChannel channel = selected.createChannel(facade, streamConnection, facade.getBufferPool());
                    new EndpointSessionHandler(ServerWebSocketContainer.this).onConnect(facade, channel);
                }
            });
            handshaker.handshake(facade);
            return;
        }
    } catch (Exception e) {
        throw new ServletException(e);
    }
}
Also used : ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) WebSocketChannel(io.undertow.websockets.core.WebSocketChannel) PathTemplate(io.undertow.util.PathTemplate) StreamConnection(org.xnio.StreamConnection) ServletWebSocketHttpExchange(io.undertow.servlet.websockets.ServletWebSocketHttpExchange) ServletException(javax.servlet.ServletException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) DeploymentException(javax.websocket.DeploymentException) ClosedChannelException(java.nio.channels.ClosedChannelException) IOException(java.io.IOException) UpgradeFailedException(org.xnio.http.UpgradeFailedException) HttpServerExchange(io.undertow.server.HttpServerExchange) ServletException(javax.servlet.ServletException) AnnotatedEndpointFactory(io.undertow.websockets.jsr.annotated.AnnotatedEndpointFactory) Endpoint(javax.websocket.Endpoint) ServerEndpoint(javax.websocket.server.ServerEndpoint) ClientEndpoint(javax.websocket.ClientEndpoint) ConstructorInstanceFactory(io.undertow.servlet.util.ConstructorInstanceFactory) InstanceFactory(io.undertow.servlet.api.InstanceFactory) HttpUpgradeListener(io.undertow.server.HttpUpgradeListener) ExtensionHandshake(io.undertow.websockets.extensions.ExtensionHandshake) JsrHybi13Handshake(io.undertow.websockets.jsr.handshake.JsrHybi13Handshake) JsrHybi08Handshake(io.undertow.websockets.jsr.handshake.JsrHybi08Handshake) Handshake(io.undertow.websockets.core.protocol.Handshake) JsrHybi07Handshake(io.undertow.websockets.jsr.handshake.JsrHybi07Handshake)

Example 48 with ServerEndpointConfig

use of javax.websocket.server.ServerEndpointConfig in project undertow by undertow-io.

the class AddEndpointServlet method init.

@Override
public void init(ServletConfig c) throws ServletException {
    String websocketPath = "/foo";
    ServerEndpointConfig config = ServerEndpointConfig.Builder.create(ProgramaticEndpoint.class, websocketPath).build();
    ServerContainer serverContainer = (ServerContainer) c.getServletContext().getAttribute("javax.websocket.server.ServerContainer");
    try {
        serverContainer.addEndpoint(config);
    } catch (DeploymentException ex) {
        throw new ServletException("Error deploying websocket endpoint:", ex);
    }
}
Also used : ServletException(javax.servlet.ServletException) ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) DeploymentException(javax.websocket.DeploymentException) ServerContainer(javax.websocket.server.ServerContainer)

Example 49 with ServerEndpointConfig

use of javax.websocket.server.ServerEndpointConfig in project wildfly by wildfly.

the class UndertowJSRWebSocketDeploymentProcessor method doDeployment.

private void doDeployment(DeploymentUnit deploymentUnit, final WebSocketDeploymentInfo container, final Set<Class<?>> annotatedEndpoints, final Set<Class<? extends ServerApplicationConfig>> serverApplicationConfigClasses, final Set<Class<? extends Endpoint>> endpoints) throws DeploymentUnitProcessingException {
    Set<Class<? extends Endpoint>> allScannedEndpointImplementations = new HashSet<>(endpoints);
    Set<Class<?>> allScannedAnnotatedEndpoints = new HashSet<>(annotatedEndpoints);
    Set<Class<?>> newAnnotatatedEndpoints = new HashSet<>();
    Set<ServerEndpointConfig> serverEndpointConfigurations = new HashSet<>();
    final Set<ServerApplicationConfig> configInstances = new HashSet<>();
    for (Class<? extends ServerApplicationConfig> clazz : serverApplicationConfigClasses) {
        try {
            configInstances.add(clazz.newInstance());
        } catch (InstantiationException | IllegalAccessException e) {
            JsrWebSocketLogger.ROOT_LOGGER.couldNotInitializeConfiguration(clazz, e);
        }
    }
    if (!configInstances.isEmpty()) {
        for (ServerApplicationConfig config : configInstances) {
            Set<Class<?>> returnedEndpoints = config.getAnnotatedEndpointClasses(allScannedAnnotatedEndpoints);
            if (returnedEndpoints != null) {
                newAnnotatatedEndpoints.addAll(returnedEndpoints);
            }
            Set<ServerEndpointConfig> endpointConfigs = config.getEndpointConfigs(allScannedEndpointImplementations);
            if (endpointConfigs != null) {
                serverEndpointConfigurations.addAll(endpointConfigs);
            }
        }
    } else {
        newAnnotatatedEndpoints.addAll(allScannedAnnotatedEndpoints);
    }
    // annotated endpoints first
    for (Class<?> endpoint : newAnnotatatedEndpoints) {
        if (endpoint != null) {
            container.addEndpoint(endpoint);
            ServerEndpoint annotation = endpoint.getAnnotation(ServerEndpoint.class);
            if (annotation != null) {
                String path = annotation.value();
                addManagementWebsocket(deploymentUnit, endpoint, path);
            }
        }
    }
    for (final ServerEndpointConfig endpoint : serverEndpointConfigurations) {
        if (endpoint != null) {
            container.addEndpoint(endpoint);
            addManagementWebsocket(deploymentUnit, endpoint.getEndpointClass(), endpoint.getPath());
        }
    }
}
Also used : ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) ServerApplicationConfig(javax.websocket.server.ServerApplicationConfig) ServerEndpoint(javax.websocket.server.ServerEndpoint) Endpoint(javax.websocket.Endpoint) ServerEndpoint(javax.websocket.server.ServerEndpoint) ClientEndpoint(javax.websocket.ClientEndpoint) HashSet(java.util.HashSet)

Aggregations

ServerEndpointConfig (javax.websocket.server.ServerEndpointConfig)49 DeploymentException (javax.websocket.DeploymentException)17 ServerEndpoint (javax.websocket.server.ServerEndpoint)14 Test (org.junit.Test)13 ServletException (javax.servlet.ServletException)10 TesterServletContext (org.apache.tomcat.unittest.TesterServletContext)10 WebSocketBaseTest (org.apache.tomcat.websocket.WebSocketBaseTest)10 ServletContextHandler (org.eclipse.jetty.servlet.ServletContextHandler)7 Endpoint (javax.websocket.Endpoint)6 ServerContainer (javax.websocket.server.ServerContainer)6 Server (org.eclipse.jetty.server.Server)6 ServerConnector (org.eclipse.jetty.server.ServerConnector)6 IOException (java.io.IOException)5 EndpointInstance (org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance)5 Before (org.junit.Before)5 HandshakeResponse (javax.websocket.HandshakeResponse)4 HandshakeRequest (javax.websocket.server.HandshakeRequest)4 WebSocketDeploymentInfo (io.undertow.websockets.jsr.WebSocketDeploymentInfo)3 ArrayList (java.util.ArrayList)3 HashSet (java.util.HashSet)3