/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.frameworkjars.ui; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactScopeEnum; import org.apache.maven.repository.metadata.ArtifactMetadata; import org.ebayopensource.turmeric.eclipse.mavenapi.MavenApiPlugin; import org.ebayopensource.turmeric.eclipse.mavenapi.impl.EclipseArtifactMetadata; import org.ebayopensource.turmeric.eclipse.mavenapi.intf.IMavenEclipseApi; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IProgressService; import org.maven.ide.eclipse.embedder.ArtifactKey; import org.maven.ide.eclipse.index.IIndex; import org.maven.ide.eclipse.index.IndexedArtifactFile; import org.maven.ide.eclipse.ui.dialogs.MavenRepositorySearchDialog; /** * The Class CopyLibraryDialog. * * @author yayu */ public class CopyLibraryDialog extends TitleAreaDialog { private Text libraryText; private Text destinationText; private ArtifactMetadata metadata = null; /** * Instantiates a new copy library dialog. * * @param shell the shell */ public CopyLibraryDialog(Shell shell) { super(shell); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { return super.createContents(parent); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite control = (Composite)super.createDialogArea(parent); setTitle("Copy Maven Library"); setMessage("copy selected library and its dependencies to a selected directory."); addLibraryChooser(control); addDestinationChooser(control); Dialog.applyDialogFont(control); return control; } /** * Adds the library chooser. * * @param parentComposite the parent composite * @return the composite */ protected Composite addLibraryChooser(Composite parentComposite) { parentComposite = new Composite(parentComposite, SWT.NONE); GridLayout layout = new GridLayout(4, false); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); parentComposite.setLayout(layout); parentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); parentComposite.setFont(parentComposite.getFont()); new Label(parentComposite, SWT.LEFT).setText("&Maven Library:"); libraryText = new Text(parentComposite, SWT.BORDER); libraryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); libraryText.setEditable(false); Button browseBtn = new Button(parentComposite, SWT.PUSH); browseBtn.setAlignment(SWT.RIGHT); browseBtn.setText("&Search..."); final SelectionListener workspaceBrowseListener = new SelectionListener() { @Override public void widgetDefaultSelected(final SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(final SelectionEvent e) { final MavenRepositorySearchDialog dialog = new MavenRepositorySearchDialog( getShell(), "Select Library to copy:", IIndex.SEARCH_ARTIFACT, null); if( dialog.open() == Window.OK ) { final Object obj = dialog.getFirstResult(); if (obj instanceof IndexedArtifactFile) { final IndexedArtifactFile artifactFile = ( IndexedArtifactFile )obj; final ArtifactKey artifactKey = artifactFile.getArtifactKey(); metadata = new EclipseArtifactMetadata( artifactKey.getGroupId(), artifactKey.getArtifactId(), artifactKey.getVersion(), "jar", ArtifactScopeEnum.DEFAULT_SCOPE ); libraryText.setText(metadata.toString()); } } dialogChanged(); } }; browseBtn.addSelectionListener(workspaceBrowseListener); return parentComposite; } /** * Adds the destination chooser. * * @param parentComposite the parent composite * @return the composite */ protected Composite addDestinationChooser(Composite parentComposite) { parentComposite = new Composite(parentComposite, SWT.NONE); GridLayout layout = new GridLayout(4, false); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); parentComposite.setLayout(layout); parentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); parentComposite.setFont(parentComposite.getFont()); new Label(parentComposite, SWT.LEFT).setText("&Destination:"); destinationText = new Text(parentComposite, SWT.BORDER); destinationText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); //libraryText.addModifyListener(modifyListener); destinationText.setEditable(false); Button browseBtn = new Button(parentComposite, SWT.PUSH); browseBtn.setAlignment(SWT.RIGHT); browseBtn.setText("&Browse..."); final String filterPath = null; final SelectionListener workspaceBrowseListener = new SelectionListener() { @Override public void widgetDefaultSelected(final SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(final SelectionEvent e) { final DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.PUSH); dialog.setText("Select Destination"); if (StringUtils.isNotBlank(filterPath)) dialog.setFilterPath(filterPath); final String dirName = dialog.open(); if (StringUtils.isNotBlank(dirName)) { destinationText.setText(dirName); } dialogChanged(); } }; browseBtn.addSelectionListener(workspaceBrowseListener); return parentComposite; } private void dialogChanged() { updatePageState(null); if (metadata == null) { updatePageState("library is not valid"); return; } if (this.destinationText != null) { String dest = this.destinationText.getText(); if (StringUtils.isBlank(dest)) { updatePageState("Destination must not be empty."); return; } File destDir = new File(dest); if (destDir.exists() == false) { updatePageState("Destination does not exist."); return; } } } private void updatePageState(String message) { setMessage(message); setErrorMessage(message); getButton(IDialogConstants.OK_ID).setEnabled(message == null); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { if (metadata == null) return; final String destination = this.destinationText.getText(); final IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask( "Copying jars for library ->" + metadata + "...", IProgressMonitor.UNKNOWN); try { monitor.internalWorked(20); IMavenEclipseApi api = MavenApiPlugin.getDefault().getMavenEclipseApi(); File destDir = new File(destination); if (destDir.exists() == false) destDir.mkdir(); else { try { FileUtils.cleanDirectory(destDir); } catch (IOException e) { e.printStackTrace(); } } monitor.internalWorked(20); try { for (Artifact artifact : api.resolveArtifactAsClasspath(metadata)) { File artifactFile = artifact.getFile(); if (artifactFile.getName().endsWith(".pom")) { System.out.println("bad"); } monitor.setTaskName("Copying from " + artifactFile + " to " + destDir); FileUtils.copyFileToDirectory(artifact.getFile(), destDir); monitor.internalWorked(20); } } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }; final IProgressService service = PlatformUI .getWorkbench().getProgressService(); try { service.run(false, false, runnable); } catch (Exception e) { ErrorDialog.openError(getShell(), "Error Occurred", "error occurred while copying library->" + metadata, new Status(IStatus.ERROR, "org.ebayopensource.turmeric", e.getLocalizedMessage(), e)); e.printStackTrace(); } super.okPressed(); } }