/*******************************************************************************
 * Copyright (c) 2003, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.internal.emf.resource;



import org.eclipse.emf.ecore.resource.Resource;

public interface ReferencedResource extends Resource, CompatibilityXMIResource {
	//TODO - rename packaged

	public static final String DELETED_ERROR_MSG = "This resource has been deleted and can no longer be used."; //$NON-NLS-1$

	public static final int RESOURCE_WAS_SAVED = 601;
	
	/**
	 * A flag used to indicate a ReferencedResource is about
	 * to save.
	 */
	public static final int RESOURCE_ABOUT_TO_SAVE = 602;
	
	/**
	 * A flag used to indicate a ReferencedResource has failed
	 * to save.
	 */
	public static final int RESOURCE_SAVE_FAILED = 603;

	/**
	 * Access this resource for read only. This call increments the use read count of this resource.
	 * Clients should call this method before they use the resource. They should call
	 * releaseFromRead() after they are done modifying this resource.
	 */
	void accessForRead();

	/**
	 * Access this resource for write only. This call increments the use write count of this
	 * resource. Clients should call this method before they modify the resource. They should call
	 * releaseFromWrite() after they are done modifying this resource.
	 */
	void accessForWrite();

	/**
	 * Return true if this resource has just been loaded and not yet accessed for read or write.
	 */
	boolean isNew();

	/**
	 * Return true if this resource does not have any write references.
	 */
	boolean isReadOnly();

	/**
	 * Return true if this resource is shared for read or write by more than one accessor.
	 */
	boolean isShared();

	/**
	 * Return true if this resource is shared for write by more than one accessor.
	 */
	boolean isSharedForWrite();

	/**
	 * Release read the access to this resource. This call decrements the use count of this resource
	 * and will remove the resource from its resource set if the use count goes to 0. Clients should
	 * call this method when they are done accessing the resource and only after they have called
	 * accessForRead() to obtain access.
	 */
	void releaseFromRead();

	/**
	 * Release write the access to this resource. This call decrements the write count of this
	 * resource and will remove the resource from its resource set if the use count goes to 0.
	 * Clients should call this method when they are done accessing the resource and only after they
	 * have called accessForWrite() to obtain access.
	 */
	void releaseFromWrite();

	/**
	 * Saves this resource only if the write count is equal to 1.
	 */
	void saveIfNecessary() throws Exception;

	/**
	 * Return true if this resource is dirty and is not shared for write.
	 */
	boolean needsToSave();



	/**
	 * Set whether we should allow a refresh to take place even when this resource is dirty.
	 * 
	 * @param b
	 */
	void setForceRefresh(boolean b);

	/**
	 * Return whether we should allow a refresh to take place even when this resource is dirty.
	 */
	boolean shouldForceRefresh();

	boolean wasReverted();

	/**
	 * Returns the number of open read accesses on this resource
	 * 
	 * @return
	 */
	int getReadCount();

	/**
	 * Returns the number of open write accesses on this resource
	 * 
	 * @return
	 */
	int getWriteCount();

	/**
	 * If the resource is no longer being accessed, then remove it from the resource set.
	 */
	void unloadIfNecessary();
}
