/**
*
*/
package com.thinkbiganalytics.alerts.api;
/*-
* #%L
* thinkbig-alerts-api
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed 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.
* #L%
*/
import org.joda.time.DateTime;
import java.io.Serializable;
import java.util.Iterator;
import java.util.Optional;
/**
* This provider is the primary facade over one or more alert sources. It allows
* for synchronously retrieving and responding to alerts, as well as registering listeners/
* responders to react to new alerts that enter the system.
*/
public interface AlertProvider {
// TODO: add criteria-based listener/responder alert filtering
/**
* @return a criteria used to filter alerts
*/
AlertCriteria criteria();
/**
* Resolves and reconstitutes one of the acceptable serializable ID formats (such as its toString() form) into
* a valid alert ID.
*
* @param value one of the serializable formats
* @return an alert ID
*/
Alert.ID resolve(Serializable value);
/**
* Registers a listener that will be called whenever the state of an alert
* changes, such as when one is created or responded to by responder that
* responded to an alert and caused its state to change.
*
* @param listener the listener being added
*/
void addListener(AlertListener listener);
/**
* Registers a responder that will be invoked whenever an respondable alert has transitioned new
* state other than CLEARED.
*/
void addResponder(AlertResponder responder);
/**
* Retrieves a specific alert
*
* @param id the alert's ID
* @return the alert, or null if no alert exists with that ID
*/
Optional<Alert> getAlert(Alert.ID id);
/**
* Retrieves alerts matching the given criteria. Specifying null retrieve all known alerts.
*/
Iterator<? extends Alert> getAlerts(AlertCriteria criteria);
/**
* Retrieves all alerts that may have been created after the given time.
*
* @param time the time from which newer alerts should be returned
* @return an iterator on all alerts created after the specified time
*/
Iterator<? extends Alert> getAlertsAfter(DateTime time);
/**
* Retrieves all alerts that may have been created after the given time.
*
* @param time the time from which newer alerts should be returned
* @return an iterator on all alerts created after the specified time
*/
Iterator<? extends Alert> getAlertsBefore(DateTime time);
/**
* Allows a synchronous update of a particular alert using the supplied responder. This method will block
* until the call to the responder has returned.
*
* @param id the ID of the alert to respond to
* @param responder the responder used as a call-back to respond to the alert
*/
void respondTo(Alert.ID id, AlertResponder responder);
}