package org.eclipse.emf.examples.jet.article2.actionexample;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionDelegate;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.emf.codegen.jet.JETEmitter;
import org.eclipse.emf.codegen.jet.JETException;
import org.eclipse.emf.common.ui.dialogs.DiagnosticDialog;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.DiagnosticException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.examples.jet.article2.TypesafeEnumPlugin;
/**
* Example action that translates and generates text with selected JET
* templates.
*
* @author Remko Popma
* @version $Revision: 1.6 $ ($Date: 2008/04/22 13:35:56 $)
*/
public class EmitAction implements IActionDelegate
{
protected ISelection selection;
public void selectionChanged(IAction action, ISelection selection)
{
this.selection = selection;
action.setEnabled(true);
}
public void run(IAction action)
{
List<?> files = (selection instanceof IStructuredSelection) ? ((IStructuredSelection)selection).toList() : Collections.EMPTY_LIST;
for (Iterator<?> i = files.iterator(); i.hasNext();)
{
IFile file = (IFile)i.next();
IPath fullPath = file.getFullPath();
String templateURI = URI.createPlatformResourceURI(fullPath.toString(), true).toString();
ClassLoader classloader = getClass().getClassLoader();
JETEmitter emitter = new JETEmitter(templateURI, classloader);
// or: use anonymous subclass
//JETEmitter emitter = new JETEmitter(templateURI) {}; // notice the
// brackets
try
{
String[] arguments = new String []{ "hi" };
generate(emitter, arguments, file);
}
catch (Exception e)
{
handleException(e);
}
}
}
/**
* Wraps text generation and save in a <code>WorkspaceModifyOperation</code>,
* and runs this operation in a <code>ProgressMonitorDialog</code>.
*
* @param emitter
* generates text to save
* @param arguments
* arguments to pass to the emitter
* @param file
* the original template file
* @throws CoreException
* @throws InvocationTargetException
* @throws InterruptedException
*/
private void generate(final JETEmitter emitter, final Object[] arguments, final IFile file) throws CoreException,
InvocationTargetException,
InterruptedException
{
WorkspaceModifyOperation op = new WorkspaceModifyOperation()
{
@Override
public void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException
{
try
{
String generated = emitter.generate(monitor, arguments);
saveGenerated(generated, file, monitor);
}
catch (JETException exception)
{
throw DiagnosticException.toCoreException(exception);
}
catch (IOException ioe)
{
throw new InvocationTargetException(ioe);
}
}
};
Shell shell = TypesafeEnumPlugin.getActiveWorkbenchShell();
ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
dialog.run(false, true, op);
}
/**
* Save the generated text to a file in the same location as the specified
* file.
*
* @param generated
* the generated text to save
* @param file
* the original template file
* @param monitor
* @throws IOException
* @throws CoreException
*/
private void saveGenerated(String generated, IFile file, IProgressMonitor monitor) throws IOException, CoreException
{
InputStream contents = new ByteArrayInputStream(generated.getBytes());
IContainer parent = file.getParent();
IFile target = parent.getFile(new Path(file.getName() + ".txt"));
if (target.exists())
{
target.setContents(contents, true, false, monitor);
}
else
{
File systemFile = target.getLocation().toFile();
if (systemFile.exists())
{ // check if out of sync
parent.refreshLocal(1, monitor); // not user-friendly: user did not
// request Refresh...
target.setContents(contents, true, false, monitor);
}
else
{
target.create(contents, false, monitor);
}
}
}
/**
* Logs the exception and shows an error dialog.
*
* @param t the exception to handle
*/
private void handleException(Throwable t)
{
if (t instanceof InvocationTargetException)
{
t = ((InvocationTargetException)t).getTargetException();
}
TypesafeEnumPlugin.log(t);
Shell shell = TypesafeEnumPlugin.getActiveWorkbenchShell();
String title = "Error while emitting template";
DiagnosticDialog.open(shell, title, null, BasicDiagnostic.toDiagnostic(t));
}
}