/**
 * Copyright 2010 JBoss Inc
 *
 * Licensed 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.eclipse.webdav;

/**
 * Locators encapsulate a resource URL, whether it is
 * a stable URL (such as a version URL) or a dynamic URL,
 * and optional label selector.
 * <p>
 * The locator 'knows' if the resource URL is stable or not.
 * Note that a stable URL cannot also have a label selector.</p>
 * <p>
 * <b>Note:</b> This class/interface is part of an interim API that is still under 
 * development and expected to change significantly before reaching stability. 
 * It is being made available at this early stage to solicit feedback from pioneering 
 * adopters on the understanding that any code that uses this API will almost 
 * certainly be broken (repeatedly) as the API evolves.
 * </p>
 */
public interface ILocator {
	/**
	 * Returns the label selector value of this locator, 
	 * or <code>null</code> if there is no label selector.
	 * <p>
	 * For certain methods (e.g. GET, PROPFIND), if the
	 * request-URL identifies a version-controlled resource,
	 * a label can be specified in a Label request header
	 * to cause the method to be applied to the version
	 * selected by that label from the version history of
	 * that version-controlled resource.</p>
	 * <p>
	 * Note that a stable URL must not have a locator label.</p>
	 *
	 * @return the label as a <code>String</code> or <code>null
	 * </code> if there is no label specified.
	 */
	public String getLabel();

	/**
	 * Returns a resource URL.
	 * <p>
	 * If there is no label specified, the URL properly identifies the
	 * resource.  However, if there is a label, the resource URL
	 * identiifes a version-controlled resource whose history contains
	 * the version whose label is the target of this locator.</p>
	 * <p>
	 * In typical usage, and with no label header, this URL may be the
	 * HTTP request URI or the destination header URI.</p>
	 *
	 * @return the String representation of the resource URL.
	 */
	public String getResourceURL();

	/**
	 * Returns whether the resource URL of this locator is stable.
	 * <p>
	 * A stable URL is a server-generated URL that cannot be moved
	 * and do not mecessarily conform to the DAV namespace.  For
	 * example, version URLs are server generated and do not have
	 * to appear in any DAV collection.  Version URLs and version
	 * history URLs are stable URLs.</p>
	 *
	 * @return true if the resource URL is stable, and false otherwise.
	 */
	public boolean isStable();
}
