/*
 * 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.sling.event.jobs;

import org.osgi.annotation.versioning.ProviderType;


/**
 * This is a job queue processing job events.
 * @since 3.0
 */
@ProviderType
public interface Queue {

    /**
     * Get the queue name.
     * @return The queue name
     */
    String getName();

    /**
     * Return statistics information about this queue.
     * @return The queue statistics
     */
    Statistics getStatistics();

    /**
     * Get the corresponding configuration.
     * @return The queue configuration
     */
    QueueConfiguration getConfiguration();

    /**
     * Suspend the queue - when a queue is suspended it stops processing
     * jobs - however already started jobs are finished (but not rescheduled).
     * Depending on the queue implementation, the queue is only suspended
     * for a specific time.
     * A queue can be resumed with {@link #resume()}.
     */
    void suspend();

    /**
     * Resume a suspended queue. {@link #suspend()}. If the queue is not
     * suspended, calling this method has no effect.
     * Depending on the queue implementation, if a job failed a job queue might
     * sleep for a configured time, before a new job is processed. By calling this
     * method, the job queue can be woken up and force an immediate reprocessing.
     * This feature is only supported by ordered queues at the moment. If a queue
     * does not support this feature, calling this method has only an effect if
     * the queue is really suspended.
     */
    void resume();

    /**
     * Is the queue currently suspended?
     * @return {code true} if the queue is supsended
     */
    boolean isSuspended();

    /**
     * Remove all outstanding jobs and delete them. This actually cancels
     * all outstanding jobs.
     */
    void removeAll();

    /**
     * Return some information about the current state of the queue. This
     * method is meant to see the internal state of the queue for debugging
     * or monitoring purposes.
     * @return Additional state info
     */
    String getStateInfo();

    /**
     * For monitoring purposes and possible extensions from the different
     * queue types. This method allows to query state information.
     * @param key The key for the state
     * @return The state or {@code null}.
     */
    Object getState(final String key);
}
