package org.yamcs.web.rest; import java.util.Set; import org.yamcs.Processor; import org.yamcs.YamcsException; import org.yamcs.management.ManagementService; import org.yamcs.protobuf.Rest.EditClientRequest; import org.yamcs.protobuf.Rest.ListClientsResponse; import org.yamcs.protobuf.SchemaRest; import org.yamcs.protobuf.YamcsManagement.ClientInfo; import org.yamcs.protobuf.YamcsManagement.ClientInfo.ClientState; import org.yamcs.protobuf.YamcsManagement.ProcessorManagementRequest; import org.yamcs.protobuf.YamcsManagement.ProcessorManagementRequest.Operation; import org.yamcs.web.BadRequestException; import org.yamcs.web.HttpException; /** * Gives information on clients (aka sessions) */ public class ClientRestHandler extends RestHandler { @Route(path="/api/clients", method="GET") public void listClients(RestRequest req) throws HttpException { Set<ClientInfo> clients = ManagementService.getInstance().getClientInfo(); ListClientsResponse.Builder responseb = ListClientsResponse.newBuilder(); for (ClientInfo client : clients) { responseb.addClient(ClientInfo.newBuilder(client).setState(ClientState.CONNECTED)); } completeOK(req, responseb.build(), SchemaRest.ListClientsResponse.WRITE); } @Route(path="/api/clients/:id", method={ "PATCH", "PUT", "POST" }) public void patchClient(RestRequest req) throws HttpException { ClientInfo ci = verifyClient(req, req.getIntegerRouteParam("id")); EditClientRequest request = req.bodyAsMessage(SchemaRest.EditClientRequest.MERGE).build(); String newProcessorName = null; String newInstance = ci.getInstance(); // By default, use same instance if (request.hasInstance()) { newInstance = request.getInstance(); } if (request.hasProcessor()) { newProcessorName = request.getProcessor(); } if (req.hasQueryParameter("processor")) { newProcessorName = req.getQueryParameter("processor"); } if (req.hasQueryParameter("instance")) { newInstance = req.getQueryParameter("instance"); } if (newProcessorName != null) { Processor newProcessor = Processor.getInstance(newInstance, newProcessorName); if (newProcessor == null) { throw new BadRequestException("Cannot switch user to non-existing processor '" + newProcessorName + "' (instance: '" + newInstance + "')"); } else { ManagementService mservice = ManagementService.getInstance(); ProcessorManagementRequest.Builder yprocReq = ProcessorManagementRequest.newBuilder(); yprocReq.setInstance(newInstance); yprocReq.setName(newProcessorName); yprocReq.setOperation(Operation.CONNECT_TO_PROCESSOR); yprocReq.addClientId(ci.getId()); try { mservice.connectToProcessor(yprocReq.build(), req.getAuthToken()); completeOK(req); return; } catch (YamcsException e) { throw new BadRequestException(e.getMessage()); } } } completeOK(req); } }