/**
 *  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 *  WSO2 Inc. 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.synapse.message.processor;

import org.apache.synapse.ManagedLifecycle;
import org.apache.synapse.Nameable;
import org.apache.synapse.SynapseArtifact;
import org.apache.synapse.aspects.AspectConfigurable;
import org.apache.synapse.aspects.flow.statistics.data.artifact.ArtifactHolder;
import org.apache.synapse.message.MessageConsumer;

import java.util.List;
import java.util.Map;

public interface MessageProcessor extends ManagedLifecycle, Nameable, SynapseArtifact, AspectConfigurable {
    /**
     * This method is used to start the message processor. Once the message processor is started
     * it will start receiving messages
     * @return {@code true} if successful, {@code false} otherwise
     */
    boolean start();

    /**
     * This method is used to stop the message processor. Once the the message processor is stopped
     * it will no longer receive messages. A stopped message processor cannot re restarted without
     * re-instantiating.
     * @return {@code true} if successful, {@code false} otherwise
     */
    boolean stop();

    /**
     * This method is used to deactivate the message processor. This will temporarily halt executing services.
     * @return {@code true} if successful, {@code false} otherwise
     */
    boolean deactivate();

    /**
     * This method is used to activate a deactivated message processor. Activating message processor
     * will cause the services to start
     * @return {@code true} if successful, {@code false} otherwise
     */
    boolean activate();

    /**
     * This method is used to see if the message processor is deactivated.
     * @return {@code true} if successful, {@code false} otherwise
     */
    boolean isDeactivated();

    /**
     * This method is used to see if the server is shutting down.
     * @return {@code true} if shutting down, {@code false} otherwise
     */
    boolean isServerShuttingDown();

    /**
     * This method is used to set the associated message store of the message processor. Every message processor
     * has to be bound to a message store
     * @param messageStoreName Name of this message store.
     */
    void setMessageStoreName(String messageStoreName);

    /**
     * This method returns the associated message store name of the message processor.
     * @return Name of this message store.
     */
    String getMessageStoreName();

    /**
     * This method is used to set configuration parameters of the message processor. For example, triggering interval
     * retrying interval, and etc.
     * @param parameters Message processor parameters.
     */
    void setParameters(Map<String,Object> parameters);

    /**
     * This method is used to retrieve the configuration parameters of message processor.
     * @return the extracted parameters of the message processor configuration
     */
    Map<String , Object> getParameters();

    /**
     * This method is used to set the actual configuration file. This file has all the configuration related
     * to particular message processor.
     * @param fileName is the name of the file
     */
    void setFileName(String fileName);

    /**
     * This method is used to retrieve the configuration file name of the message processor.
     * @return the file name
     */
    String getFileName();

    /**
     * This method is used to set the message consumer of message processor. Consumer is the one who is
     * responsible for retrieving messages from a store.
     * @param messageConsumer is the name of the associated message consumer
     * @return is true if the message if the message consumer is returned successfully. Otherwise false.
     */
    boolean setMessageConsumer(MessageConsumer messageConsumer);

    /**
     * This method retrieves the message consumer of message processor.
     * @return the message consumer
     */
    List<MessageConsumer> getMessageConsumer();

    /**
     * This method set the target endpoint associated with the message processor. Without a target endpoint
     * a message processor could not operated successfully.
     * @param targetEndpoint is the name of the associated endpoint
     */
    void setTargetEndpoint(String targetEndpoint);

    /**
     * This method is used to retrieve the associated target endpoint name of the message processor.
     * @return The name of the endpoint
     */
    String getTargetEndpoint();

    /**
     * This method is only used by the associated forwarding services of message processors.
     * When the service fails to send the message to the backend it pauses the message processor and
     * starts retrying. Pausing the message processor avoids re-triggering new services till the existing
     * service succeed.
     */
    void pauseService();

    /**
     * This is the opposite of pauseService method. This method resumes a paused method.
     */
    void resumeService();

    /**
     * This method is used to check if the state is in paused mode.
     * @return returns true on success.
     */
    boolean isPaused();
    
    /**
     * This method is used to cleanup local resources such as JMS connections
     * used by the message processor.
     */
    void cleanupLocalResources();

    /**
     * Whether the message processor edited through the management console
     * @return isEdited
     */
    public boolean isEdited();

    /**
     * Set whether the message processor edited through the management console
     * @param isEdited
     */
    public void setIsEdited(boolean isEdited);

    /**
     * Get the name of the artifact container from which the message processor deployed
     * @return artifactContainerName
     */
    public String getArtifactContainerName();

    /**
     * Set the name of the artifact container from which the message processor deployed
     * @param artifactContainerName
     */
    public void setArtifactContainerName(String artifactContainerName);

    /**
     * Execute clean up tasks of a message processor which were
     * deactivated remotely in cluster mode
     */
    public void cleanUpDeactivatedProcessors();

    /**
     * Execute pause tasks of a message processor in cluster mode
     */
    public void pauseMessageProcessorTemporarily();

    /**
     * Execute resume tasks of a message processor in cluster mode
     */
    public void resumeRemotely();

    public void setComponentStatisticsId(ArtifactHolder holder);
}
