blob: c0eb8e0f7cd788eac2963ff781314805e60ea1cc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2014 Ericsson
*
* All rights reserved. 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:
* Marc-Andre Laperle - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.importexport;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.AbstractTracePackageOperation;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.ITracePackageConstants;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageElement;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageFilesElement;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.tracepkg.TracePackageTraceElement;
/**
* An operation that extracts information from the manifest located in an
* archive
*
* @author Marc-Andre Laperle
*/
public class TracePackageExtractManifestOperation extends AbstractTracePackageOperation {
/**
* Constructs a new import operation for reading the manifest
*
* @param fileName
* the output file name
*/
public TracePackageExtractManifestOperation(String fileName) {
super(fileName);
}
/**
* Run extract the manifest operation. The status (result) of the operation
* can be obtained with {@link #getStatus}
*
* @param progressMonitor
* the progress monitor to use to display progress and receive
* requests for cancellation
*/
@Override
public void run(IProgressMonitor progressMonitor) {
TracePackageElement[] elements = null;
try {
progressMonitor.worked(1);
ArchiveFile archiveFile = getSpecifiedArchiveFile();
progressMonitor.worked(1);
if (archiveFile == null) {
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TracePackageExtractManifestOperation_InvalidFormat));
return;
}
Enumeration<@NonNull ?> entries = archiveFile.entries();
boolean found = false;
while (entries.hasMoreElements()) {
ModalContext.checkCanceled(progressMonitor);
ArchiveEntry entry = (ArchiveEntry) entries.nextElement();
IPath p = new Path(entry.getName());
//Remove project name
p = p.removeFirstSegments(1);
if (entry.getName().endsWith(ITracePackageConstants.MANIFEST_FILENAME)) {
found = true;
InputStream inputStream = archiveFile.getInputStream(entry);
ManifestReader.validateManifest(inputStream);
inputStream = archiveFile.getInputStream(entry);
elements = ManifestReader.loadElementsFromManifest(inputStream);
break;
}
progressMonitor.worked(1);
}
if (found) {
setStatus(Status.OK_STATUS);
}
else {
elements = generateElementsFromArchive();
if (elements.length > 0) {
setStatus(Status.OK_STATUS);
} else {
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, MessageFormat.format(Messages.TracePackageExtractManifestOperation_ErrorManifestNotFound, ITracePackageConstants.MANIFEST_FILENAME)));
}
}
setResultElements(elements);
archiveFile.close();
} catch (InterruptedException e) {
setStatus(Status.CANCEL_STATUS);
Thread.currentThread().interrupt();
} catch (Exception e) {
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TracePackageExtractManifestOperation_ErrorReadingManifest, e));
}
}
private TracePackageElement[] generateElementsFromArchive() {
ArchiveFile archiveFile = getSpecifiedArchiveFile();
Enumeration<@NonNull ?> entries = archiveFile.entries();
Set<String> traceFileNames = new HashSet<>();
while (entries.hasMoreElements()) {
ArchiveEntry entry = (ArchiveEntry) entries.nextElement();
String entryName = entry.getName();
IPath fullArchivePath = new Path(entryName);
if (!fullArchivePath.hasTrailingSeparator() && fullArchivePath.segmentCount() > 0) {
traceFileNames.add(fullArchivePath.segment(0));
}
}
List<TracePackageElement> packageElements = new ArrayList<>();
for (String traceFileName : traceFileNames) {
TracePackageTraceElement traceElement = new TracePackageTraceElement(null, traceFileName, null);
new TracePackageFilesElement(traceElement, traceFileName);
packageElements.add(traceElement);
}
return packageElements.toArray(new TracePackageElement[] {});
}
}