4
package org.vcs.bazaar.eclipse.ui.markers;
6
import java.util.Collection;
7
import java.util.HashSet;
10
import org.eclipse.core.resources.IMarker;
11
import org.eclipse.core.resources.IResource;
12
import org.eclipse.core.resources.ResourcesPlugin;
13
import org.eclipse.core.resources.WorkspaceJob;
14
import org.eclipse.core.runtime.CoreException;
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.core.runtime.IStatus;
17
import org.eclipse.core.runtime.Status;
18
import org.eclipse.core.runtime.jobs.ISchedulingRule;
19
import org.eclipse.core.runtime.jobs.Job;
20
import org.vcs.bazaar.eclipse.EclipseBazaarCore;
21
import org.vcs.bazaar.eclipse.core.listeners.BzrChangeStateEvent;
22
import org.vcs.bazaar.eclipse.core.listeners.IResourceStateListener;
23
import org.vcs.bazaar.eclipse.core.model.IBzrResourceStatus;
24
import org.vcs.bazaar.eclipse.core.utils.ResourceUtil;
25
import org.vcs.bazaar.eclipse.ui.EclipseBazaarUI;
26
import org.vcs.bazaar.eclipse.ui.preferences.BazaarPreferenceConstants;
29
* Mark newly created files as not being under version control.
31
* @author johan.walles@gmail.com
33
public class NewFileMarker implements IResourceStateListener {
35
private final static int INTERESTING_CHANGES = BzrChangeStateEvent.BRANCH_STATE_MODIFY
36
| BzrChangeStateEvent.WT_STATE_MODIFY
37
| BzrChangeStateEvent.RESOURCE_MODIFY;
40
* Create a background job that can be run to mark resources not handled by Bazaar.
41
* @param resources The resources to check. Those that are unhandled will be marked.
42
* @return The resource checking-and-marking job.
44
private WorkspaceJob createMarkJob(final Set<IResource> resources) {
45
return new WorkspaceJob("[Bazaar] Creating unhandled files markers") {
47
* Finds out which resources are files not under Bazaar's control.
48
* @param allResources The resources to check.
49
* @return A set of files not under Bazaar's control.
50
* @throws CoreException When status fetching fails
52
private Set<IResource> getUnhandledFiles(Set<IResource> allResources) throws CoreException {
53
Set<IResource> result = new HashSet<IResource>();
55
// Collect all unhandled resources
56
for (IResource resource : allResources) {
57
if (resource.getType() != IResource.FILE) {
58
// We're only interested in files
61
if (resource.isDerived()) {
62
// Derived resources aren't supposed to be handled by Bazaar
65
if (resource.isLinked(IResource.CHECK_ANCESTORS)) {
66
// Linked resources should be handled at their actual location,
70
IBzrResourceStatus status =
71
EclipseBazaarCore.getDefault().getStatusCacheManager().getStatus(resource);
72
if (status.isUnknown()) {
81
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
82
monitor.beginTask("[Bazaar] Creating unhandled files markers",
83
resources.size() * 2);
84
Set<IResource> unhandledFiles = getUnhandledFiles(resources);
85
if (unhandledFiles.size() == 0) {
86
return Status.OK_STATUS;
88
monitor.worked(resources.size());
89
for (IResource unhandled : unhandledFiles) {
90
// FIXME: use a multi rule for all the projects involded in the state change event.
91
ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRuleFactory().markerRule(unhandled);
92
getJobManager().beginRule(rule, monitor);
93
IMarker marker = null;
94
IMarker[] markers = unhandled.findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
95
for (IMarker aMarker : markers) {
96
if(aMarker.getAttribute("bazaar_unhanlded", false)) {
102
marker = unhandled.createMarker(EclipseBazaarUI.getPluginId() + ".marker");
103
marker.setAttribute(IMarker.MESSAGE, "Local addition not under Bazaar control");
104
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
105
marker.setAttribute(IMarker.LOCATION, "");
106
marker.setAttribute("bazaar_unhanlded", true);
109
getJobManager().endRule(rule);
111
return Status.OK_STATUS;
118
private WorkspaceJob createUnMarkJob(final HashSet<IResource> resources) {
119
return new WorkspaceJob("[Bazaar] Cleaning unhandled files markers") {
121
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
122
for (IResource resource : resources) {
123
if(!resource.isAccessible() || !ResourceUtil.shouldHandle(resource)) {
126
ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRuleFactory().markerRule(resource);
127
getJobManager().beginRule(rule, monitor);
128
IMarker[] markers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
129
for (IMarker aMarker : markers) {
130
if(aMarker.getAttribute("bazaar_unhanlded", false)) {
135
getJobManager().endRule(rule);
137
return Status.OK_STATUS;
143
public void resourceStateChanged(BzrChangeStateEvent event) {
144
boolean enabled = isEnabled();
146
Collection<IResource> resources = event.getResources();
147
if(resources == null || resources.size() == 0) {
150
WorkspaceJob job = createUnMarkJob(new HashSet<IResource>(resources));
151
job.setPriority(Job.DECORATE);
152
job.setSystem(false);
154
} else if((event.getType() & INTERESTING_CHANGES) > 0) {
155
Collection<IResource> resources = event.getResources();
156
if(resources == null || resources.size() == 0) {
159
WorkspaceJob job = createMarkJob(new HashSet<IResource>(resources));
160
job.setPriority(Job.DECORATE);
161
job.setSystem(false);
163
// FIXME: I'm using 600 here just because that's what used in
164
// AbstractResourceChangeListener. Is there a better value for this?
165
// johan.walles@gmail.com 2008aug03
170
private Boolean isEnabled() {
171
return EclipseBazaarUI.getDefault().getPreferenceStore().getBoolean(BazaarPreferenceConstants.NOT_VERSIONED_MARKER);