All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jetty.websocket.javax.common.JavaxWebSocketFrameHandlerMetadata Maven / Gradle / Ivy

The newest version!
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package org.eclipse.jetty.websocket.javax.common;

import java.lang.invoke.MethodHandle;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;

import org.eclipse.jetty.http.pathmap.UriTemplatePathSpec;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.exception.InvalidWebSocketException;
import org.eclipse.jetty.websocket.javax.common.decoders.AvailableDecoders;
import org.eclipse.jetty.websocket.javax.common.encoders.AvailableEncoders;

public class JavaxWebSocketFrameHandlerMetadata
{
    private static final String[] NO_VARIABLES = new String[0];

    // EndpointConfig entries
    private final AvailableDecoders availableDecoders;
    private final AvailableEncoders availableEncoders;

    private MethodHandle openHandle;
    private MethodHandle closeHandle;
    private MethodHandle errorHandle;
    private MethodHandle pongHandle;
    private JavaxWebSocketMessageMetadata textMetadata;
    private JavaxWebSocketMessageMetadata binaryMetadata;

    /**
     * For {@code @ServerEndpoint} or {@code ServerEndpointConfig} based endpoints, this
     * holds the {@link UriTemplatePathSpec} based off of the configured url-pattern.
     *
     * 

* This is the source of the configured uri-template variables names, as well as the parser * for the incoming URI to obtain the values for those variables. *

*

* Used to bind uri-template variables, with their values from the upgrade, to the methods * that have declared their interest in these values via {@code @PathParam} annotations. *

*

* The parsed values from the {@link UriTemplatePathSpec} are returned as a Map * of String names to String values. *

*

* This Metadata Object does not keep track of the parsed values, as they are request * specific. *

*

* This can be null if Metadata is from a client endpoint, or the server endpoint * doesn't use uri-template variables. *

*/ private UriTemplatePathSpec uriTemplatePathSpec; public JavaxWebSocketFrameHandlerMetadata(EndpointConfig endpointConfig, WebSocketComponents components) { this.availableDecoders = new AvailableDecoders(endpointConfig, components); this.availableEncoders = new AvailableEncoders(endpointConfig, components); } public AvailableDecoders getAvailableDecoders() { return availableDecoders; } public AvailableEncoders getAvailableEncoders() { return availableEncoders; } public JavaxWebSocketMessageMetadata getBinaryMetadata() { return binaryMetadata; } public MethodHandle getCloseHandle() { return closeHandle; } public MethodHandle getErrorHandle() { return errorHandle; } public MethodHandle getOpenHandle() { return openHandle; } public void setUriTemplatePathSpec(UriTemplatePathSpec pathSpec) { this.uriTemplatePathSpec = pathSpec; } public UriTemplatePathSpec getUriTemplatePathSpec() { return uriTemplatePathSpec; } public String[] getNamedTemplateVariables() { if (uriTemplatePathSpec != null) return uriTemplatePathSpec.getVariables(); return NO_VARIABLES; } public MethodHandle getPongHandle() { return pongHandle; } public JavaxWebSocketMessageMetadata getTextMetadata() { return textMetadata; } public boolean hasBinaryMetadata() { return (binaryMetadata != null); } public boolean hasTextMetdata() { return (textMetadata != null); } public void setBinaryMetadata(JavaxWebSocketMessageMetadata metadata, Object origin) { assertNotSet(this.binaryMetadata, "BINARY Message Metadata", origin); this.binaryMetadata = metadata; } public void setCloseHandler(MethodHandle close, Object origin) { assertNotSet(this.closeHandle, "CLOSE Handler", origin); this.closeHandle = close; } public void setEncoders(Class[] encoders) { this.availableEncoders.registerAll(encoders); } public void setErrorHandler(MethodHandle error, Object origin) { assertNotSet(this.errorHandle, "ERROR Handler", origin); this.errorHandle = error; } public void setOpenHandler(MethodHandle open, Object origin) { assertNotSet(this.openHandle, "OPEN Handler", origin); this.openHandle = open; } public void setPongHandle(MethodHandle pong, Object origin) { assertNotSet(this.pongHandle, "PONG Handler", origin); this.pongHandle = pong; } public void setTextMetadata(JavaxWebSocketMessageMetadata metadata, Object origin) { assertNotSet(this.textMetadata, "TEXT Messsage Metadata", origin); this.textMetadata = metadata; } @SuppressWarnings("Duplicates") private void assertNotSet(Object val, String role, Object origin) { if (val == null) return; StringBuilder err = new StringBuilder(); err.append("Cannot replace previously assigned ["); err.append(role); err.append("] at ").append(describeOrigin(val)); err.append(" with "); err.append(describeOrigin(origin)); throw new InvalidWebSocketException(err.toString()); } private String describeOrigin(Object obj) { if (obj == null) { return ""; } return obj.toString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy