/******************************************************************************* * Copyright (c) 2010, 2011 EclipseSource 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: * Holger Staudacher - initial API and implementation *******************************************************************************/ package org.eclipse.libra.warproducts.ui.exportwizard; import java.io.File; import java.util.ArrayList; import java.util.Map; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.libra.warproducts.core.*; import org.eclipse.libra.warproducts.ui.Messages; import org.eclipse.libra.warproducts.ui.WARProductConstants; import org.eclipse.libra.warproducts.ui.validation.IValidationListener; import org.eclipse.libra.warproducts.ui.validation.WARProductValidateAction; import org.eclipse.osgi.service.resolver.BundleDescription; import org.eclipse.osgi.service.resolver.State; import org.eclipse.osgi.util.NLS; import org.eclipse.pde.internal.core.TargetPlatformHelper; import org.eclipse.pde.internal.core.exports.FeatureExportInfo; import org.eclipse.pde.internal.core.iproduct.IProductPlugin; import org.eclipse.pde.internal.ui.PDEPluginImages; import org.eclipse.pde.internal.ui.PDEUIMessages; import org.eclipse.pde.internal.ui.wizards.exports.ProductExportWizard; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.progress.IProgressConstants; import org.osgi.framework.Version; public class ExportWARProductWizard extends ProductExportWizard { private IWARProduct product; private IFile warProductFile; private ExportPage exportPage; private SelectionPage selectionPage; private ValidationPage validationPage; private boolean isProductValid; public ExportWARProductWizard() { this( null ); } public ExportWARProductWizard( final IProject project ) { super( project ); } public void addPages() { selectionPage = new SelectionPage(); validationPage = new ValidationPage(); exportPage = new ExportPage(); loadProductFromSelection( getSelection() ); if( product == null ) { addPage( selectionPage ); addPage( validationPage ); } else if( !isProductValid ) { addPage( validationPage ); } addPage( exportPage ); } public boolean canFinish() { boolean result = false; IWizardPage currentPage = getContainer().getCurrentPage(); if( currentPage != null && currentPage.equals( exportPage ) && exportPage.isPageComplete() && product != null ) { result = true; } return result; } private void loadProductFromFile() { WARWorkspaceProductModel productModel = new WARWorkspaceProductModel( warProductFile, false ); try { productModel.load(); if( !productModel.isLoaded() ) { MessageDialog.openError( getContainer().getShell(), PDEUIMessages.ProductExportWizard_error, PDEUIMessages.ProductExportWizard_corrupt ); } else { product = ( IWARProduct )productModel.getProduct(); validateProduct(); } } catch( final CoreException e ) { MessageDialog.openError( getContainer().getShell(), PDEUIMessages.ProductExportWizard_error, PDEUIMessages.ProductExportWizard_corrupt ); } } private void validateProduct() { WARProductValidateAction action = new WARProductValidateAction( product ); action.addValidationListener( new IValidationListener() { public void validationFinished( final Map errors ) { validationPage.setInput( errors ); isProductValid = errors.size() == 0; } } ); action.run(); } protected boolean confirmDelete() { boolean result = true; if( !exportPage.doExportToDirectory() ) { File zipFile = new File( exportPage.getDestination(), exportPage.getFileName() ); if( zipFile.exists() ) { String bind = NLS.bind( PDEUIMessages.BaseExportWizard_confirmReplace_desc, zipFile.getAbsolutePath() ); String confirmReplaceTitle = PDEUIMessages.BaseExportWizard_confirmReplace_title; boolean openQuestion = MessageDialog.openQuestion( getContainer().getShell(), confirmReplaceTitle, bind ); if( !openQuestion ) { result = false; } else { if (! zipFile.delete()){ MessageDialog.openError( getContainer().getShell(), Messages.NewWARDeleteFailed_title, Messages.NewWARDeleteFailed_desc+"\n"+zipFile); result = false; } } } } return result; } protected void scheduleExportJob() { FeatureExportInfo info = new FeatureExportInfo(); info.toDirectory = exportPage.doExportToDirectory(); info.exportSource = false; info.exportSourceBundle = false; info.allowBinaryCycles = false; info.exportMetadata = false; info.destinationDirectory = exportPage.getDestination(); info.zipFileName = exportPage.getFileName(); info.items = getPluginModels(); String rootDirectory = "WEB-INF"; //$NON-NLS-1$ WARProductExportOperation job = new WARProductExportOperation( info, PDEUIMessages.ProductExportJob_name, product, rootDirectory ); job.setUser( true ); job.setRule( ResourcesPlugin.getWorkspace().getRoot() ); job.schedule(); job.setProperty( IProgressConstants.ICON_PROPERTY, PDEPluginImages.DESC_FEATURE_OBJ ); final Display d = getShell().getDisplay(); job.addJobChangeListener( new JobChangeAdapter() { public void done( IJobChangeEvent event ) { final IStatus result = event.getResult(); if( result.isOK() ) return; d.asyncExec( new Runnable() { public void run() { MessageDialog.openError( getShell(), PDEUIMessages.ProductExportWizard_error, PDEUIMessages.ProductExportWizard_corrupt + "\n\n" + result.getMessage() ); } } ); } } ); } private BundleDescription[] getPluginModels() { ArrayList<BundleDescription> list = new ArrayList<BundleDescription>(); State state = TargetPlatformHelper.getState(); IProductPlugin[] plugins = product.getPlugins(); for( int i = 0; i < plugins.length; i++ ) { BundleDescription bundle = null; String v = plugins[ i ].getVersion(); if( v != null && v.length() > 0 ) { bundle = state.getBundle( plugins[ i ].getId(), Version.parseVersion( v ) ); } // if there's no version, just grab a bundle like before if( bundle == null ) { bundle = state.getBundle( plugins[ i ].getId(), null ); } if( bundle != null ) { list.add( bundle ); } } Object[] bundleArray = list.toArray( new BundleDescription[ list.size() ] ); return ( BundleDescription[] )bundleArray; } public void loadProductFromFile( final IFile file ) { warProductFile = file; loadProductFromFile(); } void resetProduct() { warProductFile = null; } protected void initialize( final IStructuredSelection selection ) { if( selection.size() > 0 ) { loadProductFromSelection( selection ); } } private void loadProductFromSelection( final IStructuredSelection selection ) { Object object = selection.getFirstElement(); if( object instanceof IFile ) { handleFileSelection( object ); } else if( object instanceof IContainer ) { handleContainerSelection( object ); } } private void handleFileSelection( final Object object ) { IFile file = ( IFile )object; boolean isWarProduct = WARProductConstants.FILE_EXTENSION.equals( file.getFileExtension() ); if( isWarProduct ) { loadProductFromFile( file ); } } private void handleContainerSelection( final Object object ) { IContainer container = ( IContainer )object; try { if( container.isAccessible() ) { IResource[] resources = container.members(); for( int i = 0; i < resources.length; i++ ) { IResource resource = resources[ i ]; String resourceName = resource.getName(); boolean hasWarProductExtension = resourceName.endsWith( "." + WARProductConstants.FILE_EXTENSION ); //$NON-NLS-1$ if( resource instanceof IFile && hasWarProductExtension ) { IFile file = ( IFile )resource; loadProductFromFile( file ); } } } } catch( final CoreException e ) { MessageDialog.openError( getShell(), Messages.LoadWARProductError, e.getMessage() ); } } public IFile getProductFile() { return warProductFile; } protected boolean performPreliminaryChecks() { return product != null; } public IWizardPage getNextPage( final IWizardPage page ) { IWizardPage nextPage = null; if( page.equals( selectionPage ) ) { if( isProductValid ) { nextPage = exportPage; } else { nextPage = validationPage; } } else if( page.equals( validationPage ) ) { nextPage = exportPage; } return nextPage; } }