/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.content;

import java.io.IOException;
import java.sql.SQLException;

import org.dspace.authorize.AuthorizeException;
import org.dspace.eperson.EPerson;

/**
 * Interface for manipulating in-progress submissions, without having to know at
 * which stage of submission they are (in workspace or workflow system)
 * 
 * @author Robert Tansley
 * @version $Revision$
 */
public interface InProgressSubmission
{
    /**
     * Get the internal ID of this submission
     * 
     * @return the internal identifier
     */
    int getID();

    /**
     * Deletes submission wrapper, doesn't delete item contents
     */
    void deleteWrapper() throws SQLException, IOException, AuthorizeException;

    /**
     * Update the submission, including the unarchived item.
     */
    void update() throws SQLException, AuthorizeException;

    /**
     * Get the incomplete item object
     * 
     * @return the item
     */
    Item getItem();

    /**
     * Get the collection being submitted to
     * 
     * @return the collection
     */
    Collection getCollection();

    /**
     * Get the submitter
     * 
     * @return the submitting e-person
     */
    EPerson getSubmitter() throws SQLException;

    /**
     * Find out if the submission has (or is intended to have) more than one
     * associated bitstream.
     * 
     * @return <code>true</code> if there is to be more than one file.
     */
    boolean hasMultipleFiles();

    /**
     * Indicate whether the submission is intended to have more than one file.
     * 
     * @param b
     *            if <code>true</code>, submission may have more than one
     *            file.
     */
    void setMultipleFiles(boolean b);

    /**
     * Find out if the submission has (or is intended to have) more than one
     * title.
     * 
     * @return <code>true</code> if there is to be more than one file.
     */
    boolean hasMultipleTitles();

    /**
     * Indicate whether the submission is intended to have more than one title.
     * 
     * @param b
     *            if <code>true</code>, submission may have more than one
     *            title.
     */
    void setMultipleTitles(boolean b);

    /**
     * Find out if the submission has been published or publicly distributed
     * before
     * 
     * @return <code>true</code> if it has been published before
     */
    boolean isPublishedBefore();

    /**
     * Indicate whether the submission has been published or publicly
     * distributed before
     * 
     * @param b
     *            <code>true</code> if it has been published before
     */
    void setPublishedBefore(boolean b);
}
