/*******************************************************************************
 * Copyright (c) 2011 Eike Stepper (Berlin, Germany) 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:
 * Eike Stepper - initial API and implementation
 *******************************************************************************/
package org.eclipse.emf.ecp.spi.core;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecp.core.ECPProject;
import org.eclipse.emf.ecp.core.util.ECPProjectAware;
import org.eclipse.emf.ecp.internal.core.util.PropertiesStore.StorableElement;
import org.eclipse.emf.ecp.spi.core.InternalProvider.LifecycleEvent;

import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

/**
 * @author Eike Stepper
 * @author Eugen Neufeld
 * @noextend This interface is not intended to be extended by clients.
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface InternalProject extends ECPProject, ECPProjectAware, StorableElement, Cloneable {

	/**
	 * This method returns the repository this project is shared on.
	 * 
	 * @return the repository of this project or null if not shared
	 */
	InternalRepository getRepository();

	/**
	 * This method returns the provider of this project.
	 * 
	 * @return the provider of this project
	 */
	InternalProvider getProvider();

	/**
	 * This method returns the provider specific data of this project.
	 * 
	 * @return the provider specific data of this project
	 */
	Object getProviderSpecificData();

	/**
	 * This method sets the provider specific data of this project.
	 * 
	 * @param data the provider specific data of this project
	 */
	void setProviderSpecificData(Object data);

	/**
	 * This method is a callback for the provider to notify the project about changes.
	 * 
	 * @param objects the objects that have changed
	 * @param structural if the changes where structural (e.g. delete)
	 */
	void notifyObjectsChanged(Collection<Object> objects, boolean structural);

	/**
	 * This method undisposes the project based on a repository.
	 * 
	 * @param repository the repository
	 */
	void undispose(InternalRepository repository);

	/**
	 * This method is used to notify the provider about a {@link LifecycleEvent} of this project.
	 * 
	 * @param event to pass to the provider
	 */
	void notifyProvider(LifecycleEvent event);

	/**
	 * This method clones a project.
	 * 
	 * @param name the name of the project to create
	 * @return the cloned project
	 */
	InternalProject clone(String name);

	/**
	 * Saves the properties, such as visible packages or the name of the project into the workspace.
	 */
	void saveProperties();

	/**
	 * Get all possible {@link EObject}s from the provider to which a reference can be added from a certain
	 * {@link EObject} based
	 * on the type of the {@link EReference}.
	 * 
	 * @param eObject
	 *            - the {@link EObject} for which the reference should be set.
	 * @param eReference
	 *            - the {@link EReference} to be set.
	 * @return {@link Iterator} over all {@link EObject} that can be added as a reference
	 */
	Iterator<EObject> getReferenceCandidates(EObject eObject, EReference eReference);

	/**
	 * This method checks whether the provided object is the model root of the project.
	 * 
	 * @param object the object to check
	 * @return true if the object is the root of the model of this project, false otherwise
	 */
	boolean isModelRoot(Object object);

	/**
	 * Returns a collection of {@link EPackage}s which are not supported by the provider. EObjects from these packages
	 * cannot be created within the project.
	 * 
	 * @return {@link Collection} of unsupported {@link EPackage}s
	 */
	Set<EPackage> getUnsupportedEPackages();

	/**
	 * Set the visible {@link EPackage}s. New model elements can only be created from {@link EPackage}s contained in
	 * the visiblePackages and the {@link #setVisibleEClasses(Set)}.
	 * 
	 * @param visiblePackages the {@link EPackage}s to be visible
	 */
	void setVisiblePackages(Set<EPackage> visiblePackages);

	/**
	 * Get the currently visible {@link EPackage}s. If no filter is set, then all {@link EPackage}s supported by the
	 * provider are returned.
	 * 
	 * @return {@link Set} of {@link EPackage}s that should be available, or all supported EPackages
	 */
	Set<EPackage> getVisiblePackages();

	/**
	 * Get the currently visible {@link EClass}es. If no visible {@link EClass}es are set, then an empty {@link Set} is
	 * returned.
	 * 
	 * @return {@link Set} of {@link EClass}es that should be available, or empty.
	 */
	Set<EClass> getVisibleEClasses();

	/**
	 * Set the visible {@link EClass}es.
	 * 
	 * @param visibleEClasses the classes that should be available
	 */
	void setVisibleEClasses(Set<EClass> visibleEClasses);

	/**
	 * Check whether a project contains an Object.
	 * 
	 * @param object the object to check for containment
	 * @return true if the object is in the project, false otherwise
	 */
	boolean contains(Object object);
}
