package org.xrepl.ui; import java.util.Collections; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.jdt.core.JavaCore; import org.eclipse.xtext.Constants; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.ui.util.PluginProjectFactory; import org.xrepl.XreplResourceSetProvider; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; @Singleton public class XreplWorkspaceResourceSetProvider extends XreplResourceSetProvider { private final String fileExtension; @Inject public XreplWorkspaceResourceSetProvider( @Named(Constants.FILE_EXTENSIONS) String fileExtension, PluginProjectFactory projectFactory) { this.fileExtension = fileExtension; this.projectFactory = projectFactory; } @Override protected ResourceSet createResourceSet() { ResourceSet resourceSet = super.createResourceSet(); if (resourceSet instanceof XtextResourceSet) { checkXreplProjectExists((XtextResourceSet) resourceSet); } return resourceSet; } private PluginProjectFactory projectFactory; private void checkXreplProjectExists(XtextResourceSet resourceSet) { IProject project = ResourcesPlugin.getWorkspace().getRoot() .getProject(xreplProjectName()); if (!project.exists()) { projectFactory.addRequiredBundles(Lists .newArrayList(referencedBundles())); projectFactory.addBuilderIds(JavaCore.BUILDER_ID); projectFactory.addProjectNatures(JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature"); projectFactory.setProjectName(xreplProjectName()); projectFactory.addFolders(Collections.singletonList("src")); project = projectFactory.createProject(new NullProgressMonitor(), null); } resourceSet.setClasspathURIContext(JavaCore.create(project)); } protected String referencedBundles() { return "org.eclipse.xtext.xbase.lib"; } private String xreplProjectName() { return "." + fileExtension; } }