package com.google.gwt.eclipse.wtp.projects;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
import com.google.gdt.eclipse.core.projects.IWebAppProjectCreator;
import com.google.gwt.eclipse.wtp.GwtWtpPlugin;
import com.google.gwt.eclipse.wtp.utils.GwtFacetUtils;
public class WtpFacetCreatorParicipant implements IWebAppProjectCreator.Participant {
private IJavaProject javaProject;
private IFacetedProjectListener projectFacetListener;
@Override
public void updateWebAppProjectCreator(IWebAppProjectCreator webAppProjectCreator) {
// Just in case exit early
javaProject = webAppProjectCreator.getCreatedJavaProject();
if (javaProject == null) {
GwtWtpPlugin.logError("Not installing the GWT Facet b/c it's not a Java project");
return;
}
// wait till the faceted project is setup
listenForFacetedProjectChange();
}
private void listenForFacetedProjectChange() {
projectFacetListener = new IFacetedProjectListener() {
@Override
public void handleEvent(IFacetedProjectEvent event) {
// prevent recursion and only do this once.
FacetedProjectFramework.removeListener(projectFacetListener);
IFacetedProject facetedProject = event.getProject();
runJob(facetedProject);
}
};
FacetedProjectFramework.addListener(projectFacetListener, IFacetedProjectEvent.Type.PROJECT_MODIFIED);
}
private void runJob(final IFacetedProject facetedProject) {
Job job = new Job("Install GWT Facet for Project") {
@Override
protected IStatus run(IProgressMonitor monitor) {
installGwtFacet(facetedProject, monitor);
return Status.OK_STATUS;
}
};
job.schedule();
}
private void installGwtFacet(IFacetedProject facetedProject, IProgressMonitor monitor) {
if (facetedProject == null) {
GwtWtpPlugin.logError("Project is not faceted yet.");
return;
}
IProjectFacet gwtFacet = GwtFacetUtils.getGwtFacet();
IFacetedProjectWorkingCopy workingCopy = facetedProject.createWorkingCopy();
workingCopy.addProjectFacet(gwtFacet.getDefaultVersion());
try {
workingCopy.commitChanges(monitor);
} catch (CoreException e) {
GwtWtpPlugin.logError("Could not commit facet to project.", e);
}
}
}