001    package jp.osdl.jbento2.analyzer;
002    
003    import java.io.File;
004    import java.util.ArrayList;
005    import java.util.Arrays;
006    import java.util.HashMap;
007    import java.util.Iterator;
008    import java.util.List;
009    import java.util.Map;
010    import java.util.Set;
011    
012    public class SarCPUTotalAverageHandler implements SarAverageHandler {
013        
014        private Map data = new HashMap();
015    
016        private File src;
017        
018        private String key1 = null;
019        private String key2 = null;
020        
021        private String[] categories = {"%usr", "%nice","%sys", "%wio"};
022        
023        private int[] indexes = new int[4];
024        
025        private double value = 0;
026        private long count = 0;
027        
028        public void handleFile(File src) {
029            this.src = src;
030            key1 = getKey1(src);
031            key2 = getKey2(src);
032            value = 0;
033            count = 0;
034        }
035        
036        public void handleFirstLine(String[] firstLine) {
037            Arrays.fill(indexes, -1);
038            for (int i = 0; i < categories.length; i++) {
039                String category = categories[i];
040                for (int j = 0; j < firstLine.length; j++) {
041                    if (category.equals(firstLine[j])) {
042                        indexes[i] = j;
043                    }
044                }
045                if (indexes[i] == -1) {
046                    throw new IllegalArgumentException("category " + category
047                            + " is not found in " + src.getName());
048                }
049            }
050        }
051        
052        public void handleLine(String[] line) {
053            double usr = Double.parseDouble(line[indexes[0]]);
054            double nice = Double.parseDouble(line[indexes[1]]);
055            double sys = Double.parseDouble(line[indexes[2]]);
056            double wio = Double.parseDouble(line[indexes[3]]);
057            
058            double total = usr + nice + sys + wio;
059            value += total;
060            count++;
061        }
062        
063        public void handleEnd() {
064            Map values = (Map) data.get(key1);
065            if (values == null) {
066                values = new HashMap();
067                data.put(key1, values);
068            }
069            values.put(key2, new Double(value / count).toString());
070        }
071        
072        public TextTable getResult() {
073            int count = 0;
074            Set keys = data.keySet();
075            Iterator ite = keys.iterator();
076            List columns = new ArrayList();
077            while (ite.hasNext()) {
078                Map values = (Map) data.get(ite.next());
079                if (count < values.size()) {
080                    count = values.size();
081                    columns.clear();
082                    Iterator ite2 = values.keySet().iterator();
083                    while (ite2.hasNext()) {
084                        columns.add(ite2.next());
085                    }
086                }
087            }
088            columns.add(0, "");
089            
090            TextTable tt = new TextTable(count, TextTable.ALIGN_RIGHT, ",");
091            tt.addRow((String[]) columns.toArray(new String[columns.size()]));
092            
093            ite = keys.iterator();
094            while(ite.hasNext()) {
095                String key = (String) ite.next();
096                Map values = (Map) data.get(key);
097                List data = new ArrayList();
098                data.add(key);
099                for(int i = 1; i < columns.size(); i++) {
100                    data.add(values.get(columns.get(i)));
101                }
102                tt.addRow((String[]) data.toArray(new String[data.size()]));
103            }
104            
105            return tt;
106            
107        }
108        
109        protected String getKey1(File src) {
110            return src.getParentFile().getParentFile().getName();
111        }
112        
113        protected String getKey2(File src) {
114            return src.getParentFile().getName();
115        }
116    }