/*
* Copyright 2008-2014 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.util.List;
import net.bull.javamelody.MBeanNode.MBeanAttribute;
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.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
/**
* Partie du rapport pdf pour les MBeans.
* @author Emeric Vernat
*/
class PdfMBeansReport extends PdfAbstractReport {
private final List<MBeanNode> mbeans;
private final Font boldFont = PdfFonts.BOLD.getFont();
private final Font normalFont = PdfFonts.NORMAL.getFont();
private final Font cellFont = PdfFonts.TABLE_CELL.getFont();
private int margin;
private PdfPTable currentTable;
PdfMBeansReport(List<MBeanNode> mbeans, Document document) {
super(document);
assert mbeans != null;
this.mbeans = mbeans;
}
@Override
void toPdf() throws DocumentException {
writeTree();
}
/**
* Affiche l'arbre des MBeans.
* @throws DocumentException e
*/
void writeTree() throws DocumentException {
// MBeans pour la plateforme
margin = 0;
final MBeanNode platformNode = mbeans.get(0);
writeTree(platformNode.getChildren());
for (final MBeanNode node : mbeans) {
if (node != platformNode) {
newPage();
addToDocument(new Chunk(node.getName(), boldFont));
margin = 0;
writeTree(node.getChildren());
}
}
}
private void writeTree(List<MBeanNode> nodes) throws DocumentException {
final int marginBackup = margin;
for (final MBeanNode node : nodes) {
margin = marginBackup;
final List<MBeanNode> children = node.getChildren();
if (children != null) {
addText(node.getName());
margin += 12;
writeTree(children);
} else {
writeMBeanNode(node);
}
}
}
private void writeMBeanNode(MBeanNode mbean) throws DocumentException {
String mbeanName = mbean.getName();
final int indexOfComma = mbeanName.indexOf(',');
if (indexOfComma != -1) {
mbeanName = mbeanName.substring(indexOfComma + 1);
addText(mbeanName);
margin += 13;
writeAttributes(mbean);
} else {
writeAttributes(mbean);
}
}
private void writeAttributes(MBeanNode mbean) throws DocumentException {
final String description = mbean.getDescription();
final List<MBeanAttribute> attributes = mbean.getAttributes();
if (description != null || !attributes.isEmpty()) {
currentTable = createAttributesTable();
if (description != null) {
currentTable.getDefaultCell().setColspan(3);
addCell('(' + description + ')');
currentTable.getDefaultCell().setColspan(1);
}
for (final MBeanAttribute attribute : attributes) {
writeAttribute(attribute);
}
final Paragraph paragraph = new Paragraph();
paragraph.setIndentationLeft(margin);
paragraph.add(currentTable);
addToDocument(paragraph);
addText("\n");
}
}
private void writeAttribute(MBeanAttribute attribute) {
addCell(attribute.getName());
addCell(attribute.getFormattedValue());
final String description = attribute.getDescription();
if (description != null) {
addCell('(' + description + ')');
} else {
addCell("");
}
}
private static PdfPTable createAttributesTable() {
final PdfPTable table = new PdfPTable(3);
table.setWidthPercentage(100);
final PdfPCell defaultCell = table.getDefaultCell();
defaultCell.setPaddingLeft(2);
defaultCell.setPaddingRight(2);
defaultCell.setVerticalAlignment(Element.ALIGN_TOP);
defaultCell.setBorder(0);
return table;
}
private void addText(String text) throws DocumentException {
final Paragraph paragraph = new Paragraph(text, normalFont);
paragraph.setIndentationLeft(margin);
addToDocument(paragraph);
}
private void addCell(String string) {
currentTable.addCell(new Phrase(string, cellFont));
}
}