blob: 940dfa375af85e3467b94b1bbcacbf807692431f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.localstore;
import java.io.InputStream;
import java.util.Set;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.resources.IManager;
import org.eclipse.core.resources.IFileState;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.*;
/**
* The history store is an association of paths to file states.
* Typically the path is the full path of a resource in the workspace.
* <p>
* History store policies are stored in the org.eclipse.core.resources'
* plug-in preferences.
* </p>
*
* @since 3.1
*/
public interface IHistoryStore extends IManager {
/**
* Add an entry to the history store, represented by the given key. Return the
* file state for the newly created entry or<code>null</code> if it couldn't
* be created.
* <p>
* Note: Depending on the history store implementation, some of the history
* store policies can be applied during this method call to determine whether
* or not the entry should be added to the store.
* </p>
* @param key full workspace path to resource being logged
* @param localFile local file system file handle
* @param fileInfo The IFileInfo for the entry
* @return the file state or <code>null</code>
*
* TODO: should this method take a progress monitor?
*
* TODO: look at #getFileFor(). Is there a case where we wouldn't want to
* copy over the file attributes to the local history? If we did that here then
* we wouldn't have to have that other API.
*/
IFileState addState(IPath key, IFileStore localFile, IFileInfo fileInfo, boolean moveContents);
/**
* Returns the paths of all files with entries in this history store at or below
* the given workspace resource path to the given depth. Returns an
* empty set if there are none.
* <p>
* This method is long-running; progress and cancellation are provided
* by the given progress monitor.
* </p>
* @param path full workspace path to resource
* @param depth depth limit: one of <code>DEPTH_ZERO</code>, <code>DEPTH_ONE</code>
* or <code>DEPTH_INFINITE</code>
* @param monitor a progress monitor, or <code>null</code> if progress
* reporting is not desired
* @return the set of paths for files that have at least one history entry
* (element type: <code>IPath</code>)
*/
Set<IPath> allFiles(IPath path, int depth, IProgressMonitor monitor);
/**
* Clean this store applying the current policies.
* <p>
* Note: The history store policies are stored as part of
* the org.eclipse.core.resource plug-in's preferences and
* include such settings as: maximum file size, maximum number
* of states per file, file expiration date, etc.
* </p>
* <p>
* Note: Depending on the implementation of the history store,
* if all the history store policies are applying when the entries
* are first added to the store then this method might be a no-op.
* </p>
* <p>
* This method is long-running; progress and cancellation are provided
* by the given progress monitor.
* </p>
* @param monitor a progress monitor, or <code>null</code> if progress
* reporting is not desired
*/
void clean(IProgressMonitor monitor);
/**
* Closes the history store for the given resource.
*/
void closeHistoryStore(IResource resource);
/**
* Copies the history store information from the source path given destination path.
* Note that destination may already have some history store information. Also note
* that this is a DEPTH_INFINITY operation. That is, history will be copied for partial
* matches of the source path.
*
* @param source the resource containing the original copy of the history store information
* @param destination the target resource where to copy the history
* @param moving whether the history is being copied due to a resource move
*
* TODO: should this method take a progress monitor?
*/
void copyHistory(IResource source, IResource destination, boolean moving);
/**
* Verifies existence of specified resource in the history store. Returns
* <code>true</code> if the file state exists and <code>false</code>
* otherwise.
* <p>
* Note: This method cannot take a progress monitor since it is surfaced
* to the real API via IFileState#exists() which doesn't take a progress
* monitor.
* </p>
* @param target the file state to be verified
* @return <code>true</code> if file state exists,
* and <code>false</code> otherwise
*/
boolean exists(IFileState target);
/**
* Returns an input stream containing the file contents of the specified state.
* The user is responsible for closing the returned stream.
* <p>
* Note: This method cannot take a progress monitor since it is
* surfaced through to the real API via IFileState#getContents which
* doesn't take one.
* </p>
* @param target File state for which an input stream is requested
* @return the stream for requested file state
*/
InputStream getContents(IFileState target) throws CoreException;
/**
* Returns an array of all states available for the specified resource path or
* an empty array if none.
* <p>
* This method is long-running; progress and cancellation are provided
* by the given progress monitor.
* </p>
* @param path the resource path
* @param monitor a progress monitor, or <code>null</code> if progress
* reporting is not desired
* @return the list of file states
*/
IFileState[] getStates(IPath path, IProgressMonitor monitor);
/**
* Remove all of the file states for the given resource path and
* all its children. If the workspace root path is the given argument,
* then all history for this store is removed.
* <p>
* This method is long-running; progress and cancellation are provided
* by the given progress monitor.
* </p>
* @param path the resource path whose history is to be removed
* @param monitor a progress monitor, or <code>null</code> if progress
* reporting is not desired
*/
void remove(IPath path, IProgressMonitor monitor);
/**
* Go through the history store and remove all of the unreferenced states.
*
* As of 3.0, this method is used for testing purposes only. Otherwise the history
* store is garbage collected during the #clean method.
*/
void removeGarbage();
}