/**
* 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.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.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.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xcore.ui.internal.XcoreActivator;
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.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())
{
final Bundle bundle = XcoreActivator.getInstance().getBundle();
Job job =
new Job(Platform.getResourceBundle(bundle).getString("_UI_NewProjectBuild_job"))
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
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 which projects existed before we run the generator.
//
Resource resource = context.getResourceSet().getResource(delta.getUri(), true);
GenModel genModel = (GenModel)EcoreUtil.getObjectByType(resource.getContents(), GenModelPackage.Literals.GEN_MODEL);
IWorkspaceRoot root = context.getBuiltProject().getWorkspace().getRoot();
if (genModel != null)
{
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);
}
}