package com.robotoworks.mechanoid.ui.builder;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.xtext.builder.BuilderParticipant;
import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2;
import org.eclipse.xtext.generator.OutputConfiguration;
import org.eclipse.xtext.resource.IResourceDescription.Delta;
public class MechanoidBuilderParticipant extends BuilderParticipant {
@Override
public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException {
super.build(context, monitor);
}
@Override
protected void handleChangedContents(Delta delta,
IBuildContext context,
EclipseResourceFileSystemAccess2 fileSystemAccess)
throws CoreException {
ensureSourceFolders(context, fileSystemAccess);
super.handleChangedContents(delta, context, fileSystemAccess);
}
private void ensureSourceFolders(IBuildContext context,
EclipseResourceFileSystemAccess2 fileSystemAccess)
throws CoreException {
IProject project = context.getBuiltProject();
for(OutputConfiguration config : fileSystemAccess.getOutputConfigurations().values()) {
IFolder folder = project.getFolder(new Path(config.getOutputDirectory()));
makeSourceFolder(folder, null);
}
}
private void makeSourceFolder(IFolder folder, IProgressMonitor monitor) throws CoreException {
// make it a source folder
IJavaProject jp = JavaCore.create(folder.getProject());
if (jp.exists()) {
IClasspathEntry srcFolderClasspathEntry = JavaCore.newSourceEntry(folder.getFullPath());
IClasspathEntry[] newClassPath;
IClasspathEntry[] classPath = jp.getRawClasspath();
for (IClasspathEntry classPathEntry : classPath) {
if (classPathEntry.equals(srcFolderClasspathEntry)) {
return;
}
}
newClassPath = new IClasspathEntry[classPath.length + 1];
System.arraycopy(classPath, 0, newClassPath, 1, classPath.length);
newClassPath[0] = srcFolderClasspathEntry;
jp.setRawClasspath(newClassPath, monitor);
}
}
}