package net.sf.eclipsefp.haskell.ui.wizards.web;
import java.io.OutputStreamWriter;
import java.net.URI;
import net.sf.eclipsefp.haskell.core.HaskellCorePlugin;
import net.sf.eclipsefp.haskell.core.project.HaskellNature;
import net.sf.eclipsefp.haskell.core.project.YesodNature;
import net.sf.eclipsefp.haskell.ui.internal.backend.BackendManager;
import net.sf.eclipsefp.haskell.ui.internal.preferences.IPreferenceConstants;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import net.sf.eclipsefp.haskell.util.ProcessRunner;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
/**
*
* @author Alejandro Serrano
* @author JP Moresmau
*/
public class NewYesodProjectWizard extends Wizard implements INewWizard {
private NewYesodProjectPage mainPage;
public NewYesodProjectWizard() {
super();
setWindowTitle( UITexts.newYesodProjectWizard_windowTitle );
}
@Override
public void init( final IWorkbench workbench,
final IStructuredSelection selection ) {
// Do nothing
}
@Override
public void addPages() {
super.addPages();
mainPage = new NewYesodProjectPage( UITexts.newYesodProjectWizard_pageTitle );
mainPage.setTitle( UITexts.newYesodProjectWizard_pageTitle );
mainPage.setDescription( UITexts.newYesodProjectWizard_pageDesc );
addPage( mainPage );
}
@Override
public boolean performFinish() {
if( !mainPage.isPageComplete() ) {
return false;
}
final String name = mainPage.getProjectName();
final URI location = ( !mainPage.useDefaults() )
? mainPage.getLocationURI()
:null;
// final String author= mainPage.getAuthor();
// final String foundation= mainPage.getFoundation();
final String database= mainPage.getDatabase();
// IPath parentPath = path.removeLastSegments( 1 );
// Run "yesod init"
// Get parent path
final IPath parentPath = mainPage.getLocationPath();
new Job(UITexts.newYesodProjectWizard_job) {
@Override
protected IStatus run( final IProgressMonitor arg0 ) {
try {
String serverExecutable =BackendManager.getExecutablePath( IPreferenceConstants.YESOD_EXECUTABLE, "yesod",false );
String[] cmdLine = new String[] {serverExecutable, "init"};
//new ProcessRunner().executeBlocking( parentPath.toFile(), new StringWriter(), new StringWriter(), "yesod", "init" );
Process p = Runtime.getRuntime()
.exec( cmdLine, null, parentPath.toFile() );
Thread[] ts=ProcessRunner.consume( p );
// Get the things to write
OutputStreamWriter inS = new OutputStreamWriter( p.getOutputStream() );
//inS.write(author + "\n" );
//inS.flush();
inS.write( name + "\n" );
inS.flush();
//inS.write( "\n" ); // directory empty use project name
//inS.flush();
//inS.write(foundation + "\n" );
//inS.flush();
inS.write(database + "\n" );
inS.flush();
p.waitFor();
for (Thread t:ts){
t.join();
}
IProgressMonitor mon = new NullProgressMonitor();
WorkspaceModifyOperation wmo = new WorkspaceModifyOperation(ResourcesPlugin.getWorkspace().getRoot()) {
@Override
protected void execute(final IProgressMonitor monitor) throws CoreException{
IProject project = CustomProjectSupport
.createBaseProject( name, location );
CustomProjectSupport.addNature( project, HaskellNature.NATURE_ID );
CustomProjectSupport.addNature( project, YesodNature.NATURE_ID );
project.refreshLocal( IResource.DEPTH_INFINITE, null );
}
};
try {
// ResourcesPlugin.getWorkspace().run( operation, mon );
wmo.run( mon );
} catch( Exception cex ) {
HaskellCorePlugin.log( UITexts.newYesodProjectWizard_error, cex );
} finally {
mon.done();
}
} catch( Exception e ) {
HaskellCorePlugin.log( UITexts.newYesodProjectWizard_error, e );
Display.getDefault().asyncExec( new Runnable(){
@Override
public void run() {
MessageDialog
.openError(
getShell(),
UITexts.newYesodProjectWizard_error_title,
UITexts.newYesodProjectWizard_error_message);
}
} );
}
return Status.OK_STATUS;
}
}.schedule();
return true;
}
}