/**
* Copyright (c) 2005-2008 Aptana, Inc.
*
* 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. If redistributing this code,
* this entire header must remain intact.
*/
package com.aptana.ide.documentation.samples;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.FileLocator;
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.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.progress.UIJob;
import org.osgi.framework.Bundle;
import com.aptana.ide.core.FileUtils;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.ui.CoreUIUtils;
import com.aptana.ide.documentation.DocumentationPlugin;
import com.aptana.ide.intro.IntroPlugin;
import com.aptana.ide.intro.browser.CoreBrowserEditor;
import com.aptana.ide.samples.handlers.IPreviewHandler;
import com.aptana.ide.samples.model.SamplesEntry;
/**
* @author Kevin Sawicki (ksawicki@aptana.com)
*/
public class AjaxSamplesPreviewHandler implements IPreviewHandler
{
private void copyChildren(File parent, File[] children, List<File> createdFiles)
{
for (int i = 0; i < children.length; i++)
{
File file = children[i];
File target = new File(parent, file.getName());
try
{
if (file.isDirectory())
{
if (!target.exists())
{
if (target.mkdir())
{
createdFiles.add(target);
copyChildren(target, file.listFiles(), createdFiles);
}
}
else
{
copyChildren(target, file.listFiles(), createdFiles);
}
}
else
{
if (!target.exists())
{
OutputStream os = new FileOutputStream(target);
InputStream is = new FileInputStream(file);
FileUtils.pipe(is, os, false);
createdFiles.add(target);
is.close();
os.close();
}
}
}
catch (IOException ex)
{
}
}
}
/**
* @see com.aptana.ide.samples.handlers.IPreviewHandler#previewRequested(com.aptana.ide.samples.model.SamplesEntry)
*/
public void previewRequested(final SamplesEntry entry)
{
if (entry.isRoot())
{
final List<File> migratedIncludes = new ArrayList<File>();
List<SamplesEntry> entries = entry.getSubEntries();
File index = null;
for (int i = 0; i < entries.size(); i++)
{
SamplesEntry sub = (SamplesEntry) entries.get(i);
String name = sub.getFile().getName();
if (name.equals("index.html")) //$NON-NLS-1$
{
index = sub.getFile();
break;
}
else if (index == null
&& (name.endsWith(".html") || name.endsWith(".HTML") || name.endsWith(".htm") || name //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
.endsWith(".HTM"))) //$NON-NLS-1$
{
index = sub.getFile();
}
}
if (index != null)
{
try
{
final URL url = index.toURI().toURL();
if (url != null)
{
Bundle b = Platform.getBundle(DocumentationPlugin.PLUGIN_ID);
// Ensure the entire folder is extracted so loading page will be complete
URL content = b.getEntry("/content"); //$NON-NLS-1$
if (content != null)
{
FileLocator.toFileURL(content);
}
URL loading = b.getEntry("/content/loading_sample.html"); //$NON-NLS-1$
loading = FileLocator.toFileURL(loading);
AjaxSampleBrowserInput input = new AjaxSampleBrowserInput(entry, loading);
IWorkbenchWindow window = IntroPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
if (window != null)
{
IWorkbenchPage page = window.getActivePage();
final IEditorPart editor = IDE.openEditor(page, input, CoreBrowserEditor.ID);
final Job buildSample = new Job(Messages.AjaxSamplesPreviewHandler_JobGeneratePreview)
{
protected IStatus run(IProgressMonitor monitor)
{
List<String> includes = entry.getParent().getIncludePaths();
for (int i = 0; i < includes.size(); i++)
{
File file = new File((String) includes.get(i));
File target = new File(entry.getFile(), file.getName());
try
{
if (file.isDirectory())
{
if (!target.exists())
{
if (target.mkdir())
{
migratedIncludes.add(target);
copyChildren(target, file.listFiles(), migratedIncludes);
}
}
else
{
copyChildren(target, file.listFiles(), migratedIncludes);
}
}
else
{
if (!target.exists())
{
OutputStream os = new FileOutputStream(target);
InputStream is = new FileInputStream(file);
FileUtils.pipe(is, os, false);
migratedIncludes.add(target);
is.close();
os.close();
}
}
}
catch (IOException ex)
{
}
}
UIJob urlUpdate = new UIJob(Messages.AjaxSamplesPreviewHandler_JobUpdatePreview)
{
public IStatus runInUIThread(IProgressMonitor monitor)
{
if (editor != null && !((CoreBrowserEditor) editor).isDisposed())
{
((CoreBrowserEditor) editor).setURL(StringUtils.urlDecodeFilename(url
.toExternalForm().toCharArray()));
}
return Status.OK_STATUS;
}
};
urlUpdate.schedule();
return Status.OK_STATUS;
}
};
((CoreBrowserEditor) editor).addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
Job cleanupJob = new Job(Messages.AjaxSamplesPreviewHandler_JobCleanPreview)
{
protected IStatus run(IProgressMonitor monitor)
{
try
{
buildSample.join();
}
catch (InterruptedException e)
{
}
synchronized (migratedIncludes)
{
for (int i = migratedIncludes.size() - 1; i >= 0; i--)
{
((File) migratedIncludes.get(i)).delete();
}
}
return Status.OK_STATUS;
}
};
cleanupJob.setSystem(true);
cleanupJob.setPriority(Job.LONG);
cleanupJob.schedule();
}
});
buildSample.setPriority(Job.BUILD);
buildSample.setSystem(true);
buildSample.schedule();
}
}
}
catch (final Exception e)
{
final Job buildSample = new Job(Messages.AjaxSamplesPreviewHandler_JobShowError)
{
protected IStatus run(IProgressMonitor monitor)
{
CoreUIUtils
.logAndDialogError(
CoreUIUtils.getActiveShell(),
DocumentationPlugin.getDefault(),
Messages.AjaxSamplesPreviewHandler_ERR_Title_CreatePreview,
Messages.AjaxSamplesPreviewHandler_ERR_MSG_CreatePreview,
e);
return Status.OK_STATUS;
}
};
buildSample.setPriority(Job.INTERACTIVE);
buildSample.setSystem(true);
buildSample.schedule();
}
}
}
}
}