diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java | 674 |
1 files changed, 0 insertions, 674 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java deleted file mode 100644 index d733969f2..000000000 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java +++ /dev/null @@ -1,674 +0,0 @@ -package org.eclipse.team.internal.ccvs.core; - -/* - * (c) Copyright IBM Corp. 2000, 2002. - * All Rights Reserved. - */ - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRunnable; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.core.runtime.Status; -import org.eclipse.team.core.RepositoryProvider; -import org.eclipse.team.core.Team; -import org.eclipse.team.core.TeamException; -import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; -import org.eclipse.team.internal.ccvs.core.client.Checkout; -import org.eclipse.team.internal.ccvs.core.client.Command; -import org.eclipse.team.internal.ccvs.core.client.Import; -import org.eclipse.team.internal.ccvs.core.client.Request; -import org.eclipse.team.internal.ccvs.core.client.Session; -import org.eclipse.team.internal.ccvs.core.client.Update; -import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption; -import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; -import org.eclipse.team.internal.ccvs.core.client.Command.QuietOption; -import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; -import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; -import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; -import org.eclipse.team.internal.ccvs.core.resources.EclipseSynchronizer; -import org.eclipse.team.internal.ccvs.core.resources.RemoteFolder; -import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree; -import org.eclipse.team.internal.ccvs.core.resources.RemoteModule; -import org.eclipse.team.internal.ccvs.core.util.Util; - -public class CVSProvider implements ICVSProvider { - - private static final String STATE_FILE = ".cvsProviderState"; //$NON-NLS-1$ - - private static CVSProvider instance; - private Map repositories; - - private List listeners = new ArrayList(); - - private CVSProvider() { - repositories = new HashMap(); - } - - /* - * Add the repository location to the cahced locations - */ - private void addToCache(ICVSRepositoryLocation repository) { - repositories.put(repository.getLocation(), repository); - } - - private void repositoryAdded(ICVSRepositoryLocation repository) { - Iterator it = listeners.iterator(); - while (it.hasNext()) { - ICVSListener listener = (ICVSListener)it.next(); - listener.repositoryAdded(repository); - } - } - - public void addRepositoryListener(ICVSListener listener) { - listeners.add(listener); - } - - public void removeRepositoryListener(ICVSListener listener) { - listeners.remove(listener); - } - - /** - * @see ICVSProvider#checkout(ICVSRepositoryLocation, IProject, String, String, IProgressMonitor) - */ - public void checkout( - ICVSRepositoryLocation repository, - IProject project, - String sourceModule, - CVSTag tag, - IProgressMonitor monitor) - throws TeamException { - - if (sourceModule == null) - sourceModule = project.getName(); - checkout(new ICVSRemoteFolder[] { new RemoteFolder(null, repository, new Path(sourceModule), tag)}, - new IProject[] { project }, monitor); - } - - /* - * Delete the target projects before checking out - */ - private void scrubProjects(IProject[] projects, IProgressMonitor monitor) throws CVSException { - if (projects == null) { - monitor.done(); - return; - } - monitor.beginTask(Policy.bind("CVSProvider.Scrubbing_projects_1"), projects.length * 100); //$NON-NLS-1$ - try { - for (int i=0;i<projects.length;i++) { - IProject project = projects[i]; - if (project != null && project.exists()) { - if(!project.isOpen()) { - project.open(Policy.subMonitorFor(monitor, 10)); - } - // XXX: temporary code to support creating a java project for sources in CVS - // should be removed once nature support is added to the UI. - // delete children, keep project - monitor.subTask(Policy.bind("CVSProvider.Scrubbing_local_project_1")); //$NON-NLS-1$ - EclipseSynchronizer.getInstance().prepareForDeletion(project); - IResource[] children = project.members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS); - IProgressMonitor subMonitor = Policy.subMonitorFor(monitor, 80); - subMonitor.beginTask(null, children.length * 100); - try { - for (int j = 0; j < children.length; j++) { - if ( ! children[j].getName().equals(".project")) {//$NON-NLS-1$ - children[j].delete(true /*force*/, Policy.subMonitorFor(subMonitor, 100)); - } - } - } finally { - subMonitor.done(); - } - CVSWorkspaceRoot.getCVSFolderFor(project).unmanage(Policy.subMonitorFor(monitor, 10)); - } else if (project != null) { - // Make sure there is no directory in the local file system. - File location = new File(project.getParent().getLocation().toFile(), project.getName()); - if (location.exists()) { - deepDelete(location); - } - } - } - } catch (CoreException e) { - throw wrapException(e); - } finally { - monitor.done(); - } - } - - private void deepDelete(File resource) { - if (resource.isDirectory()) { - File[] fileList = resource.listFiles(); - for (int i = 0; i < fileList.length; i++) { - deepDelete(fileList[i]); - } - } - resource.delete(); - } - - /* - * Bring the provied projects into the workspace - */ - private void refreshProjects(IProject[] projects, IProgressMonitor monitor) throws CoreException, TeamException { - monitor.beginTask(Policy.bind("CVSProvider.Creating_projects_2"), projects.length * 100); //$NON-NLS-1$ - try { - for (int i = 0; i < projects.length; i++) { - IProject project = projects[i]; - // Register the project with Team - // (unless the project already has the proper nature from the project meta-information) - if (!project.getDescription().hasNature(CVSProviderPlugin.getTypeId())) { - Team.addNatureToProject(project, CVSProviderPlugin.getTypeId(), Policy.subMonitorFor(monitor, 100)); - } - } - - } finally { - monitor.done(); - } - } - - - /** - * @see ICVSProvider#checkout(ICVSRemoteResource[], IProject[], IProgressMonitor) - */ - public void checkout(final ICVSRemoteFolder[] resources, final IProject[] projects, final IProgressMonitor monitor) throws TeamException { - final TeamException[] eHolder = new TeamException[1]; - try { - IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() { - public void run(IProgressMonitor pm) throws CoreException { - try { - pm.beginTask(null, 1000 * resources.length); - - // Get the location of the workspace root - ICVSFolder root = CVSWorkspaceRoot.getCVSFolderFor(ResourcesPlugin.getWorkspace().getRoot()); - - for (int i=0;i<resources.length;i++) { - IProject project = null; - RemoteFolder resource = (RemoteFolder)resources[i]; - - // Determine the provided target project if there is one - if (projects != null) - project = projects[i]; - - // Determine the remote module to be checked out - String moduleName; - if (resource instanceof RemoteModule) { - moduleName = ((RemoteModule)resource).getName(); - } else { - moduleName = resource.getRepositoryRelativePath(); - } - - // Open a connection session to the repository - ICVSRepositoryLocation repository = resource.getRepository(); - Session session = new Session(repository, root); - try { - session.open(Policy.subMonitorFor(pm, 50)); - - // Determine the local target projects (either the project provider or the module expansions) - final Set targetProjects = new HashSet(); - if (project == null) { - - // Fetch the module expansions - IStatus status = Request.EXPAND_MODULES.execute(session, new String[] {moduleName}, Policy.subMonitorFor(pm, 50)); - if (status.getCode() == CVSStatus.SERVER_ERROR) { - // XXX Should we cleanup any partially checked out projects? - throw new CVSServerException(status); - } - - // Convert the module expansions to local projects - String[] expansions = session.getModuleExpansions(); - for (int j = 0; j < expansions.length; j++) { - targetProjects.add(ResourcesPlugin.getWorkspace().getRoot().getProject(new Path(expansions[j]).segment(0))); - } - - } else { - targetProjects.add(project); - } - - // Prepare the target projects to receive resources - root.run(new ICVSRunnable() { - public void run(IProgressMonitor monitor) throws CVSException { - scrubProjects((IProject[]) targetProjects.toArray(new IProject[targetProjects.size()]), monitor); - } - }, Policy.subMonitorFor(pm, 100)); - - // Build the local options - List localOptions = new ArrayList(); - // Add the option to load into the target project if one was supplied - if (project != null) { - localOptions.add(Checkout.makeDirectoryNameOption(project.getName())); - } - // Prune empty directories if pruning enabled - if (CVSProviderPlugin.getPlugin().getPruneEmptyDirectories()) - localOptions.add(Checkout.PRUNE_EMPTY_DIRECTORIES); - // Add the options related to the CVSTag - CVSTag tag = resource.getTag(); - if (tag == null) { - // A null tag in a remote resource indicates HEAD - tag = CVSTag.DEFAULT; - } - localOptions.add(Update.makeTagOption(tag)); - - // Perform the checkout - IStatus status = Command.CHECKOUT.execute(session, - getDefaultGlobalOptions(), - (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]), - new String[]{moduleName}, - null, - Policy.subMonitorFor(pm, 800)); - if (status.getCode() == CVSStatus.SERVER_ERROR) { - // XXX Should we cleanup any partially checked out projects? - throw new CVSServerException(status); - } - - // Bring the project into the workspace - refreshProjects((IProject[])targetProjects.toArray(new IProject[targetProjects.size()]), Policy.subMonitorFor(pm, 100)); - - } finally { - session.close(); - } - } - } - catch (TeamException e) { - // Pass it outside the workspace runnable - eHolder[0] = e; - } finally { - pm.done(); - } - // CoreException and OperationCanceledException are propagated - } - }; - ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor); - } catch (CoreException e) { - throw wrapException(e); - } finally { - monitor.done(); - } - // Re-throw the TeamException, if one occurred - if (eHolder[0] != null) { - throw eHolder[0]; - } - } - - /** - * @see ICVSProvider#createRepository(Properties) - */ - public ICVSRepositoryLocation createRepository(Properties configuration) throws CVSException { - // Create a new repository location - CVSRepositoryLocation location = CVSRepositoryLocation.fromProperties(configuration); - - // Check the cache for an equivalent instance and if there is one, throw an exception - CVSRepositoryLocation existingLocation = (CVSRepositoryLocation)repositories.get(location.getLocation()); - if (existingLocation != null) { - throw new CVSException(new CVSStatus(CVSStatus.ERROR, Policy.bind("CVSProvider.alreadyExists"))); //$NON-NLS-1$ - } - - return location; - } - - /** - * @see ICVSProvider#addRepository(ICVSRepositoryLocation) - */ - public void addRepository(ICVSRepositoryLocation repository) throws CVSException { - // Check the cache for an equivalent instance and if there is one, just update the cache - CVSRepositoryLocation existingLocation = (CVSRepositoryLocation)repositories.get(repository.getLocation()); - if (existingLocation != null) { - ((CVSRepositoryLocation)repository).updateCache(); - } else { - // Cache the password and register the repository location - addToCache(repository); - ((CVSRepositoryLocation)repository).updateCache(); - repositoryAdded(repository); - } - try { - saveState(); - } catch (TeamException e) { - CVSProviderPlugin.log(e.getStatus()); - } - } - - /** - * @see ICVSProvider#disposeRepository(ICVSRepositoryLocation) - */ - public void disposeRepository(ICVSRepositoryLocation repository) throws CVSException { - ((CVSRepositoryLocation)repository).dispose(); - removeFromCache(repository); - } - - public boolean isKnownRepository(String location) { - return repositories.get(location) != null; - } - - public static GlobalOption[] getDefaultGlobalOptions() { - QuietOption option = CVSProviderPlugin.getPlugin().getQuietness(); - if (option == null) - return Command.NO_GLOBAL_OPTIONS; - else - return new GlobalOption[] {option}; - } - - /** - * Return the singleton instance of CVSProvider - */ - public static CVSProvider getInstance() { - return instance; - } - - public String[] getExpansions(ICVSRemoteFolder[] resources, IProgressMonitor monitor) throws CVSException { - - if (resources.length == 0) return new String[0]; - - // Get the location of the workspace root - ICVSFolder root = CVSWorkspaceRoot.getCVSFolderFor(ResourcesPlugin.getWorkspace().getRoot()); - - // Get the command arguments - String[] arguments = new String[resources.length]; - for (int i = 0; i < resources.length; i++) { - if (resources[i] instanceof RemoteModule) { - arguments[i] = ((RemoteModule)resources[i]).getName(); - } else { - arguments[i] = resources[i].getRepositoryRelativePath(); - } - } - - // Perform the Expand-Modules command - IStatus status; - Session s = new Session(resources[0].getRepository(), root); - s.open(monitor); - try { - status = Request.EXPAND_MODULES.execute(s, arguments, monitor); - } finally { - s.close(); - } - if (status.getCode() == CVSStatus.SERVER_ERROR) { - throw new CVSServerException(status); - } - - return s.getModuleExpansions(); - } - - /** - * @see ICVSProvider#getKnownRepositories() - */ - public ICVSRepositoryLocation[] getKnownRepositories() { - return (ICVSRepositoryLocation[])repositories.values().toArray(new ICVSRepositoryLocation[repositories.size()]); - } - - - - /** - * @see ICVSProvider#getRepository(String) - */ - public ICVSRepositoryLocation getRepository(String location) throws CVSException { - ICVSRepositoryLocation repository = (ICVSRepositoryLocation)repositories.get(location); - if (repository == null) { - repository = CVSRepositoryLocation.fromString(location); - addToCache(repository); - repositoryAdded(repository); - } - return repository; - } - - /** - * @see ICVSProvider#getSupportedConnectionMethods() - */ - public String[] getSupportedConnectionMethods() { - IConnectionMethod[] methods = CVSRepositoryLocation.getPluggedInConnectionMethods(); - String[] result = new String[methods.length]; - for (int i=0;i<methods.length;i++) - result[i] = methods[i].getName(); - return result; - } - - /** - * @see ICVSProvider#createModule() - */ - public void createModule(ICVSRepositoryLocation location, IProject project, String moduleName, IProgressMonitor monitor) throws TeamException { - - // Determine if the repository is known - boolean alreadyExists = isCached(location); - // Set the folder sync info of the project to point to the remote module - ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); - - try { - // Get the import properties - String message = Policy.bind("CVSProvider.initialImport"); //$NON-NLS-1$ - String vendor = "vendor"; //$NON-NLS-1$ - String tag = "start"; //$NON-NLS-1$ - String projectName = project.getName(); - if (moduleName == null) - moduleName = projectName; - - // Perform the import using a dummy root so the local project is not traversed - Session s = new Session(location, new RemoteFolderTree(null, location, Path.EMPTY, null)); - s.open(monitor); - try { - IStatus status = Command.IMPORT.execute(s, - getDefaultGlobalOptions(), - new LocalOption[] {Import.makeArgumentOption(Command.MESSAGE_OPTION, message)}, - new String[] { moduleName, vendor, tag }, - null, - monitor); - // If we get a warning, the operation most likely failed so check that the status is OK - if (status.getCode() == CVSStatus.SERVER_ERROR || ! status.isOK()) { - throw new CVSServerException(status); - } - } finally { - s.close(); - } - - folder.setFolderSyncInfo(new FolderSyncInfo(moduleName, location.getLocation(), null, false)); - - // Register the project with Team - // (unless the project already has the proper nature from the project meta-information) - try { - if (!project.getDescription().hasNature(CVSProviderPlugin.getTypeId())) { - Team.addNatureToProject(project, CVSProviderPlugin.getTypeId(), Policy.subMonitorFor(monitor, 1)); - } - } catch (CoreException e) { - throw wrapException(e); - } - } catch (TeamException e) { - // The checkout may have triggered password caching - // Therefore, if this is a newly created location, we want to clear its cache - if ( ! alreadyExists) - disposeRepository(location); - throw e; - } - // Add the repository if it didn't exist already - if ( ! alreadyExists) - addRepository(location); - } - - private CVSTag getTagFromProperties(Properties configuration) { - String date = configuration.getProperty("date"); //$NON-NLS-1$ - String tagName = configuration.getProperty("tag"); //$NON-NLS-1$ - if (tagName == null) - tagName = configuration.getProperty("branch"); //$NON-NLS-1$ - if (tagName == null) - return CVSTag.DEFAULT; - return new CVSTag(tagName, CVSTag.BRANCH); - } - - private boolean isCached(ICVSRepositoryLocation repository) { - return repositories.containsKey(repository.getLocation()); - } - - public static boolean isText(IFile file) { - return Team.getType(file) == Team.TEXT; - } - - private void removeFromCache(ICVSRepositoryLocation repository) { - if (repositories.remove(repository.getLocation()) != null) { - Iterator it = listeners.iterator(); - while (it.hasNext()) { - ICVSListener listener = (ICVSListener)it.next(); - listener.repositoryRemoved(repository); - } - } - } - - public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException { - - // Ensure provided info matches that of the project - ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); - FolderSyncInfo folderInfo = folder.getFolderSyncInfo(); - if ( ! info.equals(folderInfo)) { - throw new CVSException(new CVSStatus(CVSStatus.ERROR, Policy.bind("CVSProvider.infoMismatch", project.getName())));//$NON-NLS-1$ - } - - // Ensure that the provided location is managed - ICVSRepositoryLocation location = getRepository(info.getRoot()); - if (! isCached(location)) { - addToCache(location); - repositoryAdded(location); - } - - // Register the project with Team - // (unless the project already has the proper nature from the project meta-information) - try { - if (!project.getDescription().hasNature(CVSProviderPlugin.getTypeId())) - Team.addNatureToProject(project, CVSProviderPlugin.getTypeId(), monitor); - } catch (CoreException e) { - throw wrapException(e); - } - } - - private CVSException wrapException(CoreException e) { - return new CVSException(e.getStatus()); //$NON-NLS-1$ - } - - public static void startup() { - if (instance == null) { - instance = new CVSProvider(); - } - try { - getInstance().loadState(); - } catch (TeamException e) { - Util.logError(Policy.bind("CVSProvider.errorSaving"), e);//$NON-NLS-1$ - } - } - - public static void shutdown() { - try { - getInstance().saveState(); - } catch (TeamException e) { - Util.logError(Policy.bind("CVSProvider.errorLoading"), e);//$NON-NLS-1$ - } - } - - private void loadState() throws TeamException { - IPath pluginStateLocation = CVSProviderPlugin.getPlugin().getStateLocation().append(STATE_FILE); - File file = pluginStateLocation.toFile(); - if (file.exists()) { - try { - DataInputStream dis = new DataInputStream(new FileInputStream(file)); - readState(dis); - dis.close(); - } catch (IOException e) { - throw new TeamException(new Status(Status.ERROR, CVSProviderPlugin.ID, TeamException.UNABLE, Policy.bind("CVSProvider.ioException"), e)); //$NON-NLS-1$ - } - } else { - // If the file did not exist, then prime the list of repositories with - // the providers with which the projects in the workspace are shared. - IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); - for (int i = 0; i < projects.length; i++) { - RepositoryProvider provider = RepositoryProvider.getProvider(projects[i], CVSProviderPlugin.getTypeId()); - String location = null; - if (provider==null) { - // Check for old 1.0 sync info - // location = getRepositoryLocationFromOneO(projects[i]); - } else { - ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(projects[i]); - FolderSyncInfo info = folder.getFolderSyncInfo(); - if (info != null) { - location = info.getRoot(); - } - } - if (location != null) { - // getRepository() will add the repo if it doesn't exist already - ICVSRepositoryLocation result = getRepository(location); - } - } - saveState(); - } - } - - private void saveState() throws TeamException { - IPath pluginStateLocation = CVSProviderPlugin.getPlugin().getStateLocation(); - File tempFile = pluginStateLocation.append(STATE_FILE + ".tmp").toFile(); //$NON-NLS-1$ - File stateFile = pluginStateLocation.append(STATE_FILE).toFile(); - try { - DataOutputStream dos = new DataOutputStream(new FileOutputStream(tempFile)); - writeState(dos); - dos.close(); - if (stateFile.exists()) { - stateFile.delete(); - } - boolean renamed = tempFile.renameTo(stateFile); - if (!renamed) { - throw new TeamException(new Status(Status.ERROR, CVSProviderPlugin.ID, TeamException.UNABLE, Policy.bind("CVSProvider.rename", tempFile.getAbsolutePath()), null)); //$NON-NLS-1$ - } - } catch (IOException e) { - throw new TeamException(new Status(Status.ERROR, CVSProviderPlugin.ID, TeamException.UNABLE, Policy.bind("CVSProvider.save",stateFile.getAbsolutePath()), e)); //$NON-NLS-1$ - } - } - private void readState(DataInputStream dis) throws IOException, CVSException { - int count = dis.readInt(); - for (int i = 0; i < count; i++) { - getRepository(dis.readUTF()); - } - } - - private void writeState(DataOutputStream dos) throws IOException { - // Write the repositories - Collection repos = repositories.values(); - dos.writeInt(repos.size()); - Iterator it = repos.iterator(); - while (it.hasNext()) { - ICVSRepositoryLocation root = (ICVSRepositoryLocation)it.next(); - dos.writeUTF(root.getLocation()); - } - } - - private String getRepositoryLocationFromOneO(IProject project) throws CVSException { - try { - byte[] syncBytes = ResourcesPlugin.getWorkspace().getSynchronizer().getSyncInfo( - new QualifiedName("org.eclipse.vcm.core", "Sharing"), project); //$NON-NLS-1$ //$NON-NLS-2$ - if (syncBytes != null) { - DataInputStream reader = new DataInputStream(new ByteArrayInputStream(syncBytes)); - String repoType = reader.readUTF(); - String repoLocation = reader.readUTF(); - if (repoType.equals("CVS")) return repoLocation; //$NON-NLS-1$ - } - } catch (CoreException ex) { - throw CVSException.wrapException(ex); - } catch (IOException ex) { - throw CVSException.wrapException(ex); - } - return null; - } -} - |