AgentsResponseEntity.java

package emissary.client.response;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;

@XmlRootElement(name = "agents")
@XmlAccessorType(XmlAccessType.NONE)
public class AgentsResponseEntity extends BaseResponseEntity {
    private static final long serialVersionUID = 5686691885767273319L;

    @XmlElement(name = "local")
    private AgentList local = new AgentList();

    @XmlElement(name = "cluster")
    private final Set<AgentList> cluster = new HashSet<>();

    public AgentsResponseEntity() {}

    public AgentsResponseEntity(AgentList local) {
        this.local = local;
    }

    public void addClusterAgents(@Nullable AgentList pl) {
        if (pl != null) {
            this.cluster.add(pl);
        }
    }

    public AgentList getLocal() {
        return local;
    }

    public void setLocal(AgentList local) {
        this.local = local;
    }

    public Set<AgentList> getCluster() {
        return cluster;
    }

    @Override
    public void append(BaseEntity e) {
        addErrors(e.getErrors());
        if (e instanceof AgentsResponseEntity) {
            AgentsResponseEntity pre = this.getClass().cast(e);
            addClusterAgents(pre.getLocal());
        }
    }

    @Override
    public void dumpToConsole() {
        Stream.concat(cluster.stream(), Stream.of(local)).filter(agentList -> agentList.getHost() != null).collect(Collectors.toSet()).stream()
                .sorted(Comparator.comparing(AgentList::getHost)).forEach(agentList -> {
                    if (!agentList.getAgents().isEmpty()) {
                        agentList.dumpToConsole();
                    }
                });
    }
}