001    package jp.osdl.jbento2.analyzer;
002    
003    import java.io.File;
004    import java.util.regex.Matcher;
005    import java.util.regex.Pattern;
006    
007    import org.apache.commons.cli.CommandLine;
008    import org.apache.commons.cli.CommandLineParser;
009    import org.apache.commons.cli.HelpFormatter;
010    import org.apache.commons.cli.OptionBuilder;
011    import org.apache.commons.cli.Options;
012    import org.apache.commons.cli.ParseException;
013    import org.apache.commons.cli.PosixParser;
014    
015    /**
016     * Generate graphs. graph file name and title is same source csv file.
017     * 
018     * 
019     */
020    public class GCAllCli {
021    
022        private static final String FILE_NAME = ".*\\.gc\\.log";
023        private String srcDirName;
024    
025        private String destDirName;
026    
027        private String startTime;
028        
029        private long rampUpMillis = 0;
030    
031        private long durationMillis = 0;
032    
033        public static void main(String[] args) throws Exception {
034            Options options = new Options();
035    
036            options.addOption(OptionBuilder.withArgName("source dir").hasArg()
037                    .withDescription("source directory.").withLongOpt("source")
038                    .create("s"));
039    
040            options.addOption(OptionBuilder.withArgName("dest dir").hasArg()
041                    .withDescription("destination directory.").withLongOpt("dest")
042                    .create("d"));
043    
044            options.addOption(OptionBuilder.withArgName("start time").hasArg()
045                    .withDescription("start time[HH:mm:ss]").withLongOpt("start")
046                    .create("t"));
047            
048            options.addOption(OptionBuilder.withArgName("skip time").hasArg()
049                    .withDescription("skip time[sec]").withLongOpt("skip")
050                    .create("k"));
051    
052            options.addOption(OptionBuilder.withArgName("mean time").hasArg()
053                    .withDescription("mean time[sec]").withLongOpt("mean")
054                    .create("m"));
055            
056            options.addOption("h", "help", false, "display help");
057            
058            if (args.length == 0) {
059                HelpFormatter formatter = new HelpFormatter();
060                formatter.printHelp("GCAllCli", options, true);
061                return;
062            }
063    
064            CommandLineParser parser = new PosixParser();
065            CommandLine line = null;
066            try {
067                line = parser.parse(options, args);
068            } catch (ParseException ex) {
069                throw ex;
070            }
071    
072            if (line.hasOption("h")
073                    || (line.getOptions().length == 0 && line.getArgs().length == 0)) {
074                HelpFormatter formatter = new HelpFormatter();
075                formatter.printHelp("GCAllCli", options, true);
076                return;
077            }
078    
079            GCAllCli cli = new GCAllCli();
080            cli.setSrcDirName(line.getOptionValue("s"));
081            cli.setDestDirName(line.getOptionValue("d"));
082            cli.setStartTime(line.getOptionValue("t"));
083            cli.setRampUpMillis(line.getOptionValue("k"));
084            cli.setDurationMillis(line.getOptionValue("m"));
085            cli.execute();
086        }
087    
088        public void execute() throws Exception {
089            File srcDir = new File(srcDirName);
090            if (!srcDir.isDirectory()) {
091                throw new IllegalArgumentException(srcDir.getName()
092                        + "is not a directory");
093            }
094            traverse(srcDir);
095        }
096    
097        void traverse(File dir) throws Exception {
098            File[] files = dir.listFiles();
099            for (int i = 0; i < files.length; i++) {
100                File file = files[i];
101                if (file.isDirectory()) {
102                    traverse(file);
103                } else {
104                    Pattern pattern = Pattern.compile(FILE_NAME);
105                    Matcher matcher = pattern.matcher(file.getName());
106                    if (matcher.matches()) {
107                        GCAnalyzer analyzer = new GCAnalyzer();
108                        analyzer.setSrc(file.getAbsolutePath());
109                        if (destDirName != null) {
110                            analyzer.setDest(getDest(file.getAbsolutePath()));
111                        }
112                        analyzer.setStartTime(startTime);
113                        analyzer.setRampUpMillis(rampUpMillis);
114                        analyzer.setDurationMillis(durationMillis);
115                        System.out.println("analyzing " + file.getName());
116                        analyzer.analyze();
117                    }
118                }
119            }
120        }
121    
122        private String getDest(String filePath) {
123            // for cygwin
124            String srcDirName = this.srcDirName.replace('/', File.separatorChar);
125            if (srcDirName.charAt(srcDirName.length() - 1) == File.separatorChar) {
126                srcDirName = srcDirName.substring(0, srcDirName.length() - 1);
127            }
128    
129            String postDir = null;
130            
131            try { 
132                int index = filePath.indexOf(srcDirName);
133                postDir = filePath.substring(index + srcDirName.length(),
134                        filePath.lastIndexOf(File.separatorChar));
135            } catch (IndexOutOfBoundsException e) {
136                System.err.println(e.getMessage());
137                System.err.println("filePath=" + filePath);
138                System.err.println("srcDirName=" + srcDirName);
139                System.err.println("File.separator=" + File.separator);
140                throw e;
141            }
142    
143            String dest = destDirName + postDir;
144            File destDir = new File(dest);
145            if (!destDir.isDirectory()) {
146                if (!destDir.mkdirs()) {
147                    throw new IllegalArgumentException("destDir " + destDir
148                            + " cannot be created");
149                }
150            }
151            String destName = dest
152                    + filePath.substring(filePath.lastIndexOf(File.separator),
153                            filePath.lastIndexOf('.')) + ".csv";
154            return destName;
155        }
156    
157        public String getDestDirName() {
158            return destDirName;
159        }
160    
161        public void setDestDirName(String destDirName) {
162            this.destDirName = destDirName;
163        }
164    
165        public String getStartTime() {
166            return startTime;
167        }
168    
169        public void setStartTime(String startTime) {
170            this.startTime = startTime;
171        }
172    
173        public String getSrcDirName() {
174            return srcDirName;
175        }
176    
177        public void setSrcDirName(String srcDirName) {
178            this.srcDirName = srcDirName;
179        }
180    
181        public long getDurationMillis() {
182            return durationMillis;
183        }
184    
185        public void setDurationMillis(String durationMillis) {
186            if (durationMillis != null) {
187                this.durationMillis = Long.parseLong(durationMillis) * 1000;
188            }
189        }
190    
191        public long getRampUpMillis() {
192            return rampUpMillis;
193        }
194    
195        public void setRampUpMillis(String rampUpMillis) {
196            if (rampUpMillis != null) {
197                this.rampUpMillis = Long.parseLong(rampUpMillis) * 1000;
198            }
199        }
200    
201    }