blob: e50143720cff8472dae08b620f29707bfaa4e759 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.wizards;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.team.core.ProjectSetCapability;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.RepositoryProviderType;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ui.ITeamUIImages;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.UIProjectSetSerializationContext;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.XMLMemento;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class ProjectSetExportWizard extends Wizard implements IExportWizard {
ExportProjectSetMainPage mainPage;
ExportProjectSetLocationPage locationPage;
IStructuredSelection selection;
public ProjectSetExportWizard() {
setNeedsProgressMonitor(true);
setWindowTitle(TeamUIMessages.ProjectSetExportWizard_Project_Set_1);
}
@Override
public void addPages() {
mainPage = new ExportProjectSetMainPage("projectSetMainPage", TeamUIMessages.ProjectSetExportWizard_Export_a_Project_Set_3, TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_PROJECTSET_EXPORT_BANNER)); //$NON-NLS-1$
IProject[] projects = (IProject[])selection.toList().toArray(new IProject[0]);
addPage(mainPage);
mainPage.setSelectedProjects(projects);
locationPage = new ExportProjectSetLocationPage("projectSetLocationPage", TeamUIMessages.ProjectSetExportWizard_Export_a_Project_Set_3, TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_PROJECTSET_EXPORT_BANNER)); //$NON-NLS-1$
addPage(locationPage);
}
@Override
public boolean performFinish() {
final boolean[] result = new boolean[] {false};
try {
getContainer().run(false, false, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException {
String filename = locationPage.getFileName();
Path path = new Path(filename);
if (path.getFileExtension() == null) {
filename = filename + ".psf"; //$NON-NLS-1$
}
PsfFilenameStore.getInstance().remember(filename);
File file = new File(filename);
File parentFile = file.getParentFile();
if (parentFile != null && !parentFile.exists()) {
boolean r = MessageDialog.openQuestion(getShell(), TeamUIMessages.ProjectSetExportWizard_Question_4, TeamUIMessages.ProjectSetExportWizard_Target_directory_does_not_exist__Would_you_like_to_create_it__5); //
if (!r) {
result[0] = false;
return;
}
r = parentFile.mkdirs();
if (!r) {
MessageDialog.openError(getShell(), TeamUIMessages.ProjectSetExportWizard_Export_Problems_6, TeamUIMessages.ProjectSetExportWizard_An_error_occurred_creating_the_target_directory_7); //
result[0] = false;
return;
}
}
if (file.exists() && file.isFile()) {
boolean r = MessageDialog.openQuestion(getShell(), TeamUIMessages.ProjectSetExportWizard_Question_8, TeamUIMessages.ProjectSetExportWizard_Target_already_exists__Would_you_like_to_overwrite_it__9); //
if (!r) {
result[0] = false;
return;
}
}
IWorkingSet[] workingSets = null;
if (mainPage.exportWorkingSets.getSelection()){
workingSets = mainPage.getSelectedWorkingSets();
}
// Hash the projects by provider
IProject[] projects = mainPage.getSelectedProjects();
Map<String, Set<IProject>> map = new HashMap<>();
for (int i = 0; i < projects.length; i++) {
IProject project = projects[i];
RepositoryProvider provider = RepositoryProvider.getProvider(project);
if (provider != null) {
String id = provider.getID();
Set<IProject> list = map.get(id);
if (list == null) {
list = new TreeSet<>((o1, o2) -> o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()));
map.put(id, list);
}
list.add(project);
}
}
UIProjectSetSerializationContext context = new UIProjectSetSerializationContext(getShell(), filename);
BufferedWriter writer = null;
try {
// if file was written to the workspace, perform the validateEdit
if (!locationPage.isSaveToFileSystem())
locationPage.validateEditWorkspaceFile(getShell());
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); //$NON-NLS-1$
//
XMLMemento xmlMemento = getXMLMementoRoot();
Iterator it = map.keySet().iterator();
monitor.beginTask(null, 1000 * map.keySet().size());
while (it.hasNext()) {
String id = (String)it.next();
IMemento memento = xmlMemento.createChild("provider"); //$NON-NLS-1$
memento.putString("id", id); //$NON-NLS-1$
Set<IProject> list = map.get(id);
IProject[] projectArray = list.toArray(new IProject[list.size()]);
RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id);
ProjectSetCapability serializer = providerType.getProjectSetCapability();
ProjectSetCapability.ensureBackwardsCompatible(providerType, serializer);
if (serializer != null) {
String[] references = serializer.asReference(projectArray, context, SubMonitor.convert(monitor, 990));
for (int i = 0; i < references.length; i++) {
IMemento proj = memento.createChild("project"); //$NON-NLS-1$
proj.putString("reference", references[i]); //$NON-NLS-1$
}
}
}
if (workingSets != null){
for (int i = 0; i < workingSets.length; i++) {
IMemento memento =xmlMemento.createChild("workingSets"); //$NON-NLS-1$
workingSets[i].saveState(memento);
}
}
xmlMemento.save(writer);
result[0] = true;
} catch (IOException e) {
throw new InvocationTargetException(e);
} catch (TeamException e) {
throw new InvocationTargetException(e);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
throw new InvocationTargetException(e);
}
}
}
// if file was written to the workspace, refresh it
if (!locationPage.isSaveToFileSystem())
try {
locationPage.refreshWorkspaceFile(monitor);
} catch (CoreException e) {
//throw away
}
// notify provider types of the project set write
for (Iterator iter = map.keySet().iterator();iter.hasNext();) {
String id = (String) iter.next();
RepositoryProviderType type = RepositoryProviderType.getProviderType(id);
if (type != null) {
ProjectSetCapability capability = type.getProjectSetCapability();
if (capability != null) {
capability.projectSetCreated(file, context, SubMonitor.convert(monitor, 10));
}
}
}
monitor.done();
}
private XMLMemento getXMLMementoRoot() {
Document document;
try {
document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element element = document.createElement("psf"); //$NON-NLS-1$
element.setAttribute("version", "2.0"); //$NON-NLS-1$ //$NON-NLS-2$
document.appendChild(element);
return new XMLMemento(document, element);
} catch (ParserConfigurationException e) {
throw new Error(e.getMessage());
}
}
});
} catch (InterruptedException e) {
return true;
} catch (InvocationTargetException e) {
Throwable target = e.getTargetException();
if (target instanceof TeamException) {
ErrorDialog.openError(getShell(), null, null, ((TeamException)target).getStatus());
return false;
}
if (target instanceof RuntimeException) {
throw (RuntimeException)target;
}
if (target instanceof Error) {
throw (Error)target;
}
}
return result[0];
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.selection = selection;
}
}