/*******************************************************************************
 * Copyright (c) 2011, 2013 Google, Inc. and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Sergey Prigogin <eclipse.sprigogin@gmail.com> - [refactoring] Provide a way to implement refactorings that depend on resources that have to be explicitly released - https://bugs.eclipse.org/347599
 *     IBM Corporation - bug fixes
 *******************************************************************************/
package org.eclipse.ltk.core.refactoring;

/**
 * <p>
 * Refactoring context is a disposable object that can be used by a refactoring to hold resources
 * that have to be explicitly released. The refactoring context is guaranteed to receive
 * a {@link #dispose()} call after the associated refactoring has finished or produced an error.
 * At this point, the refactoring context must release all resources and detach all listeners.
 * A refactoring context can only be disposed once; it cannot be reused.
 * </p>
 * <p>
 * This class is intended to be subclassed by clients wishing to implement new refactorings that
 * depend on resources that have to be explicitly released.
 * </p>
 * @since 3.6
 */
public class RefactoringContext {
	private Refactoring fRefactoring;

	/**
	 * Creates a context for the given refactoring.
	 *
	 * @param refactoring The refactoring associated with the context. Cannot be <code>null</code>.
	 * @throws NullPointerException if refactoring is <code>null</code>.
	 */
	public RefactoringContext(Refactoring refactoring) {
		if (refactoring == null)
			throw new NullPointerException();
		fRefactoring= refactoring;
	}

	/**
	 * Returns the refactoring associated with the context.
	 * <p>
	 * The returned refactoring must be in an initialized state, i.e. ready to
	 * be executed via {@link PerformRefactoringOperation}.
	 * </p>
	 * @return The refactoring associated with the context.
	 * @nooverride This method is not intended to be re-implemented or extended by clients.
	 */
	public Refactoring getRefactoring() {
		return fRefactoring;
	}

	/**
	 * Disposes of the context. This method will be called exactly once during the life cycle
	 * of the context after the associated refactoring has finished or produced an error.
	 * <p>
	 * Subclasses may extend this method (must call super).
	 * </p>
	 */
	public void dispose() {
		if (fRefactoring == null)
			throw new IllegalStateException("dispose() called more than once."); //$NON-NLS-1$
		fRefactoring= null;
	}
}
