| /******************************************************************************* |
| * 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(); |
| } |
| } |