package org.opennms.web.rest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.commons.lang.StringUtils;
import org.opennms.core.criteria.Alias.JoinType;
import org.opennms.core.criteria.Criteria;
import org.opennms.core.criteria.CriteriaBuilder;
import org.opennms.core.criteria.Fetch.FetchType;
import org.opennms.core.utils.LogUtils;
import org.opennms.netmgt.model.OnmsAlarm;
import org.opennms.netmgt.model.OnmsSeverity;
public class AlarmRestServiceBase extends OnmsRestService {
protected static final Pattern m_severityPattern;
static {
final String severities = StringUtils.join(OnmsSeverity.names(), "|");
m_severityPattern = Pattern.compile("\\s+(\\{alias\\}.)?severity\\s*(\\!\\=|\\<\\>|\\<\\=|\\>\\=|\\=|\\<|\\>)\\s*'?(" + severities + ")'?");
}
protected Criteria getCriteria(final MultivaluedMap<String,String> params, final boolean stripOrdering) {
final CriteriaBuilder cb = getCriteriaBuilder(params, stripOrdering);
final Criteria criteria = cb.toCriteria();
LogUtils.debugf(this, "criteria = %s", criteria);
return criteria;
}
protected CriteriaBuilder getCriteriaBuilder(final MultivaluedMap<String, String> params, final boolean stripOrdering) {
translateParameters(params);
final CriteriaBuilder cb = new CriteriaBuilder(OnmsAlarm.class);
cb.fetch("firstEvent", FetchType.EAGER);
cb.fetch("lastEvent", FetchType.EAGER);
cb.alias("node", "node", JoinType.LEFT_JOIN);
cb.alias("node.snmpInterfaces", "snmpInterface", JoinType.LEFT_JOIN);
cb.alias("node.ipInterfaces", "ipInterface", JoinType.LEFT_JOIN);
if (params.containsKey("alarmId")) {
if (params.containsKey("id")) {
throw new IllegalArgumentException("Form parameters contain both the 'alarmId' and 'id' properties! Pick a side!");
}
params.put("id", params.remove("alarmId"));
}
applyQueryFilters(params, cb);
if (stripOrdering) {
cb.clearOrder();
cb.limit(DEFAULT_LIMIT);
cb.offset(0);
} else {
cb.orderBy("lastEventTime").desc();
}
cb.distinct();
return cb;
}
protected void translateParameters(final MultivaluedMap<String, String> params) {
// this is handled by a @QueryParam annotation, ignore it from the UriInfo object
params.remove("severities");
if (params.containsKey("nodeId")) {
final String nodeId = params.getFirst("nodeId");
params.remove("nodeId");
params.add("node.id", nodeId);
}
if (params.containsKey("nodeLabel")) {
final String nodeLabel = params.getFirst("nodeLabel");
params.remove("nodeLabel");
params.add("node.label", nodeLabel);
}
final String query = params.getFirst("query");
// System.err.println("tranlateSeverity: query = " + query + ", pattern = " + p);
if (query != null) {
final Matcher m = m_severityPattern.matcher(query);
if (m.find()) {
// System.err.println("translateSeverity: group(1) = '" + m.group(1) + "', group(2) = '" + m.group(2) + "', group(3) = '" + m.group(3) + "'");
final String alias = m.group(1);
final String comparator = m.group(2);
final String severity = m.group(3);
final OnmsSeverity onmsSeverity = OnmsSeverity.get(severity);
// System.err.println("translateSeverity: " + severity + " = " + onmsSeverity);
final String newQuery = m.replaceFirst(" " + (alias == null? "" : alias) + "severity " + comparator + " " + onmsSeverity.getId());
params.remove("query");
params.add("query", newQuery);
// System.err.println("translateSeverity: newQuery = '" + newQuery + "'");
} else {
// System.err.println("translateSeverity: failed to find pattern");
}
}
}
}