X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.logging.ui%2Fsrc%2Forg%2Fsimantics%2Flogging%2Fui%2Fhandlers%2FSaveLogFilesHandler.java;fp=bundles%2Forg.simantics.logging.ui%2Fsrc%2Forg%2Fsimantics%2Flogging%2Fui%2Fhandlers%2FSaveLogFilesHandler.java;h=7d7983f594a9a551dcac4bf88089bb340eb9fea5;hb=7d5a5691780ed8373e77641b4a08f18cba0b9fab;hp=0000000000000000000000000000000000000000;hpb=33b349001037197a526a49e5820f0317dc74d934;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java new file mode 100644 index 000000000..7d7983f59 --- /dev/null +++ b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java @@ -0,0 +1,93 @@ +package org.simantics.logging.ui.handlers; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.inject.Named; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Shell; +import org.simantics.logging.LogCollector; +import org.simantics.utils.FileUtils; +import org.simantics.utils.ui.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SaveLogFilesHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(SaveLogFilesHandler.class); + + private static final String[] FILTER_NAMES = { "ZIP-archive", "AllFiles (*:*)" }; + private static final String[] FILTER_EXTENSIONS = { "*.zip", "*.*" }; + private static final String USER_HOME = System.getProperty("user.home"); + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) { + + FileDialog dialog = new FileDialog(shell, SWT.SAVE); + dialog.setFilterNames(FILTER_NAMES); + dialog.setFilterExtensions(FILTER_EXTENSIONS); + if (USER_HOME != null) { + if (Files.exists(Paths.get(USER_HOME))) { + dialog.setFilterPath(USER_HOME); + } + } + StringBuilder fileName = new StringBuilder(); + String productName = Platform.getProduct().getName(); + if (productName != null) + fileName.append(productName.replaceAll(" ", "_")).append("-"); + + fileName.append("logs-").append(currentLocalDateTimeStamp()); + String actualFileName = fileName.toString(); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Resolved log files name {}", actualFileName); + dialog.setFileName(actualFileName); + + String destination = dialog.open(); + if (destination != null) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Destination for saving log files is {}", destination); + + try { + Path tempDir = Files.createTempDirectory(actualFileName); + Map> allLogs = LogCollector.allLogs(); + for (Entry> logEntry : allLogs.entrySet()) { + Path subFolder = tempDir.resolve(logEntry.getKey()); + Files.createDirectory(subFolder); + for (Path p : logEntry.getValue()) { + try { + Files.copy(p, subFolder.resolve(p.getFileName())); + } catch (IOException e) { + LOGGER.error("Could not copy {}", p.toAbsolutePath(), e); + } + } + } + FileUtils.compressZip(tempDir.toAbsolutePath().toString(), destination); + FileUtils.delete(tempDir); + } catch (Throwable t) { + LOGGER.error("Could not save log files to ZIP", t); + ExceptionUtils.logAndShowError("Could not save log files to ZIP", t); + } + } else { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("No destination selected for saving logs"); + } + } + } + + private static String currentLocalDateTimeStamp() { + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmm")); + } + +}