diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java | 1036 |
1 files changed, 518 insertions, 518 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java index 93eb373a0..ff57ec0e4 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java @@ -44,265 +44,265 @@ import org.eclipse.team.ui.synchronize.*; * in the subscriber. */ public class LogEntryCacheUpdateHandler extends BackgroundEventHandler { - - private static final int REMOVAL = 1; - private static final int CHANGE = 2; - private static final int FETCH_REQUEST = 3; - private static final int PAUSE = 4; - - /* - * Lock used to ensure that fetches are queued when the job is - * a non-system job. - */ - private final Object queueLock = new Object(); - - /* - * Exception used to stop processing so the job can be restarted as a non-system job - */ - private static final OperationCanceledException PAUSE_EXCEPTION = new OperationCanceledException(); - - /* - * Contants for configuring how long to wait for the job to be paused - * when a fetch is required and the job needs to be converted to a non-system - * job. If the wait time is elapsed, an exception is thrown. - */ - private static final int WAIT_INCREMENT = 10; - private static final int MAX_WAIT = 1000; - - /* - * Set that keeps track of all resource for which we haved fetched log entries - */ - private final SyncInfoTree collectedInfos = new SyncInfoTree(); - - /* - * The cache that hold the log entries while the job is running - */ - //private LogEntryCache logEntriesCache; - - /* - * SoftReference used to hold on to the log entry cache while - * the job is not running so the cache can be cleared if memory is low. - */ - private SoftReference cacheReference; - - /* - * Collector that forewards subscriber changes so that - * stale cache entries can be cleared. - */ - private final LogEntryResourceCollector collector; + + private static final int REMOVAL = 1; + private static final int CHANGE = 2; + private static final int FETCH_REQUEST = 3; + private static final int PAUSE = 4; + + /* + * Lock used to ensure that fetches are queued when the job is + * a non-system job. + */ + private final Object queueLock = new Object(); + + /* + * Exception used to stop processing so the job can be restarted as a non-system job + */ + private static final OperationCanceledException PAUSE_EXCEPTION = new OperationCanceledException(); + + /* + * Contants for configuring how long to wait for the job to be paused + * when a fetch is required and the job needs to be converted to a non-system + * job. If the wait time is elapsed, an exception is thrown. + */ + private static final int WAIT_INCREMENT = 10; + private static final int MAX_WAIT = 1000; + + /* + * Set that keeps track of all resource for which we haved fetched log entries + */ + private final SyncInfoTree collectedInfos = new SyncInfoTree(); + + /* + * The cache that hold the log entries while the job is running + */ + //private LogEntryCache logEntriesCache; + + /* + * SoftReference used to hold on to the log entry cache while + * the job is not running so the cache can be cleared if memory is low. + */ + private SoftReference cacheReference; + + /* + * Collector that forewards subscriber changes so that + * stale cache entries can be cleared. + */ + private final LogEntryResourceCollector collector; - /* - * The subscriber generating the SyncInfo and log entries - */ - private final Subscriber subscriber; - - /* - * The accumulated list of updates that need to be dispatched - * (i.e. the cache should be purged of out-of-date resources). - * This list is only modified and accessed from the event processing - * thread. - */ + /* + * The subscriber generating the SyncInfo and log entries + */ + private final Subscriber subscriber; + + /* + * The accumulated list of updates that need to be dispatched + * (i.e. the cache should be purged of out-of-date resources). + * This list is only modified and accessed from the event processing + * thread. + */ private final List<Event> updates = new ArrayList<>(); - - /* - * The accumulated list of fetches that have been requested - */ + + /* + * The accumulated list of fetches that have been requested + */ private final List<Event> fetches = new ArrayList<>(); - private final ISynchronizePageConfiguration configuration; - - - /* - * Interface for notifying a single client that the infos have been fetched - */ - public interface ILogsFetchedListener { + private final ISynchronizePageConfiguration configuration; + + + /* + * Interface for notifying a single client that the infos have been fetched + */ + public interface ILogsFetchedListener { - void logEntriesFetched(SyncInfoSet set, LogEntryCache logEntryCache, IProgressMonitor monitor); - - } - - /* - * The listener or null if noone is listening - */ - private ILogsFetchedListener listener; - - /* - * Subscriber resource collector that forwards subscriber changes - * through the handler so that stale cache entries can be cleared - */ - private class LogEntryResourceCollector extends SubscriberResourceCollector { + void logEntriesFetched(SyncInfoSet set, LogEntryCache logEntryCache, IProgressMonitor monitor); + + } + + /* + * The listener or null if noone is listening + */ + private ILogsFetchedListener listener; + + /* + * Subscriber resource collector that forwards subscriber changes + * through the handler so that stale cache entries can be cleared + */ + private class LogEntryResourceCollector extends SubscriberResourceCollector { - public LogEntryResourceCollector(Subscriber subscriber) { - super(subscriber); - } + public LogEntryResourceCollector(Subscriber subscriber) { + super(subscriber); + } - @Override + @Override protected void remove(IResource resource) { - queueEvent(new ResourceEvent(resource, REMOVAL, IResource.DEPTH_INFINITE), false /* do not put in on the front of the queue*/); - } + queueEvent(new ResourceEvent(resource, REMOVAL, IResource.DEPTH_INFINITE), false /* do not put in on the front of the queue*/); + } - @Override + @Override protected void change(IResource resource, int depth) { - queueEvent(new ResourceEvent(resource, CHANGE, depth), false /* do not put in on the front of the queue*/); - } + queueEvent(new ResourceEvent(resource, CHANGE, depth), false /* do not put in on the front of the queue*/); + } - @Override + @Override protected boolean hasMembers(IResource resource) { - return collectedInfos.hasMembers(resource); - } - } - - /* - * Custom event for queue a log entry fetch request - */ - private class FetchRequest extends Event { - private final SyncInfo[] infos; - public FetchRequest(SyncInfo[] infos) { - super(FETCH_REQUEST); - this.infos = infos; - } - public SyncInfo[] getInfos() { - return infos; - } - } - - public LogEntryCacheUpdateHandler(ISynchronizePageConfiguration configuration) { - super(CVSUIMessages.LogEntryCacheUpdateHandler_1, CVSUIMessages.LogEntryCacheUpdateHandler_0); // - this.configuration = configuration; - this.subscriber = getSubscriber(configuration); - cacheReference = new SoftReference(new LogEntryCache()); - collector = new LogEntryResourceCollector(subscriber); - } + return collectedInfos.hasMembers(resource); + } + } + + /* + * Custom event for queue a log entry fetch request + */ + private class FetchRequest extends Event { + private final SyncInfo[] infos; + public FetchRequest(SyncInfo[] infos) { + super(FETCH_REQUEST); + this.infos = infos; + } + public SyncInfo[] getInfos() { + return infos; + } + } + + public LogEntryCacheUpdateHandler(ISynchronizePageConfiguration configuration) { + super(CVSUIMessages.LogEntryCacheUpdateHandler_1, CVSUIMessages.LogEntryCacheUpdateHandler_0); // + this.configuration = configuration; + this.subscriber = getSubscriber(configuration); + cacheReference = new SoftReference(new LogEntryCache()); + collector = new LogEntryResourceCollector(subscriber); + } - private Subscriber getSubscriber(ISynchronizePageConfiguration configuration) { - ISynchronizeParticipant participant = configuration.getParticipant(); - if (participant instanceof SubscriberParticipant) { + private Subscriber getSubscriber(ISynchronizePageConfiguration configuration) { + ISynchronizeParticipant participant = configuration.getParticipant(); + if (participant instanceof SubscriberParticipant) { SubscriberParticipant sp = (SubscriberParticipant) participant; return sp.getSubscriber(); } - if (participant instanceof ModelCompareParticipant) { + if (participant instanceof ModelCompareParticipant) { ModelCompareParticipant mcp = (ModelCompareParticipant) participant; return mcp.getSubscriber(); } - return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); - } + return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); + } - public ISynchronizePageConfiguration getConfiguration() { - return configuration; - } - - public Subscriber getSubscriber() { - return subscriber; - } - - /** - * Set the listener that should receive notification when log entries - * have been fetched and are avalable. - * @param listener the listener or <code>null</code> - */ - public void setListener(ILogsFetchedListener listener) { - this.listener = listener; - } - - @Override + public ISynchronizePageConfiguration getConfiguration() { + return configuration; + } + + public Subscriber getSubscriber() { + return subscriber; + } + + /** + * Set the listener that should receive notification when log entries + * have been fetched and are avalable. + * @param listener the listener or <code>null</code> + */ + public void setListener(ILogsFetchedListener listener) { + this.listener = listener; + } + + @Override protected Object getJobFamiliy() { - return ISynchronizeManager.FAMILY_SYNCHRONIZE_OPERATION; - } - - @Override + return ISynchronizeManager.FAMILY_SYNCHRONIZE_OPERATION; + } + + @Override protected void createEventHandlingJob() { - super.createEventHandlingJob(); - Job job = getEventHandlerJob(); - job.setSystem(false); - job.setUser(false); - } - - @Override + super.createEventHandlingJob(); + Job job = getEventHandlerJob(); + job.setSystem(false); + job.setUser(false); + } + + @Override protected void processEvent(Event event, IProgressMonitor monitor) throws CoreException { - Policy.checkCanceled(monitor); - switch (event.getType()) { - case REMOVAL: - case CHANGE: - updates.add(event); - break; - case FETCH_REQUEST: - fetches.add(event); - break; - case PAUSE: - throw PAUSE_EXCEPTION; - } - - } - - @Override + Policy.checkCanceled(monitor); + switch (event.getType()) { + case REMOVAL: + case CHANGE: + updates.add(event); + break; + case FETCH_REQUEST: + fetches.add(event); + break; + case PAUSE: + throw PAUSE_EXCEPTION; + } + + } + + @Override protected boolean doDispatchEvents(IProgressMonitor monitor) throws TeamException { - Policy.checkCanceled(monitor); - boolean dispatched = false; - monitor.beginTask(null, 50); - dispatched |= updateCache(Policy.subMonitorFor(monitor, 20)); - dispatched |= processQueuedFetches(Policy.subMonitorFor(monitor, 80)); - monitor.done(); - return dispatched; - } - - /* - * Remove any stale or unneeded log entries from the cache. - * Return whether there were any entries to purge. - */ - private boolean updateCache(IProgressMonitor monitor) { - if (updates.isEmpty()) return false; - try { - collectedInfos.beginInput(); - // Cycle through the update events - for (Iterator iter = updates.iterator(); iter.hasNext();) { - Event event = (Event) iter.next(); - Policy.checkCanceled(monitor); - if (event.getType() == REMOVAL) { - remove(event.getResource(), ((ResourceEvent)event).getDepth()); - } else if (event.getType() == CHANGE) { - change(event.getResource(), ((ResourceEvent)event).getDepth()); - } - // Use the iterator to remove so that updates will not be lost - // if the job is cancelled and then restarted. - iter.remove(); - } - } finally { - collectedInfos.endInput(monitor); - } - return true; - } + Policy.checkCanceled(monitor); + boolean dispatched = false; + monitor.beginTask(null, 50); + dispatched |= updateCache(Policy.subMonitorFor(monitor, 20)); + dispatched |= processQueuedFetches(Policy.subMonitorFor(monitor, 80)); + monitor.done(); + return dispatched; + } + + /* + * Remove any stale or unneeded log entries from the cache. + * Return whether there were any entries to purge. + */ + private boolean updateCache(IProgressMonitor monitor) { + if (updates.isEmpty()) return false; + try { + collectedInfos.beginInput(); + // Cycle through the update events + for (Iterator iter = updates.iterator(); iter.hasNext();) { + Event event = (Event) iter.next(); + Policy.checkCanceled(monitor); + if (event.getType() == REMOVAL) { + remove(event.getResource(), ((ResourceEvent)event).getDepth()); + } else if (event.getType() == CHANGE) { + change(event.getResource(), ((ResourceEvent)event).getDepth()); + } + // Use the iterator to remove so that updates will not be lost + // if the job is cancelled and then restarted. + iter.remove(); + } + } finally { + collectedInfos.endInput(monitor); + } + return true; + } - @Override + @Override public void shutdown() { - super.shutdown(); - collector.dispose(); - // Probably not necessary as GC would take care of it but we'll do it anyway - if (cacheReference != null) { - LogEntryCache cache = (LogEntryCache)cacheReference.get(); - if (cache != null) { - cache.clearEntries(); - } - } - collectedInfos.clear(); - - } - - private void remove(IResource resource, int depth) { - collectedInfos.remove(resource, depth); - } + super.shutdown(); + collector.dispose(); + // Probably not necessary as GC would take care of it but we'll do it anyway + if (cacheReference != null) { + LogEntryCache cache = (LogEntryCache)cacheReference.get(); + if (cache != null) { + cache.clearEntries(); + } + } + collectedInfos.clear(); + + } + + private void remove(IResource resource, int depth) { + collectedInfos.remove(resource, depth); + } - private void remove(SyncInfo info) { - if (info != null) { - collectedInfos.remove(info.getLocal()); - LogEntryCache cache = (LogEntryCache)cacheReference.get(); - if (cache != null) { + private void remove(SyncInfo info) { + if (info != null) { + collectedInfos.remove(info.getLocal()); + LogEntryCache cache = (LogEntryCache)cacheReference.get(); + if (cache != null) { ICVSRemoteResource remoteResource = getRemoteResource(info); if (remoteResource != null) cache.clearEntries(remoteResource); } - } - } + } + } - public ICVSRemoteResource getRemoteResource(SyncInfo info) { + public ICVSRemoteResource getRemoteResource(SyncInfo info) { try { ICVSRemoteResource remote = (ICVSRemoteResource) info.getRemote(); ICVSRemoteResource local = CVSWorkspaceRoot.getRemoteResourceFor(info.getLocal()); @@ -330,180 +330,180 @@ public class LogEntryCacheUpdateHandler extends BackgroundEventHandler { } } - private boolean useRemote(String localRevision, String remoteRevision) { - boolean useRemote; - if (remoteRevision == null && localRevision == null) { - useRemote = true; - } else if (localRevision == null) { - useRemote = true; - } else if (remoteRevision == null) { - useRemote = false; - } else { - useRemote = ResourceSyncInfo.isLaterRevision(remoteRevision, localRevision); - } - return useRemote; - } + private boolean useRemote(String localRevision, String remoteRevision) { + boolean useRemote; + if (remoteRevision == null && localRevision == null) { + useRemote = true; + } else if (localRevision == null) { + useRemote = true; + } else if (remoteRevision == null) { + useRemote = false; + } else { + useRemote = ResourceSyncInfo.isLaterRevision(remoteRevision, localRevision); + } + return useRemote; + } - private String getRevisionString(ICVSRemoteResource remoteFile) { + private String getRevisionString(ICVSRemoteResource remoteFile) { if(remoteFile instanceof RemoteFile) { return ((RemoteFile)remoteFile).getRevision(); } return null; } - - private void change(IResource resource, int depth) { - // We only need to remove collected log entries that don't apply - // any longer. They will be refetched when they are required. - SyncInfo[] collected = collectedInfos.getSyncInfos(resource, depth); - change(collected); - } - - private void change(SyncInfo[] collected) { - Subscriber subscriber = getSubscriber(); - for (int i = 0; i < collected.length; i++) { - try { - SyncInfo info = collected[i]; - SyncInfo newInfo = subscriber.getSyncInfo(info.getLocal()); - if (newInfo == null || !newInfo.equals(info)) { - // The cached log entry no longer applies to the new sync info. - // It will be refetched when required. - remove(info); - } - } catch (TeamException e) { - // Log and continue - CVSUIPlugin.log(e); - } - } - } + + private void change(IResource resource, int depth) { + // We only need to remove collected log entries that don't apply + // any longer. They will be refetched when they are required. + SyncInfo[] collected = collectedInfos.getSyncInfos(resource, depth); + change(collected); + } + + private void change(SyncInfo[] collected) { + Subscriber subscriber = getSubscriber(); + for (int i = 0; i < collected.length; i++) { + try { + SyncInfo info = collected[i]; + SyncInfo newInfo = subscriber.getSyncInfo(info.getLocal()); + if (newInfo == null || !newInfo.equals(info)) { + // The cached log entry no longer applies to the new sync info. + // It will be refetched when required. + remove(info); + } + } catch (TeamException e) { + // Log and continue + CVSUIPlugin.log(e); + } + } + } - /** - * Queue a request to fetch log entries for the given SyncInfo nodes. - * The event handler must be a non-system job when revision histories - * are fetched. - * @param infos the nodes whose log entries are to be fetched - */ - public void fetch(SyncInfo[] infos) throws CVSException { - synchronized(queueLock) { - Job job = getEventHandlerJob(); - if (job.isSystem() && job.getState() != Job.NONE) { - // queue an event to pause the processor - super.queueEvent(new Event(PAUSE), true /* put on the front of the queue */); - int count = 0; - while (job.getState() != Job.NONE && count < MAX_WAIT) { - count += WAIT_INCREMENT; - try { - Thread.sleep(WAIT_INCREMENT); // Wait a little while - } catch (InterruptedException e) { - // Ignore - } - } - if (job.getState() != Job.NONE) { - // The job never completed in the time aloted so throw an exception - throw new CVSException(CVSUIMessages.LogEntryCacheUpdateHandler_2); - } - } - // Queue the event even if the job didn't stop in the time aloted - queueEvent(new FetchRequest(infos), false /* don't place at the end */); - } - } - - @Override + /** + * Queue a request to fetch log entries for the given SyncInfo nodes. + * The event handler must be a non-system job when revision histories + * are fetched. + * @param infos the nodes whose log entries are to be fetched + */ + public void fetch(SyncInfo[] infos) throws CVSException { + synchronized(queueLock) { + Job job = getEventHandlerJob(); + if (job.isSystem() && job.getState() != Job.NONE) { + // queue an event to pause the processor + super.queueEvent(new Event(PAUSE), true /* put on the front of the queue */); + int count = 0; + while (job.getState() != Job.NONE && count < MAX_WAIT) { + count += WAIT_INCREMENT; + try { + Thread.sleep(WAIT_INCREMENT); // Wait a little while + } catch (InterruptedException e) { + // Ignore + } + } + if (job.getState() != Job.NONE) { + // The job never completed in the time aloted so throw an exception + throw new CVSException(CVSUIMessages.LogEntryCacheUpdateHandler_2); + } + } + // Queue the event even if the job didn't stop in the time aloted + queueEvent(new FetchRequest(infos), false /* don't place at the end */); + } + } + + @Override protected void queueEvent(Event event, boolean front) { - // Override to snure that queues by this handler are serialized - synchronized(queueLock) { - Job job = getEventHandlerJob(); - if (job.getState() == Job.NONE) { - job.setSystem(event.getType() != FETCH_REQUEST); - } - super.queueEvent(event, front); - } - } - - /* - * Method invoked during event dispatch to fetch log entries - */ - private boolean processQueuedFetches(IProgressMonitor monitor) { - if (fetches.isEmpty()) return false; - try { - // Now perform the fetching - Map projectMapping = getFetchesByProject(); - if (projectMapping.isEmpty()) return true; - LogEntryCache logEntriesCache = (LogEntryCache)cacheReference.get(); - if (logEntriesCache == null) { - logEntriesCache = new LogEntryCache(); - cacheReference = new SoftReference(logEntriesCache); - } - monitor.beginTask(CVSUIMessages.CVSChangeSetCollector_4, 100 * projectMapping.size()); - monitor.setTaskName(CVSUIMessages.CVSChangeSetCollector_4); - for (Iterator iter = projectMapping.values().iterator(); iter.hasNext();) { - SyncInfoSet set = (SyncInfoSet) iter.next(); - Policy.checkCanceled(monitor); - fetchLogEntries(logEntriesCache, set, Policy.subMonitorFor(monitor, 90)); - fireFetchedNotification(logEntriesCache, set, Policy.subMonitorFor(monitor, 10)); - } - } finally { - // Clear the fetches even if we were cancelled. - // Restarting will need to re-request all infos - fetches.clear(); - monitor.done(); - } - return true; - } + // Override to snure that queues by this handler are serialized + synchronized(queueLock) { + Job job = getEventHandlerJob(); + if (job.getState() == Job.NONE) { + job.setSystem(event.getType() != FETCH_REQUEST); + } + super.queueEvent(event, front); + } + } + + /* + * Method invoked during event dispatch to fetch log entries + */ + private boolean processQueuedFetches(IProgressMonitor monitor) { + if (fetches.isEmpty()) return false; + try { + // Now perform the fetching + Map projectMapping = getFetchesByProject(); + if (projectMapping.isEmpty()) return true; + LogEntryCache logEntriesCache = (LogEntryCache)cacheReference.get(); + if (logEntriesCache == null) { + logEntriesCache = new LogEntryCache(); + cacheReference = new SoftReference(logEntriesCache); + } + monitor.beginTask(CVSUIMessages.CVSChangeSetCollector_4, 100 * projectMapping.size()); + monitor.setTaskName(CVSUIMessages.CVSChangeSetCollector_4); + for (Iterator iter = projectMapping.values().iterator(); iter.hasNext();) { + SyncInfoSet set = (SyncInfoSet) iter.next(); + Policy.checkCanceled(monitor); + fetchLogEntries(logEntriesCache, set, Policy.subMonitorFor(monitor, 90)); + fireFetchedNotification(logEntriesCache, set, Policy.subMonitorFor(monitor, 10)); + } + } finally { + // Clear the fetches even if we were cancelled. + // Restarting will need to re-request all infos + fetches.clear(); + monitor.done(); + } + return true; + } - private void fireFetchedNotification(LogEntryCache logEntriesCache, SyncInfoSet set, IProgressMonitor monitor) { - if (listener != null) { - listener.logEntriesFetched(set, logEntriesCache, monitor); - } - } + private void fireFetchedNotification(LogEntryCache logEntriesCache, SyncInfoSet set, IProgressMonitor monitor) { + if (listener != null) { + listener.logEntriesFetched(set, logEntriesCache, monitor); + } + } - /* - * Return a map of IProject to SyncInfoSet as that is how entries are fetched. - * The set for each project includes all infos from the original set. - * This is one so that the completion notification contains all infos - * including those were a fetch was not required either because the - * entry was already cached or the resource has no history. - */ - private Map getFetchesByProject() { + /* + * Return a map of IProject to SyncInfoSet as that is how entries are fetched. + * The set for each project includes all infos from the original set. + * This is one so that the completion notification contains all infos + * including those were a fetch was not required either because the + * entry was already cached or the resource has no history. + */ + private Map getFetchesByProject() { Map<IProject, SyncInfoSet> result = new HashMap<>(); - for (Iterator iter = fetches.iterator(); iter.hasNext();) { - FetchRequest request = (FetchRequest) iter.next(); - SyncInfo[] infos = request.getInfos(); - for (int i = 0; i < infos.length; i++) { - SyncInfo info = infos[i]; - IProject project = info.getLocal().getProject(); - SyncInfoSet infoSet = result.get(project); - if (infoSet == null) { - infoSet = new SyncInfoSet(); - result.put(project, infoSet); - } - infoSet.add(info); - } - } - return result; - } + for (Iterator iter = fetches.iterator(); iter.hasNext();) { + FetchRequest request = (FetchRequest) iter.next(); + SyncInfo[] infos = request.getInfos(); + for (int i = 0; i < infos.length; i++) { + SyncInfo info = infos[i]; + IProject project = info.getLocal().getProject(); + SyncInfoSet infoSet = result.get(project); + if (infoSet == null) { + infoSet = new SyncInfoSet(); + result.put(project, infoSet); + } + infoSet.add(info); + } + } + return result; + } - private boolean isFetchRequired(SyncInfo info) { - // We only need to fetch if we don't have the log entry already - // and the change is a remote change - return info.getLocal().getType() == IResource.FILE && !isLogEntryCached(info) && isRemoteChange(info); - - } - + private boolean isFetchRequired(SyncInfo info) { + // We only need to fetch if we don't have the log entry already + // and the change is a remote change + return info.getLocal().getType() == IResource.FILE && !isLogEntryCached(info) && isRemoteChange(info); + + } + /* - * Return whether the given SyncInfo is cached. If there is - * an info for the resource that does not match the given info, - * it is removed and false is returned. - */ - private boolean isLogEntryCached(SyncInfo info) { - SyncInfo collectedInfo = collectedInfos.getSyncInfo(info.getLocal()); - if (collectedInfo != null && !collectedInfo.equals(info)) { - remove(collectedInfo); - collectedInfo = null; - } - return collectedInfo != null; - } + * Return whether the given SyncInfo is cached. If there is + * an info for the resource that does not match the given info, + * it is removed and false is returned. + */ + private boolean isLogEntryCached(SyncInfo info) { + SyncInfo collectedInfo = collectedInfos.getSyncInfo(info.getLocal()); + if (collectedInfo != null && !collectedInfo.equals(info)) { + remove(collectedInfo); + collectedInfo = null; + } + return collectedInfo != null; + } - /* + /* * Return if this sync info should be considered as part of a remote change * meaning that it can be placed inside an incoming commit set (i.e. the * set is determined using the comments from the log entry of the file). @@ -518,136 +518,136 @@ public class LogEntryCacheUpdateHandler extends BackgroundEventHandler { if (info.getRemote() != null) return true; ICVSFile file = CVSWorkspaceRoot.getCVSFileFor((IFile)info.getLocal()); try { - return file.getSyncBytes() != null; - } catch (CVSException e) { - // Log the error and exclude the file from consideration - CVSUIPlugin.log(e); - return false; - } - } - - /* - * Fetch the log entries for the info in the given set - */ - private void fetchLogEntries(LogEntryCache logEntriesCache, SyncInfoSet set, IProgressMonitor monitor) { - try { - if (subscriber instanceof CVSCompareSubscriber) { - CVSCompareSubscriber compareSubscriber = (CVSCompareSubscriber)subscriber; - fetchLogEntries(logEntriesCache, compareSubscriber, set, monitor); - } else { - // Run the log command once with no tags - fetchLogs(logEntriesCache, set, null, null, monitor); - } - } catch (CVSException e) { - handleException(e); - } catch (InterruptedException e) { - throw new OperationCanceledException(); - } - - } - - private void fetchLogEntries(LogEntryCache logEntriesCache, CVSCompareSubscriber compareSubscriber, SyncInfoSet set, IProgressMonitor monitor) throws CVSException, InterruptedException { - Map localTagMap = getLocalTagMap(set); - monitor.beginTask(null, 100 * localTagMap.size()); - for (Iterator iter = localTagMap.keySet().iterator(); iter.hasNext();) { - CVSTag localTag = (CVSTag) iter.next(); - fetchLogEntries(logEntriesCache, compareSubscriber, set, localTag, Policy.subMonitorFor(monitor, 100)); - } - Policy.checkCanceled(monitor); - monitor.done(); - } + return file.getSyncBytes() != null; + } catch (CVSException e) { + // Log the error and exclude the file from consideration + CVSUIPlugin.log(e); + return false; + } + } + + /* + * Fetch the log entries for the info in the given set + */ + private void fetchLogEntries(LogEntryCache logEntriesCache, SyncInfoSet set, IProgressMonitor monitor) { + try { + if (subscriber instanceof CVSCompareSubscriber) { + CVSCompareSubscriber compareSubscriber = (CVSCompareSubscriber)subscriber; + fetchLogEntries(logEntriesCache, compareSubscriber, set, monitor); + } else { + // Run the log command once with no tags + fetchLogs(logEntriesCache, set, null, null, monitor); + } + } catch (CVSException e) { + handleException(e); + } catch (InterruptedException e) { + throw new OperationCanceledException(); + } + + } + + private void fetchLogEntries(LogEntryCache logEntriesCache, CVSCompareSubscriber compareSubscriber, SyncInfoSet set, IProgressMonitor monitor) throws CVSException, InterruptedException { + Map localTagMap = getLocalTagMap(set); + monitor.beginTask(null, 100 * localTagMap.size()); + for (Iterator iter = localTagMap.keySet().iterator(); iter.hasNext();) { + CVSTag localTag = (CVSTag) iter.next(); + fetchLogEntries(logEntriesCache, compareSubscriber, set, localTag, Policy.subMonitorFor(monitor, 100)); + } + Policy.checkCanceled(monitor); + monitor.done(); + } - /* - * Return the resources grouped by the tag found in the - * workspace. The map is CVSTag->SyncInfoSet - */ - private Map getLocalTagMap(SyncInfoSet set) { + /* + * Return the resources grouped by the tag found in the + * workspace. The map is CVSTag->SyncInfoSet + */ + private Map getLocalTagMap(SyncInfoSet set) { Map<CVSTag, SyncInfoSet> result = new HashMap<>(); - for (Iterator iter = set.iterator(); iter.hasNext();) { - SyncInfo info = (SyncInfo) iter.next(); - CVSTag tag = getLocalTag(info); - SyncInfoSet tagSet = result.get(tag); - if (tagSet == null) { - tagSet = new SyncInfoSet(); - result.put(tag, tagSet); - } - tagSet.add(info); - } - return result; - } + for (Iterator iter = set.iterator(); iter.hasNext();) { + SyncInfo info = (SyncInfo) iter.next(); + CVSTag tag = getLocalTag(info); + SyncInfoSet tagSet = result.get(tag); + if (tagSet == null) { + tagSet = new SyncInfoSet(); + result.put(tag, tagSet); + } + tagSet.add(info); + } + return result; + } - private CVSTag getLocalTag(SyncInfo syncInfo) { + private CVSTag getLocalTag(SyncInfo syncInfo) { try { - IResource local = syncInfo.getLocal(); - ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(local); - CVSTag tag = null; - if(cvsResource.isFolder()) { - FolderSyncInfo info = ((ICVSFolder)cvsResource).getFolderSyncInfo(); - if(info != null) { - tag = info.getTag(); - } - if (tag != null && tag.getType() == CVSTag.BRANCH) { - tag = Util.getAccurateFolderTag(local, tag); - } - } else { - tag = CVSAction.getAccurateFileTag(cvsResource); - } - if(tag == null) { - tag = new CVSTag(); - } - return tag; - } catch (CVSException e) { - CVSUIPlugin.log(e); - return new CVSTag(); - } - } + IResource local = syncInfo.getLocal(); + ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(local); + CVSTag tag = null; + if(cvsResource.isFolder()) { + FolderSyncInfo info = ((ICVSFolder)cvsResource).getFolderSyncInfo(); + if(info != null) { + tag = info.getTag(); + } + if (tag != null && tag.getType() == CVSTag.BRANCH) { + tag = Util.getAccurateFolderTag(local, tag); + } + } else { + tag = CVSAction.getAccurateFileTag(cvsResource); + } + if(tag == null) { + tag = new CVSTag(); + } + return tag; + } catch (CVSException e) { + CVSUIPlugin.log(e); + return new CVSTag(); + } + } - private void fetchLogEntries(LogEntryCache logEntriesCache, CVSCompareSubscriber compareSubscriber, SyncInfoSet set, CVSTag localTag, IProgressMonitor monitor) throws CVSException, InterruptedException { - if (compareSubscriber.isMultipleTagComparison()) { - Map rootToInfoMap = getRootToInfoMap(compareSubscriber, set); - monitor.beginTask(null, 100 * rootToInfoMap.size()); - for (Iterator iterator = rootToInfoMap.keySet().iterator(); iterator.hasNext();) { - IResource root = (IResource) iterator.next(); - Policy.checkCanceled(monitor); - fetchLogs(logEntriesCache, set, localTag, compareSubscriber.getTag(root), Policy.subMonitorFor(monitor, 100)); - } - monitor.done(); - } else { - Policy.checkCanceled(monitor); - fetchLogs(logEntriesCache, set, localTag, compareSubscriber.getTag(), monitor); - } - } + private void fetchLogEntries(LogEntryCache logEntriesCache, CVSCompareSubscriber compareSubscriber, SyncInfoSet set, CVSTag localTag, IProgressMonitor monitor) throws CVSException, InterruptedException { + if (compareSubscriber.isMultipleTagComparison()) { + Map rootToInfoMap = getRootToInfoMap(compareSubscriber, set); + monitor.beginTask(null, 100 * rootToInfoMap.size()); + for (Iterator iterator = rootToInfoMap.keySet().iterator(); iterator.hasNext();) { + IResource root = (IResource) iterator.next(); + Policy.checkCanceled(monitor); + fetchLogs(logEntriesCache, set, localTag, compareSubscriber.getTag(root), Policy.subMonitorFor(monitor, 100)); + } + monitor.done(); + } else { + Policy.checkCanceled(monitor); + fetchLogs(logEntriesCache, set, localTag, compareSubscriber.getTag(), monitor); + } + } - private Map getRootToInfoMap(CVSCompareSubscriber compareSubscriber, SyncInfoSet set) { + private Map getRootToInfoMap(CVSCompareSubscriber compareSubscriber, SyncInfoSet set) { Map<IResource, SyncInfoSet> rootToInfosMap = new HashMap<>(); - IResource[] roots = compareSubscriber.roots(); - for (Iterator iter = set.iterator(); iter.hasNext();) { - SyncInfo info = (SyncInfo) iter.next(); - IPath localPath = info.getLocal().getFullPath(); - for (int j = 0; j < roots.length; j++) { - IResource resource = roots[j]; - if (resource.getFullPath().isPrefixOf(localPath)) { - SyncInfoSet infoList = rootToInfosMap.get(resource); - if (infoList == null) { - infoList = new SyncInfoSet(); - rootToInfosMap.put(resource, infoList); - } - infoList.add(info); - break; // out of inner loop - } - } - - } - return rootToInfosMap; - } + IResource[] roots = compareSubscriber.roots(); + for (Iterator iter = set.iterator(); iter.hasNext();) { + SyncInfo info = (SyncInfo) iter.next(); + IPath localPath = info.getLocal().getFullPath(); + for (int j = 0; j < roots.length; j++) { + IResource resource = roots[j]; + if (resource.getFullPath().isPrefixOf(localPath)) { + SyncInfoSet infoList = rootToInfosMap.get(resource); + if (infoList == null) { + infoList = new SyncInfoSet(); + rootToInfosMap.put(resource, infoList); + } + infoList.add(info); + break; // out of inner loop + } + } + + } + return rootToInfosMap; + } - private void fetchLogs(LogEntryCache logEntriesCache, SyncInfoSet set, CVSTag localTag, CVSTag remoteTag, IProgressMonitor monitor) throws CVSException, InterruptedException { - ICVSRemoteResource[] remoteResources = getRemotesToFetch(set.getSyncInfos()); - if (remoteResources.length > 0) { + private void fetchLogs(LogEntryCache logEntriesCache, SyncInfoSet set, CVSTag localTag, CVSTag remoteTag, IProgressMonitor monitor) throws CVSException, InterruptedException { + ICVSRemoteResource[] remoteResources = getRemotesToFetch(set.getSyncInfos()); + if (remoteResources.length > 0) { RemoteLogOperation logOperation = new RemoteLogOperation(getConfiguration().getSite().getPart(), remoteResources, localTag, remoteTag, logEntriesCache); logOperation.execute(monitor); - } - collectedInfos.addAll(set); + } + collectedInfos.addAll(set); } private ICVSRemoteResource[] getRemotesToFetch(SyncInfo[] infos) { @@ -664,14 +664,14 @@ public class LogEntryCacheUpdateHandler extends BackgroundEventHandler { return remotes.toArray(new ICVSRemoteResource[remotes.size()]); } - /** - * Stop any current fetch in process. - */ - public void stopFetching() { - try { - getEventHandlerJob().cancel(); - getEventHandlerJob().join(); - } catch (InterruptedException e) { - } - } + /** + * Stop any current fetch in process. + */ + public void stopFetching() { + try { + getEventHandlerJob().cancel(); + getEventHandlerJob().join(); + } catch (InterruptedException e) { + } + } } |