/*
 * Copyright (C) 2001, 2002 Red Hat Inc. All Rights Reserved.
 *
 * The contents of this file are subject to the CCM Public
 * License (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.redhat.com/licenses/ccmpl.html
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 */

package com.arsdigita.cms.docmgr;

import java.math.BigDecimal;
import java.net.URL;

/**
 * This interface describes the functionality common to operations
 * on files and folders in the document manager application.
 *
 * Concrete implementations of this interface may vary in the
 * implementation of the data store.  For example, persistent data for
 * resource might be stored in a file system or a database.
 *
 * @author Stefan Deusch (stefan@arsdigita.com)
 * @version $Id: //apps/docmgr-cms/dev/src/com/arsdigita/cms/docmgr/Resource.java#2 $
 */

public interface Resource {

    /**
     * The path-separator character, represented as a string for convenience.
     */

    final static String SEPARATOR = "/";

    /**
     * The path-separator character.
     */

    final static char SEPARATOR_CHAR = SEPARATOR.charAt(0);


    /**
     * Returns the title of the file or folder corresponding to this
     * resource.  Use title instead of name to be CMS friendly
     */
    //String getName();
    String getTitle();

    /**
     * Returns a description of the resource, or null if no
     * description has been provided.
     */
    String getDescription();

    /**
     * Returns the path name of this resource's parent, or null if
     * this resource does not have a parent.
     */
    Resource getParentResource();

    /**
     * Converts this resource into a pathname string.
     */
    String getPath();

    /**
     * Tests whether this resource is a folder.
     */
    boolean isFolder();

    /**
     * Tests whether this resource is a file.
     */
    boolean isFile();

    /**
     * Copies the resource into another location.  Preserves the
     * original name of the resource but places the copy inside a new
     * parent resource.
     *
     * @param parent the parent of the copy
     * @return a copy of the original resource
     */
    Resource copyTo(Resource parent) throws ResourceExistsException;

    /**
     * Copies the resource into another location with a new name.
     *
     * @param name the name of the copy
     * @param parent the parent of the copy
     * @return a copy of the original resource.
     */
    Resource copyTo(String name, Resource parent) throws ResourceExistsException;

    /**
     * Copies the resource into the same location (same parent) with a
     * new name.
     *
     * @param name the name of the copy
     * @return a copy of the original resource.
     */
    Resource copyTo(String name) throws ResourceExistsException;

    /**
     * Returns the pathname string of this resource.
     */
    String toString();

    /**
     * Returns the URL corresponding to this resource.
     */
    URL toURL();

    /**
     * Returns a unique identifier for this resource.
     */
    BigDecimal getID();

    /**
     * Set parent object
     */ 
    void setParentResource(Resource parent);

    /**
     * The usual save operation
     */ 
    void save();

    /**
     * Is this the root?
     */ 
    boolean isRoot();

    /*
     * delete the resource
     */
    void delete();
}
