All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.neo4j.kernel.diagnostics.DiagnosticsReportSources Maven / Gradle / Ivy

Go to download

Neo4j kernel is a lightweight, embedded Java database designed to store data structured as graphs rather than tables. For more information, see http://neo4j.org.

There is a newer version: 5.25.1
Show newest version
/*
 * Copyright (c) "Neo4j"
 * Neo4j Sweden AB [http://neo4j.com]
 *
 * This file is part of Neo4j.
 *
 * Neo4j is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
package org.neo4j.kernel.diagnostics;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

import org.neo4j.io.fs.FileSystemAbstraction;

/**
 * Contains helper methods to create create {@link DiagnosticsReportSource}.
 */
public final class DiagnosticsReportSources
{
    private DiagnosticsReportSources()
    {
        // util class
    }

    /**
     * Create a diagnostics source the will copy a file into the archive.
     *
     * @param destination final destination in archive.
     * @param fs filesystem abstraction to use.
     * @param source source file to archive
     * @return a diagnostics source consuming a file.
     */
    public static DiagnosticsReportSource newDiagnosticsFile( String destination, FileSystemAbstraction fs, Path source )
    {
        return new DiagnosticsFileReportSource( destination, fs, source );
    }

    /**
     * @param destinationFolder destination folder (including trailing '/') in archive.
     * @param fs filesystem abstraction to use.
     * @param file input log file, should be without rotation numbers.
     * @return a list diagnostics sources consisting of the log file including all rotated away files.
     */
    public static List newDiagnosticsRotatingFile( String destinationFolder,
            FileSystemAbstraction fs, Path file )
    {
        List files = new ArrayList<>();

        try
        {
            Path[] paths = fs.listFiles( file.getParent(), path -> path.getFileName().toString().startsWith( file.getFileName().toString() ) );

            if ( paths != null )
            {
                for ( Path path : paths )
                {
                    files.add( newDiagnosticsFile( destinationFolder + path.getFileName().toString(), fs, path ) );
                }
            }
        }
        catch ( IOException e )
        {
            files.add( newDiagnosticsString( destinationFolder, () -> "Error reading files in directory: " + e.getMessage() ) );
        }

        return files;
    }

    /**
     * Create a diagnostics source from a string. Can be used to dump simple messages to a file in the archive. Files
     * are opened with append option so this method can be used to accumulate messages from multiple source to a single
     * file in the archive.
     *
     * @param destination final destination in archive.
     * @param messageSupplier a string supplier with the final message.
     * @return a diagnostics source consuming a string.
     */
    public static DiagnosticsReportSource newDiagnosticsString( String destination, Supplier messageSupplier )
    {
        return new DiagnosticsStringReportSource( destination, messageSupplier );
    }

    private static class DiagnosticsFileReportSource implements DiagnosticsReportSource
    {
        private final String destination;
        private final FileSystemAbstraction fs;
        private final Path source;

        DiagnosticsFileReportSource( String destination, FileSystemAbstraction fs, Path source )
        {
            this.destination = destination;
            this.fs = fs;
            this.source = source;
        }

        @Override
        public String destinationPath()
        {
            return destination;
        }

        @Override
        public InputStream newInputStream() throws IOException
        {
            return fs.openAsInputStream( source );
        }

        @Override
        public long estimatedSize()
        {
            try
            {
                return fs.getFileSize( source );
            }
            catch ( IOException e )
            {
                throw new UncheckedIOException( e );
            }
        }
    }

    private static class DiagnosticsStringReportSource implements DiagnosticsReportSource
    {
        private final String destination;
        private final Supplier messageSupplier;

        private DiagnosticsStringReportSource( String destination, Supplier messageSupplier )
        {
            this.destination = destination;
            this.messageSupplier = messageSupplier;
        }

        @Override
        public String destinationPath()
        {
            return destination;
        }

        @Override
        public InputStream newInputStream()
        {
            final String message = messageSupplier.get();
            return new ByteArrayInputStream( message.getBytes( StandardCharsets.UTF_8 ) );
        }

        @Override
        public long estimatedSize()
        {
            return 0; // Size of strings should be negligible
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy