/** * Copyright (c) 2011, 2012 Cloudsmith Inc. and other contributors, as listed below. * 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: * itemis AG - initial API and implementation * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.ui.editor.findrefs; import static java.util.Collections.singleton; import java.util.Iterator; import java.util.Set; import org.cloudsmith.geppetto.pp.dsl.ui.editor.findrefs.PPReferenceFinder.IPPQueryData; 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.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IGlobalServiceProvider; 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.inject.Inject; /** * @author Jan Koehnlein - Initial contribution and API */ public class FindReferenceQueryDataFactory { /** * Provides the label at the top of the search result page * */ public static class QueryLabelProvider { @Inject private IStorage2UriMapper storage2UriMapper; @Inject private IQualifiedNameProvider qualifiedNameProvider; @Inject private IQualifiedNameConverter qualifiedNameConverter; public String get(EObject target) { StringBuilder builder = new StringBuilder(); builder.append("Puppet references to "); QualifiedName qualifiedName = qualifiedNameProvider.getFullyQualifiedName(target); if(qualifiedName != null) { builder.append(qualifiedNameConverter.toString(qualifiedName)); } else { String simpleName = SimpleAttributeResolver.NAME_RESOLVER.getValue(target); if(simpleName != null) builder.append(simpleName); else builder.append(target.eResource().getURIFragment(target)); } Iterator<Pair<IStorage, IProject>> storages = storage2UriMapper.getStorages(EcoreUtil.getURI(target)).iterator(); if(storages.hasNext()) { builder.append(" (").append(storages.next().getFirst().getFullPath().toString()).append(")"); } return builder.toString(); } } @Inject protected IGlobalServiceProvider globalServiceProvider; protected String createLabel(EObject target) { QueryLabelProvider queryLabelProvider = globalServiceProvider.findService(target, QueryLabelProvider.class); // TODO remove after fix: NPE in mark occurrences on a JVM element if(queryLabelProvider == null || target.eIsProxy() || target.eResource() == null) return ""; return queryLabelProvider.get(target); } public IPPQueryData createQueryData(EObject element, URI localResourceURI) { URI targetURI = EcoreUtil.getURI(element); IPPQueryData queryData = new PPReferenceQueryData( targetURI, createTargetURIs(element), localResourceURI, createResultFilter(element), createLabel(element)); return queryData; } protected Predicate<IReferenceDescription> createResultFilter(EObject target) { return null; } protected Set<URI> createTargetURIs(EObject target) { return singleton(EcoreUtil.getURI(target)); } }