/*
 * 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.lenya.cms.publication;

import org.apache.lenya.exceptions.ResourceNotFoundException;
/**
 * A DocumentIdentityMap avoids the multiple instanciation of a document object.
 * 
 */
public interface DocumentFactory {

    /**
     * Returns a document.
     * @param identifier The identifier of the document.
     * @return A document.
     * @throws ResourceNotFoundException if the document does not exist.
     */
    Document get(DocumentIdentifier identifier) throws ResourceNotFoundException;
    
    /**
     * Returns a document.
     * @param publication The publication.
     * @param area The area.
     * @param uuid The document ID.
     * @param language The language.
     * @return A document.
     * @throws ResourceNotFoundException if the document does not exist.
     */
    //florent : document don't depend on a publication or area
    //Document get(Publication publication, String area, String uuid, String language)
    Document get(String uuid, String language)
            throws ResourceNotFoundException;

    /**
     * Returns a revision of a document.
     * @param publication The publication.
     * @param area The area.
     * @param uuid The document ID.
     * @param language The language.
     * @param revision The revision..
     * @return A document.
     * @throws ResourceNotFoundException if the document does not exist.
     */
    //florent Document get(Publication publication, String area, String uuid, String language, int revision)
    Document get(String uuid, String language, int revision)
            throws ResourceNotFoundException;

    /**
     * Returns the document identified by a certain web application URL.
     * @param webappUrl The web application URL.
     * @return A document.
     * @throws ResourceNotFoundException if an error occurs.
     */
    Document getFromURL(String webappUrl) throws ResourceNotFoundException;

    /**
     * Builds a document for the default language.
     * @param publication The publication.
     * @param area The area.
     * @param uuid The document UUID.
     * @return A document.
     * @throws ResourceNotFoundException if an error occurs.
     */
    //florent Document get(Publication publication, String area, String uuid)
    Document get(String uuid)
            throws ResourceNotFoundException;

    /**
     * Checks if a webapp URL represents a document.
     * @param webappUrl A web application URL.
     * @return A boolean value.
     */
    boolean isDocument(String webappUrl);
    
    /**
     * @return The session.
     */
    //Session getSession();
    
    /**
     * @param id The publication ID.
     * @return A publication.
     * @throws PublicationException if the publication does not exist.
     */
    //Publication getPublication(String id) throws PublicationException;
    
    /**
     * @return All publication IDs.
     */
    //String[] getPublicationIds();
    
    /**
     * @param id The publication ID.
     * @return If a publication with this ID exists.
     */
    /*boolean existsPublication(String id);
    
    void setPublicationManager(PublicationManager pubManager);
    
    PublicationManager getPublicationManager();*/

}
