Skip to main content

[perfdata~pda:20] PDA Version 2.0.3_00

  • From:
  • To:
  • Subject: [perfdata~pda:20] PDA Version 2.0.3_00
  • Date: Thu, 23 Jan 2014 01:48:21 +0000

Project:    perfdata
Repository: pda
Revision:   20
Author:     nicolasmichael
Date:       2014-01-23 01:48:18 UTC
Link:       

Log Message:
------------
PDA Version 2.0.3_00


Revisions:
----------
20


Modified Paths:
---------------
src/de/nmichael/pda/gui/SeriesSettingsDialog.java
src/CHANGELOG.TXT
src/de/nmichael/pda/util/Util.java
src/de/nmichael/pda/data/Parser.java
src/de/nmichael/pda/data/DataSeriesSet.java
src/COPYING.TXT
src/de/nmichael/pda/data/DataSeriesProperties.java
src/de/nmichael/pda/data/DataSeries.java
src/de/nmichael/pda/gui/MainFrame.java
src/de/nmichael/pda/Logger.java
src/de/nmichael/pda/util/ErrorPrintStream.java
src/de/nmichael/pda/data/Project.java
src/de/nmichael/pda/gui/GraphPanel.java
src/de/nmichael/pda/Main.java
src/de/nmichael/pda/gui/SelectSeriesDialog.java
src/de/nmichael/pda/gui/BaseDialog.java
src/de/nmichael/pda/data/DataSeriesPropertySet.java


Added Paths:
------------
src/de/nmichael/pda/parser/Cpustat.java
src/de/nmichael/pda/gui/ChangeDirDialog.java
src/de/nmichael/pda/gui/img/filedirreplace.png


Diffs:
------
Index: src/CHANGELOG.TXT
===================================================================
--- src/CHANGELOG.TXT   (revision 19)
+++ src/CHANGELOG.TXT   (revision 20)
@@ -1,3 +1,28 @@
+Version 2.0.3_00 (2014-01-22)
+-----------------------------
+* New: Feature to replace directory in an existing project
+* Bugfix: Logging bugfix
+* Bugfix: Line width property got lost when series configuration dialog was 
opened
+
+Version 2.0.2_04 (2013-11-14)
+-----------------------------
+* Bugfix: In case of negative min values, all series now scaled based on 
min:max ratio with common null axis
+* Bugfix: Auto-correction for line style and line width selection in 
properties dialog
+
+Version 2.0.2_03 (2013-11-11)
+-----------------------------
+* New: Null Axis in case of negative values
+* Bugfix: Parser allows user-specified, negative min value for scaling
+
+Version 2.0.2_02 (2013-11-11)
+-----------------------------
+* New: Added verbose mode for debug logging
+* Bugfix: Error messages are now not only logged, but also displayed as an 
error dialog
+
+Version 2.0.2_01 (2013-11-10)
+-----------------------------
+* Bugfix: Selection of linesyle "dashed" in combination with line width of 
greater than 1 fixed
+
 Version 2.0.2_00 (2013-11-10)
 -----------------------------
 * New: Users can now configure size and color of labels
Index: src/COPYING.TXT
===================================================================
--- src/COPYING.TXT     (revision 19)
+++ src/COPYING.TXT     (revision 20)
@@ -1,5 +1,5 @@
                        Performance Data Analyzer (PDA)
-                   Copyright (c) 2006-13 by Nicolas Michael
+                   Copyright (c) 2006-14 by Nicolas Michael
                 --------------------------------------------
 
                                   Author:
Index: src/de/nmichael/pda/Logger.java
===================================================================
--- src/de/nmichael/pda/Logger.java     (revision 19)
+++ src/de/nmichael/pda/Logger.java     (revision 20)
@@ -10,12 +10,14 @@
 
 package de.nmichael.pda;
 
+import de.nmichael.pda.gui.BaseDialog;
+import de.nmichael.pda.util.Util;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
 
 public class Logger {
     
-    private static boolean debugLogging = true;
+    private static boolean debugLogging = false;
 
     public enum LogType {
         info,
@@ -61,10 +63,18 @@
             return;
         }
         System.out.println("[" + getCurrentTimeStamp() + "] - " + 
getTypeString(type) + " - " + msg);
+        if (type == LogType.error) {
+            BaseDialog.errorDlg(null, Util.breakLine(msg, 80));
+        }
     }
     
     public static boolean isDebugLoggin() {
         return debugLogging;
     }
     
+    static void setDebugLogging(boolean debug) {
+        debugLogging = debug;
+        log(LogType.debug, "Verbose Mode enabled.");
+    }
+    
 }
Index: src/de/nmichael/pda/Main.java
===================================================================
--- src/de/nmichael/pda/Main.java       (revision 19)
+++ src/de/nmichael/pda/Main.java       (revision 20)
@@ -17,7 +17,7 @@
 
 public class Main {
     
-    public static final String VERSIONID = "2.0.2_00";
+    public static final String VERSIONID = "2.0.3_00";
     
     public static final String PROGRAM = "Performance Data Analyzer";
     public static final String PROGRAMSHORT = "PDA";
@@ -25,7 +25,7 @@
     public static final String AUTHOR = "Nicolas Michael";
     public static final String HOMEPAGE = "http://pda.nmichael.de";;
     public static final String EMAIL = 
" ";
-    public static final String COPYRIGHT = "Copyright (c) 2006-13 by " + 
AUTHOR;
+    public static final String COPYRIGHT = "Copyright (c) 2006-14 by " + 
AUTHOR;
     public static final String LICENSE = "GNU General Public License v2";
     public static String HOMEDIR = System.getProperty("user.home");
     public static String PDADIR = System.getProperty("user.dir");
@@ -33,7 +33,6 @@
     public static String PARSERDIR = PDADIR + FILESEP + "parsers";
     public static ConfigFile config = null;
     
-    public static boolean argBatch = false;
     private static String argFname = null;
     
     private static void startGUI() {
@@ -58,14 +57,15 @@
         System.out.println(COPYRIGHT);
         System.out.println("");
         System.out.println("Usage:");
-        System.out.println("    PerformanceDataAnalyser [file]");
+        System.out.println("    PerformanceDataAnalyser [-v] [file]");
+        System.out.println("        -v      verbose");
         System.out.println("        file    project file to open");
     }
     
     private static void getCommandLineArgs(String[] args) {
         for (int i=0; i<args.length; i++) {
-            if (args[i].equals("-b")) {
-                argBatch = true;
+            if (args[i].equals("-v")) {
+                Logger.setDebugLogging(true);
                 continue;
             }
             if (args[i].equals("-help")) {
@@ -116,14 +116,7 @@
 
         getCommandLineArgs(args);
 
-        if (!argBatch) {
-            startGUI();
-        } else {
-            Logger.log(Logger.LogType.info, "Sorry, batch mode currently not 
supported.");
-             // @todo Reporter Mode
-            //Reporter batchMode = new Reporter(argFname);
-            //batchMode.run();
-        }
+        startGUI();
     }
     
 }
\ No newline at end of file
Index: src/de/nmichael/pda/gui/GraphPanel.java
===================================================================
--- src/de/nmichael/pda/gui/GraphPanel.java     (revision 19)
+++ src/de/nmichael/pda/gui/GraphPanel.java     (revision 20)
@@ -55,6 +55,7 @@
     private int yaxiscnt;
     private SGLabel selectedLabel;
     private boolean hasSeriesLabels = false;
+    private double maxMin2MaxRatio = 0;
     
     public enum GraphAction {
         begin,
@@ -125,6 +126,8 @@
         graph2yAxis = new Hashtable();
         graph2yAxisOrientation = new Hashtable();
         nextLabelPosition = G_MARGIN_LEFT;
+
+        maxMin2MaxRatio = 
findAndAdjustMinToMaxRatio(projectItem.getSeriesProperties());        
         
         DataSeriesPropertySet prop = projectItem.getSeriesProperties();
         for (int i = 0; i < prop.size(); i++) {
@@ -135,11 +138,33 @@
             }
         }
         
+        if (maxMin2MaxRatio > 0 && graphcnt > 0) {
+            Layer l = createNullLayer();
+            if (l != null) {
+                this.add(l);
+            }
+        }
+        
         if (layers.size() == 0) {
             add(mainFrame.getPdaLogo());
         }
     }
     
+    private double findAndAdjustMinToMaxRatio(DataSeriesPropertySet prop) {
+        // find all series with negative values and determine the maximum 
min:max ratio
+        double min2max = 0;
+        for (int i = 0; i < prop.size(); i++) {
+            DataSeriesProperties dp = prop.getDataProperties(i);
+            double scaleMin = dp.getScaleMin();
+            double scaleMax = dp.getScaleMax();
+            if (scaleMin >= 0 || scaleMax <= 0) {
+                continue;
+            }
+            min2max = Math.max(Math.abs(scaleMin) / scaleMax, min2max);
+        }
+        return min2max;
+    }
+    
     private Layer createLayer(DataSeriesProperties prop) {
         String name = prop.getDisplayName();
         
@@ -152,6 +177,12 @@
         if (scaleMax <= scaleMin) {
             scaleMax = scaleMin + 1;
         }
+        if (scaleMin < 0 && scaleMax > 0) {
+            double myMin2MaxRatio = Math.abs(scaleMin) / scaleMax;
+            if (myMin2MaxRatio != maxMin2MaxRatio) {
+                scaleMin = -1 * maxMin2MaxRatio * scaleMax;
+            }
+        }
         CartesianGraph g = createGraph(layer, prop, name, scaleMin, 
scaleMax);
         if (g == null) {
             Logger.log(Logger.LogType.debug, 
"createLayer("+prop.getName()+") - skipped (no graph created)");
@@ -416,6 +447,50 @@
         return graph;
     }
     
+    private Layer createNullLayer() {
+        float xyRatio = ((float)getWidth())/((float)getHeight());
+        myWidth = G_WIDTH * xyRatio;
+        myHeight = G_HEIGHT;
+        final Layer layer = new Layer("NULLLAYER", new Dimension2D(myWidth, 
myHeight));
+        double scaleMin = -1 * maxMin2MaxRatio;
+        double scaleMax = 1;
+        CartesianGraph graph = new CartesianGraph();
+        long minTs = projectItem.getScaleMinX();
+        long maxTs = projectItem.getScaleMaxX();
+        if (minTs <= 0 || maxTs == Long.MAX_VALUE || minTs >= maxTs || 
maxMin2MaxRatio <= 0) {
+            return null;
+        }
+        
+        GeoDate startDate = new GeoDate(minTs);
+        GeoDate endDate = new GeoDate(maxTs);
+        
+        Range2D xPhysRange = new Range2D(G_MARGIN_LEFT, myWidth - 
G_MARGIN_RIGHT);
+        Range2D yPhysRange = new Range2D(G_MARGIN_BOTTOM, myHeight - 
G_MARGIN_TOP);
+        
+        TimeRange xUserRange = new TimeRange(startDate,endDate);
+        Range2D yUserRange = new Range2D(scaleMin, scaleMax);
+        graph2yUserRange.put(graph,yUserRange);
+        
+        gov.noaa.pmel.sgt.LinearTransform xt = new 
gov.noaa.pmel.sgt.LinearTransform(xPhysRange, xUserRange);
+        gov.noaa.pmel.sgt.AxisTransform yt = new 
gov.noaa.pmel.sgt.LinearTransform(yPhysRange, yUserRange);
+        graph.setXTransform(xt);
+        graph.setYTransform(yt);
+        
+        GeoDate[] date = new GeoDate[2];
+        double[] values = new double[2];
+        date[0] = new GeoDate(minTs);
+        values[0] = 0;
+        date[1] = new GeoDate(maxTs);
+        values[1] = 0;
+        Attribute attr = new LineAttribute(LineAttribute.DASHED, Color.gray);
+        ((LineAttribute) attr).setWidth(1);
+        SGTData sgtdata = new SimpleLine(date, values, "NULLLINE");
+        graph.setData(sgtdata, attr);
+        layer.setGraph(graph);
+        layers.add(layer);
+        return layer;
+    }
+    
     private void addSampleLabel(Layer l, DataSeriesProperties prop, Sample 
sample,
             double px, double py) {
         String text = sample.getLabel();
Index: src/de/nmichael/pda/gui/BaseDialog.java
===================================================================
--- src/de/nmichael/pda/gui/BaseDialog.java     (revision 19)
+++ src/de/nmichael/pda/gui/BaseDialog.java     (revision 20)
@@ -267,7 +267,7 @@
         return JOptionPane.showInputDialog(frame, title, initialValue);
     }
 
-    private static String fileDlg(Window frame, String titel, String type, 
String ext, String startdir, boolean save) {
+    private static String fileDlg(Window frame, String titel, String type, 
String ext, String startdir, boolean save, boolean dirs) {
         try {
             JFileChooser dlg;
             if (startdir != null) {
@@ -281,6 +281,9 @@
             if (titel != null) {
                 dlg.setDialogTitle(titel);
             }
+            if (dirs) {
+               dlg.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+            }
             int ret;
             dlg.setPreferredSize(new Dimension(950, 500));
             if (save) {
@@ -300,13 +303,17 @@
     }
 
     public static String saveFileDlg(Window frame, String titel, String 
type, String ext, String startdir) {
-        return fileDlg(frame, titel, type, ext, startdir, true);
+        return fileDlg(frame, titel, type, ext, startdir, true, false);
     }
 
     public static String openFileDlg(Window frame, String titel, String 
type, String ext, String startdir) {
-        return fileDlg(frame, titel, type, ext, startdir, false);
+        return fileDlg(frame, titel, type, ext, startdir, false, false);
     }
     
+    public static String openDirDlg(Window frame, String titel, String type, 
String ext, String startdir) {
+        return fileDlg(frame, titel, type, ext, startdir, false, true);
+    }
+    
     public static String choseColor(Window parent, String colorTxt) {
         Color color = Util.getColor(colorTxt);
         color = JColorChooser.showDialog(parent, "Chose Color", color);
Index: src/de/nmichael/pda/gui/SeriesSettingsDialog.java
===================================================================
--- src/de/nmichael/pda/gui/SeriesSettingsDialog.java   (revision 19)
+++ src/de/nmichael/pda/gui/SeriesSettingsDialog.java   (revision 20)
@@ -17,6 +17,7 @@
 import de.nmichael.pda.data.*;
 import de.nmichael.pda.util.*;
 import gov.noaa.pmel.sgt.SGLabel;
+import java.beans.PropertyChangeEvent;
 
 public class SeriesSettingsDialog extends BaseDialog {
     
@@ -123,6 +124,18 @@
         lineWidth.setPreferredSize(new Dimension(200,19));
         mainPanel.add(lineWidth,new GridBagConstraints(1, 6, 2, 1, 0.0, 0.0,
                 GridBagConstraints.WEST, GridBagConstraints.NONE, new 
Insets(0, 0, 0, 0), 0, 0));
+        lineWidth.addFocusListener(new java.awt.event.FocusAdapter() {
+            public void focusLost(FocusEvent e) {
+                int width = Util.string2int(lineWidth.getText(), 2);
+                int style = lineStyle.getSelectedIndex();
+                if (width > 1 && (style == 
DataSeriesProperties.LINESTYLE_SOLID || style == 
DataSeriesProperties.LINESTYLE_DASHED)) {
+                    
lineStyle.setSelectedIndex(DataSeriesProperties.LINESTYLE_STRONG);
+                }
+                if (width < 2 && style == 
DataSeriesProperties.LINESTYLE_STRONG) {
+                    
lineStyle.setSelectedIndex(DataSeriesProperties.LINESTYLE_SOLID);
+                }
+            }
+        });
         
         JLabel lineStyleLabel = new JLabel();
         setLabel(lineStyleLabel, "Line Style:", 's', lineStyle);
@@ -131,6 +144,24 @@
         lineStyle.setPreferredSize(new Dimension(200,19));
         mainPanel.add(lineStyle,new GridBagConstraints(1, 7, 2, 1, 0.0, 0.0,
                 GridBagConstraints.WEST, GridBagConstraints.NONE, new 
Insets(0, 0, 0, 0), 0, 0));
+        lineStyle.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                int width = Util.string2int(lineWidth.getText(), 2);
+                switch (lineStyle.getSelectedIndex()) {
+                    case DataSeriesProperties.LINESTYLE_SOLID:
+                    case DataSeriesProperties.LINESTYLE_DASHED:
+                        if (width > 1) {
+                            lineWidth.setText("1");
+                        }
+                        break;
+                    case DataSeriesProperties.LINESTYLE_STRONG:
+                        if (width < 2) {
+                            lineWidth.setText("2");
+                        }
+                        break;
+                }
+            }
+        });
         
         JLabel valueAxisLabel = new JLabel();
         setLabel(valueAxisLabel, "Value Axis:", 'x', valueAxis);
@@ -174,11 +205,11 @@
             style.addItem(DataSeriesProperties.STYLES[i]);
         }
         style.setSelectedIndex(prop.getStyle());
-        lineWidth.setText(Integer.toString(prop.getLineWidth()));
         for (int i=0; i<DataSeriesProperties.LINESTYLES.length; i++) {
             lineStyle.addItem(DataSeriesProperties.LINESTYLES[i]);
         }
         lineStyle.setSelectedIndex(prop.getLineStyle());
+        lineWidth.setText(Integer.toString(prop.getLineWidth()));
         smooth.setText(Integer.toString(prop.getSmooth()));
         for (int i=0; i<DataSeriesProperties.VALUEAXIS.length; i++) {
             valueAxis.addItem(DataSeriesProperties.VALUEAXIS[i]);
@@ -234,12 +265,12 @@
             prop.setColor(Util.getColor(color.getText().trim()));
             prop.setStyle(style.getSelectedIndex());
             try {
-                
prop.setLineWidth(Integer.parseInt(lineWidth.getText().trim()));
+                
prop.setLineWidth(Util.string2int(lineWidth.getText().trim(), 2));
             } catch (Exception ee) {
             }
             prop.setLineStyle(lineStyle.getSelectedIndex());
             try {
-                prop.setSmooth(Integer.parseInt(smooth.getText().trim()));
+                prop.setSmooth(Util.string2int(smooth.getText().trim(), 
DataSeriesProperties.LINESTYLE_SOLID));
             } catch (Exception ee) {
             }
             prop.setValueAxis(valueAxis.getSelectedIndex());
Index: src/de/nmichael/pda/gui/img/filedirreplace.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: src/de/nmichael/pda/gui/img/filedirreplace.png
===================================================================
--- src/de/nmichael/pda/gui/img/filedirreplace.png      (revision 19)
+++ src/de/nmichael/pda/gui/img/filedirreplace.png      (revision 20)

Property changes on: src/de/nmichael/pda/gui/img/filedirreplace.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: src/de/nmichael/pda/gui/MainFrame.java
===================================================================
--- src/de/nmichael/pda/gui/MainFrame.java      (revision 19)
+++ src/de/nmichael/pda/gui/MainFrame.java      (revision 20)
@@ -60,6 +60,7 @@
     JMenuItem menuProjectOpen = new JMenuItem();
     JMenuItem menuProjectSave = new JMenuItem();
     JMenuItem menuProjectSaveAs = new JMenuItem();
+    JMenuItem menuProjectChangeDir = new JMenuItem();
     JMenuItem menuProjectClose = new JMenuItem();
     JMenuItem menuProjectConfigure = new JMenuItem();
     JMenuItem menuProjectSelect = new JMenuItem();
@@ -325,6 +326,14 @@
                 menuProjectSaveAs_actionPerformed(e);
             }
         });
+        menuProjectChangeDir.setText("Change Data Directory ...");
+        menuProjectChangeDir.setMnemonic('c');
+        BaseDialog.setIcon(menuProjectChangeDir, "filedirreplace.png");
+        menuProjectChangeDir.addActionListener(new ActionListener()  {
+            public void actionPerformed(ActionEvent e) {
+                menuProjectChangeDir_actionPerformed(e);
+            }
+        });
         menuProjectClose.setText("Close");
         menuProjectClose.setMnemonic('c');
         BaseDialog.setIcon(menuProjectClose, "fileclose.png");
@@ -405,6 +414,7 @@
         menuProject.add(menuProjectOpen);
         menuProject.add(menuProjectSave);
         menuProject.add(menuProjectSaveAs);
+        menuProject.add(menuProjectChangeDir);
         menuProject.add(menuProjectClose);
         menuProject.addSeparator();
         menuProject.add(menuProjectConfigure);
@@ -765,6 +775,22 @@
         }
     }
     
+    private void menuProjectChangeDir_actionPerformed(ActionEvent e) {
+        if (project != null) {
+            String oldDir = 
Util.getPathOfFile(project.getRandomParserFileName());
+            ChangeDirDialog dlg = new ChangeDirDialog(this, oldDir);
+            if (dlg.showDialog()) {
+                oldDir = dlg.getOldDir();
+                String newDir = dlg.getNewDir();
+                if (newDir != null) {
+                    int count = project.replaceDirectory(oldDir, newDir);
+                    BaseDialog.infoDlg(this, count + " filenames changed.");
+                    updateDisplay();
+                }
+            }
+        }
+    }
+    
     private void menuProjectClose_actionPerformed(ActionEvent e) {
         createNewProject();
         updateTitle();
Index: src/de/nmichael/pda/gui/ChangeDirDialog.java
===================================================================
--- src/de/nmichael/pda/gui/ChangeDirDialog.java        (revision 0)
+++ src/de/nmichael/pda/gui/ChangeDirDialog.java        (revision 20)
@@ -0,0 +1,105 @@
+/**
+* Title:        Performance Data Analyzer (PDA)
+* Copyright:    Copyright (c) 2006-2013 by Nicolas Michael
+* Website:      http://pda.nmichael.de/
+* License:      GNU General Public License v2
+*
+* @author Nicolas Michael
+* @version 2
+*/
+
+package de.nmichael.pda.gui;
+
+import de.nmichael.pda.Main;
+import de.nmichael.pda.util.Util;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import javax.swing.*;
+
+public class ChangeDirDialog extends BaseDialog {
+    
+    // Data
+    private String oldDirName;
+    private String newDirName;
+    
+    // Base Layout
+    private JTextField oldDir;
+    private JTextField newDir;
+    
+    // Ok Button
+    private JButton okButton = new JButton();
+
+    public ChangeDirDialog(JFrame parent, String oldDir) {
+        super(parent, "Change Data Directory");
+        this.oldDirName = oldDir;
+    }
+
+    @Override
+    protected void initialize() {
+        mainPanel.setLayout(new GridBagLayout());
+        
+        JLabel oldDirLabel = new JLabel();
+        oldDir = new JTextField();
+        oldDir.setText(oldDirName);
+        setLabel(oldDirLabel, "Old Directory:", 'o', oldDir);
+        mainPanel.add(oldDirLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 
0.0,
+                 GridBagConstraints.WEST, GridBagConstraints.NONE, new 
Insets(0, 0, 0, 5), 0, 0));
+        oldDir.setPreferredSize(new Dimension(800, 19));
+        mainPanel.add(oldDir, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
+                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new 
Insets(0, 0, 0, 0), 0, 0));
+
+        JLabel newDirLabel = new JLabel();
+        newDir = new JTextField();
+        newDir.setText(oldDirName);
+        setLabel(newDirLabel, "New Directory:", 'n', newDir);
+        mainPanel.add(newDirLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 
0.0,
+                 GridBagConstraints.WEST, GridBagConstraints.NONE, new 
Insets(0, 0, 0, 5), 0, 0));
+        newDir.setPreferredSize(new Dimension(800, 19));
+        mainPanel.add(newDir, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
+                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new 
Insets(0, 0, 0, 0), 0, 0));
+
+        JButton selectDirButton = new JButton();
+        selectDirButton.setPreferredSize(new Dimension(30, 22));
+        setIcon(selectDirButton, "fileopen.png");
+        selectDirButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                String s = BaseDialog.openDirDlg(parent, "Select New 
Directory", null, null, newDir.getText().trim());
+                if (s != null) {
+                    newDir.setText(s);
+                }
+            }
+        });
+        mainPanel.add(selectDirButton, new GridBagConstraints(2, 1, 1, 1, 
0.0, 0.0,
+                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new 
Insets(0, 5, 0, 0), 0, 0));
+
+    }
+    
+    protected void closeWindow(boolean okButton) {
+        if (okButton) {
+            oldDirName = oldDir.getText().trim();
+            newDirName = newDir.getText().trim();
+        }
+        super.closeWindow(okButton);
+    }
+    
+    private String getDir(String dir) {
+        if (dir != null) {
+            dir = dir.trim();
+            if (!dir.endsWith(Main.FILESEP)) {
+                dir = dir + Main.FILESEP;
+            }
+        }
+        return dir;
+    }
+    
+    public String getOldDir() {
+        return getDir(oldDirName);
+    }
+    
+    public String getNewDir() {
+        return getDir(newDirName);
+    }
+    
+}
Index: src/de/nmichael/pda/gui/SelectSeriesDialog.java
===================================================================
--- src/de/nmichael/pda/gui/SelectSeriesDialog.java     (revision 19)
+++ src/de/nmichael/pda/gui/SelectSeriesDialog.java     (revision 20)
@@ -231,7 +231,9 @@
             for (DataSeries s : series) {
                 if (s.isUsed()) {
                     if (s.isSelected() && s.getDataProperties() == null) {
-                        createDataProperties(s);
+                        if (!s.findDataProperties(propertySet)) {
+                            createDataProperties(s);
+                        }
                     }
                     if (!s.isParsed()) {
                         ArrayList<Parser> dirtyParsers = s.getDirtyParsers();
Index: src/de/nmichael/pda/data/DataSeries.java
===================================================================
--- src/de/nmichael/pda/data/DataSeries.java    (revision 19)
+++ src/de/nmichael/pda/data/DataSeries.java    (revision 20)
@@ -380,6 +380,15 @@
     public DataSeriesProperties getDataProperties() {
         return dataProperties;
     }
+    
+    public boolean findDataProperties(DataSeriesPropertySet propertySet) {
+        DataSeriesProperties dp = propertySet.getDataProperties(getName());
+        if (dp != null) {
+            this.setDataProperties(dp);
+            return true;
+        }
+        return false;
+    }
 
     @Override
     public int compareTo(Object t) {
Index: src/de/nmichael/pda/data/Parser.java
===================================================================
--- src/de/nmichael/pda/data/Parser.java        (revision 19)
+++ src/de/nmichael/pda/data/Parser.java        (revision 20)
@@ -139,10 +139,18 @@
         Logger.log(Logger.LogType.error, "Parser " + getName() + " [" + 
filename + "]: " + msg);
     }
 
+    public void logWarning(String msg) {
+        Logger.log(Logger.LogType.warning, "Parser " + getName() + " [" + 
filename + "]: " + msg);
+    }
+
     public void logInfo(String msg) {
         Logger.log(Logger.LogType.info, "Parser " + getName() + " [" + 
filename + "]: " + msg);
     }
 
+    public void logDebug(String msg) {
+        Logger.log(Logger.LogType.debug, "Parser " + getName() + " [" + 
filename + "]: " + msg);
+    }
+
     public void setFilename(String absfilename) {
         this.filename = absfilename;
     }
Index: src/de/nmichael/pda/data/DataSeriesSet.java
===================================================================
--- src/de/nmichael/pda/data/DataSeriesSet.java (revision 19)
+++ src/de/nmichael/pda/data/DataSeriesSet.java (revision 20)
@@ -482,6 +482,86 @@
     }
 
     /**
+     * Sets the preferred minimum scale of all series with same category, 
subcategory, and/or series names
+     * to the same value.
+     * @param sameCategory if true, group series with same category name
+     * @param sameSubcategory if true, group series with same subcategory 
name
+     * @param sameSeries if true, group series with same series name
+     */
+    public void setPreferredScaleSameMin(boolean sameCategory, boolean 
sameSubcategory, boolean sameSeries) {
+        Hashtable<String, Double> minValues = new Hashtable<String, 
Double>();
+        for (String c : getCategoryNames()) {
+            for (String sc : getSubcategoryNames(c)) {
+                for (String s : getSeriesNames(c, sc)) {
+                    DataSeries series = getSeries(c, sc, s);
+                    String key = (sameCategory ? c : "") + ":"
+                            + (sameSubcategory ? sc : "") + ":"
+                            + (sameSeries ? s : "");
+                    Double allmin = minValues.get(key);
+                    double min = series.getMinValue();
+                    //System.out.println(c + ":" + sc + ":" + s + " = " + 
max);
+                    min = Math.min((allmin != null ? allmin.doubleValue() : 
0), min);
+                    minValues.put(key, min);
+                }
+            }
+        }
+        for (String c : getCategoryNames()) {
+            for (String sc : getSubcategoryNames(c)) {
+                for (String s : getSeriesNames(c, sc)) {
+                    DataSeries series = getSeries(c, sc, s);
+                    String key = (sameCategory ? c : "") + ":"
+                            + (sameSubcategory ? sc : "") + ":"
+                            + (sameSeries ? s : "");
+                    Double min = minValues.get(key).doubleValue();
+                    series.setPreferredScale(-1 * 
Util.roundUpToScale(Math.abs(min)), series.getPreferredScaleMaxValue());
+                }
+            }
+        }
+    }
+
+    /**
+     * Sets the both the preferred minimum and maximum scale of all series 
with same category, subcategory, and/or series names
+     * to the same value (min=max for all series).
+     * @param sameCategory if true, group series with same category name
+     * @param sameSubcategory if true, group series with same subcategory 
name
+     * @param sameSeries if true, group series with same series name
+     */
+    public void setPreferredScaleMinMaxSame(boolean sameCategory, boolean 
sameSubcategory, boolean sameSeries) {
+        Hashtable<String, Double> maxValues = new Hashtable<String, 
Double>();
+        for (String c : getCategoryNames()) {
+            for (String sc : getSubcategoryNames(c)) {
+                for (String s : getSeriesNames(c, sc)) {
+                    DataSeries series = getSeries(c, sc, s);
+                    String key = (sameCategory ? c : "") + ":"
+                            + (sameSubcategory ? sc : "") + ":"
+                            + (sameSeries ? s : "");
+                    Double allmax = maxValues.get(key);
+                    double max = Math.max(series.getMaxValue(), 
Math.abs(series.getMinValue()));
+                    if (max == Double.MAX_VALUE) {
+                        max = 0;
+                    }
+                    //System.out.println(c + ":" + sc + ":" + s + " = " + 
max);
+                    max = Math.max((allmax != null ? allmax.doubleValue() : 
0), max);
+                    maxValues.put(key, max);
+                }
+            }
+        }
+        for (String c : getCategoryNames()) {
+            for (String sc : getSubcategoryNames(c)) {
+                for (String s : getSeriesNames(c, sc)) {
+                    DataSeries series = getSeries(c, sc, s);
+                    String key = (sameCategory ? c : "") + ":"
+                            + (sameSubcategory ? sc : "") + ":"
+                            + (sameSeries ? s : "");
+                    Double max = maxValues.get(key).doubleValue();
+                    double scaledMax = Util.roundUpToScale((max != 
Double.MAX_VALUE ? max : 1));
+                    series.setPreferredScale(-1 * scaledMax, scaledMax);
+                }
+            }
+        }
+    }
+
+    /**
      * Sets the preferred scale of all series with a set of series names to 
an
      * automatically determined min and max value
      * @param seriesNames the series names of these series
Index: src/de/nmichael/pda/data/DataSeriesProperties.java
===================================================================
--- src/de/nmichael/pda/data/DataSeriesProperties.java  (revision 19)
+++ src/de/nmichael/pda/data/DataSeriesProperties.java  (revision 20)
@@ -142,7 +142,11 @@
     public void setLineWidth(int width) {
         this.lineWidth = width;
         if (lineWidth > 1) {
-            lineStyle = LINESTYLE_STRONG;
+            if (lineStyle == LINESTYLE_DASHED) {
+                lineWidth = 1;
+            } else {
+                lineStyle = LINESTYLE_STRONG;
+            }
         }
     }
     
@@ -171,7 +175,9 @@
     }
     
     public int getLineStyle() {
-        return (lineWidth > 1 ? LineAttribute.HEAVY : (lineStyle >= 0 ? 
lineStyle : LineAttribute.SOLID));
+        return (lineWidth > 1 ? 
+                LineAttribute.HEAVY : 
+                (lineStyle >= 0 ? lineStyle : LineAttribute.SOLID));
     }
     
     public void setScaleMin(double value) {
@@ -183,13 +189,13 @@
     }
     
     public double getScaleMin() {
-        if (scaleMin >= 0) {
+        if (scaleMin != 0) { // @todo: was >= 0
             return scaleMin;
         } else {
             if (series != null) {
                 double min = series.getPreferredScaleMinValue();
                 if (min <= 0) {
-                    min = series.getMinValue();
+                    // @todo min = series.getMinValue();
                 }
                 return min;
             } else {
Index: src/de/nmichael/pda/data/DataSeriesPropertySet.java
===================================================================
--- src/de/nmichael/pda/data/DataSeriesPropertySet.java (revision 19)
+++ src/de/nmichael/pda/data/DataSeriesPropertySet.java (revision 20)
@@ -23,6 +23,14 @@
     }
     
     public void addDataProperties(DataSeriesProperties prop) {
+        // check for duplicates
+        for (int i=0; i<seriesProperties.size(); i++) {
+            if (seriesProperties.get(i).getName().equals(prop.getName())) {
+                seriesProperties.remove(i);
+                seriesProperties.add(i, prop);
+                return;
+            }
+        }
         seriesProperties.add(prop);
     }
     
@@ -36,6 +44,15 @@
         return seriesProperties.get(i);
     }
     
+    public DataSeriesProperties getDataProperties(String name) {
+        for (int i=0; i<seriesProperties.size(); i++) {
+            if (name.equals(seriesProperties.get(i).getName())) {
+                return seriesProperties.get(i);
+            }
+        }
+        return null;
+    }
+    
     public void removeDataProperties(int i) {
         if (i>= 0 && i<size()) seriesProperties.remove(i);
     }
Index: src/de/nmichael/pda/data/Project.java
===================================================================
--- src/de/nmichael/pda/data/Project.java       (revision 19)
+++ src/de/nmichael/pda/data/Project.java       (revision 20)
@@ -104,6 +104,43 @@
         return (DataLabel)labels.get(i);
     }
     
+    public int replaceDirectory(String oldDir, String newDir) {
+        int count = 0;
+        for (int i=0; i<items.size(); i++) {
+            ProjectItem pi = items.get(i);
+            ParserSet ps = pi.getParsers();
+            for (int j=0; ps != null && j<ps.size(); j++) {
+                Parser p = ps.getParser(j);
+                boolean changed = false;
+                String fname = p.getFilename();
+                if (fname.startsWith(oldDir)) {
+                    String newFname = Util.replace(fname, oldDir, newDir);
+                    if (!fname.equals(newFname)) {
+                        p.setFilename(newFname);
+                        count++;
+                        changed = true;
+                    }
+                }
+                if (changed) {
+                    p.parse(true, true);
+                }
+            }
+        }
+        return count++;
+    }
+    
+    public String getRandomParserFileName() {
+        for (int i=0; i<items.size(); i++) {
+            ProjectItem pi = items.get(i);
+            ParserSet ps = pi.getParsers();
+            for (int j=0; ps != null && j<ps.size(); j++) {
+                Parser p = ps.getParser(j);
+                return p.getFilename();
+            }
+        }
+        return null;
+    }
+    
     public boolean loadFromFile() {
         ProjectFile file = new ProjectFile(this);
         return file.loadFromFile();
Index: src/de/nmichael/pda/parser/Cpustat.java
===================================================================
--- src/de/nmichael/pda/parser/Cpustat.java     (revision 0)
+++ src/de/nmichael/pda/parser/Cpustat.java     (revision 20)
@@ -0,0 +1,131 @@
+/**
+* Title:        Performance Data Analyzer (PDA)
+* Copyright:    Copyright (c) 2006-2013 by Nicolas Michael
+* Website:      http://pda.nmichael.de/
+* License:      GNU General Public License v2
+*
+* @author Nicolas Michael
+* @version 2
+*/
+
+package de.nmichael.pda.parser;
+
+import de.nmichael.pda.data.*;
+import java.util.regex.*;
+import java.util.*;
+import java.io.*;
+
+public class Cpustat extends Parser {
+    
+    private static final String CATEGORY_TOTAL = "all";
+
+    private Pattern p = Pattern.compile(" *([0-9\\.]+) +([0-9]+) +tick 
+([0-9][0-9 ]+[0-9]) +# (.+)");
+    
+    // @Override
+    public boolean canHandle(String filename) {
+        return super.canHandle(filename,"cpustat");
+    }
+    
+    public Cpustat() {
+        super("cpustat");
+        setSupportedFileFormat(new FileFormatDescription(
+                FileFormatDescription.PRODUCT_SOLARIS,
+                null,
+                "cpustat",
+                new String[][] { { "-c events -c events ..." },
+                                 },
+                "Hardware Counter Statistics",
+                null));
+        setDefaultInterval(1); // in case data has no timestamps
+    }
+    
+    private long[] getValues(String s) {
+        String[] sa = s.split(" +");
+        long[] va = new long[sa.length];
+        for (int i=0; i<sa.length; i++) {
+            va[i] = Long.parseLong(sa[i].trim());
+        }
+        return va;
+    }
+    
+    private String[] getCounters(String s) {
+        String[] ca = s.split(",");
+        ArrayList<String> cal = new ArrayList<String>();
+        for (String c : ca) {
+            if (c.startsWith("pic")) {
+                int pos = c.indexOf("=");
+                if (pos > 0) {
+                    cal.add(c.substring(pos+1));
+                }
+            }
+        }
+        return cal.toArray(new String[0]);
+    }
+    
+    private void addSample(long ts, String cat, String scat, String cntr, 
long value) {
+        DataSeries s = series().getSeries(cat, scat, cntr);
+        if (s == null) {
+            s = series().addSeries(cat, scat, cntr);
+        }
+        s.addSample(ts, value);
+    }
+    
+    @Override
+    public void createAllSeries() {
+        parse();
+    }
+
+    // @Override
+    public void parse() {
+        long startts = 0;
+        long lastts = 0;
+        try {
+            Hashtable<String,Long> totals = new Hashtable<String,Long>();
+            String s;
+            
+            while( (s = readLine()) != null) {
+                if (startts == 0) {
+                    startts = getCurrentTimeStamp().getTimeStamp();
+                }
+                Matcher m = p.matcher(s);
+                if (m.matches()) {
+                    double ts = Double.parseDouble(m.group(1));
+                    int cpu = Integer.parseInt(m.group(2));
+                    long[] values = getValues(m.group(3));
+                    String[] counters = getCounters(m.group(4));
+                    long myts = startts + (long)(1000 * ts);
+                    int core = cpu / 8;
+                    
+                    if (myts - lastts > 600) {
+                        if (totals.size() > 0) {
+                            for (String c : totals.keySet()) {
+                                addSample(lastts, CATEGORY_TOTAL, "", c, 
totals.get(c));
+                            }
+                        }
+                        totals = new Hashtable<String,Long>();
+                        lastts = myts;
+                    }
+                    
+                    String cat = Integer.toString(core);
+                    String scat = Integer.toString(cpu);
+                    for (int i=0; i<counters.length; i++) {
+                        addSample(myts, cat, scat, counters[i], values[i]);
+                        Long total = totals.get(counters[i]);
+                        if (total == null) {
+                            totals.put(counters[i], new Long(values[i]));
+                        } else {
+                            totals.put(counters[i], new Long(total + 
values[i]));
+                        }
+                    }
+                    
+                }
+            }
+            
+            series().setPreferredScaleIndividual();
+           
+        } catch (Exception e) {
+            logError(e.toString());
+        }
+    }
+  
+}
\ No newline at end of file
Index: src/de/nmichael/pda/util/Util.java
===================================================================
--- src/de/nmichael/pda/util/Util.java  (revision 19)
+++ src/de/nmichael/pda/util/Util.java  (revision 20)
@@ -172,15 +172,15 @@
              return "NaN";
          }
          if (kmg) {
-             if (d > 1000000000) {
+             if (Math.abs(d) > 1000000000) {
                  d /= 1000000000;
                  unit = "G";
              }
-             if (d > 1000000) {
+             if (Math.abs(d) > 1000000) {
                  d /= 1000000;
                  unit = "M";
              }
-             if (d > 1000) {
+             if (Math.abs(d) > 1000) {
                  d /= 1000;
                  unit = "K";
              }
@@ -329,4 +329,18 @@
                 + makeTimeString(cal.get(Calendar.SECOND), 2);
     }
     
+    public static String breakLine(String s, int cols) {
+        StringBuilder sb = new StringBuilder();
+        while (s != null && s.length() > 0) {
+            if (s.length() <= cols) {
+                sb.append(s);
+                s = null;
+            } else {
+                sb.append(s.substring(0, cols) + "\n");
+                s = s.substring(cols);
+            }
+        }
+        return sb.toString();
+    }
+    
 }
Index: src/de/nmichael/pda/util/ErrorPrintStream.java
===================================================================
--- src/de/nmichael/pda/util/ErrorPrintStream.java      (revision 19)
+++ src/de/nmichael/pda/util/ErrorPrintStream.java      (revision 20)
@@ -26,11 +26,7 @@
                 
o.getClass().toString().indexOf("java.lang.NoClassDefFoundError")>0 ||
                 
o.getClass().toString().indexOf("java.lang.OutOfMemoryError")>0) {
             String text = o.toString();
-            if (Main.argBatch) {
-                System.out.println(o);
-            } else {
-                new ErrorMessageThread(o.toString()).start();
-            }
+            new ErrorMessageThread(o.toString()).start();
         }
         super.print(o);
     }





[perfdata~pda:20] PDA Version 2.0.3_00

nicolasmichael 01/23/2014
 
 
Close
loading
Please Confirm
Close