org.eclipse.xtext.ui.editor.findrefs.ReferenceQueryExecutor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtext.ui.editor.findrefs.ReferenceQueryExecutor.java

Source

/*******************************************************************************
 * Copyright (c) 2011 itemis AG (http://www.itemis.eu) 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
 *******************************************************************************/
package org.eclipse.xtext.ui.editor.findrefs;

import java.util.Iterator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IStorage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.xtext.findReferences.TargetURICollector;
import org.eclipse.xtext.findReferences.TargetURIs;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IReferenceDescription;
import org.eclipse.xtext.ui.resource.IStorage2UriMapper;
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.util.SimpleAttributeResolver;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.inject.Inject;
import com.google.inject.Provider;

/**
 * @author Jan Koehnlein - Initial contribution and API
 * @since 2.3
 */
public class ReferenceQueryExecutor {

    @Inject
    private Provider<TargetURIs> targetURIsProvider;

    @Inject
    private TargetURICollector uriCollector;

    @Inject
    private IStorage2UriMapper storage2UriMapper;

    @Inject
    private IQualifiedNameProvider qualifiedNameProvider;

    @Inject
    private IQualifiedNameConverter qualifiedNameConverter;

    @Inject
    private ReferenceQuery referenceQuery;

    /**
     * Returns an instance of {@link TargetURIs} by default.
     * Clients may override and enhance the result.
     */
    protected Iterable<URI> getTargetURIs(EObject primaryTarget) {
        TargetURIs result = targetURIsProvider.get();
        uriCollector.add(primaryTarget, result);
        return result;
    }

    public String getLabel(EObject primaryTarget) {
        StringBuilder builder = new StringBuilder();
        builder.append(getLabelPrefix());
        builder.append(getElementName(primaryTarget));
        String resourceName = getResourceName(primaryTarget);
        if (resourceName != null) {
            builder.append(Messages.FindReferencesHandler_1).append(resourceName)
                    .append(Messages.FindReferencesHandler_2);
        }
        return builder.toString();
    }

    protected String getLabelPrefix() {
        return Messages.FindReferencesHandler_labelPrefix;
    }

    protected String getElementName(EObject primaryTarget) {
        QualifiedName qualifiedName = qualifiedNameProvider.getFullyQualifiedName(primaryTarget);
        if (qualifiedName != null) {
            return qualifiedNameConverter.toString(qualifiedName);
        }
        String simpleName = SimpleAttributeResolver.NAME_RESOLVER.getValue(primaryTarget);
        return (simpleName != null) ? simpleName : primaryTarget.eResource().getURIFragment(primaryTarget);
    }

    protected String getResourceName(EObject primaryTarget) {
        Iterator<Pair<IStorage, IProject>> storages = storage2UriMapper.getStorages(EcoreUtil.getURI(primaryTarget))
                .iterator();
        return (storages.hasNext()) ? storages.next().getFirst().getFullPath().toString() : null;
    }

    protected Predicate<IReferenceDescription> getFilter(EObject primaryTarget) {
        return Predicates.alwaysTrue();
    }

    public void init(EObject target) {
        Iterable<URI> targetURIs = getTargetURIs(target);
        Predicate<IReferenceDescription> filter = getFilter(target);
        String label = getLabel(target);
        referenceQuery.init(targetURIs, filter, label);
    }

    public void execute() {
        NewSearchUI.activateSearchResultView();
        NewSearchUI.runQueryInBackground(referenceQuery);
    }
}