package org.yamcs.web.rest; import java.util.ArrayList; import java.util.List; import org.yamcs.parameter.ParameterValue; import org.yamcs.parameter.ParameterValueWithId; import org.yamcs.parameter.Value; import org.yamcs.utils.ValueUtility; import org.yamcs.web.InternalServerErrorException; /** * Filters the replay of parameters. Extracted in an abstract class because it's * used in multiple places */ public abstract class RestParameterReplayListener extends RestReplayListener { private boolean noRepeat; private Value lastValue; final protected RestRequest req; /** * */ public RestParameterReplayListener(RestRequest req) { super(); this.req = req; } /** * * @param pos * @param limit */ public RestParameterReplayListener(long pos, int limit, RestRequest req) { super(pos, limit); this.req = req; } public void setNoRepeat(boolean noRepeat) { this.noRepeat = noRepeat; } @Override public List<ParameterValueWithId> filter(List<ParameterValueWithId> params) { if (noRepeat) { List<ParameterValueWithId> plist = new ArrayList<>(); for (ParameterValueWithId pvalid : params) { ParameterValue pval = pvalid.getParameterValue(); if (!ValueUtility.equals(lastValue, pval.getEngValue())) { plist.add(pvalid); } lastValue = pval.getEngValue(); } return (plist.size() > 0) ? plist : null; } else { return params; } } @Override public ParameterValueWithId filter(ParameterValueWithId pvwid) { if (noRepeat) { ParameterValue pval = pvwid.getParameterValue(); if (!ValueUtility.equals(lastValue, pval.getEngValue())) { lastValue = pval.getEngValue(); return pvwid; } else { return null; } } else { return pvwid; } } public void replayFailed(Throwable t){ RestHandler.completeWithError(req, new InternalServerErrorException(t)); } }