/**
 * 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.camel.api.management.mbean;

import org.apache.camel.api.management.ManagedAttribute;

public interface ManagedErrorHandlerMBean {

    @ManagedAttribute(description = "Camel ID")
    String getCamelId();

    @ManagedAttribute(description = "Camel ManagementName")
    String getCamelManagementName();

    @ManagedAttribute(description = "Does the error handler support redelivery")
    boolean isSupportRedelivery();

    @ManagedAttribute(description = "Is this error handler a dead letter channel")
    boolean isDeadLetterChannel();

    @ManagedAttribute(description = "When a message is moved to dead letter channel is it the original message or recent message")
    boolean isDeadLetterUseOriginalMessage();

    @ManagedAttribute(description = "Does this error handler handle new exceptions which may occur during error handling")
    boolean isDeadLetterHandleNewException();

    @ManagedAttribute(description = "Does this error handler support transactions")
    boolean isSupportTransactions();

    @ManagedAttribute(description = "Endpoint Uri for the dead letter channel where dead message is move to", mask = true)
    String getDeadLetterChannelEndpointUri();

    @ManagedAttribute(description = "Number of Exchanges scheduled for redelivery (waiting to be redelivered in the future)")
    Integer getPendingRedeliveryCount();

    @ManagedAttribute(description = "RedeliveryPolicy for maximum redeliveries")
    Integer getMaximumRedeliveries();

    @ManagedAttribute(description = "RedeliveryPolicy for maximum redeliveries")
    void setMaximumRedeliveries(Integer maximum);

    @ManagedAttribute(description = "RedeliveryPolicy for maximum redelivery delay")
    Long getMaximumRedeliveryDelay();

    @ManagedAttribute(description = "RedeliveryPolicy for maximum redelivery delay")
    void setMaximumRedeliveryDelay(Long delay);

    @ManagedAttribute(description = "RedeliveryPolicy for redelivery delay")
    Long getRedeliveryDelay();

    @ManagedAttribute(description = "RedeliveryPolicy for redelivery delay")
    void setRedeliveryDelay(Long delay);

    @ManagedAttribute(description = "RedeliveryPolicy for backoff multiplier")
    Double getBackOffMultiplier();

    @ManagedAttribute(description = "RedeliveryPolicy for backoff multiplier")
    void setBackOffMultiplier(Double multiplier);

    @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance factor")
    Double getCollisionAvoidanceFactor();

    @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance factor")
    void setCollisionAvoidanceFactor(Double factor);

    @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance percent")
    Double getCollisionAvoidancePercent();

    @ManagedAttribute(description = "RedeliveryPolicy for collision avoidance percent")
    void setCollisionAvoidancePercent(Double percent);

    @ManagedAttribute(description = "RedeliveryPolicy for delay pattern")
    String getDelayPattern();

    @ManagedAttribute(description = "RedeliveryPolicy for delay pattern")
    void setDelayPattern(String pattern);

    @ManagedAttribute(description = "RedeliveryPolicy for logging level when retries exhausted")
    String getRetriesExhaustedLogLevel();

    @ManagedAttribute(description = "RedeliveryPolicy for logging level when retries exhausted")
    void setRetriesExhaustedLogLevel(String level);

    @ManagedAttribute(description = "RedeliveryPolicy for logging level when attempting retry")
    String getRetryAttemptedLogLevel();

    @ManagedAttribute(description = "RedeliveryPolicy for logging level when attempting retry")
    void setRetryAttemptedLogLevel(String level);

    @ManagedAttribute(description = "RedeliveryPolicy for logging stack traces")
    Boolean getLogStackTrace();

    @ManagedAttribute(description = "RedeliveryPolicy for logging stack traces")
    void setLogStackTrace(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging redelivery stack traces")
    Boolean getLogRetryStackTrace();

    @ManagedAttribute(description = "RedeliveryPolicy for logging redelivery stack traces")
    void setLogRetryStackTrace(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging handled exceptions")
    Boolean getLogHandled();

    @ManagedAttribute(description = "RedeliveryPolicy for logging handled exceptions")
    void setLogHandled(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging new exceptions")
    Boolean getLogNewException();

    @ManagedAttribute(description = "RedeliveryPolicy for logging new exceptions")
    void setLogNewException(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted with message history")
    Boolean getLogExhaustedMessageHistory();

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted with message history")
    void setLogExhaustedMessageHistory(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted with message history")
    Boolean getLogExhaustedMessageBody();

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted with message body")
    void setLogExhaustedMessageBody(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging handled and continued exceptions")
    Boolean getLogContinued();

    @ManagedAttribute(description = "RedeliveryPolicy for logging handled and continued exceptions")
    void setLogContinued(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted exceptions")
    Boolean getLogExhausted();

    @ManagedAttribute(description = "RedeliveryPolicy for logging exhausted exceptions")
    void setLogExhausted(Boolean log);

    @ManagedAttribute(description = "RedeliveryPolicy for using collision avoidance")
    Boolean getUseCollisionAvoidance();

    @ManagedAttribute(description = "RedeliveryPolicy for using collision avoidance")
    void setUseCollisionAvoidance(Boolean avoidance);

    @ManagedAttribute(description = "RedeliveryPolicy for using exponential backoff")
    Boolean getUseExponentialBackOff();

    @ManagedAttribute(description = "RedeliveryPolicy for using exponential backoff")
    void setUseExponentialBackOff(Boolean backoff);

    @ManagedAttribute(description = "RedeliveryPolicy for allow redelivery while stopping")
    Boolean getAllowRedeliveryWhileStopping();

    @ManagedAttribute(description = "RedeliveryPolicy for allow redelivery while stopping")
    void setAllowRedeliveryWhileStopping(Boolean allow);

}