/* * Copyright (c) 2014 Google Inc. * * 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 com.google.eclipse.protobuf.ui.scoping; import static com.google.eclipse.protobuf.util.Workspaces.workspaceRoot; import static java.util.Collections.unmodifiableList; import com.google.common.collect.ImmutableList; import com.google.eclipse.protobuf.scoping.IUriResolver; import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences; import com.google.inject.Inject; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.ui.XtextProjectHelper; import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess; import java.util.ArrayList; import java.util.List; /** * Resolves URIs. */ public class UriResolver implements IUriResolver { @Inject private MultipleDirectoriesUriResolver multipleDirectories; @Inject private SingleDirectoryUriResolver singleDirectory; @Inject private IPreferenceStoreAccess storeAccess; @Override public String resolveUri(String importUri, URI declaringResourceUri, IProject project) { return resolveUriInternal(importUri, declaringResourceUri, project); } private String resolveUriInternal(String importUri, URI declaringResourceUri, IProject project) { if (project == null) { return multipleDirectories.resolveUri(importUri, preferencesFromAllProjects()); } PathsPreferences locations = new PathsPreferences(storeAccess, project); if (locations.areFilesInMultipleDirectories()) { return multipleDirectories.resolveUri(importUri, ImmutableList.of(locations)); } return singleDirectory.resolveUri(importUri, declaringResourceUri); } private Iterable<PathsPreferences> preferencesFromAllProjects() { List<PathsPreferences> allPreferences = new ArrayList<>(); IWorkspaceRoot root = workspaceRoot(); for (IProject project : root.getProjects()) { if (project.isHidden() || !project.isAccessible() || !XtextProjectHelper.hasNature(project)) { continue; } PathsPreferences preferences = new PathsPreferences(storeAccess, project); allPreferences.add(preferences); } return unmodifiableList(allPreferences); } }