blob: 4b226564ed507c5a27612d8a182dea98d8058fbc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.metron.indexing.dao.metaalert;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.metron.indexing.dao.search.GetRequest;
import org.apache.metron.indexing.dao.search.InvalidCreateException;
import org.apache.metron.indexing.dao.update.Document;
import org.apache.metron.indexing.dao.update.PatchRequest;
import org.apache.metron.indexing.dao.update.UpdateDao;
public interface MetaAlertUpdateDao extends UpdateDao {
String STATUS_PATH = "/" + MetaAlertConstants.STATUS_FIELD;
String ALERT_PATH = "/" + MetaAlertConstants.ALERT_FIELD;
/**
* Determines if a given patch request is allowed or not. By default patching the 'alert' or
* 'status' fields are not allowed, because they should be updated via the specific methods.
* @param request The patch request to examine
* @return True if patch can be performed, false otherwise
*/
default boolean isPatchAllowed(PatchRequest request) {
if (request.getPatch() != null && !request.getPatch().isEmpty()) {
for (Map<String, Object> patch : request.getPatch()) {
Object pathObj = patch.get("path");
if (pathObj != null && pathObj instanceof String) {
String path = (String) pathObj;
if (STATUS_PATH.equals(path) || ALERT_PATH.equals(path)) {
return false;
}
}
}
}
return true;
}
/**
* Creates a meta alert from a list of child alerts. The most recent version of each child alert is
* retrieved using the DAO abstractions.
*
* @param request A request object containing get requests for alerts to be added and a list of groups
* @return The complete document of the created metaalert.
* @throws InvalidCreateException If a malformed create request is provided
* @throws IOException If a problem occurs during communication
*/
Document createMetaAlert(MetaAlertCreateRequest request)
throws InvalidCreateException, IOException;
/**
* Adds alerts to a metaalert, based on a list of GetRequests provided for retrieval.
* @param metaAlertGuid The GUID of the metaalert to be given new children.
* @param alertRequests GetRequests for the appropriate alerts to add.
* @return The complete metaalert document with the alerts added.
*/
Document addAlertsToMetaAlert(String metaAlertGuid, List<GetRequest> alertRequests)
throws IOException, IllegalStateException;
/**
* Removes alerts from a metaalert
* @param metaAlertGuid The metaalert guid to be affected.
* @param alertRequests A list of GetReqests that will provide the alerts to remove
* @return The complete metaalert document with the alerts removed.
* @throws IOException If an error is thrown during retrieal.
*/
Document removeAlertsFromMetaAlert(String metaAlertGuid, List<GetRequest> alertRequests)
throws IOException, IllegalStateException;
/**
* Removes a metaalert link from a given alert. An nonexistent link performs no change.
* @param metaAlertGuid The metaalert GUID to link.
* @param alert The alert to be linked to.
* @return True if the alert changed, false otherwise.
*/
default boolean removeMetaAlertFromAlert(String metaAlertGuid, Document alert) {
List<String> metaAlertField = new ArrayList<>();
@SuppressWarnings("unchecked")
List<String> alertField = (List<String>) alert.getDocument()
.get(MetaAlertConstants.METAALERT_FIELD);
if (alertField != null) {
metaAlertField.addAll(alertField);
}
boolean metaAlertRemoved = metaAlertField.remove(metaAlertGuid);
if (metaAlertRemoved) {
alert.getDocument().put(MetaAlertConstants.METAALERT_FIELD, metaAlertField);
}
return metaAlertRemoved;
}
/**
* The meta alert status field can be set to either 'active' or 'inactive' and will control whether or not meta alerts
* (and child alerts) appear in search results. An 'active' status will cause meta alerts to appear in search
* results instead of it's child alerts and an 'inactive' status will suppress the meta alert from search results
* with child alerts appearing in search results as normal. A change to 'inactive' will cause the meta alert GUID to
* be removed from all it's child alert's "metaalerts" field. A change back to 'active' will have the opposite effect.
*
* @param metaAlertGuid The GUID of the meta alert
* @param status A status value of 'active' or 'inactive'
* @return The complete metaalert document with the updated status.
* @throws IOException if an error occurs during the update.
*/
Document updateMetaAlertStatus(String metaAlertGuid, MetaAlertStatus status)
throws IOException;
/**
* Adds a metaalert link to a provided alert Document. Adding an existing link does no change.
* @param metaAlertGuid The GUID to be added.
* @param alert The alert we're adding the link to.
* @return True if the alert is modified, false if not.
*/
default boolean addMetaAlertToAlert(String metaAlertGuid, Document alert) {
List<String> metaAlertField = new ArrayList<>();
@SuppressWarnings("unchecked")
List<String> alertField = (List<String>) alert.getDocument()
.get(MetaAlertConstants.METAALERT_FIELD);
if (alertField != null) {
metaAlertField.addAll(alertField);
}
boolean metaAlertAdded = !metaAlertField.contains(metaAlertGuid);
if (metaAlertAdded) {
metaAlertField.add(metaAlertGuid);
alert.getDocument().put(MetaAlertConstants.METAALERT_FIELD, metaAlertField);
}
return metaAlertAdded;
}
}