RollOutputsAction.java

package emissary.server.mvc.internal;

import emissary.core.Namespace;
import emissary.core.NamespaceException;
import emissary.core.ResourceWatcher;
import emissary.output.DropOffPlace;
import emissary.output.filter.IDropOffFilter;
import emissary.server.mvc.adapters.RequestUtil;

import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import java.util.List;

import static emissary.util.PayloadUtil.logger;

@Path("")
// context is /emissary, set in EmissaryServer
// TODO This class should go away as we are using a rollable framework.
public class RollOutputsAction {

    @GET
    @Path("/roll")
    @Produces(MediaType.TEXT_PLAIN)
    public Response rollOutputs(@QueryParam("filter") List<String> outputFilterNames,
            @QueryParam("p") @DefaultValue("DropOffPlace") String namespaceName) {
        try {
            StringBuilder outputNames = new StringBuilder();
            DropOffPlace dropOffPlace = (DropOffPlace) Namespace.lookup(RequestUtil.sanitizeParameter(namespaceName));

            for (String filter : outputFilterNames) {
                try {
                    IDropOffFilter f = dropOffPlace.getFilter(filter);
                    if (f != null) {
                        f.close();
                        outputNames.append(" ").append(filter);
                    }
                } catch (RuntimeException ex) {
                    outputNames.append(" ").append(filter).append("-FAILED");
                    logger.error("Could not roll " + filter, ex);
                }
            }

            ResourceWatcher rw = ResourceWatcher.lookup();
            if (rw != null) {
                rw.logStats(logger);
                rw.resetStats();
                outputNames.append(" ").append("ResourceStats");
            }

            return Response.ok().entity("Output Rolled: " + outputNames).build();
        } catch (NamespaceException | RuntimeException ex) {
            logger.warn("Could not roll outputs", ex);
            return Response.ok().entity("Could not roll outputs: " + ex.toString()).build();
        }
    }
}