blob: 6cabc2622590e211eedb66f88d8711bf49ec8108 [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.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
/**
* Class to handle the bridge between Mylyn and bugzilla
*
* @author Shawn Minto
*/
public class BugzillaSearchManager {
/** The hash of all of the landmarks and their related search hits */
private final Map<String, Map<Integer, List<BugzillaReportInfo>>> landmarksHash;
/**
* The currently running search jobs so that we can cancel it if necessary <br>
* KEY: IMember VALUE: Job
*/
static Map<String, Job> runningJobs = Collections.synchronizedMap(new HashMap<String, Job>());
/**
* Constructor
*/
public BugzillaSearchManager() {
landmarksHash = Collections.synchronizedMap(new HashMap<String, Map<Integer, List<BugzillaReportInfo>>>());
}
/**
* Remove a landmark from the hash
*
* @param removed
* This landmark to remove (IJavaElement)
*/
public void removeFromLandmarksHash(IJavaElement removed) {
landmarksHash.remove(removed.getHandleIdentifier());
}
/**
* Remove all of the landmarks from the hash that are in the list
*
* @param removed
* This list of landmarks to remove (IJavaElements)
*/
public void removeFromLandmarksHash(List<IJavaElement> removed) {
for (IJavaElement je : removed) {
landmarksHash.remove(je.getHandleIdentifier());
}
}
/**
* Add data to the landmarks hash
*
* @param doiList
* The list of BugzillaSearchHitDoiInfo
* @param m
* The member that this list is for
*/
public void addToLandmarksHash(List<BugzillaReportInfo> doiList, IMember m, int scope) {
Map<Integer, List<BugzillaReportInfo>> searches = landmarksHash.get(m.getHandleIdentifier());
if (searches == null) {
searches = new HashMap<Integer, List<BugzillaReportInfo>>();
}
searches.put(scope, doiList);
landmarksHash.put(m.getHandleIdentifier(), searches);
}
/**
* Get the doiList for the given IMember from the landmarks hash
*
* @param m
* The member to get the doiList for
* @return The doiList or null if it doesn't exist
*/
public List<BugzillaReportInfo> getFromLandmarksHash(IMember m, int scope) {
Map<Integer, List<BugzillaReportInfo>> scopes = landmarksHash.get(m.getHandleIdentifier());
if (scopes == null) {
return null;
} else {
return scopes.get(scope);
}
}
/**
* Determine whether the current element has a search job running for it
*
* @param e
* The element that we want to know whether there is a search job or not
* @return <code>true</code> if it does else <code>false</code>
*/
public static boolean doesJobExist(String handle) {
return runningJobs.containsKey(handle);
}
/**
* Remove search job for the given element
*
* @param m
* The element that we want to make sure that the search is canceled for
*/
public static void removeSearchJob(String handle) {
// make sure that there wasn't a previous search job that we know
// of. If there was, cancel it
if (doesJobExist(handle)) {
// get the search job and wait until it is cancelled
Job prevJob = runningJobs.get(handle);
prevJob.cancel();
runningJobs.remove(handle);
}
}
/**
* Add a search job to our list
*
* @param handle
* The handle of the element that we are searching for
* @param searchJob
* The job that represents the search
*/
public static void addJob(String handle, Job searchJob) {
runningJobs.put(handle, searchJob);
}
public static void cancelAllRunningJobs() {
Collection<Job> jobs = runningJobs.values();
for (Job j : jobs) {
j.cancel();
}
runningJobs.clear();
}
}