ClientManager.java 1.89 KB
package com.example.mina.client.base;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@Component
@Slf4j
public class ClientManager<T extends AbstractClientFactory> {

    private Map<String, T> clientFactories;

    private Map<String, MatrixClient> clients ;

    public ClientManager() {

       // this.clients = Collections.emptyMap();
        this.clients = new HashMap<>();
    }

    @Autowired
    public void setClientFactories(Map<String, T> clientFactories) {
        this.clientFactories = clientFactories;
    }

    public Set<String> getSupportedMatrix() {
        return this.clientFactories.keySet();
    }

    public T getClientFactory(String name) {
        return this.clientFactories.get(name);
    }

    public MatrixClient getOrCreateClient(MatrixConnectConfig connectConfig) {
        Assert.notNull(connectConfig, "matrix connect config is null");
        Assert.hasLength(connectConfig.getDeviceId(), "deviceId can not be empty");

        String deviceId = connectConfig.getDeviceId();

        if(clients.containsKey(deviceId)) {
            return clients.get(deviceId);
        }

        String deviceType = connectConfig.getDeviceType();
        //check the device type is supported by system
        T clientFactory = getClientFactory(deviceType);
        if(clientFactory == null) {
            log.error("the matrix type is not supported by the system! matrix type is: " + deviceType);
            throw new RuntimeException("the matrix type is not supported by the system! matrix type is: " + deviceType);
        }
        MatrixClient client = clientFactory.createClient(connectConfig);

        clients.put(deviceId, client);
        return client;
    }
}