//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.persistence;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.persistence.refresh.IRefreshListener;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.services.Services;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.ecore.IUmaResourceSet;

/**
 * A resource set that manages a collection of {@link Resource}
 * 
 * @author Phong Nguyen Le
 * @since 1.1
 */
public interface ILibraryResourceSet extends IUmaResourceSet {
	/**
	 * Gets the persistence type this resource set supports
	 * 
	 * @return the persistence type
	 * @see Services#getDefaultLibraryPersistenceType()
	 * @see Services#XMI_PERSISTENCE_TYPE
	 */
	String getPersistenceType();

	/**
	 * Loads method libraries into this resource set from the given URI.
	 * 
	 * @param parameters
	 * @return
	 */
	void loadMethodLibraries(URI uri, Map parameters)
			throws LibraryResourceException;

	/**
	 * Gets the list of method libraries that have been loaded into this
	 * resource set.
	 * 
	 * @return
	 */
	List getMethodLibraries();

	/**
	 * Gets the first loaded method library of this resource set.
	 * 
	 * @return the method library or <code>null</code> if it is not loaded
	 *         yet.
	 * @see #loadLibrary(URI, Map)
	 */
	MethodLibrary getFirstMethodLibrary();

	/**
	 * Gets the object with the specified GUID (Globally Unique Identifier)
	 * 
	 * @param guid
	 * @return
	 */
	EObject getEObject(String guid);

	Map getDefaultSaveOptions();

	/**
	 * Loads the given opposite features of all loaded objects in this resource
	 * set.
	 * 
	 * @param oppositeFeatures
	 */
	void loadOppositeFeatures(List oppositeFeatures);

	/**
	 * Loads the given opposite features of those objects in this resource set
	 * whose GUIDs are specified in <code>GUIDs</code> set.
	 * 
	 * @param oppositeFeatures
	 * @param GUIDs
	 */
	void loadOppositeFeatures(List oppositeFeatures, Set GUIDs);

	/**
	 * Saves this resource set with the given save options.
	 * 
	 * @param options
	 *            save options
	 * @throws LibraryResourceException
	 */
	void save(Map options) throws LibraryResourceException;

	/**
	 * Unloads the given object in this resource set
	 * 
	 * @param object
	 * @return boolean <code>true</code> if the given object was unloaded
	 *         successfully
	 */
	boolean unload(EObject object);

	/**
	 * Unloads the specified resource of this resource set.
	 * 
	 * @param resource
	 * @param options
	 */
	void unload(Resource resource, Map options);

	/**
	 * Reloads the given resources
	 * 
	 * @param resources
	 * @return resources that had been reloaded
	 */
	Collection reloadResources(Collection resources);

	/**
	 * Reloads the given persisted objects.
	 * 
	 * @param objects
	 * @return objects that have been reloaded
	 */
	Collection reloadObjects(Collection objects);

	/**
	 * Unloads this resource set. This will unload every resource in this
	 * resource set and reset the resource set to the state before loading the
	 * library.
	 * 
	 */
	void unload();

	/**
	 * Checks if there is any unresolved proxy detected in the library
	 * 
	 * @return
	 */
	boolean hasUnresolvedProxy();

	/**
	 * Subscribes the specified listener to listen to refresh events broadcasted
	 * whenever resources or objects of this resource set is refreshed/reloaded.
	 * 
	 * @param listener
	 * @see #reloadResources(Collection)
	 */
	void addRefreshListener(IRefreshListener listener);
	
	/**
	 * Unsubscribes the specified listener from listening to refresh events.
	 * 
	 * @param listener
	 */
	void removeRefreshListenter(IRefreshListener listener);

	ILibraryPersister getPersister();

	void checkModify(Resource[] resources, Object context)
			throws LibraryResourceException;

	IStatus checkModify(Collection<EObject> eObjects, Object context);
}
