| /** |
| * Copyright (c) 2011-2012 Eclipse contributors 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.emf.ecore.xcore.ui.container; |
| |
| import java.util.List; |
| import java.util.ListIterator; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IStorage; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.common.util.UniqueEList; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.xtext.ui.containers.JavaProjectsState; |
| import org.eclipse.xtext.ui.resource.IStorage2UriMapperJdtExtensions; |
| |
| import com.google.inject.Inject; |
| import com.google.inject.Singleton; |
| |
| @Singleton |
| public class XcoreJavaProjectsState extends JavaProjectsState |
| { |
| @Inject |
| IStorage2UriMapperJdtExtensions jdtExtensions; |
| |
| @Override |
| protected String doInitHandle(URI uri) |
| { |
| String result = getJavaProjectsHelper().initHandle(uri); |
| if (result == null && uri.isPlatformResource() && uri.segmentCount() > 1) |
| { |
| IProject project = getWorkspaceRoot().getProject(uri.segment(1)); |
| IJavaProject javaProject = JavaCore.create(project); |
| result = javaProject.exists() ? javaProject.getHandleIdentifier() : project.getName(); |
| } |
| return result; |
| } |
| |
| @Override |
| protected List<String> doInitVisibleHandles(String handle) |
| { |
| List<String> result = getJavaProjectsHelper().initVisibleHandles(handle); |
| if (!result.isEmpty()) |
| { |
| IJavaElement javaElement = JavaCore.create(handle); |
| if (javaElement != null) |
| { |
| // Because this is for an Xcore project, where the *.xcore resources are not on the classpath, |
| // add the handle for the overall Java project to the resource set. |
| // This ensures that inferred JVM types in the Xcore models have precedence when resolving JVM type references. |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=502276 |
| // |
| result = new UniqueEList<String>(result); |
| if (!result.contains(handle)) |
| { |
| result.add(0, handle); |
| } |
| |
| LOOP: |
| for (ListIterator<String> i = result.listIterator(); i.hasNext();) |
| { |
| String visibleHandle = i.next(); |
| IJavaElement visibleHandleElement = JavaCore.create(visibleHandle); |
| if (visibleHandleElement instanceof IPackageFragmentRoot) |
| { |
| // If there are any Xcore resource URIs related to this fragment root, |
| // include the handle for that URI in the result, right after this fragment's handle. |
| // This ensures that inferred JVM types from Xcore models in the target platform are used. |
| // See org.eclipse.xtext.common.types.xtext.ui.JdtIndexedJvmTypeAccess.findAccessibleType(String, ResourceSet, Iterator<IEObjectDescription>) |
| // Unless there is such an entry on the list of visible containers, the resource description for this URI will not be used. |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=500822 |
| // |
| IPackageFragmentRoot packageFragmentRoot = (IPackageFragmentRoot)visibleHandleElement; |
| Map<URI, IStorage> allEntries = jdtExtensions.getAllEntries(packageFragmentRoot); |
| for (URI uri : allEntries.keySet()) |
| { |
| if ("xcore".equals(uri.fileExtension()) && uri.isPlatformResource()) |
| { |
| String uriHandle = initHandle(uri); |
| if (!result.contains(uriHandle)) |
| { |
| i.add(uriHandle); |
| } |
| continue LOOP; |
| } |
| } |
| |
| IJavaProject javaProject = packageFragmentRoot.getJavaProject(); |
| if (javaProject != null) |
| { |
| String projectHandle = javaProject.getHandleIdentifier(); |
| if (!result.contains(projectHandle)) |
| { |
| i.add(projectHandle); |
| } |
| } |
| } |
| } |
| |
| IProject project = javaElement.getJavaProject().getProject(); |
| result.addAll(getProjectsHelper().initVisibleHandles(project.getName())); |
| } |
| } |
| return result; |
| } |
| } |