net.bull.javamelody.internal.web.pdf.PdfOtherReport.java Source code

Java tutorial

Introduction

Here is the source code for net.bull.javamelody.internal.web.pdf.PdfOtherReport.java

Source

/*
 * Copyright 2008-2017 by Emeric Vernat
 *
 *     This file is part of Java Melody.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.bull.javamelody.internal.web.pdf;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Phrase;

import net.bull.javamelody.internal.common.I18N;
import net.bull.javamelody.internal.model.Collector;
import net.bull.javamelody.internal.model.CollectorServer;
import net.bull.javamelody.internal.model.Counter;
import net.bull.javamelody.internal.model.CounterRequest;
import net.bull.javamelody.internal.model.CounterRequestAggregation;
import net.bull.javamelody.internal.model.CounterRequestContext;
import net.bull.javamelody.internal.model.DatabaseInformations;
import net.bull.javamelody.internal.model.HeapHistogram;
import net.bull.javamelody.internal.model.JavaInformations;
import net.bull.javamelody.internal.model.JndiBinding;
import net.bull.javamelody.internal.model.MBeanNode;
import net.bull.javamelody.internal.model.Period;
import net.bull.javamelody.internal.model.ProcessInformations;
import net.bull.javamelody.internal.model.Range;
import net.bull.javamelody.internal.model.SamplingProfiler.SampledMethod;
import net.bull.javamelody.internal.model.SessionInformations;

/**
 * Rapports pdf secondaires (avec iText).
 * @author Emeric Vernat
 */
public class PdfOtherReport {
    private final OutputStream output;
    private final Document document;
    private final PdfDocumentFactory pdfDocumentFactory;

    public PdfOtherReport(String application, OutputStream output) throws IOException {
        super();
        assert output != null;
        this.output = output;

        try {
            pdfDocumentFactory = new PdfDocumentFactory(application, null, output);
            this.document = pdfDocumentFactory.createDocument();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
    }

    public void close() throws IOException {
        output.close();
    }

    public void writeSessionInformations(List<SessionInformations> sessionsInformations) throws IOException {
        try {
            document.open();
            addParagraph(getString("Sessions"), "system-users.png");
            new PdfSessionInformationsReport(sessionsInformations, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeHeapHistogram(HeapHistogram heapHistogram) throws IOException {
        try {
            document.open();
            addParagraph(getFormattedString("heap_histo_du",
                    I18N.createDateAndTimeFormat().format(heapHistogram.getTime())), "memory.png");
            new PdfHeapHistogramReport(heapHistogram, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeHotspots(List<SampledMethod> hotspots) throws IOException {
        try {
            document.open();
            addParagraph(getString("hotspots"), "clock.png");
            new PdfHotspotsReport(hotspots, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeProcessInformations(List<ProcessInformations> processInformations) throws IOException {
        try {
            document.open();
            addParagraph(getString("Processus"), "processes.png");
            new PdfProcessInformationsReport(processInformations, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeProcessInformations(Map<String, List<ProcessInformations>> processInformationsByTitle)
            throws IOException {
        try {
            document.open();
            for (final Map.Entry<String, List<ProcessInformations>> entry : processInformationsByTitle.entrySet()) {
                addParagraph(entry.getKey(), "processes.png");
                new PdfProcessInformationsReport(entry.getValue(), document).toPdf();
            }
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeDatabaseInformations(DatabaseInformations databaseInformations) throws IOException {
        try {
            document.open();
            final String selectedRequestName = databaseInformations.getSelectedRequestName();
            addParagraph(getString("database") + " : " + getString(selectedRequestName), "db.png");
            new PdfDatabaseInformationsReport(databaseInformations, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeJndi(List<JndiBinding> jndiBindings, String path) throws IOException {
        try {
            document.open();
            if (path.isEmpty()) {
                addParagraph(getString("Arbre_JNDI"), "jndi.png");
            } else {
                addParagraph(getFormattedString("Arbre_JNDI_pour_contexte", path), "jndi.png");
            }
            new PdfJndiReport(jndiBindings, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeMBeans(List<MBeanNode> mbeans) throws IOException {
        try {
            document.open();
            addParagraph(getString("MBeans"), "mbeans.png");
            new PdfMBeansReport(mbeans, document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeMBeans(Map<String, List<MBeanNode>> mbeansByTitle) throws IOException {
        try {
            document.open();
            for (final Map.Entry<String, List<MBeanNode>> entry : mbeansByTitle.entrySet()) {
                addParagraph(entry.getKey(), "mbeans.png");
                new PdfMBeansReport(entry.getValue(), document).toPdf();
            }
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeAllCurrentRequestsAsPart(Map<JavaInformations, List<CounterRequestContext>> currentRequests,
            Collector collector, List<Counter> counters, long timeOfSnapshot) throws IOException {
        try {
            document.open();

            // on remplace les parentCounters
            final List<CounterRequestContext> allCurrentRequests = new ArrayList<CounterRequestContext>();
            for (final List<CounterRequestContext> rootCurrentContexts : currentRequests.values()) {
                allCurrentRequests.addAll(rootCurrentContexts);
            }
            CounterRequestContext.replaceParentCounters(allCurrentRequests, counters);
            final List<PdfCounterReport> pdfCounterReports = new ArrayList<PdfCounterReport>();
            // ce range n'a pas d'importance pour ce pdf
            final Range range = Period.TOUT.getRange();
            for (final Counter counter : counters) {
                final PdfCounterReport pdfCounterReport = new PdfCounterReport(collector, counter, range, false,
                        document);
                pdfCounterReports.add(pdfCounterReport);
            }
            final Font normalFont = PdfFonts.NORMAL.getFont();
            for (final Map.Entry<JavaInformations, List<CounterRequestContext>> entry : currentRequests
                    .entrySet()) {
                final JavaInformations javaInformations = entry.getKey();
                final List<CounterRequestContext> rootCurrentContexts = entry.getValue();
                addParagraph(getString("Requetes_en_cours"), "hourglass.png");
                if (rootCurrentContexts.isEmpty()) {
                    addToDocument(new Phrase(getString("Aucune_requete_en_cours"), normalFont));
                } else {
                    final PdfCounterRequestContextReport pdfCounterRequestContextReport = new PdfCounterRequestContextReport(
                            rootCurrentContexts, pdfCounterReports, javaInformations.getThreadInformationsList(),
                            javaInformations.isStackTraceEnabled(), pdfDocumentFactory, document);
                    pdfCounterRequestContextReport.setTimeOfSnapshot(timeOfSnapshot);
                    pdfCounterRequestContextReport.writeContextDetails();
                }
            }
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeRequestAndGraphDetail(Collector collector, CollectorServer collectorServer, Range range,
            String requestId) throws IOException {
        try {
            document.open();
            new PdfRequestAndGraphDetailReport(collector, collectorServer, range, requestId, pdfDocumentFactory,
                    document).toPdf();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeRuntimeDependencies(Counter counter, Range range) throws IOException {
        try {
            final Document myDocument = pdfDocumentFactory.createDocument(true);
            myDocument.open();
            final String counterLabel = getString(counter.getName() + "Label");
            final String paragraphTitle = getFormattedString("Dependance_compteur", counterLabel) + " - "
                    + range.getLabel();
            myDocument.add(pdfDocumentFactory.createParagraphElement(paragraphTitle, counter.getIconName()));
            new PdfRuntimeDependenciesReport(counter, myDocument).toPdf();
            myDocument.close();
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
    }

    public void writeCounterSummaryPerClass(Collector collector, Counter counter, String requestId, Range range)
            throws IOException {
        final List<CounterRequest> requestList = new CounterRequestAggregation(counter)
                .getRequestsAggregatedOrFilteredByClassName(requestId);
        try {
            document.open();
            final String counterLabel = getString(counter.getName() + "Label");
            final String title = getFormattedString("Statistiques_compteur", counterLabel) + " - "
                    + range.getLabel();
            addParagraph(title, counter.getIconName());
            new PdfCounterReport(collector, counter, range, false, document)
                    .writeRequests(counter.getChildCounterName(), requestList);
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    public void writeThreads(List<JavaInformations> javaInformationsList) throws IOException {
        try {
            document.open();
            addParagraph(getString("Threads"), "threads.png");
            String eol = "";
            final Font normalFont = PdfFonts.NORMAL.getFont();
            for (final JavaInformations javaInformations : javaInformationsList) {
                addToDocument(new Phrase(eol, normalFont));

                final PdfThreadInformationsReport pdfThreadInformationsReport = new PdfThreadInformationsReport(
                        javaInformations.getThreadInformationsList(), javaInformations.isStackTraceEnabled(),
                        pdfDocumentFactory, document);
                pdfThreadInformationsReport.writeIntro(javaInformations);
                pdfThreadInformationsReport.writeDeadlocks();

                pdfThreadInformationsReport.toPdf();
                eol = "\n";
            }
        } catch (final DocumentException e) {
            throw createIOException(e);
        }
        document.close();
    }

    private static IOException createIOException(Exception e) {
        // Rq: le constructeur de IOException avec message et cause n'existe qu'en jdk 1.6
        return new IOException(e.getMessage(), e);
    }

    private void addParagraph(String paragraphTitle, String iconName) throws DocumentException, IOException {
        addToDocument(pdfDocumentFactory.createParagraphElement(paragraphTitle, iconName));
    }

    private static String getString(String key) {
        return I18N.getString(key);
    }

    private static String getFormattedString(String key, Object... arguments) {
        return I18N.getFormattedString(key, arguments);
    }

    private void addToDocument(Element element) throws DocumentException {
        document.add(element);
    }
}