/* * 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; import java.io.IOException; import java.text.DateFormat; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import com.lowagie.text.BadElementException; import com.lowagie.text.Chunk; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.PdfPCell; /** * Rapport pdf pour les sessions http. * @author Emeric Vernat */ class PdfSessionInformationsReport extends PdfAbstractTableReport { private final List<SessionInformations> sessionsInformations; private final boolean displayUser; private final DecimalFormat integerFormat = I18N.createIntegerFormat(); private final DateFormat durationFormat = I18N.createDurationFormat(); private final DateFormat expiryFormat = I18N.createDateAndTimeFormat(); private final Font cellFont = PdfFonts.TABLE_CELL.getFont(); private final Font severeCellFont = PdfFonts.SEVERE_CELL.getFont(); private final Map<String, Image> imagesByFileName = new HashMap<String, Image>(); PdfSessionInformationsReport(List<SessionInformations> sessionsInformations, Document document) { super(document); assert sessionsInformations != null; this.sessionsInformations = sessionsInformations; this.displayUser = isDisplayUser(); } private boolean isDisplayUser() { for (final SessionInformations sessionInformations : sessionsInformations) { if (sessionInformations.getRemoteUser() != null) { return true; } } return false; } @Override void toPdf() throws IOException, DocumentException { if (sessionsInformations.isEmpty()) { addToDocument(new Phrase(getString("Aucune_session"), cellFont)); return; } writeHeader(); writeSessions(); long totalSerializedSize = 0; int nbSerializableSessions = 0; for (final SessionInformations sessionInformations : sessionsInformations) { final int size = sessionInformations.getSerializedSize(); if (size >= 0) { totalSerializedSize += size; nbSerializableSessions++; } } final long meanSerializedSize; if (nbSerializableSessions > 0) { meanSerializedSize = totalSerializedSize / nbSerializableSessions; } else { meanSerializedSize = -1; } final Paragraph paragraph = new Paragraph("", cellFont); paragraph.add(getFormattedString("nb_sessions", sessionsInformations.size()) + "\n\n" + getFormattedString("taille_moyenne_sessions", meanSerializedSize)); paragraph.setAlignment(Element.ALIGN_RIGHT); addToDocument(paragraph); } private void writeHeader() throws DocumentException { final List<String> headers = createHeaders(); final int[] relativeWidths = new int[headers.size()]; Arrays.fill(relativeWidths, 0, headers.size(), 1); relativeWidths[0] = 3; // sessionId initTable(headers, relativeWidths); } private List<String> createHeaders() { final List<String> headers = new ArrayList<String>(); headers.add(getString("Session_id")); headers.add(getString("Dernier_acces")); headers.add(getString("Age")); headers.add(getString("Expiration")); headers.add(getString("Nb_attributs")); headers.add(getString("Serialisable")); headers.add(getString("Taille_serialisee")); headers.add(getString("Adresse_IP")); headers.add(getString("Pays")); headers.add(getString("Navigateur")); headers.add(getString("OS")); if (displayUser) { headers.add(getString("Utilisateur")); } return headers; } private void writeSessions() throws IOException, DocumentException { for (final SessionInformations session : sessionsInformations) { nextRow(); writeSession(session); } addTableToDocument(); } private void writeSession(SessionInformations session) throws IOException, BadElementException { final PdfPCell defaultCell = getDefaultCell(); defaultCell.setHorizontalAlignment(Element.ALIGN_LEFT); addCell(session.getId()); defaultCell.setHorizontalAlignment(Element.ALIGN_RIGHT); addCell(durationFormat.format(session.getLastAccess())); addCell(durationFormat.format(session.getAge())); addCell(expiryFormat.format(session.getExpirationDate())); addCell(integerFormat.format(session.getAttributeCount())); defaultCell.setHorizontalAlignment(Element.ALIGN_CENTER); if (session.isSerializable()) { addCell(getString("oui")); } else { final Phrase non = new Phrase(getString("non"), severeCellFont); addCell(non); } defaultCell.setHorizontalAlignment(Element.ALIGN_RIGHT); addCell(integerFormat.format(session.getSerializedSize())); defaultCell.setHorizontalAlignment(Element.ALIGN_LEFT); final String remoteAddr = session.getRemoteAddr(); if (remoteAddr == null) { addCell(""); } else { addCell(remoteAddr); } defaultCell.setHorizontalAlignment(Element.ALIGN_CENTER); writeCountry(session); writeBrowserAndOs(session); if (displayUser) { defaultCell.setHorizontalAlignment(Element.ALIGN_LEFT); final String remoteUser = session.getRemoteUser(); if (remoteUser == null) { addCell(""); } else { addCell(remoteUser); } } } private void writeCountry(SessionInformations session) throws IOException, BadElementException { final String country = session.getCountry(); if (country == null) { addCell(""); } else { final String fileName = "flags/" + country + ".gif"; final Image image = getImageByFileName(fileName); if (image == null) { addCell(country); } else { addCell(new Phrase(new Chunk(image, 0, 0))); } } } private void writeBrowserAndOs(SessionInformations session) throws IOException, BadElementException { final String browser = session.getBrowser(); if (browser == null) { addCell(""); } else { final String browserIconName = HtmlSessionInformationsReport .getBrowserIconName(browser); final String fileName = "browsers/" + browserIconName; final Image image = getImageByFileName(fileName); if (image == null) { addCell(browser); } else { addCell(new Phrase(new Chunk(image, 0, 0))); } } final String os = session.getOs(); if (os == null) { addCell(""); } else { final String osIconName = HtmlSessionInformationsReport.getOSIconName(os); final String fileName = "servers/" + osIconName; final Image image = getImageByFileName(fileName); if (image == null) { addCell(os); } else { addCell(new Phrase(new Chunk(image, 0, 0))); } } } private Image getImageByFileName(String fileName) throws BadElementException, IOException { assert fileName != null; Image image = imagesByFileName.get(fileName); if (image == null) { if (getClass().getResource(Parameters.getResourcePath(fileName)) == null) { return null; } image = PdfDocumentFactory.getImage(fileName); image.scalePercent(40); imagesByFileName.put(fileName, image); } return image; } }