/**
 * 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.activemq.broker.jmx;

import java.util.Map;

import javax.management.openmbean.CompositeData;
import javax.management.openmbean.OpenDataException;

public interface QueueViewMBean extends DestinationViewMBean {

    /**
     * Retrieve a message from the destination's queue.
     * 
     * @param messageId the message id of the message to retrieve
     * @return A CompositeData object which is a JMX version of the messages
     * @throws OpenDataException
     */
    @MBeanInfo("View a message from the destination by JMS message ID.")
    CompositeData getMessage(@MBeanInfo("messageId") String messageId) throws OpenDataException;

    /**
     * Removes a message from the queue. If the message has already been
     * dispatched to another consumer, the message cannot be deleted and this
     * method will return false.
     * 
     * @param messageId
     * @return true if the message was found and could be successfully deleted.
     * @throws Exception
     */
    @MBeanInfo("Remove a message from the destination by JMS message ID.  If the message has been dispatched, it cannot be deleted and false is returned.")
    boolean removeMessage(@MBeanInfo("messageId") String messageId) throws Exception;

    /**
     * Removes the messages matching the given selector
     * 
     * @return the number of messages removed
     */
    @MBeanInfo("Removes messages from the destination based on an SQL-92 selection on the message headers or XPATH on the body.")
    int removeMatchingMessages(@MBeanInfo("selector") String selector) throws Exception;

    /**
     * Removes the messages matching the given selector up to the maximum number
     * of matched messages
     * 
     * @return the number of messages removed
     */
    @MBeanInfo("Removes up to a specified number of messages from the destination based on an SQL-92 selection on the message headers or XPATH on the body.")
    int removeMatchingMessages(@MBeanInfo("selector") String selector, @MBeanInfo("maximumMessages") int maximumMessages) throws Exception;

    /**
     * Removes all of the messages in the queue.
     * 
     * @throws Exception
     */
    @MBeanInfo("Removes all of the messages in the queue.")
    void purge() throws Exception;

    /**
     * Copies a given message to another destination.
     * 
     * @param messageId
     * @param destinationName
     * @return true if the message was found and was successfully copied to the
     *         other destination.
     * @throws Exception
     */
    @MBeanInfo("Copies a message with the given JMS message ID into the specified destination.")
    boolean copyMessageTo(@MBeanInfo("messageId") String messageId, @MBeanInfo("destinationName") String destinationName) throws Exception;

    /**
     * Copies the messages matching the given selector
     * 
     * @return the number of messages copied
     */
    @MBeanInfo("Copies messages based on an SQL-92 selecton on the message headers or XPATH on the body into the specified destination.")
    int copyMatchingMessagesTo(@MBeanInfo("selector") String selector, @MBeanInfo("destinationName") String destinationName) throws Exception;

    /**
     * Copies the messages matching the given selector up to the maximum number
     * of matched messages
     * 
     * @return the number of messages copied
     */
    @MBeanInfo("Copies up to a specified number of messages based on an SQL-92 selecton on the message headers or XPATH on the body into the specified destination.")
    int copyMatchingMessagesTo(@MBeanInfo("selector") String selector, @MBeanInfo("destinationName") String destinationName, @MBeanInfo("maximumMessages") int maximumMessages) throws Exception;

    /**
     * Moves the message to another destination.
     * 
     * @param messageId
     * @param destinationName
     * @return true if the message was found and was successfully copied to the
     *         other destination.
     * @throws Exception
     */
    @MBeanInfo("Moves a message with the given JMS message ID into the specified destination.")
    boolean moveMessageTo(@MBeanInfo("messageId") String messageId, @MBeanInfo("destinationName") String destinationName) throws Exception;

    /**
     * Moves a message back to its original destination
     */
    @MBeanInfo("Moves a message with the given JMS message back to its original destination")
    boolean retryMessage(@MBeanInfo("messageId") String messageId) throws Exception;
    
    /**
     * Moves the messages matching the given selector
     * 
     * @return the number of messages removed
     */
    @MBeanInfo("Moves messages based on an SQL-92 selecton on the message headers or XPATH on the body into the specified destination.")
    int moveMatchingMessagesTo(@MBeanInfo("selector") String selector, @MBeanInfo("destinationName") String destinationName) throws Exception;

    /**
     * Moves the messages matching the given selector up to the maximum number
     * of matched messages
     */
    @MBeanInfo("Moves up to a specified number of messages based on an SQL-92 selecton on the message headers or XPATH on the body into the specified destination.")
    int moveMatchingMessagesTo(@MBeanInfo("selector") String selector, @MBeanInfo("destinationName") String destinationName, @MBeanInfo("maximumMessages") int maximumMessages) throws Exception;

    /**
     * Retries messages sent to the DLQ
     */
    @MBeanInfo("Retries messages sent to the DLQ")
    public int retryMessages() throws Exception;
    
    /**
     * @return true if the message cursor has memory space available
     * to page in more messages
     */
    @MBeanInfo("Message cursor has memory space available")
    public boolean doesCursorHaveSpace();
    
    /**
     * @return true if the cursor has reached its memory limit for
     * paged in messages
     */
    @MBeanInfo("Message cusor has reached its memory limit for paged in messages")
    public boolean isCursorFull();
    
    /**
     * @return true if the cursor has messages buffered to deliver
     */
    @MBeanInfo("Message cursor has buffered messages to deliver")
    public boolean doesCursorHaveMessagesBuffered();
    
    /**
     * @return the cursor memory usage in bytes
     */
    @MBeanInfo("Message cursor memory usage, in bytes.")
    public long getCursorMemoryUsage();
    
    /**
     * @return the cursor memory usage as a percentage
     */
    @MBeanInfo("Percentage of memory limit used")
    public int getCursorPercentUsage();
    
    /**
     * @return the number of messages available to be paged in 
     * by the cursor
     */
    @MBeanInfo("Number of messages available to be paged in by the cursor.")
    public int cursorSize();

    /**
     * @return true if caching is currently enabled of for the destination
     */
    @MBeanInfo("Caching is enabled")
    boolean isCacheEnabled();


    /**
     * @return a Map of groupNames and ConsumerIds
     */
    @MBeanInfo("Map of groupNames and ConsumerIds")
    Map<String,String> getMessageGroups();

    /**
     * @return the message group type implementation (simple,bucket,cached)
     */
    @MBeanInfo("group  implementation (simple,bucket,cached)")
    String getMessageGroupType();

    /**
     * remove a message group = has the effect of rebalancing group
     * @param groupName
     */

    @MBeanInfo("remove a message group by its groupName")
    void removeMessageGroup(@MBeanInfo("groupName")String groupName);

    /**
     * remove all the message groups - will rebalance all message groups across consumers
     */
    @MBeanInfo("emove all the message groups - will rebalance all message groups across consumers")
    void removeAllMessageGroups();

    @MBeanInfo("pause dispatch to consumers")
    void pause();

    @MBeanInfo("resume dispatch to consumers if paused")
    void resume();

    @MBeanInfo("Dispatch to consumers is paused")
    boolean isPaused();


}
