diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java | 105 |
1 files changed, 102 insertions, 3 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java index 65c4e782b..e5c794650 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. + * Copyright (c) 2000, 2012 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 @@ -11,7 +11,11 @@ package org.eclipse.team.internal.ccvs.ui.model; import java.lang.reflect.InvocationTargetException; +import java.util.HashSet; +import java.util.Set; + import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.osgi.util.NLS; @@ -20,6 +24,7 @@ import org.eclipse.team.internal.ccvs.core.*; import org.eclipse.team.internal.ccvs.ui.*; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.operations.FetchMembersOperation; +import org.eclipse.team.internal.ccvs.ui.repo.RepositoryRoot; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; @@ -57,7 +62,30 @@ public class RemoteFolderElement extends RemoteResourceElement implements IDefer public Object[] fetchChildren(Object o, IProgressMonitor monitor) throws TeamException { if (!(o instanceof ICVSRemoteFolder)) return new Object[0]; - return ((ICVSRemoteFolder) o).members(monitor); + ICVSRemoteFolder remoteFolder = (ICVSRemoteFolder) o; + if (remoteFolder.getTag() != null + && remoteFolder.getTag().getType() == CVSTag.BRANCH) { + monitor = Policy.monitorFor(monitor); + monitor.beginTask(NLS.bind( + CVSUIMessages.RemoteFolderElement_fetchingRemoteChildren, + new String[] { getLabel(remoteFolder) }), 100); + try { + ICVSRemoteResource[] cachedFolders = CVSUIPlugin + .getPlugin() + .getRepositoryManager() + .getFoldersForTag(remoteFolder.getRepository(), + remoteFolder.getTag(), + Policy.subMonitorFor(monitor, 50)); + if (!hasCachedParent(cachedFolders, remoteFolder)) { + return getCachedChildren(cachedFolders, remoteFolder, + Policy.subMonitorFor(monitor, 50)); + } + return remoteFolder.members(Policy.subMonitorFor(monitor, 50)); + } finally { + monitor.done(); + } + } + return remoteFolder.members(monitor); } public void fetchDeferredChildren(Object o, IElementCollector collector, IProgressMonitor monitor) { @@ -67,18 +95,89 @@ public class RemoteFolderElement extends RemoteResourceElement implements IDefer } try { monitor = Policy.monitorFor(monitor); - monitor.beginTask(NLS.bind(CVSUIMessages.RemoteFolderElement_fetchingRemoteChildren, new String[] { getLabel(o) }), 100); + ICVSRemoteFolder remoteFolder = (ICVSRemoteFolder) o; + if (remoteFolder.getTag() != null + && remoteFolder.getTag().getType() == CVSTag.BRANCH) { + monitor.beginTask( + NLS.bind( + CVSUIMessages.RemoteFolderElement_fetchingRemoteChildren, + new String[] { getLabel(o) }), 200); + ICVSRemoteResource[] cachedFolders = CVSUIPlugin + .getPlugin() + .getRepositoryManager() + .getFoldersForTag(remoteFolder.getRepository(), + remoteFolder.getTag(), + Policy.subMonitorFor(monitor, 100)); + if (!hasCachedParent(cachedFolders, remoteFolder)) { + collector.add( + getCachedChildren(cachedFolders, remoteFolder, + Policy.subMonitorFor(monitor, 90)), Policy + .subMonitorFor(monitor, 10)); + return; + } + } else { + monitor.beginTask( + NLS.bind( + CVSUIMessages.RemoteFolderElement_fetchingRemoteChildren, + new String[] { getLabel(o) }), 100); + } FetchMembersOperation operation = new FetchMembersOperation(null, (ICVSRemoteFolder)o, collector); operation.run(Policy.subMonitorFor(monitor, 100)); } catch (InvocationTargetException e) { handle(collector, e); } catch (InterruptedException e) { // Cancelled by the user; + } catch (CVSException e) { + handle(collector, e); } finally { monitor.done(); } } + private boolean hasCachedParent(ICVSRemoteResource[] cachedFolders, + ICVSRemoteFolder remoteFolder) { + for (int i = 0; i < cachedFolders.length; i++) { + if (remoteFolder.getRepositoryRelativePath().startsWith( + cachedFolders[i].getRepositoryRelativePath())) { + return true; + } + } + return false; + } + + private ICVSRemoteResource[] getCachedChildren( + ICVSRemoteResource[] cachedFolders, ICVSRemoteFolder remoteFolder, + IProgressMonitor monitor) { + Set remoteResources = new HashSet(); + monitor = Policy.monitorFor(monitor); + monitor.beginTask(NLS.bind( + CVSUIMessages.RemoteFolderElement_fetchingRemoteChildren, + new String[] { getLabel(remoteFolder) }), cachedFolders.length); + try { + RepositoryRoot repositoryRoot = CVSUIPlugin.getPlugin() + .getRepositoryManager() + .getRepositoryRootFor(remoteFolder.getRepository()); + for (int i = 0; i < cachedFolders.length; i++) { + if (cachedFolders[i].getRepositoryRelativePath().startsWith( + remoteFolder.getRepositoryRelativePath())) { + String path = new Path( + cachedFolders[i].getRepositoryRelativePath()) + .uptoSegment( + new Path(remoteFolder + .getRepositoryRelativePath()) + .segmentCount() + 1).toString(); + remoteResources.add(repositoryRoot.getRemoteFolder(path, + remoteFolder.getTag(), + Policy.subMonitorFor(monitor, 1))); + } + } + return (ICVSRemoteResource[]) remoteResources + .toArray(new ICVSRemoteResource[remoteResources.size()]); + } finally { + monitor.done(); + } + } + public ISchedulingRule getRule(Object element) { ICVSRepositoryLocation location = getRepositoryLocation(element); return new RepositoryLocationSchedulingRule(location); |