| /** |
| * 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.builder; |
| |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.IncrementalProjectBuilder; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModel; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.emf.ecore.xcore.ui.internal.XcoreActivator; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.xtext.builder.BuilderParticipant; |
| import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2; |
| import org.eclipse.xtext.resource.IResourceDescription.Delta; |
| import org.osgi.framework.Bundle; |
| |
| import com.google.common.base.Strings; |
| import com.google.common.collect.Lists; |
| import com.google.common.collect.Sets; |
| |
| |
| public class XcoreBuildParticipant extends BuilderParticipant |
| { |
| protected Set<IProject> newProjects = Sets.newLinkedHashSet(); |
| |
| @Override |
| public void build(final IBuildContext context, IProgressMonitor monitor) throws CoreException |
| { |
| super.build(context, monitor); |
| final Set<IProject> createdProjects = Sets.newHashSet(); |
| for (IProject newProject : newProjects) |
| { |
| if (newProject.exists()) |
| { |
| createdProjects.add(newProject); |
| } |
| } |
| if (!createdProjects.isEmpty()) |
| { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| final Set<IWorkingSet> workingSets = Sets.newHashSet(); |
| IProject project = context.getBuiltProject(); |
| for (IWorkingSet workingSet : workbench.getWorkingSetManager().getAllWorkingSets()) |
| { |
| IAdaptable[] elements = workingSet.getElements(); |
| for (IAdaptable element : elements) |
| { |
| if (project.equals(element.getAdapter(IProject.class))) |
| { |
| workingSets.add(workingSet); |
| continue; |
| } |
| } |
| } |
| |
| final Bundle bundle = XcoreActivator.getInstance().getBundle(); |
| Job job = |
| new Job(Platform.getResourceBundle(bundle).getString("_UI_NewProjectBuild_job")) |
| { |
| @Override |
| protected IStatus run(IProgressMonitor monitor) |
| { |
| for (IWorkingSet workingSet : workingSets) |
| { |
| List<IAdaptable> elements = Lists.newArrayList(workingSet.getElements()); |
| elements.addAll(createdProjects); |
| workingSet.setElements(workingSet.adaptElements(elements.toArray(new IAdaptable[elements.size()]))); |
| } |
| |
| for (IProject project : createdProjects) |
| { |
| try |
| { |
| project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor); |
| } |
| catch (CoreException exception) |
| { |
| return new Status(exception.getStatus().getSeverity(), bundle.getSymbolicName(), exception.getMessage(), exception); |
| } |
| } |
| |
| return Status.OK_STATUS; |
| } |
| }; |
| job.setPriority(Job.BUILD); |
| job.schedule(); |
| } |
| newProjects.clear(); |
| } |
| |
| @Override |
| protected void handleChangedContents(Delta delta, IBuildContext context, EclipseResourceFileSystemAccess2 fileSystemAccess) throws CoreException |
| { |
| // Determine if this resource is logically nested in the project being built. |
| // |
| URI uri = delta.getUri(); |
| IProject builtProject = context.getBuiltProject(); |
| if (uri.isPlatformResource() && builtProject.getName().equals(uri.segment(1))) |
| { |
| // Determine which projects existed before we run the generator. |
| // |
| Resource resource = context.getResourceSet().getResource(uri, true); |
| GenModel genModel = (GenModel)EcoreUtil.getObjectByType(resource.getContents(), GenModelPackage.Literals.GEN_MODEL); |
| if (genModel != null) |
| { |
| IWorkspaceRoot root = builtProject.getWorkspace().getRoot(); |
| for (String projectName : new String [] { genModel.getEditProjectDirectory(), genModel.getEditorProjectDirectory(), genModel.getTestsProjectDirectory() }) |
| { |
| if (!Strings.isNullOrEmpty(projectName)) |
| { |
| IProject project = root.getProject(projectName); |
| if (!project.exists()) |
| { |
| newProjects.add(project); |
| } |
| } |
| } |
| } |
| |
| // Do the normal generation. |
| // |
| super.handleChangedContents(delta, context, fileSystemAccess); |
| } |
| } |
| |
| @Override |
| protected boolean shouldGenerate(Resource resource, IBuildContext context) |
| { |
| return true; |
| } |
| } |