blob: 20df46fd95211d0695b5bf13aeca1ae84132103c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.core;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.internal.core.BufferManager;
import org.eclipse.dltk.internal.core.DefaultWorkingCopyOwner;
import org.eclipse.dltk.internal.core.ExternalScriptProject;
import org.eclipse.dltk.internal.core.ModelElement;
import org.eclipse.dltk.internal.core.SourceModule;
/**
* The owner of an <code>ISourceModule</code> handle in working copy mode. An
* owner is used to identify a working copy and to create its buffer.
* <p>
* Clients should subclass this class to instantiate a working copy owner that
* is specific to their need and that they can pass in to various APIs (e.g.
* <code>IType.resolveType(String, WorkingCopyOwner)</code>. Clients can also
* override the default implementation of
* <code>createBuffer(ISourceModule)</code>.
* </p>
* <p>
* Note: even though this class has no abstract method, which means that it
* provides functional default behavior, it is still an abstract class, as
* clients are intended to own their owner implementation.
* </p>
*
* @see ISourceModule#becomeWorkingCopy(IProblemRequestor,
* org.eclipse.core.runtime.IProgressMonitor)
* @see ISourceModule#discardWorkingCopy()
* @see ISourceModule#getWorkingCopy(org.eclipse.core.runtime.IProgressMonitor)
*
*/
public abstract class WorkingCopyOwner {
/**
* Sets the buffer provider of the primary working copy owner. Note that
* even if the buffer provider is a working copy owner, only its
* <code>createBuffer(ISourceModule)</code> method is used by the primary
* working copy owner. It doesn't replace the internal primary working
* owner.
* <p>
* This method is for internal use by the dltk-related plug-ins. Clients
* outside of the dltk should not reference this method.
* </p>
*
* @param primaryBufferProvider
* the primary buffer provider
*/
public static void setPrimaryBufferProvider(
WorkingCopyOwner primaryBufferProvider) {
DefaultWorkingCopyOwner.PRIMARY.primaryBufferProvider = primaryBufferProvider;
}
/**
* Creates a buffer for the given working copy. The new buffer will be
* initialized with the contents of the underlying file if and only if it
* was not already initialized by the compilation owner (a buffer is
* uninitialized if its content is <code>null</code>).
* <p>
* Note: This buffer will be associated to the working copy for its entire
* life-cycle. Another working copy on same unit but owned by a different
* owner would not share the same buffer unless its owner decided to
* implement such a sharing behaviour.
* </p>
*
* @param workingCopy
* the working copy of the buffer
* @return IBuffer the created buffer for the given working copy
* @see IBuffer
*/
public IBuffer createBuffer(ISourceModule workingCopy) {
return BufferManager.createBuffer(workingCopy);
}
/**
* Returns a new working copy with the given name using this working copy
* owner to create its buffer.
* <p>
* This working copy always belongs to the default package in a package
* fragment root that corresponds to its DLTK project, and this DLTK project
* never exists. However this DLTK project has the given buildpath that is
* used when resolving names in this working copy.
* </p>
* <p>
* A DOM AST created using this working copy will have bindings resolved
* using the given buildpath, and problem are reported to the given problem
* requestor.
* <p>
* </p>
* <code>DLTKCore#getOptions()</code> is used to create the DOM AST as it is
* not possible to set the options on the non-existing DLTK project. </p>
* <p>
* When the working copy instance is created, an
* {@link IModelElementDelta#ADDED added delta} is reported on this working
* copy.
* </p>
* <p>
* Once done with the working copy, users of this method must discard it
* using {@link ISourceModule#discardWorkingCopy()}.
* </p>
* <p>
* Note that when such working copy is committed, only its buffer is saved
* (see {@link IBuffer#save(IProgressMonitor, boolean)}) but no resource is
* created.
* </p>
* <p>
* This method is not intended to be overriden by clients.
* </p>
*
* @param name
* the name of the working copy (e.g. "X.java")
* @param buildpath
* the buildpath used to resolve names in this working copy
* @param problemRequestor
* a requestor which will get notified of problems detected
* during reconciling as they are discovered. The requestor can
* be set to <code>null</code> indicating that the client is not
* interested in problems.
* @param monitor
* a progress monitor used to report progress while opening the
* working copy or <code>null</code> if no progress should be
* reported
* @throws ModelException
* if the contents of this working copy can not be determined.
* @return a new working copy
* @see ISourceModule#becomeWorkingCopy(IProblemRequestor, IProgressMonitor)
*
*/
public final ISourceModule newWorkingCopy(String name,
IBuildpathEntry[] buildpath, IProblemRequestor problemRequestor,
IProgressMonitor monitor) throws ModelException {
ExternalScriptProject project = new ExternalScriptProject(buildpath);
IProjectFragment fragment = project.getProjectFragment(Path.EMPTY);
IScriptFolder parent = fragment
.getScriptFolder(IProjectFragment.DEFAULT_SCRIPT_FOLDER_NAME);
SourceModule result = new SourceModule((ModelElement) parent, name,
this);
result.becomeWorkingCopy(problemRequestor, monitor);
return result;
}
}