Skip to content

Implementation of saving GC chart to image file #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 13, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 39 additions & 21 deletions src/main/java/com/tagtraum/perf/gcviewer/GCViewer.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,72 @@
package com.tagtraum.perf.gcviewer;

import java.io.File;
import java.io.IOException;

import com.tagtraum.perf.gcviewer.exp.DataWriter;
import com.tagtraum.perf.gcviewer.exp.DataWriterType;
import com.tagtraum.perf.gcviewer.exp.impl.DataWriterFactory;
import com.tagtraum.perf.gcviewer.imp.DataReaderException;
import com.tagtraum.perf.gcviewer.imp.DataReaderFacade;
import com.tagtraum.perf.gcviewer.model.GCModel;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GCViewer {
private static final Logger LOGGER = Logger.getLogger(GCViewer.class.getName());

public static void main(final String[] args) {
// TODO: unify parameter handling from command line
if (args.length == 2) {
if (args.length > 3) {
usage();
}
if (args.length >= 2) {
final String gcfile = args[0];
final String summaryFilePath = args[1];
final String chartFilePath = args.length == 3 ? args[2] : null;

//export summary:
try {
exportSummary(summaryFilePath, gcfile);
export(gcfile, summaryFilePath, chartFilePath);
System.exit(0);
}
catch(Exception e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "Error during report generation", e);
System.exit(-1);
}

}
else if (args.length > 1) {
usage();
}
}
}
else {
GCViewerGui.start(args.length == 1 ? args[0] : null);
}
}

private static void exportSummary(String summaryFilePath, String gcFilename) throws DataReaderException, IOException {
try (DataWriter summaryWriter = DataWriterFactory.getDataWriter(new File(summaryFilePath), DataWriterType.SUMMARY)) {
DataReaderFacade dataReaderFacade = new DataReaderFacade();
GCModel model = dataReaderFacade.loadModel(new File(gcFilename).toURI().toURL(), false, null);
summaryWriter.write(model);
}
}


private static void export(String gcFilename, String summaryFilePath, String chartFilePath)
throws IOException, DataReaderException {
DataReaderFacade dataReaderFacade = new DataReaderFacade();
GCModel model = dataReaderFacade.loadModel(new File(gcFilename).toURI().toURL(), false, null);

exportSummary(model, summaryFilePath);
if (chartFilePath != null)
renderChart(model, chartFilePath);
}

private static void exportSummary(GCModel model, String summaryFilePath) throws IOException {
try (DataWriter summaryWriter = DataWriterFactory.getDataWriter(new File(summaryFilePath), DataWriterType.SUMMARY)) {
summaryWriter.write(model);
}
}

private static void renderChart(GCModel model, String chartFilePath) throws IOException {
SimpleChartRenderer renderer = new SimpleChartRenderer();
renderer.render(model, chartFilePath);
}

private static void usage() {
System.out.println("Welcome to GCViewer with cmdline");
System.out.println("java -jar gcviewer.jar [<gc-log-file|url>] -> opens gui and loads given file");
System.out.println("java -jar gcviewer.jar [<gc-log-file>] [<export.csv>] -> cmdline: writes report to <export.csv>");
System.out.println("java -jar gcviewer.jar [<gc-log-file>] [<export.csv>] [<chart.png>] " +
"-> cmdline: writes report to <export.csv> and renders gc chart to <chart.png>");
}

}
54 changes: 14 additions & 40 deletions src/main/java/com/tagtraum/perf/gcviewer/ModelChartImpl.java
Original file line number Diff line number Diff line change
@@ -1,50 +1,19 @@
package com.tagtraum.perf.gcviewer;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import com.tagtraum.perf.gcviewer.model.GCModel;
import com.tagtraum.perf.gcviewer.renderer.*;
import com.tagtraum.perf.gcviewer.util.TimeFormat;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.text.DateFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.util.Date;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.tagtraum.perf.gcviewer.model.GCModel;
import com.tagtraum.perf.gcviewer.renderer.ConcurrentGcBegionEndRenderer;
import com.tagtraum.perf.gcviewer.renderer.FullGCLineRenderer;
import com.tagtraum.perf.gcviewer.renderer.GCRectanglesRenderer;
import com.tagtraum.perf.gcviewer.renderer.GCTimesRenderer;
import com.tagtraum.perf.gcviewer.renderer.IncLineRenderer;
import com.tagtraum.perf.gcviewer.renderer.InitialMarkLevelRenderer;
import com.tagtraum.perf.gcviewer.renderer.PolygonChartRenderer;
import com.tagtraum.perf.gcviewer.renderer.TotalHeapRenderer;
import com.tagtraum.perf.gcviewer.renderer.TotalTenuredRenderer;
import com.tagtraum.perf.gcviewer.renderer.TotalYoungRenderer;
import com.tagtraum.perf.gcviewer.renderer.UsedHeapRenderer;
import com.tagtraum.perf.gcviewer.renderer.UsedTenuredRenderer;
import com.tagtraum.perf.gcviewer.renderer.UsedYoungRenderer;
import com.tagtraum.perf.gcviewer.util.TimeFormat;

/**
* Graphical chart of the gc file. It contains the chart and all rulers surrounding it but not
* the model details on the right side.
Expand Down Expand Up @@ -234,6 +203,11 @@ public double getScaleFactor() {
return scaleFactor;
}

public void autoSetScaleFactor() {
double scaleFactor = getViewport().getWidth() / model.getRunningTime();
setScaleFactor(scaleFactor);
}

public void setScaleFactor(double scaleFactor) {
this.scaleFactor = scaleFactor;
chart.setSize(chart.getPreferredSize());
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/com/tagtraum/perf/gcviewer/SimpleChartRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.tagtraum.perf.gcviewer;

import com.tagtraum.perf.gcviewer.model.GCModel;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;

public class SimpleChartRenderer {
private static final Logger LOGGER = Logger.getLogger(SimpleChartRenderer.class.getName());

public void render(GCModel model, String chartFilePath) throws IOException {
GCPreferences gcPreferences = new GCPreferences();
gcPreferences.load();

final ModelChartImpl pane = new ModelChartImpl();
pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

pane.setModel(model, gcPreferences);
pane.setFootprint(model.getFootprint());
pane.setMaxPause(model.getPause().getMax());
pane.setRunningTime(model.getRunningTime());

Dimension d = new Dimension(gcPreferences.getWindowWidth(), gcPreferences.getWindowHeight());
pane.setSize(d);
pane.addNotify();
pane.validate();

pane.autoSetScaleFactor();

final BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
final Graphics2D graphics = image.createGraphics();
graphics.setBackground(Color.WHITE);
graphics.clearRect(0, 0, image.getWidth(), image.getHeight());

pane.paint(graphics);

ImageIO.write(image, "png", new File(chartFilePath));
}
}