blob: 1d8cd806225885d41cfecc8213365038e76423be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 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.team.internal.ccvs.core;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.*;
import org.eclipse.team.core.*;
import org.eclipse.team.core.mapping.IChangeGroupingRequestor;
import org.eclipse.team.core.subscribers.Subscriber;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
import org.eclipse.team.internal.core.TeamPlugin;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
/**
* This class represents the CVS Provider's capabilities in the absence of a
* particular project.
*/
public class CVSTeamProviderType extends RepositoryProviderType implements IAdaptable {
private static AutoShareJob autoShareJob;
public static class AutoShareJob extends Job {
List projectsToShare = new ArrayList();
AutoShareJob() {
super(CVSMessages.CVSTeamProviderType_0);
}
public boolean isQueueEmpty() {
return projectsToShare.isEmpty();
}
@Override
public boolean shouldSchedule() {
return !isQueueEmpty();
}
@Override
public boolean shouldRun() {
synchronized (projectsToShare) {
for (Iterator iter = projectsToShare.iterator(); iter.hasNext();) {
IProject project = (IProject) iter.next();
if (RepositoryProvider.isShared(project)) {
iter.remove();
}
}
return !projectsToShare.isEmpty();
}
}
public void share(IProject project) {
if (!RepositoryProvider.isShared(project)) {
synchronized (projectsToShare) {
if (!projectsToShare.contains(project))
projectsToShare.add(project);
}
if(getState() == Job.NONE && !isQueueEmpty())
schedule();
}
}
@Override
protected IStatus run(IProgressMonitor monitor) {
IProject next = null;
next = getNextProject();
monitor.beginTask(null, IProgressMonitor.UNKNOWN);
while (next != null) {
autoconnectCVSProject(next, Policy.subMonitorFor(monitor, IProgressMonitor.UNKNOWN));
next = getNextProject();
}
monitor.done();
return Status.OK_STATUS;
}
private IProject getNextProject() {
IProject next = null;
synchronized (projectsToShare) {
if (!projectsToShare.isEmpty()) {
next = (IProject)projectsToShare.remove(0);
}
}
return next;
}
/*
* Auto-connect to the repository using CVS/ directories
*/
private void autoconnectCVSProject(IProject project, IProgressMonitor monitor) {
try {
ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project);
FolderSyncInfo info = folder.getFolderSyncInfo();
if (info != null) {
// Set the sharing
CVSWorkspaceRoot.setSharing(project, info, monitor);
}
} catch (TeamException e) {
CVSProviderPlugin.log(IStatus.ERROR, "Could not auto-share project " + project.getName(), e); //$NON-NLS-1$
}
}
}
private synchronized static AutoShareJob getAutoShareJob() {
if (autoShareJob == null) {
autoShareJob = new AutoShareJob();
autoShareJob.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
// Reschedule the job if it has unprocessed projects
if (!autoShareJob.isQueueEmpty()) {
autoShareJob.schedule();
}
}
});
autoShareJob.setSystem(true);
autoShareJob.setPriority(Job.SHORT);
// Must run with the workspace rule to ensure that projects added while we're running
// can be shared
autoShareJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
}
return autoShareJob;
}
/**
* @see org.eclipse.team.core.RepositoryProviderType#supportsProjectSetImportRelocation()
*/
public boolean supportsProjectSetImportRelocation() {
return false;
}
@Override
public ProjectSetCapability getProjectSetCapability() {
return new CVSProjectSetCapability();
}
@Override
public void metaFilesDetected(IProject project, IContainer[] containers) {
for (IContainer container : containers) {
IContainer cvsDir = null;
if (container.getName().equals("CVS")) { //$NON-NLS-1$
cvsDir = container;
} else {
IResource resource = container.findMember("CVS"); //$NON-NLS-1$
if (resource.getType() != IResource.FILE) {
cvsDir = (IContainer)resource;
}
}
try {
if (cvsDir != null && !cvsDir.isTeamPrivateMember())
cvsDir.setTeamPrivateMember(true);
} catch (CoreException e) {
TeamPlugin.log(IStatus.ERROR, "Could not flag meta-files as team-private for " + cvsDir.getFullPath(), e); //$NON-NLS-1$
}
}
if (CVSProviderPlugin.getPlugin().isAutoshareOnImport())
getAutoShareJob().share(project);
}
@Override
public Subscriber getSubscriber() {
return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber();
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter == ActiveChangeSetManager.class || adapter == IChangeGroupingRequestor.class)
return adapter.cast(CVSProviderPlugin.getPlugin().getChangeSetManager());
return Platform.getAdapterManager().getAdapter(this, adapter);
}
}