/*
 * 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.web;

import java.util.Collection;
import java.util.Map;

import org.apache.nifi.controller.ControllerService;

/**
 * NiFi web context providing limited access to dataflow configuration for
 * component custom UIs.
 */
public interface NiFiWebConfigurationContext {

    /**
     * @param serviceIdentifier of the controller service
     * @param componentId the id of the component that is referencing the controller service
     * @return the ControllerService for the specified identifier. If a
     * corresponding service cannot be found, null is returned. If this NiFi is
     * clustered, the only services available will be those those availability
     * is NCM only
     */
    ControllerService getControllerService(String serviceIdentifier, String componentId);

    /**
     * Provides a mechanism for custom UIs to save actions to appear in NiFi
     * configuration history. Note all fields within each Action must be
     * populated. Null values will result in a failure to insert the audit
     * record. Since the saving to these actions is separate from the actual
     * configuration change, a failure to insert here will just generate a
     * warning log message. The recording of these actions typically happens
     * after a configuration change is applied. Since those changes have already
     * been applied to the flow, we cannot revert them because of a failure to
     * insert an audit record.
     *
     * @param requestContext context of the request
     * @param actions to save
     * @throws IllegalArgumentException When the requestContext isn't fully
     * populated or isn't appropriate for the given request
     */
    void saveActions(NiFiWebRequestContext requestContext, Collection<ConfigurationAction> actions);

    /**
     * @return the current user identity. The value may be a DN, an email, a username, or any string that identities the user. Returns null if no user is found
     */
    String getCurrentUserIdentity();

    /**
     * Sets the annotation data for the underlying component.
     *
     * @param configurationContext config context
     * @param annotationData the data
     * @param properties component properties
     * @return the configuration for the underlying component
     * @throws ResourceNotFoundException if the underlying component does not
     * exit
     * @throws InvalidRevisionException if a revision other than the current
     * revision is given
     * @throws ClusterRequestException if the annotation data was unable to be
     * set for the underlying component. This exception will only be thrown when
     * operating in a cluster.
     * @throws IllegalArgumentException When the requestContext isn't fully
     * populated or isn't appropriate for the given request
     */
    ComponentDetails updateComponent(NiFiWebConfigurationRequestContext configurationContext, String annotationData, Map<String, String> properties)
            throws ResourceNotFoundException, InvalidRevisionException, ClusterRequestException;


    /**
     * Gets the details for the underlying component (including configuration,
     * validation errors, and annotation data).
     *
     * @param requestContext context of request
     * @return the configuration for the underlying component
     * @throws ResourceNotFoundException if the underlying component does not
     * exit
     * @throws ClusterRequestException if the underlying component was unable to
     * be retrieved from the cluster. This exception will only be thrown when
     * operating in a cluster.
     * @throws IllegalArgumentException When the requestContext isn't fully
     * populated or isn't appropriate for the given request
     */
    ComponentDetails getComponentDetails(NiFiWebRequestContext requestContext) throws ResourceNotFoundException, ClusterRequestException;
}
