blob: fb3f4d3c133a4846fa7fbaa3aa835a2323cee04f [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.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
import org.eclipse.mylyn.internal.context.core.DegreeOfSeparation;
import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
import org.eclipse.mylyn.internal.context.core.IDegreeOfSeparation;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.ui.PlatformUI;
/**
* @author Shawn Minto
*/
public class BugzillaReferencesProvider extends AbstractRelationProvider {
public static final String ID = "org.eclipse.mylyn.bugs.search.references";
public static final String NAME = "referenced by";
public static final int DEFAULT_DEGREE = 0;
public BugzillaReferencesProvider() {
super(BugzillaStructureBridge.CONTENT_TYPE, ID);
}
@Override
public List<IDegreeOfSeparation> getDegreesOfSeparation() {
List<IDegreeOfSeparation> separations = new ArrayList<IDegreeOfSeparation>();
separations.add(new DegreeOfSeparation("disabled", 0));
separations.add(new DegreeOfSeparation("local, fully qualified matches", 1));
separations.add(new DegreeOfSeparation("local, unqualified matches", 2));
separations.add(new DegreeOfSeparation("server, fully quaified matches", 3));
separations.add(new DegreeOfSeparation("server, unqualified matches", 4));
return separations;
}
protected boolean acceptElement(IJavaElement javaElement) {
return javaElement != null && (javaElement instanceof IMember || javaElement instanceof IType)
&& javaElement.exists();
}
/**
* HACK: checking kind as string - don't want the dependancy to mylar.java
*/
@Override
protected void findRelated(final IInteractionElement node, int degreeOfSeparation) {
if (!node.getContentType().equals("java")) {
return;
}
IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
if (!acceptElement(javaElement)) {
return;
}
runJob(node, degreeOfSeparation);
}
@Override
public IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, int degreeOfSepatation) {
IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
ITask task = TasksUiPlugin.getTaskListManager().getActiveTask();
TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(task.getConnectorKind(),
task.getRepositoryUrl());
return new BugzillaMylynSearch(degreeOfSepatation, javaElement, repository.getRepositoryUrl());
}
private void runJob(final IInteractionElement node, final int degreeOfSeparation) {
BugzillaMylynSearch search = (BugzillaMylynSearch) getSearchOperation(node, 0, degreeOfSeparation);
search.addListener(new IActiveSearchListener() {
private boolean gathered = false;
public void searchCompleted(List<?> nodes) {
Iterator<?> itr = nodes.iterator();
if (MylynBugsManager.getDefault() == null) {
return;
}
while (itr.hasNext()) {
Object o = itr.next();
if (o instanceof BugzillaReportInfo) {
BugzillaReportInfo bugzillaNode = (BugzillaReportInfo) o;
final String handle = bugzillaNode.getElementHandle();
// if (MylarBugsPlugin.getDefault().getCache().getCached(handle) == null)
// cache(handle, bugzillaNode);
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
incrementInterest(node, BugzillaStructureBridge.CONTENT_TYPE, handle,
degreeOfSeparation);
}
});
}
}
gathered = true;
BugzillaReferencesProvider.this.searchCompleted(node);
}
public boolean resultsGathered() {
return gathered;
}
});
search.run(new NullProgressMonitor(), Job.DECORATE - 10);
}
@Override
public String getGenericId() {
return ID;
}
@Override
protected String getSourceId() {
return ID;
}
@Override
public String getName() {
return NAME;
}
/*
*
* STUFF FOR TEMPORARILY CACHING A PROXY REPORT
*
* TODO remove the proxys and update the BugzillaStructureBridge cache so
* that on restart, we dont have to get all of the bugs
*
*/
private static final Map<String, BugzillaReportInfo> reports = new HashMap<String, BugzillaReportInfo>();
public BugzillaReportInfo getCached(String handle) {
return reports.get(handle);
}
protected void cache(String handle, BugzillaReportInfo bugzillaNode) {
reports.put(handle, bugzillaNode);
}
public void clearCachedReports() {
reports.clear();
}
public Collection<? extends String> getCachedHandles() {
return reports.keySet();
}
@Override
public void stopAllRunningJobs() {
BugzillaSearchManager.cancelAllRunningJobs();
}
@Override
protected int getDefaultDegreeOfSeparation() {
return DEFAULT_DEGREE;
}
@Override
public void contextPreActivated(IInteractionContext context) {
// ignore
}
@Override
public void elementsDeleted(List<IInteractionElement> elements) {
// ignore
}
}