/*************************************************************************************
* Copyright (c) 2008-2015 Red Hat, Inc. and others.
* 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
*
* Contributors:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.arquillian.ui.internal.commands;
import java.io.File;
import java.lang.reflect.Method;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jboss.tools.arquillian.core.ArquillianCoreActivator;
import org.jboss.tools.arquillian.core.internal.archives.Archive;
/**
*
* @author snjeza
*
*/
public class ExportArchiveCommandHandler extends AbstractHandler {
/* (non-Javadoc)
* @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);
if (selection instanceof IStructuredSelection) {
Object object = ((IStructuredSelection)selection).getFirstElement();
if (object instanceof Archive) {
Archive archive = (Archive) object;
FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
dialog.setFileName(archive.getInternalName());
String name = archive.getInternalName();
int index = name.indexOf('.');
if (index >= 0) {
String extension = "*" + name.substring(index);
String[] extensions = { extension };
dialog.setFilterExtensions(extensions);
}
String path= dialog.open();
if (path == null) {
return null;
}
final File localFile= new File(path);
if (localFile.exists()) {
MessageDialog overwriteDialog= new MessageDialog(
getShell(),
"Export Archive",
null,
path + " already exists. Do you want to replace it?",
MessageDialog.WARNING,
new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
1);
if (overwriteDialog.open() != Window.OK) {
return null;
}
}
createArchive(archive, localFile);
}
}
return null;
}
private Shell getShell() {
if (Display.getCurrent() != null) {
return PlatformUI.getWorkbench().getModalDialogShellProvider().getShell();
}
return null;
}
private static Archive createArchive(Archive archive, File file) {
IJavaProject javaProject = archive.getJavaProject();
String className = archive.getLocation().getFullyQualifiedName();
//String className = type.getFullyQualifiedName();
String methodName = archive.getLocation().getMethodName();
//String methodName = deploymentMethod.getName();
ClassLoader loader = ArquillianCoreActivator.getDefault().getClassLoader(javaProject);
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(loader);
Class<?> clazz = Class.forName(className, true, loader);
Object object = clazz.newInstance();
Method method = clazz.getMethod(methodName, new Class[0]);
Object archiveObject = method.invoke(object, new Object[0]);
Class<?> archiveClass = archiveObject.getClass();
//archive.as(ZipExporter.class).exportTo(
// new File("/home/alr/Desktop/myPackage.jar"), true);
Class<?> exporterClass = Class.forName("org.jboss.shrinkwrap.api.exporter.ZipExporter", true, loader); //$NON-NLS-1$
Method asMethod = archiveClass.getMethod("as", new Class[] { Class.class }); //$NON-NLS-1$
Object asObject = asMethod.invoke(archiveObject, new Object[] {exporterClass});
Class<?> asClass = asObject.getClass();
Method exportToMethod = asClass.getMethod("exportTo", new Class[] {File.class, boolean.class }); //$NON-NLS-1$
exportToMethod.invoke(asObject, new Object[] {file, Boolean.TRUE});
} catch (OutOfMemoryError e) {
throw new OutOfMemoryError(e.getLocalizedMessage());
} catch (InternalError e) {
throw new InternalError(e.getLocalizedMessage());
} catch (StackOverflowError e) {
throw new StackOverflowError(e.getLocalizedMessage());
} catch (UnknownError e) {
throw new UnknownError(e.getLocalizedMessage());
} catch (Throwable e) {
String message = getText(e) + "(project=" + javaProject.getProject().getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
Throwable cause = e.getCause();
int i = 0;
while (cause != null && i++ < 5) {
message = getText(cause) + "(project=" + javaProject.getProject().getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
cause = cause.getCause();
}
ArquillianCoreActivator.logWarning(message);
if (Platform.inDebugMode()) {
ArquillianCoreActivator.log(e);
}
} finally {
Thread.currentThread().setContextClassLoader(oldLoader);
}
return null;
}
private static String getText(Throwable e) {
String text;
if (e.getLocalizedMessage() == null || e.getLocalizedMessage().isEmpty()) {
text = e.getClass().getName() + ": "; //$NON-NLS-1$
} else {
text = e.getLocalizedMessage();
}
return text;
}
}