blob: 3c32e94e52f144c1bb337806119143c65104fd18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.mylyn.context.core.InterestComparator;
import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
/**
* Used to facilitate bugzilla searches based on IJavaElements
*
* @author Shawn Minto
*/
public class BugzillaMylynSearch implements IActiveSearchOperation {
// scope identifiers
public static final int LOCAL_QUAL = 1; // local implies a bugzilla task,
// not just an offline report
public static final int LOCAL_UNQUAL = 2;
public static final int FULLY_QUAL = 3;
public static final int UNQUAL = 4;
private final int scope;
private final IJavaElement element;
private String handle = "";
private String serverUrl = "";
/**
* Constructor
*
* @param scope
* The scope of this search
*/
public BugzillaMylynSearch(int scope, IJavaElement element, String serverUrl) {
this.scope = scope;
this.element = element;
this.serverUrl = serverUrl;
}
public IStatus run(IProgressMonitor monitor) {
return run(monitor, Job.DECORATE);
}
public IStatus run(IProgressMonitor monitor, int priority) {
handle = element.getHandleIdentifier() + " " + scope;
List<IJavaElement> landmarks = new ArrayList<IJavaElement>();
landmarks.add(element);
if (!BugzillaSearchManager.doesJobExist(handle)) {
// perform the bugzilla search
// get only the useful landmarks (IMember)
List<IMember> members = getMemberLandmarks(landmarks);
// go through all of the landmarks that we are given and perform a
// search on them
for (IMember m : members) {
// FIXME: decide whether to do leave the caching of searches in
// for now or not
// check if we have the info cached
// List<BugzillaReportNode> landmarkDoi =
// MylarTaskListPlugin.getBridge()
// .getFromLandmarksHash(m, scope);
// if (landmarkDoi != null) {
// //TODO decide when to queue up and do a refresh search
// notifySearchCompleted(landmarkDoi);
// continue;
// }
// create a search operation so that we can search
BugzillaMylynSearchOperation op = new BugzillaMylynSearchOperation(this, m, scope);
// create a new search job so that it can be scheduled and
// run as a background thread
Job searchJob = new BugzillaMylynSearchJob("Querying Bugzilla Server - Mylar - "
+ op.getSearchMemberName(), op);
// schedule the new search job
searchJob.setPriority(priority);
searchJob.schedule();
// save this searchJobs handle so that we can cancel it if need
// be
BugzillaSearchManager.addJob(handle, searchJob);
}
}
return Status.OK_STATUS;
}
/** List of listeners wanting to know about the searches */
private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();
/**
* Add a listener for when the bugzilla search is completed
*
* @param l
* The listener to add
*/
public void addListener(IActiveSearchListener l) {
// add the listener to the list
listeners.add(l);
}
/**
* Remove a listener for when the bugzilla search is completed
*
* @param l
* The listener to remove
*/
public void removeListener(IActiveSearchListener l) {
// remove the listener from the list
listeners.remove(l);
}
/**
* Notify all of the listeners that the bugzilla search is completed
*
* @param doiList
* A list of BugzillaSearchHitDoiInfo
* @param member
* The IMember that the search was performed on
*/
public void notifySearchCompleted(List<BugzillaReportInfo> doiList) {
// go through all of the listeners and call searchCompleted(colelctor,
// member)
BugzillaSearchManager.removeSearchJob(handle);
for (IActiveSearchListener listener : listeners) {
listener.searchCompleted(doiList);
}
}
/**
* Get only the landmarks that are IMember and sort them according to their DOI value (highest to lowest)
*
* @param landmarks
* The landmarks to check
* @return List of IMember landmarks sorted by DOI value
*/
public static List<IMember> getMemberLandmarks(List<IJavaElement> landmarks) {
List<IMember> memberLandmarks = new ArrayList<IMember>();
for (IJavaElement je : landmarks) {
// keep only the IMember landmarks
if (je instanceof IMember) {
memberLandmarks.add((IMember) je);
}
}
// sort the landmarks
Collections.sort(memberLandmarks, new InterestComparator<IMember>());
return memberLandmarks;
}
public String getServerUrl() {
return serverUrl;
}
}