blob: e1e4352721887c6c4ad25716d9dfd67cdbc4fc06 [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.nifi.components.state;
import java.io.IOException;
import java.util.Map;
import org.apache.nifi.components.ConfigurableComponent;
/**
* <p>
* Provides a mechanism by which components can store and retrieve state. Depending on the Provider, the state
* may be stored locally, or it may be stored on a remote resource.
* </p>
*
* <p>
* Which implementation should be used for local and clustered state is configured in the NiFi properties file.
* It is therefore possible to provide custom implementations of this interface. Note, however, that this interface
* is new as of version 0.5.0 of Apache NiFi and may not be considered "stable" as of yet. Therefore, it is subject
* to change without notice, so providing custom implementations is cautioned against until the API becomes more stable.
* </p>
*
* @since 0.5.0
*/
public interface StateProvider extends ConfigurableComponent {
/**
* Initializes the StateProvider so that it is capable of being used. This method will be called
* once before any of the other methods are called and will not be called again until the {@link #shutdown()}
* method has been called
*
* @param context the initialization context that can be used to prepare the state provider for use
*/
void initialize(StateProviderInitializationContext context) throws IOException;
/**
* Shuts down the StateProvider and cleans up any resources held by it. Once this method has returned, the
* StateProvider may be initialized once again via the {@link #initialize(StateProviderInitializationContext)} method.
*/
void shutdown();
/**
* Updates the value of the component's state, setting the new value to the
* given state
*
* @param state the value to change the state to
* @param componentId the id of the component for which state is being set
*
* @throws IOException if unable to communicate with the underlying storage mechanism
*/
void setState(Map<String, String> state, String componentId) throws IOException;
/**
* Returns the currently configured state for the component. The returned StateMap will never be null.
* The version of the StateMap will be -1 and the state will contain no key/value pairs if the state has never been set.
*
* @param componentId the id of the component for which state is to be retrieved
* @return the currently configured value for the component's state
*
* @throws IOException if unable to communicate with the underlying storage mechanism
*/
StateMap getState(String componentId) throws IOException;
/**
* Updates the value of the component's state to the new value if and only if the value currently
* is the same as the given oldValue.
*
* @param oldValue the old value to compare against
* @param newValue the new value to use if and only if the state's value is the same as the given oldValue
* @param componentId the id of the component for which state is being retrieved
* @return <code>true</code> if the state was updated to the new value, <code>false</code> if the state's value was not
* equal to oldValue
*
* @throws IOException if unable to communicate with the underlying storage mechanism
*/
boolean replace(StateMap oldValue, Map<String, String> newValue, String componentId) throws IOException;
/**
* Removes all values from the component's state that is stored using the given scope
*
* @param componentId the id of the component for which state is being cleared
*
* @throws IOException if unable to communicate with the underlying storage mechanism
*/
void clear(String componentId) throws IOException;
/**
* This method is called whenever a component is removed from the NiFi instance. This allows the State Provider to
* perform tasks when a component is removed in order to clean up resources that may be associated with that component
*
* @param componentId the ID of the component that was added to the NiFi instance
* @throws IOException if unable to perform the necessary cleanup
*/
void onComponentRemoved(String componentId) throws IOException;
/**
* Notifies the state provider that it should begin servicing requests to store and retrieve state
*/
void enable();
/**
* Notifies the state provider that it should stop servicing requests to store and retrieve state and instead throw a ProviderDisabledException if any request is made to do so
*/
void disable();
/**
* @return <code>true</code> if the provider is enabled, <code>false</code> otherwise.
*/
boolean isEnabled();
/**
* Provides a listing of {@link Scope}s supported by the StateProvider
* @return the {@link Scope}s supported by the configuration
*/
Scope[] getSupportedScopes();
}