blob: e8a5e38766df60a3b1eca5f6641a389085d6fe75 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.importing.wizards;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.importing.ImportPlugin;
import org.eclipse.epf.importing.ImportResources;
import org.eclipse.epf.importing.services.PluginImportData;
import org.eclipse.epf.importing.services.PluginImportingService;
import org.eclipse.epf.library.ILibraryManager;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.PluginDepInfo;
import org.eclipse.epf.library.edit.validation.PluginDependencyInfoMgr;
import org.eclipse.epf.library.ui.LibraryUIImages;
import org.eclipse.epf.library.ui.wizards.LibraryBackupUtil;
import org.eclipse.epf.services.IFileManager;
import org.eclipse.epf.services.Services;
import org.eclipse.epf.ui.wizards.BaseWizard;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
/**
* A wizard that imports an exported method plug-ins into the currrent method
* library.
*
* @author Jeff Hardy
* @author Kelvin Low
* @since 1.0
*/
public class ImportPluginWizard extends BaseWizard implements IImportWizard {
protected SelectImportPluginSource page1;
protected SelectPluginsToImport page2;
protected PluginImportData data = new PluginImportData();
protected PluginImportingService service = PluginImportingService.newInstance(data);
public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.import.importPluginWizard"; //$NON-NLS-1$
/**
* Creates a new instance.
*/
public ImportPluginWizard() {
setWindowTitle(ImportResources.importPluginsWizard_title);
setNeedsProgressMonitor(true);
}
/**
* @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
* IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
super.init(workbench, selection);
}
/**
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
public void addPages() {
// check out the library first
IFileManager fileMgr = Services.getFileManager();
if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
fileMgr.checkModify(LibraryService.getInstance()
.getCurrentMethodLibrary().eResource().getURI()
.toFileString(), MsgBox.getDefaultShell());
}
ILibraryManager manager = (ILibraryManager) LibraryService
.getInstance().getCurrentLibraryManager();
if (manager != null && manager.isMethodLibraryReadOnly()) {
ImportPlugin.getDefault().getMsgDialog().displayError(
ImportResources.importPluginsWizard_title,
ImportResources.ImportPluginWizard_readonly);
return;
}
SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, ImportPlugin
.getDefault().getImageDescriptor(
"full/wizban/ImportMethodPlugins.gif")); //$NON-NLS-1$
if (wizardExtender == null) {
page1 = new SelectImportPluginSource(data, service);
addPage(page1);
page2 = new SelectPluginsToImport(data, service);
addPage(page2);
return;
}
List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
IWizardPage page = wizardExtender
.getReplaceWizardPage(SelectImportPluginSource.PAGE_NAME);
if (page != null) {
((SelectImportPluginSource) page).setData(data);
((SelectImportPluginSource) page).setService(service);
wizardPages.add(page);
} else {
page1 = new SelectImportPluginSource(data, service);
wizardPages.add(page1);
}
page = wizardExtender
.getReplaceWizardPage(SelectPluginsToImport.PAGE_NAME);
if (page != null) {
wizardPages.add(page);
} else {
page2 = new SelectPluginsToImport(data, service);
wizardPages.add(page2);
}
super.getNewWizardPages(wizardPages);
for (Iterator<IWizardPage> it = wizardPages.iterator(); it
.hasNext();) {
IWizardPage wizardPage = it.next();
super.addPage(wizardPage);
}
wizardExtender.initWizardPages(wizardPages);
}
/**
* @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
*/
public void createPageControls(Composite pageContainer) {
super.createPageControls(pageContainer);
pageContainer.getShell().setImage(LibraryUIImages.IMG_METHOD_PLUGIN);
}
/**
* @see org.eclipse.jface.wizard.IWizard#canFinish()
*/
public boolean canFinish() {
if (this.getContainer().getCurrentPage() != page2)
return false;
return page2.isPageComplete();
}
/**
* @see org.eclipse.jface.wizard.IWizard#performFinish()
*/
public boolean performFinish() {
// Check if the selected plug-ins are updatable or not.
PluginModifyInfo modifyInfo = checkModify();
// if only locked, we can auto-unlock and relock the plugins
// if the pluin is readonly, user need to manually make it updatable
// customers need to manually unlock and lock plugins
// during content library upgrade
if (modifyInfo.readonlyPlugins.size() > 0) {
// Display an error message.
String error = modifyInfo.getReadonlyMessage().toString();
ImportPlugin.getDefault().getMsgDialog().displayError(
ImportResources.ImportConfigurationWizard_error, error);
return false;
}
StringBuffer buffer = new StringBuffer();
PluginImportData.PluginInfo info;
int i = 0;
for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
i++;
if (i > 20) {
String msg = "\n\t. . ."; //$NON-NLS-1$
buffer.append(msg);
break;
}
info = (PluginImportData.PluginInfo) it.next();
if ((info.existingPlugin != null) && info.selected) {
if (buffer.length() > 0) {
buffer.append("\n"); //$NON-NLS-1$
}
buffer.append("\t").append(info.name); //$NON-NLS-1$
}
}
if (buffer.length() > 0) {
boolean yes = ImportPlugin
.getDefault()
.getMsgDialog()
.displayConfirmation(
ImportResources.importPluginsWizard_title,
NLS
.bind(
ImportResources.ImportPluginWizard_warn_existing_plugins,
buffer.toString()));
if (!yes) {
return false;
}
}
// allow user to proceed with locked plugins
if (modifyInfo.lockedPlugins.size() > 0) {
String message = modifyInfo.getLockedMessage().toString()
+ ImportResources.ImportPluginWizard_confirm_continue;
boolean yes = ImportPlugin.getDefault().getMsgDialog()
.displayConfirmation(
ImportResources.importPluginsWizard_title, message);
if (!yes) {
return false;
}
}
if (ProcessUtil.isSynFree() && !service.isSynFreeLib()) {
// String message = ImportResources.ImportNoSynLib_ConvertMsg;
// boolean yes = ImportPlugin.getDefault().getMsgDialog()
// .displayConfirmation(
// ImportResources.importPluginsWizard_title, message);
// if (!yes) {
// return false;
// }
String message = ImportResources.ImportNoSynLibToSynLib_Error;
ImportPlugin.getDefault().getMsgDialog()
.displayError(
ImportResources.importPluginsWizard_title, message);
return false;
} else if (!ProcessUtil.isSynFree() && service.isSynFreeLib()) {
String message = ImportResources.ImportSynLibToNoSynLib_Error;
ImportPlugin.getDefault().getMsgDialog()
.displayError(
ImportResources.importPluginsWizard_title, message);
return false;
}
// Prompt user to back up library.
LibraryBackupUtil.promptBackupCurrentLibrary(null, LibraryService
.getInstance());
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException {
try {
monitor.beginTask(ImportResources.ImportPluginWizard_MSG1,
IProgressMonitor.UNKNOWN);
// Start the import.
service.performImport(monitor);
} catch (Exception e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
};
try {
getContainer().run(true, false, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
Throwable realException = e.getTargetException();
ImportPlugin.getDefault().getMsgDialog().displayError(
ImportResources.ImportPluginWizard_error,
realException.getMessage());
return false;
}
try {
checkPluginCircularDependency();
} catch (Throwable e) {
e.printStackTrace();
}
// Save the import path to preference store.
ImportUIPreferences.addImportPluginDir(data.llData.getParentFolder());
ImportUIPreferences.setCheckBasePlugins(service.isCheckBasePlugins());
return true;
}
/**
* Returns a PluginModifyInfo object.
*/
public PluginModifyInfo checkModify() {
// StringBuffer error = new StringBuffer();
PluginModifyInfo modifyInfo = new PluginModifyInfo();
PluginImportData.PluginInfo info;
for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
info = (PluginImportData.PluginInfo) it.next();
MethodPlugin plugin = info.existingPlugin;
if ((plugin != null) && info.selected) {
if (plugin.getUserChangeable().booleanValue() == false) {
// The plug-in is locked
modifyInfo.lockedPlugins.add(plugin);
} else {
// The plug-in exists in the current library, make sure the
// plug-in is updatable.
IStatus status = TngUtil.checkEdit(plugin, getShell());
if (!status.isOK()) {
modifyInfo.readonlyPlugins.add(plugin);
}
}
}
}
return modifyInfo;
}
private void checkPluginCircularDependency() {
PluginDependencyInfoMgr mgr = new PluginDependencyInfoMgr(
LibraryService.getInstance().getCurrentMethodLibrary());
PluginDependencyInfoMgr.CheckResult result = mgr
.checkCircularDependnecy(null, false);
if (result.circularList != null && !result.circularList.isEmpty()) {
List cirPlugins = (List) result.circularList.get(0);
String msg = ""; //$NON-NLS-1$
for (int i = 0; i < cirPlugins.size(); i++) {
PluginDepInfo pinfo = (PluginDepInfo) cirPlugins.get(i);
if (i != 0) {
msg += ", "; //$NON-NLS-1$
}
msg += pinfo.getPlugin().getName();
}
ImportPlugin.getDefault().getMsgDialog().displayWarning(
ImportResources.ImportPluginWizard_warn_circular_plugins,
msg);
}
}
/**
* @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
*/
public String getWizardExtenderExtensionPointId() {
return WIZARD_EXTENSION_POINT_ID;
}
}