WebSocketEndpointRegistry.java

package sprout.server.websocket.endpoint;

import sprout.beans.annotation.Component;
import sprout.mvc.mapping.PathPattern;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class WebSocketEndpointRegistry {

    private final Map<PathPattern, WebSocketEndpointInfo> endpointMappings = new ConcurrentHashMap<>();

    public WebSocketEndpointInfo getEndpointInfo(String path) {
        for (Map.Entry<PathPattern, WebSocketEndpointInfo> entry : endpointMappings.entrySet()) {
            if (entry.getKey().matches(path)) {
                // 필요하다면 여기서 PathPattern.extractPathVariables() 호출하여
                // WebSocketEndpointInfo에 변수를 전달하거나, 나중에 WebSocketSession에서 관리
                return entry.getValue();
            }
        }
        return null;
    }

    public void registerEndpoint(PathPattern pathPattern, Object handlerBean,
                                 Method onOpenMethod, Method onCloseMethod, Method onErrorMethod,
                                 Map<String, Method> messageMappings) { // Map<MessagePath, Method>
        Objects.requireNonNull(pathPattern, "WebSocket endpoint pathPattern cannot be null.");
        Objects.requireNonNull(handlerBean, "WebSocket handler bean cannot be null.");

        if (endpointMappings.containsKey(pathPattern)) {
            System.err.println("Warning: Duplicate WebSocket endpoint path registered: " + pathPattern.getOriginalPattern());
        }

        WebSocketEndpointInfo info = new WebSocketEndpointInfo(pathPattern, handlerBean, onOpenMethod, onCloseMethod, onErrorMethod, messageMappings);
        endpointMappings.put(pathPattern, info);
        System.out.println("Registered WebSocket endpoint: " + pathPattern.getOriginalPattern());
    }


}