/* * Software Name : ATK * * Copyright (C) 2007 - 2012 France Télécom * * 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. * * ------------------------------------------------------------------ * File Name : CreateGraph.java * * Created : 02/03/2009 * Author(s) : Yvain Leyral */ package com.orange.atk.graphAnalyser; import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.JOptionPane; import org.apache.log4j.Logger; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import com.orange.atk.monitoring.Event; import com.orange.atk.monitoring.Graph; import com.orange.atk.monitoring.MonitoringConfig; import com.orange.atk.phone.TcpdumpLineListener; import com.orange.atk.platform.Platform; import com.orange.atk.results.logger.documentGenerator.GraphGenerator; import com.orange.atk.results.logger.documentGenerator.PlotReader; import com.orange.atk.results.logger.log.ActionsLogger; import com.orange.atk.results.measurement.PlotList; import com.orange.atk.util.NetworkAnalysisUtils; public class CreateGraph implements TcpdumpLineListener { public static final String[] COLORS = {"black", "blue", "cyan", "gray", "green", "magenta", "orange", "pink", "red", "yellow"}; public static final Color[] COLORS_ = {Color.decode("#000000"), Color.decode("#29A2C6"), Color.decode("#4FD5D6"), Color.decode("#666666"), Color.decode("#73B66B"), Color.decode("#660099"), Color.decode("#FF6D31"), Color.decode("#EF597B"), Color.decode("#EE0000"), Color.decode("#FFCB18")}; private Map<String, PerformanceGraph> mapPerfGraph = null; private Map<String, GraphMarker> mapAction = null; private static Map<String, Color> mapColor = null; private List<Event> tempVectMarker = null; private List<Graph> tempVectGraph = null; private ChartPanel chartPanel = null; private XYPlot xyplot; private ActionsLogger actionslogger = null; private JFreeChart jfreechart; public CreateGraph() { // jfreechart = ChartFactory.createXYLineChart("Performances", // "time (min)", null, null, PlotOrientation.VERTICAL, false, true, // false); jfreechart = ChartFactory.createTimeSeriesChart("Performances", "Time (min:sec)", null, null, false, true, false); jfreechart.setBackgroundPaint(Color.white); xyplot = jfreechart.getXYPlot(); xyplot.setOrientation(PlotOrientation.VERTICAL); xyplot.setBackgroundPaint(Color.white); xyplot.setDomainGridlinePaint(Color.lightGray); xyplot.setRangeGridlinePaint(Color.lightGray); chartPanel = new ChartPanel(jfreechart); mapColor = new HashMap<String, Color>(); setMapcolor(); xyplot.setDomainCrosshairVisible(true); xyplot.setDomainCrosshairLockedOnData(false); xyplot.setRangeCrosshairVisible(false); mapPerfGraph = new HashMap<String, PerformanceGraph>(); mapAction = new HashMap<String, GraphMarker>(); } public void generateImage(String path) { for (int i = 0; i < tempVectGraph.size(); i++) { Graph temp = tempVectGraph.get(i); String name = temp.getName(); float Scale; try { Scale = Float.parseFloat(temp.getScale()); } catch (NumberFormatException e1) { Logger.getLogger(this.getClass()).warn("non float value for scale in config file"); Scale = 1; } String ycomment = temp.getYcomment(); // Check if file is empty File file = new File(path + Platform.FILE_SEPARATOR + name + ".csv"); if (file.exists()) { Logger.getLogger(this.getClass()).debug("Length" + file.length()); if (file.length() == 0) { file.delete(); Logger.getLogger(this.getClass()).debug("delete file" + name + ".csv"); } else { try { PlotList plotlist = PlotReader.read(new BufferedReader(new FileReader( file.getAbsolutePath()))); // Storage, blue, x Storage, y Storage, 1, true GraphGenerator.generateGraphWithJFreeChart( plotlist, name, path, ycomment, path + Platform.FILE_SEPARATOR + name + ".png", Scale); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Logger.getLogger(this.getClass()).error(e); } } } file = null; } } /** * add a PerformanceGraph in HashMap * * @param path * repertory where files are stored stream where the data will be * saved * @param name * Name of the file to add * @param mycolor * color of the graph * @param index * index for graph overlay in Jfreechart */ public void addPerfGraph(String path, String name, String mycolor, int index, String ycomment, String unit, int scale) { File file = new File(path + Platform.FILE_SEPARATOR + name + ".csv"); if (file.length() != 0) { Color color = mapColor.get(mycolor); PerformanceGraph graph = new PerformanceGraph(index, path + Platform.FILE_SEPARATOR + name + ".csv", ycomment, color, name, xyplot, unit, scale); mapPerfGraph.put(name, graph); } file = null; } /** * True if url markers are displayed */ private boolean urlMarkersDisplayed = true; public void displayUrlMarkers(boolean shown) { urlMarkersDisplayed = shown; if (shown) { drawMarker("URL"); } else { removeMarker("URL"); } } /** * Read all plt files and create dataset for jfreechart Read action.xml and * create markers * * @param path * repertory where files are stored stream where the data will be * saved * @return if the data have been well saved, false otherwise */ public void createMyDataset(String path) { String realpath = path + Platform.FILE_SEPARATOR; mapPerfGraph = new HashMap<String, PerformanceGraph>(); tempVectGraph = new ArrayList<Graph>(); tempVectMarker = new ArrayList<Event>(); mapAction = new HashMap<String, GraphMarker>(); actionslogger = new ActionsLogger(); MonitoringConfig config; try { config = MonitoringConfig.fromFile(realpath + "Confile.xml"); init(config); } catch (IOException e1) { Logger.getLogger(this.getClass()).error(e1); } for (int i = 0; i < tempVectGraph.size(); i++) { Graph g = tempVectGraph.get(i); String name = (String) g.getName(); String mycolor = (String) g.getColor(); String ycomment = g.getYcomment(); String unit = g.getUnit(); if (!unit.equals("")) ycomment += " (" + unit + ")"; int scale = Integer.parseInt(g.getScale()); addPerfGraph(path, name, mycolor, i, ycomment, unit, scale); } // add data fillAllDataset(); // initialize time axis initializeTimeAxis(); // create Dataset createDatasets(); // Calculate and add Markers actionslogger.load(new File(realpath + "actions.xml")); for (int i = 0; i < getTempVectMarker().size(); i++) { Event temp = getTempVectMarker().get(i); String name = (String) temp.getName(); Color color = mapColor.get((String) temp.getColor()); GraphMarker marker = new GraphMarker(xyplot, actionslogger.getSpecificActionsVect(name), color); mapAction.put(name, marker); } xyplot.getRangeAxis().setVisible(false); } /** * Create all dataset */ public void fillAllDataset() { Set<String> cles = mapPerfGraph.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); PerformanceGraph graph = (PerformanceGraph) mapPerfGraph.get(cle); Logger.getLogger(this.getClass()).debug("create dataset of graph " + cle); graph.createPlots(); } } public long initializeTimeAxis() { Set<String> cles = mapPerfGraph.keySet(); Iterator<String> it = cles.iterator(); long initialvalue = 0; while (it.hasNext()) { String cle = (String) it.next(); PerformanceGraph graph = (PerformanceGraph) mapPerfGraph.get(cle); if (graph.getmintimestamp() < initialvalue || initialvalue == 0 && graph.getmintimestamp() != -1) { initialvalue = graph.getmintimestamp(); } } if (initialvalue == -1) { initialvalue = (new Date()).getTime(); } DateAxis axis = (DateAxis) xyplot.getDomainAxis(); // axis.setTickUnit(new DateTickUnit(DateTickUnit.SECOND, 10)); RelativeDateFormat rdf = new RelativeDateFormat(initialvalue); rdf.setSecondFormatter(new DecimalFormat("00")); axis.setDateFormatOverride(rdf); return initialvalue; } public void createDatasets() { Set<String> cles = mapPerfGraph.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); PerformanceGraph graph = (PerformanceGraph) mapPerfGraph.get(cle); graph.createDataset(); } } public long getInitialValue(String pclogOutputDir) { long initValue = 0; Set<String> cles = mapPerfGraph.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); PerformanceGraph graph = (PerformanceGraph) mapPerfGraph.get(cle); long graphInitValue = graph.getmintimestamp(); if (graphInitValue != 0 && initValue < graphInitValue) { initValue = graphInitValue; } } return initValue; } public boolean addrefgraph(String pclogOutputDir, File file, String color, LectureJATKResult frame) { long initValue = getInitialValue(pclogOutputDir); // get value for new graph PlotList newplts; try { newplts = PlotReader.read(new BufferedReader(new FileReader( pclogOutputDir + Platform.FILE_SEPARATOR + file.getName()))); // change date of value long initialValue = newplts.getInitialValue(); newplts.changeTimeScale((initValue - initialValue)); // Generate file with new timescale GraphGenerator.dumpInFile(newplts, pclogOutputDir + Platform.FILE_SEPARATOR + Platform.FILE_SEPARATOR + file.getName()); // always save // with 1 // scale // add graph // TODO read conffile associated with this CSV graph file addPerfGraph(file.getParent(), file.getName().replace(".csv", ""), color, getMapPerfGraph().size(), file.getName().replace(".csv", ""), "", 1); } catch (FileNotFoundException e) { Logger.getLogger(this.getClass()).error(e); JOptionPane.showMessageDialog(frame, "FileNotFoundException", "Add ref Chart", JOptionPane.INFORMATION_MESSAGE); return false; } catch (ArrayIndexOutOfBoundsException e) { Logger.getLogger(this.getClass()).error(e); JOptionPane.showMessageDialog(frame, "ArrayIndexOutOfBoundsException", "Add ref Chart", JOptionPane.INFORMATION_MESSAGE); return false; } catch (IOException e) { Logger.getLogger(this.getClass()).error(e); JOptionPane.showMessageDialog(frame, "IOException", "Add ref Chart", JOptionPane.INFORMATION_MESSAGE); return false; } return true; } /** * Read all plt files and create dataset for jfreechart Read action.xml and * create markers * * @param path * repertory where files are stored stream where the data will be * saved * @return if the data have been well saved, false otherwise */ public boolean createPerfGraphsAndMarkers(String confilepath) { boolean empty = true; mapPerfGraph = new HashMap<String, PerformanceGraph>(); // simule la lecture d'un fichier de config tempVectGraph = new ArrayList<Graph>(); tempVectMarker = new ArrayList<Event>(); mapAction = new HashMap<String, GraphMarker>(); actionslogger = new ActionsLogger(); MonitoringConfig config; try { config = MonitoringConfig.fromFile(confilepath); init(config); } catch (IOException e1) { Logger.getLogger(this.getClass()).error(e1); } for (int i = 0; i < tempVectGraph.size(); i++) { Graph temp = tempVectGraph.get(i); String name = temp.getName(); Color color = mapColor.get(temp.getColor()); String unit = temp.getUnit(); String ycomment = temp.getYcomment(); if (!unit.equals("")) { ycomment += " (" + unit + ")"; } int scale = Integer.parseInt(temp.getScale()); PerformanceGraph graph = new PerformanceGraph(i, confilepath + name + ".csv", ycomment, color, name, xyplot, unit, scale); mapPerfGraph.put(name, graph); empty = false; } for (int i = 0; i < getTempVectMarker().size(); i++) { Event temp = getTempVectMarker().get(i); String name = (String) temp.getName(); Color color = mapColor.get((String) temp.getColor()); GraphMarker marker = new GraphMarker(xyplot, actionslogger.getSpecificActionsVect(name), color); marker.setActivate(true); mapAction.put(name, marker); } return empty; } public void createEmptyDataset() { Set<String> cles = mapPerfGraph.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); PerformanceGraph graph = (PerformanceGraph) mapPerfGraph.get(cle); graph.createEmptyDataset(); } xyplot.getRangeAxis().setVisible(false); } /** * Create marker vector this vector will be composed of three information * necessary to display * * @param name * name of the plt file * @param position * comment position * @param color * comment color * * @return if the data have been well saved, false otherwise */ public void createMarkerVector(String name, double position, String color) { getTempVectMarker().add(new Event(name, position, color)); } /** * Refresh display on graph to display */ public void refreshGraph() { Set<String> cles = mapAction.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); GraphMarker marker = (GraphMarker) mapAction.get(cle); marker.refreshMarker(); } } /** * Clear all marker and annotation on display */ public void clearMarker() { Set<String> cles = mapAction.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()) { String cle = (String) it.next(); GraphMarker marker = (GraphMarker) mapAction.get(cle); marker.removeMarker(); } } /** * Draw a specific set of marker * * @param name * name of marker set */ public void drawMarker(String key) { mapAction.get(key).drawMarker(); } /** * Remove a specific set of marker * * @param name * name of marker set */ public void removeMarker(String key) { mapAction.get(key).removeMarker(); } /** * Draw a specific graph * * @param GraphName * Graph name */ public void drawGraph(String GraphName) { mapPerfGraph.get(GraphName).drawGraph(); refreshGraph(); } /** * Unraw a specific graph * * @param GraphName * Graph name */ public void undrawGraph(String GraphName) { mapPerfGraph.get(GraphName).removeGraph(); refreshGraph(); } /** * Define initial vector to define a set of color available * */ private final void setMapcolor() { for (int i = 0; i < COLORS.length; i++) { mapColor.put(COLORS[i], COLORS_[i]); } } private void init(MonitoringConfig config) { for (Graph g : config.getGraphs()) { this.getTempVectGraph().add(g); } for (Event e : config.getEvents()) { this.getTempVectMarker().add(e); } } public ChartPanel getChartpanel() { return chartPanel; } public Map<String, PerformanceGraph> getMapPerfGraph() { if (mapPerfGraph == null) { mapPerfGraph = new HashMap<String, PerformanceGraph>(); } return mapPerfGraph; } public Map<String, GraphMarker> getMapAction() { if (mapPerfGraph == null) { mapAction = new HashMap<String, GraphMarker>(); } return mapAction; } public static Map<String, Color> getMapColor() { return mapColor; } public ChartPanel getChartPanel() { return chartPanel; } public ActionsLogger getActionslogger() { return actionslogger; } public JFreeChart getJfreechart() { return jfreechart; } public List<Graph> getTempVectGraph() { return tempVectGraph; } public List<Event> getTempVectMarker() { return tempVectMarker; } /** * A new tcpdump line has been received */ public void newTcpDumpLine(String line) { Date theDate = NetworkAnalysisUtils.extractTcpdumpLineDate(line); String url = NetworkAnalysisUtils.extractTcpdumpLineUrl(line); if (theDate != null && url != null) { GraphMarker urlMarker = mapAction.get("URL"); if (urlMarker != null) { urlMarker.addEvent("Type", url, theDate, theDate); // Set marker to hidden if urlMarkers checkbox is not checked if (urlMarkersDisplayed == false) { urlMarker.removeMarker(); } mapAction.put("URL", urlMarker); } } } }