diff options
Diffstat (limited to 'bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java')
-rw-r--r-- | bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java | 550 |
1 files changed, 275 insertions, 275 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java index 462860ca5..c34010237 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetManager.java @@ -42,288 +42,288 @@ import org.osgi.service.prefs.Preferences; */ public class SubscriberChangeSetManager extends ActiveChangeSetManager { - private static final String PREF_CHANGE_SETS = "changeSets"; //$NON-NLS-1$ + private static final String PREF_CHANGE_SETS = "changeSets"; //$NON-NLS-1$ - private static final int RESOURCE_REMOVAL = 1; - private static final int RESOURCE_CHANGE = 2; + private static final int RESOURCE_REMOVAL = 1; + private static final int RESOURCE_CHANGE = 2; - private EventHandler handler; - private ResourceCollector collector; + private EventHandler handler; + private ResourceCollector collector; - /* - * Background event handler for serializing and batching change set changes - */ - private class EventHandler extends BackgroundEventHandler { + /* + * Background event handler for serializing and batching change set changes + */ + private class EventHandler extends BackgroundEventHandler { - private List<Event> dispatchEvents = new ArrayList<>(); + private List<Event> dispatchEvents = new ArrayList<>(); - protected EventHandler(String jobName, String errorTitle) { - super(jobName, errorTitle); - } + protected EventHandler(String jobName, String errorTitle) { + super(jobName, errorTitle); + } - @Override + @Override protected void processEvent(Event event, IProgressMonitor monitor) throws CoreException { - // Handle everything in the dispatch - if (isShutdown()) - throw new OperationCanceledException(); - dispatchEvents.add(event); - } + // Handle everything in the dispatch + if (isShutdown()) + throw new OperationCanceledException(); + dispatchEvents.add(event); + } - @Override + @Override protected boolean doDispatchEvents(IProgressMonitor monitor) throws TeamException { - if (dispatchEvents.isEmpty()) { - return false; - } - if (isShutdown()) - throw new OperationCanceledException(); - ResourceDiffTree[] locked = null; - try { - locked = beginDispath(); - for (Iterator iter = dispatchEvents.iterator(); iter.hasNext();) { - Event event = (Event) iter.next(); - switch (event.getType()) { - case RESOURCE_REMOVAL: - handleRemove(event.getResource()); - break; - case RESOURCE_CHANGE: - handleChange(event.getResource(), ((ResourceEvent)event).getDepth()); - break; - default: - break; - } - if (isShutdown()) - throw new OperationCanceledException(); - } - } catch (CoreException e) { + if (dispatchEvents.isEmpty()) { + return false; + } + if (isShutdown()) + throw new OperationCanceledException(); + ResourceDiffTree[] locked = null; + try { + locked = beginDispath(); + for (Iterator iter = dispatchEvents.iterator(); iter.hasNext();) { + Event event = (Event) iter.next(); + switch (event.getType()) { + case RESOURCE_REMOVAL: + handleRemove(event.getResource()); + break; + case RESOURCE_CHANGE: + handleChange(event.getResource(), ((ResourceEvent)event).getDepth()); + break; + default: + break; + } + if (isShutdown()) + throw new OperationCanceledException(); + } + } catch (CoreException e) { throw TeamException.asTeamException(e); } finally { - try { - endDispatch(locked, monitor); - } finally { - dispatchEvents.clear(); - } - } - return true; - } - - /* - * Begin input on all the sets and return the sync sets that were - * locked. If this method throws an exception then the client - * can assume that no sets were locked - */ - private ResourceDiffTree[] beginDispath() { - ChangeSet[] sets = getSets(); - List<ResourceDiffTree> lockedSets = new ArrayList<>(); - try { - for (int i = 0; i < sets.length; i++) { - ActiveChangeSet set = (ActiveChangeSet)sets[i]; - ResourceDiffTree tree = set.internalGetDiffTree(); - lockedSets.add(tree); - tree.beginInput(); - } - return lockedSets.toArray(new ResourceDiffTree[lockedSets.size()]); - } catch (RuntimeException e) { - try { - for (Iterator iter = lockedSets.iterator(); iter.hasNext();) { - ResourceDiffTree tree = (ResourceDiffTree) iter.next(); - try { - tree.endInput(null); - } catch (Throwable e1) { - // Ignore so that original exception is not masked - } - } - } catch (Throwable e1) { - // Ignore so that original exception is not masked - } - throw e; - } - } - - private void endDispatch(ResourceDiffTree[] locked, IProgressMonitor monitor) { - if (locked == null) { - // The begin failed so there's nothing to unlock - return; - } - monitor.beginTask(null, 100 * locked.length); - for (int i = 0; i < locked.length; i++) { - ResourceDiffTree tree = locked[i]; - try { - tree.endInput(Policy.subMonitorFor(monitor, 100)); - } catch (RuntimeException e) { - // Don't worry about ending every set if an error occurs. - // Instead, log the error and suggest a restart. - TeamPlugin.log(IStatus.ERROR, Messages.SubscriberChangeSetCollector_0, e); - throw e; - } - } - monitor.done(); - } - - @Override + try { + endDispatch(locked, monitor); + } finally { + dispatchEvents.clear(); + } + } + return true; + } + + /* + * Begin input on all the sets and return the sync sets that were + * locked. If this method throws an exception then the client + * can assume that no sets were locked + */ + private ResourceDiffTree[] beginDispath() { + ChangeSet[] sets = getSets(); + List<ResourceDiffTree> lockedSets = new ArrayList<>(); + try { + for (int i = 0; i < sets.length; i++) { + ActiveChangeSet set = (ActiveChangeSet)sets[i]; + ResourceDiffTree tree = set.internalGetDiffTree(); + lockedSets.add(tree); + tree.beginInput(); + } + return lockedSets.toArray(new ResourceDiffTree[lockedSets.size()]); + } catch (RuntimeException e) { + try { + for (Iterator iter = lockedSets.iterator(); iter.hasNext();) { + ResourceDiffTree tree = (ResourceDiffTree) iter.next(); + try { + tree.endInput(null); + } catch (Throwable e1) { + // Ignore so that original exception is not masked + } + } + } catch (Throwable e1) { + // Ignore so that original exception is not masked + } + throw e; + } + } + + private void endDispatch(ResourceDiffTree[] locked, IProgressMonitor monitor) { + if (locked == null) { + // The begin failed so there's nothing to unlock + return; + } + monitor.beginTask(null, 100 * locked.length); + for (int i = 0; i < locked.length; i++) { + ResourceDiffTree tree = locked[i]; + try { + tree.endInput(Policy.subMonitorFor(monitor, 100)); + } catch (RuntimeException e) { + // Don't worry about ending every set if an error occurs. + // Instead, log the error and suggest a restart. + TeamPlugin.log(IStatus.ERROR, Messages.SubscriberChangeSetCollector_0, e); + throw e; + } + } + monitor.done(); + } + + @Override protected synchronized void queueEvent(Event event, boolean front) { - // Override to allow access from enclosing class - super.queueEvent(event, front); - } - - /* - * Handle the removal - */ - private void handleRemove(IResource resource) { - ChangeSet[] sets = getSets(); - for (int i = 0; i < sets.length; i++) { - ChangeSet set = sets[i]; - // This will remove any descendants from the set and callback to - // resourcesChanged which will batch changes - if (!set.isEmpty()) { - set.rootRemoved(resource, IResource.DEPTH_INFINITE); - if (set.isEmpty()) { - remove(set); - } - } - } - } - - /* - * Handle the change - */ - private void handleChange(IResource resource, int depth) throws CoreException { - IDiff diff = getDiff(resource); - if (isModified(diff)) { - ActiveChangeSet[] containingSets = getContainingSets(resource); - if (containingSets.length == 0) { - // Consider for inclusion in the default set - // if the resource is not already a member of another set - if (getDefaultSet() != null) { - getDefaultSet().add(diff); - } - } else { - for (int i = 0; i < containingSets.length; i++) { - ActiveChangeSet set = containingSets[i]; - // Update the sync info in the set - set.add(diff); - } - } - } else { - removeFromAllSets(resource); - } - if (depth != IResource.DEPTH_ZERO) { - IResource[] members = getSubscriber().members(resource); - for (int i = 0; i < members.length; i++) { - IResource member = members[i]; - handleChange(member, depth == IResource.DEPTH_ONE ? IResource.DEPTH_ZERO : IResource.DEPTH_INFINITE); - } - } - } - - private void removeFromAllSets(IResource resource) { - List<ChangeSet> toRemove = new ArrayList<>(); - ChangeSet[] sets = getSets(); - for (int i = 0; i < sets.length; i++) { - ChangeSet set = sets[i]; - if (set.contains(resource)) { - set.remove(resource); - if (set.isEmpty()) { - toRemove.add(set); - } - } - } - for (Object element : toRemove) { - ActiveChangeSet set = (ActiveChangeSet) element; - remove(set); - } - } - - private ActiveChangeSet[] getContainingSets(IResource resource) { - Set<ActiveChangeSet> result = new HashSet<>(); - ChangeSet[] sets = getSets(); - for (int i = 0; i < sets.length; i++) { - ChangeSet set = sets[i]; - if (set.contains(resource)) { - result.add((ActiveChangeSet) set); - } - } - return result.toArray(new ActiveChangeSet[result.size()]); - } - } - - private class ResourceCollector extends SubscriberResourceCollector { - - public ResourceCollector(Subscriber subscriber) { - super(subscriber); - } - - @Override + // Override to allow access from enclosing class + super.queueEvent(event, front); + } + + /* + * Handle the removal + */ + private void handleRemove(IResource resource) { + ChangeSet[] sets = getSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + // This will remove any descendants from the set and callback to + // resourcesChanged which will batch changes + if (!set.isEmpty()) { + set.rootRemoved(resource, IResource.DEPTH_INFINITE); + if (set.isEmpty()) { + remove(set); + } + } + } + } + + /* + * Handle the change + */ + private void handleChange(IResource resource, int depth) throws CoreException { + IDiff diff = getDiff(resource); + if (isModified(diff)) { + ActiveChangeSet[] containingSets = getContainingSets(resource); + if (containingSets.length == 0) { + // Consider for inclusion in the default set + // if the resource is not already a member of another set + if (getDefaultSet() != null) { + getDefaultSet().add(diff); + } + } else { + for (int i = 0; i < containingSets.length; i++) { + ActiveChangeSet set = containingSets[i]; + // Update the sync info in the set + set.add(diff); + } + } + } else { + removeFromAllSets(resource); + } + if (depth != IResource.DEPTH_ZERO) { + IResource[] members = getSubscriber().members(resource); + for (int i = 0; i < members.length; i++) { + IResource member = members[i]; + handleChange(member, depth == IResource.DEPTH_ONE ? IResource.DEPTH_ZERO : IResource.DEPTH_INFINITE); + } + } + } + + private void removeFromAllSets(IResource resource) { + List<ChangeSet> toRemove = new ArrayList<>(); + ChangeSet[] sets = getSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + if (set.contains(resource)) { + set.remove(resource); + if (set.isEmpty()) { + toRemove.add(set); + } + } + } + for (Object element : toRemove) { + ActiveChangeSet set = (ActiveChangeSet) element; + remove(set); + } + } + + private ActiveChangeSet[] getContainingSets(IResource resource) { + Set<ActiveChangeSet> result = new HashSet<>(); + ChangeSet[] sets = getSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + if (set.contains(resource)) { + result.add((ActiveChangeSet) set); + } + } + return result.toArray(new ActiveChangeSet[result.size()]); + } + } + + private class ResourceCollector extends SubscriberResourceCollector { + + public ResourceCollector(Subscriber subscriber) { + super(subscriber); + } + + @Override protected void remove(IResource resource) { - if (handler != null) - handler.queueEvent(new BackgroundEventHandler.ResourceEvent(resource, RESOURCE_REMOVAL, IResource.DEPTH_INFINITE), false); - } + if (handler != null) + handler.queueEvent(new BackgroundEventHandler.ResourceEvent(resource, RESOURCE_REMOVAL, IResource.DEPTH_INFINITE), false); + } - @Override + @Override protected void change(IResource resource, int depth) { - if (handler != null) - handler.queueEvent(new BackgroundEventHandler.ResourceEvent(resource, RESOURCE_CHANGE, depth), false); - } + if (handler != null) + handler.queueEvent(new BackgroundEventHandler.ResourceEvent(resource, RESOURCE_CHANGE, depth), false); + } - @Override + @Override protected boolean hasMembers(IResource resource) { - return SubscriberChangeSetManager.this.hasMembers(resource); - } - } + return SubscriberChangeSetManager.this.hasMembers(resource); + } + } - public SubscriberChangeSetManager(Subscriber subscriber) { - collector = new ResourceCollector(subscriber); - handler = new EventHandler(NLS.bind(Messages.SubscriberChangeSetCollector_1, new String[] { subscriber.getName() }), NLS.bind(Messages.SubscriberChangeSetCollector_2, new String[] { subscriber.getName() })); // - } + public SubscriberChangeSetManager(Subscriber subscriber) { + collector = new ResourceCollector(subscriber); + handler = new EventHandler(NLS.bind(Messages.SubscriberChangeSetCollector_1, new String[] { subscriber.getName() }), NLS.bind(Messages.SubscriberChangeSetCollector_2, new String[] { subscriber.getName() })); // + } - @Override + @Override protected void initializeSets() { - load(getPreferences()); - } - - public boolean hasMembers(IResource resource) { - ChangeSet[] sets = getSets(); - for (int i = 0; i < sets.length; i++) { - ActiveChangeSet set = (ActiveChangeSet)sets[i]; - if (set.getDiffTree().getChildren(resource.getFullPath()).length > 0) - return true; - } - if (getDefaultSet() != null) - return (getDefaultSet().getDiffTree().getChildren(resource.getFullPath()).length > 0); - return false; - } - - /** - * Return the sync info for the given resource obtained - * from the subscriber. - * @param resource the resource - * @return the sync info for the resource - * @throws CoreException - */ - @Override + load(getPreferences()); + } + + public boolean hasMembers(IResource resource) { + ChangeSet[] sets = getSets(); + for (int i = 0; i < sets.length; i++) { + ActiveChangeSet set = (ActiveChangeSet)sets[i]; + if (set.getDiffTree().getChildren(resource.getFullPath()).length > 0) + return true; + } + if (getDefaultSet() != null) + return (getDefaultSet().getDiffTree().getChildren(resource.getFullPath()).length > 0); + return false; + } + + /** + * Return the sync info for the given resource obtained + * from the subscriber. + * @param resource the resource + * @return the sync info for the resource + * @throws CoreException + */ + @Override public IDiff getDiff(IResource resource) throws CoreException { - Subscriber subscriber = getSubscriber(); - return subscriber.getDiff(resource); - } - - /** - * Return the subscriber associated with this collector. - * @return the subscriber associated with this collector - */ - public Subscriber getSubscriber() { - return collector.getSubscriber(); - } - - @Override + Subscriber subscriber = getSubscriber(); + return subscriber.getDiff(resource); + } + + /** + * Return the subscriber associated with this collector. + * @return the subscriber associated with this collector + */ + public Subscriber getSubscriber() { + return collector.getSubscriber(); + } + + @Override public void dispose() { - handler.shutdown(); - collector.dispose(); - super.dispose(); - save(getPreferences()); - } + handler.shutdown(); + collector.dispose(); + super.dispose(); + save(getPreferences()); + } - private Preferences getPreferences() { - return getParentPreferences().node(getSubscriberIdentifier()); - } + private Preferences getPreferences() { + return getParentPreferences().node(getSubscriberIdentifier()); + } private static Preferences getParentPreferences() { return getTeamPreferences().node(PREF_CHANGE_SETS); @@ -333,21 +333,21 @@ public class SubscriberChangeSetManager extends ActiveChangeSetManager { return InstanceScope.INSTANCE.getNode(TeamPlugin.getPlugin().getBundle().getSymbolicName()); } - /** - * Return the id that will uniquely identify the subscriber across - * restarts. - * @return the id that will uniquely identify the subscriber across - */ - protected String getSubscriberIdentifier() { - return getSubscriber().getName(); - } - - /** - * Wait until the collector is done processing any events. - * This method is for testing purposes only. - * @param monitor - */ - public void waitUntilDone(IProgressMonitor monitor) { + /** + * Return the id that will uniquely identify the subscriber across + * restarts. + * @return the id that will uniquely identify the subscriber across + */ + protected String getSubscriberIdentifier() { + return getSubscriber().getName(); + } + + /** + * Wait until the collector is done processing any events. + * This method is for testing purposes only. + * @param monitor + */ + public void waitUntilDone(IProgressMonitor monitor) { monitor.worked(1); // wait for the event handler to process changes. while(handler.getEventHandlerJob().getState() != Job.NONE) { @@ -359,7 +359,7 @@ public class SubscriberChangeSetManager extends ActiveChangeSetManager { Policy.checkCanceled(monitor); } monitor.worked(1); - } + } @Override protected String getName() { |