/************************************************************************************* * Copyright (c) 2008-2011 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.common.jdt.ui.buildpath.handlers; import java.util.Map; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceRuleFactory; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.handlers.HandlerUtil; import org.jboss.tools.common.jdt.core.buildpath.MaterializeLibraryJob; import org.jboss.tools.common.jdt.ui.buildpath.dialog.MaterializeLibraryDialog; /** * Materialize Library Handler. * * @author Fred Bricon */ @SuppressWarnings("restriction") public class MaterializeLibraryHandler extends AbstractHandler { private static final String ECLIPSE_DEFAULT_WEBFOLDER = "WebContent"; private static final String MAVEN_DEFAULT_WEBFOLDER = "src/main/webapp"; private static final String WEB_INF = "/WEB-INF/"; @Override public Object execute(final ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getCurrentSelection(event); ClassPathContainer libraryFromUI = getSelectedLibrary(selection); if (libraryFromUI != null) { IPath path = libraryFromUI.getClasspathEntry().getPath(); IJavaProject javaProject = libraryFromUI.getJavaProject(); final String libName = libraryFromUI.getLabel(); try { IClasspathContainer containerToMaterialize = JavaCore.getClasspathContainer(path, javaProject); final IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); if (containerToMaterialize == null) { String msg = NLS.bind("The {0} classpath container is not initialized yet.", path); MessageDialog.openError(window.getShell(), "Error Materializing library", msg); return null; } IProject project = javaProject.getProject(); MaterializeLibraryDialog dialog = new MaterializeLibraryDialog(window.getShell(), project, containerToMaterialize, getDefaultLib(project) ); if(dialog.open() == Dialog.OK) { Map<IPath, String> jarsToMaterialize = dialog.getSelectedClasspathEntryPaths(); IContainer libFolder = dialog.getLibFolder(); Job job = new MaterializeLibraryJob(javaProject, containerToMaterialize, jarsToMaterialize, libFolder, dialog.isKeepSources()); job.setRule(getRule(project)); job.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent changeEvent) { final IStatus result = changeEvent.getResult(); if (IStatus.OK != result.getCode()) { Display.getDefault().asyncExec(new Runnable() { public void run() { Shell shell = HandlerUtil.getActiveShell(event); Throwable e = result.getException(); if (e != null) e.printStackTrace(); MessageDialogWithToggle.openError(shell, NLS.bind("Error Materializing {0}", libName), result.getMessage()); } }); } } }); job.schedule(); } } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } private String getDefaultLib(IProject project) { //Let's try to be smart and guess where we're gonna put all the dependencies StringBuilder path = new StringBuilder(); if (project.getFolder(MAVEN_DEFAULT_WEBFOLDER).exists()) { path.append(MAVEN_DEFAULT_WEBFOLDER).append(WEB_INF); } else if (project.getFolder(ECLIPSE_DEFAULT_WEBFOLDER).exists()) { path.append(ECLIPSE_DEFAULT_WEBFOLDER).append(WEB_INF); } path.append("lib"); return path.toString(); } private ISchedulingRule getRule(IProject project) { IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory(); ISchedulingRule rule = ruleFactory.buildRule(); return rule; } private ClassPathContainer getSelectedLibrary(ISelection selection) { ClassPathContainer container = null; if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object o = structuredSelection.getFirstElement(); if (o instanceof ClassPathContainer) { container = (ClassPathContainer) o; } } return container; } }