blob: 4e605a1ce2e581275f8db1b2c096c51369980fae [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 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.core.resources.team;
import java.net.URI;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.internal.resources.InternalTeamHook;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
/**
* A general hook class for operations that team providers may be
* interested in participating in. Implementors of the hook should provide
* a concrete subclass, and override any methods they are interested in.
* <p>
* This class is intended to be subclassed by the team component in
* conjunction with the <code>org.eclipse.core.resources.teamHook</code>
* standard extension point. Individual team providers may also subclass this
* class. It is not intended to be subclassed by other clients. The methods
* defined on this class are called from within the implementations of
* workspace API methods and must not be invoked directly by clients.
* </p>
*
* @since 2.1
*/
public abstract class TeamHook extends InternalTeamHook {
/**
* The default resource scheduling rule factory. This factory can be used for projects
* that the team hook methods do not participate in.
*
* @see #getRuleFactory(IProject)
* @see #setRuleFactory(IProject, IResourceRuleFactory)
* @since 3.0
*/
protected final IResourceRuleFactory defaultFactory = new ResourceRuleFactory();
/**
* Creates a new team hook. Default constructor for use by subclasses and the
* resources plug-in only.
*/
protected TeamHook() {
super();
}
/**
* Returns the resource scheduling rule factory that should be used when workspace
* operations are invoked on resources in that project. The workspace will ask the
* team hook this question only once per project, per session. The workspace will
* assume the returned result is valid for the rest of that session, unless the rule
* is changed by calling <code>setRuleFactory</code>.
* <p>
* This method must not return <code>null</code>. If no special rules are required
* by the team hook for the given project, the value of the <code>defaultFactory</code>
* field should be returned.
* <p>
* This default implementation always returns the value of the <code>defaultFactory</code>
* field. Subclasses may override and provide a subclass of <code>ResourceRuleFactory</code>.
*
* @param project the project to return scheduling rules for
* @return the resource scheduling rules for a project
* @see #setRuleFactory(IProject, IResourceRuleFactory)
* @see ResourceRuleFactory
* @since 3.0
*/
public IResourceRuleFactory getRuleFactory(IProject project) {
return defaultFactory;
}
/**
* Sets the resource scheduling rule factory to use for resource modifications
* in the given project. This method only needs to be called if the factory has changed
* since the initial call to <code>getRuleFactory</code> for the given project
* <p>
* The supplied factory must not be <code>null</code>. If no special rules are required
* by the team hook for the given project, the value of the <code>defaultFactory</code>
* field should be used.
* <p>
* Note that the new rule factory will only take effect for resource changing
* operations that begin after this method completes. Care should be taken to
* avoid calling this method during the invocation of any resource changing
* operation (in any thread). The best time to change rule factories is during resource
* change notification when the workspace is locked for modification.
*
* @param project the project to change the resource rule factory for
* @param factory the new resource rule factory
* @see #getRuleFactory(IProject)
* @see IResourceRuleFactory
* @since 3.0
*/
@Override
protected final void setRuleFactory(IProject project, IResourceRuleFactory factory) {
super.setRuleFactory(project, factory);
}
/**
* Validates whether a particular attempt at link creation is allowed. This gives
* team providers an opportunity to hook into the beginning of the implementation
* of <code>IFile.createLink</code>.
* <p>
* The implementation of this method runs "below" the resources API and is
* therefore very restricted in what resource API method it can call. The
* list of useable methods includes most resource operations that read but
* do not update the resource tree; resource operations that modify
* resources and trigger deltas must not be called from within the dynamic
* scope of the invocation of this method.
* </p><p>
* This method should be overridden by subclasses that want to control what
* links are created. The default implementation of this method allows all links
* to be created.
* </p>
*
* @param file the file to be linked
* @param updateFlags bit-wise or of update flag constants
* (only ALLOW_MISSING_LOCAL is relevant here)
* @param location a file system path where the file should be linked
* @return a status object with code <code>IStatus.OK</code>
* if linking is allowed, otherwise a status object with severity
* <code>IStatus.ERROR</code> indicating why the creation is not allowed.
* @see org.eclipse.core.resources.IResource#ALLOW_MISSING_LOCAL
*/
public IStatus validateCreateLink(IFile file, int updateFlags, IPath location) {
return Status.OK_STATUS;
}
/**
* Validates whether a particular attempt at link creation is allowed. This gives
* team providers an opportunity to hook into the beginning of the implementation
* of {@link IFile#createLink(URI, int, IProgressMonitor) }
* <p>
* The implementation of this method runs "below" the resources API and is
* therefore very restricted in what resource API method it can call. The
* list of useable methods includes most resource operations that read but
* do not update the resource tree; resource operations that modify
* resources and trigger deltas must not be called from within the dynamic
* scope of the invocation of this method.
* </p><p>
* This method should be overridden by subclasses that want to control what
* links are created. The default implementation of this method allows all links
* to be created.
* </p>
*
* @param file the file to be linked
* @param updateFlags bit-wise or of update flag constants
* (only ALLOW_MISSING_LOCAL is relevant here)
* @param location a file system URI where the file should be linked
* @return a status object with code <code>IStatus.OK</code>
* if linking is allowed, otherwise a status object with severity
* <code>IStatus.ERROR</code> indicating why the creation is not allowed.
* @see org.eclipse.core.resources.IResource#ALLOW_MISSING_LOCAL
* @since 3.2
*/
public IStatus validateCreateLink(IFile file, int updateFlags, URI location) {
//forward to old method to ensure old hooks get a chance to validate in the local case
if (EFS.SCHEME_FILE.equals(location.getScheme()))
return validateCreateLink(file, updateFlags, URIUtil.toPath(location));
return Status.OK_STATUS;
}
/**
* Validates whether a particular attempt at link creation is allowed. This gives
* team providers an opportunity to hook into the beginning of the implementation
* of <code>IFolder.createLink</code>.
* <p>
* The implementation of this method runs "below" the resources API and is
* therefore very restricted in what resource API method it can call. The
* list of useable methods includes most resource operations that read but
* do not update the resource tree; resource operations that modify
* resources and trigger deltas must not be called from within the dynamic
* scope of the invocation of this method.
* </p><p>
* This method should be overridden by subclasses that want to control what
* links are created. The default implementation of this method allows all links
* to be created.
* </p>
*
* @param folder the file to be linked
* @param updateFlags bit-wise or of update flag constants
* (only ALLOW_MISSING_LOCAL is relevant here)
* @param location a file system path where the folder should be linked
* @return a status object with code <code>IStatus.OK</code>
* if linking is allowed, otherwise a status object with severity
* <code>IStatus.ERROR</code> indicating why the creation is not allowed.
* @see org.eclipse.core.resources.IResource#ALLOW_MISSING_LOCAL
*/
public IStatus validateCreateLink(IFolder folder, int updateFlags, IPath location) {
return Status.OK_STATUS;
}
/**
* Validates whether a particular attempt at link creation is allowed. This gives
* team providers an opportunity to hook into the beginning of the implementation
* of {@link IFolder#createLink(URI, int, IProgressMonitor)}
* <p>
* The implementation of this method runs "below" the resources API and is
* therefore very restricted in what resource API method it can call. The
* list of useable methods includes most resource operations that read but
* do not update the resource tree; resource operations that modify
* resources and trigger deltas must not be called from within the dynamic
* scope of the invocation of this method.
* </p><p>
* This method should be overridden by subclasses that want to control what
* links are created. The default implementation of this method allows all links
* to be created.
* </p>
*
* @param folder the file to be linked
* @param updateFlags bit-wise or of update flag constants
* (only ALLOW_MISSING_LOCAL is relevant here)
* @param location a file system path where the folder should be linked
* @return a status object with code <code>IStatus.OK</code>
* if linking is allowed, otherwise a status object with severity
* <code>IStatus.ERROR</code> indicating why the creation is not allowed.
* @see org.eclipse.core.resources.IResource#ALLOW_MISSING_LOCAL
* @since 3.2
*/
public IStatus validateCreateLink(IFolder folder, int updateFlags, URI location) {
//forward to old method to ensure old hooks get a chance to validate in the local case
if (EFS.SCHEME_FILE.equals(location.getScheme()))
return validateCreateLink(folder, updateFlags, URIUtil.toPath(location));
return Status.OK_STATUS;
}
}