| /******************************************************************************* |
| * 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.context.core; |
| |
| import java.util.List; |
| |
| import org.eclipse.mylyn.context.core.AbstractContextListener; |
| import org.eclipse.mylyn.context.core.ContextChangeEvent; |
| import org.eclipse.mylyn.context.core.ContextCore; |
| import org.eclipse.mylyn.context.core.IInteractionElement; |
| import org.eclipse.mylyn.monitor.core.InteractionEvent; |
| |
| /** |
| * Used for Active Search. |
| * |
| * NOTE: this facility is not exposed by default in Mylyn 2.0 and likely to change for 3.0. |
| * |
| * @author Mik Kersten |
| * @since 2.0 |
| */ |
| public abstract class AbstractRelationProvider extends AbstractContextListener { |
| |
| protected final String DOS_0_LABEL = "disabled"; //$NON-NLS-1$ |
| |
| protected final String DOS_1_LABEL = "landmark resources"; //$NON-NLS-1$ |
| |
| protected final String DOS_2_LABEL = "interesting resources"; //$NON-NLS-1$ |
| |
| protected final String DOS_3_LABEL = "interesting projects"; //$NON-NLS-1$ |
| |
| protected final String DOS_4_LABEL = "project dependencies"; //$NON-NLS-1$ |
| |
| protected final String DOS_5_LABEL = "entire workspace (slow)"; //$NON-NLS-1$ |
| |
| private boolean enabled = false; |
| |
| private final String id; |
| |
| private final String structureKind; |
| |
| private int degreeOfSeparation; |
| |
| public String getId() { |
| return id; |
| } |
| |
| public AbstractRelationProvider(String structureKind, String id) { |
| this.id = id; |
| this.structureKind = structureKind; |
| degreeOfSeparation = getDefaultDegreeOfSeparation(); |
| } |
| |
| public abstract List<IDegreeOfSeparation> getDegreesOfSeparation(); |
| |
| protected abstract int getDefaultDegreeOfSeparation(); |
| |
| protected abstract void findRelated(final IInteractionElement node, int degreeOfSeparation); |
| |
| /** |
| * @param limitTo |
| * Only used in thye AbstractJavaRelationshipProvider for the search type |
| */ |
| public abstract IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, |
| int degreeOfSeparation); |
| |
| public abstract String getName(); |
| |
| public boolean acceptResultElement(Object element) { |
| return true; |
| } |
| |
| @Override |
| public void contextChanged(ContextChangeEvent event) { |
| switch (event.getEventKind()) { |
| case LANDMARKS_ADDED: |
| if (enabled) { |
| for (IInteractionElement node : event.getElements()) { |
| findRelated(node, degreeOfSeparation); |
| } |
| } |
| break; |
| } |
| } |
| |
| protected void searchCompleted(IInteractionElement landmark) { |
| if (landmark.getRelations().size() > 0) { |
| ContextCorePlugin.getContextManager().notifyRelationshipsChanged(landmark); |
| } |
| } |
| |
| protected void incrementInterest(IInteractionElement node, String elementKind, String elementHandle, |
| int degreeOfSeparation) { |
| int predictedInterest = 1;// (7-degreeOfSeparation) * |
| // TaskscapeManager.getScalingFactors().getDegreeOfSeparationScale(); |
| InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.PREDICTION, elementKind, elementHandle, |
| getSourceId(), getId(), null, predictedInterest); |
| ContextCorePlugin.getContextManager().processInteractionEvent(event, false, false); |
| createEdge(node, elementKind, elementHandle); |
| } |
| |
| /** |
| * Public for testing |
| */ |
| public void createEdge(IInteractionElement toNode, String elementKind, String targetHandle) { |
| CompositeContextElement targetNode = (CompositeContextElement) ContextCore.getContextManager().getElement( |
| targetHandle); |
| if (targetNode == null) { |
| return; |
| } |
| InteractionContextElement concreteTargetNode = null; |
| if (targetNode.getNodes().size() != 1) { |
| return; |
| } else { |
| concreteTargetNode = targetNode.getNodes().iterator().next(); |
| } |
| if (concreteTargetNode != null) { |
| for (InteractionContextElement sourceNode : ((CompositeContextElement) toNode).getNodes()) { |
| InteractionContextRelation edge = new InteractionContextRelation(elementKind, getId(), sourceNode, |
| concreteTargetNode, sourceNode.getContext()); |
| sourceNode.addEdge(edge); |
| } |
| } |
| } |
| |
| protected abstract String getSourceId(); |
| |
| public boolean isEnabled() { |
| return enabled; |
| } |
| |
| public void setEnabled(boolean enabled) { |
| this.enabled = enabled; |
| } |
| |
| public int getCurrentDegreeOfSeparation() { |
| return degreeOfSeparation; |
| } |
| |
| @Override |
| public String toString() { |
| return "(provider for: " + id + ")"; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public String getStructureKind() { |
| return structureKind; |
| } |
| |
| public void setDegreeOfSeparation(int degreeOfSeparation) { |
| this.degreeOfSeparation = degreeOfSeparation; |
| } |
| |
| public abstract String getGenericId(); |
| |
| public abstract void stopAllRunningJobs(); |
| |
| } |