package com.dubture.composer.ui.wizard.project.template;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Observable;
import java.util.concurrent.CountDownLatch;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PlatformUI;
import com.dubture.composer.core.log.Logger;
import com.dubture.composer.ui.ComposerUIPlugin;
import com.dubture.composer.ui.job.CreateProjectJob;
import com.dubture.composer.ui.job.CreateProjectJob.JobListener;
import com.dubture.composer.ui.wizard.AbstractWizardFirstPage;
import com.dubture.composer.ui.wizard.AbstractWizardSecondPage;
import com.dubture.getcomposer.core.ComposerPackage;
/**
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class PackageProjectWizardSecondPage extends AbstractWizardSecondPage implements IShellProvider, PackageFilterChangedListener {
private PackageFilterViewer filter;
public PackageProjectWizardSecondPage(AbstractWizardFirstPage mainPage, String title) {
super(mainPage, title);
setPageComplete(false);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (filter.getSelectedPackage() == null || filter.getSelectedPackage().getSelectedVersion() == null) {
setPageComplete(false);
}
}
@Override
public void createControl(Composite parent) {
filter = new PackageFilterViewer();
filter.createControl(parent);
filter.addChangeListener(this);
filter.setMinimumHeight(400);
setControl(filter.getControl());
setPageComplete(false);
setHelpContext(filter.getControl());
}
@Override
public void update(Observable o, Object arg) {
}
@Override
protected String getPageTitle() {
return "Select package";
}
@Override
protected String getPageDescription() {
return "Search for a package to be used as the startingpoint for your new Composer project.";
}
@Override
protected void beforeFinish(IProgressMonitor monitor) throws Exception {
PackageFilterItem filterItem = filter.getSelectedPackage();
final CountDownLatch latch = new CountDownLatch(1);
monitor.beginTask("Initializing composer project", 2);
monitor.worked(1);
File file = new File(firstPage.getLocationURI());
IPath location = new Path(file.toString());
// let the create-project command handle folder creation
if (firstPage.isInLocalServer()) {
location = location.removeLastSegments(1);
}
CreateProjectJob projectJob = new CreateProjectJob(location, firstPage.nameGroup.getName(), filterItem.getPackage().getName(), filterItem.getSelectedVersion());
projectJob.setJobListener(new JobListener() {
@Override
public void jobStarted() {
latch.countDown();
}
@Override
public void jobFinished(String projectName) {
latch.countDown();
refreshProject(projectName);
}
@Override
public void jobFailed() {
latch.countDown();
}
});
projectJob.schedule();
// we need to wait until the first page has started the
// create-project composer command and the command actually
// wrote something to disk, otherwise the command will fail
//
// Note: The composer guys do not accept pull requests
// to allow the create-project command be run on target paths
// with files in it, so we have to use this workaround.
try {
latch.await();
} catch (InterruptedException e) {
}
monitor.worked(1);
}
@Override
protected void finishPage(IProgressMonitor monitor) throws Exception {
try {
PackageProjectWizardFirstPage page = (PackageProjectWizardFirstPage) firstPage;
if (page.doesOverrideComposer()) {
monitor.beginTask("Updating composer.json with new values", 1);
ComposerPackage package1 = firstPage.getPackage();
IFile file = getProject().getFile(new Path("composer.json"));
if (file != null && file.exists()) {
ByteArrayInputStream is = new ByteArrayInputStream(package1.toJson().getBytes());
file.setContents(is, IResource.FORCE, monitor);
}
}
} catch (Exception e) {
Logger.logException(e);
} finally {
monitor.worked(1);
}
}
@Override
public void filterChanged(PackageFilterItem item) {
if (item != null && item.getSelectedVersion() != null) {
setPageComplete(true);
return;
}
setPageComplete(false);
}
@Override
protected void setHelpContext(Control control) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(control, ComposerUIPlugin.PLUGIN_ID + "." + "help_context_wizard_template_secondpage");
}
}