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 SarAllCli {
021
022 private static final String FILE_NAME = ".*\\.(.*)\\.sar";
023 private static final String CSV_FILE_NAME = ".*\\.*\\.(csv)";
024 private String srcDirName;
025
026 private String destDirName;
027
028 private String skipTime;
029
030 private String termTime;
031
032 private long newDateDelta = -1;
033
034 public static void main(String[] args) throws Exception {
035 Options options = new Options();
036
037 options.addOption(OptionBuilder.withArgName("source dir").hasArg()
038 .withDescription("source directory.").withLongOpt("source")
039 .create("s"));
040
041 options.addOption(OptionBuilder.withArgName("skip time[s]").hasArg()
042 .withDescription("skip seconds after starting measurement.")
043 .withLongOpt("skip").create("k"));
044
045 options.addOption(OptionBuilder.withArgName("term time[s]").hasArg()
046 .withDescription("seconds of term for analyzing.").withLongOpt(
047 "term").create("t"));
048
049 options.addOption(OptionBuilder.withArgName("dest dir").hasArg()
050 .withDescription("destination directory.").withLongOpt("dest")
051 .create("d"));
052
053 options.addOption(OptionBuilder.withArgName("new date delta").hasArg()
054 .withDescription("delta[sec] used to determinate new date")
055 .withLongOpt("delta").create("l"));
056
057 if (args.length == 0) {
058 HelpFormatter formatter = new HelpFormatter();
059 formatter.printHelp("SarAllCli", options, true);
060 return;
061 }
062
063 CommandLineParser parser = new PosixParser();
064 CommandLine line = null;
065 try {
066 line = parser.parse(options, args);
067 } catch (ParseException ex) {
068 throw ex;
069 }
070
071 if (line.hasOption("h")
072 || (line.getOptions().length == 0 && line.getArgs().length == 0)) {
073 HelpFormatter formatter = new HelpFormatter();
074 formatter.printHelp("SartAllCli", options, true);
075 return;
076 }
077
078 SarAllCli cli = new SarAllCli();
079 cli.setSrcDirName(line.getOptionValue("s"));
080 cli.setDestDirName(line.getOptionValue("d"));
081 cli.setSkipTime(line.getOptionValue("k"));
082 cli.setTermTime(line.getOptionValue("t"));
083 if (line.hasOption("l")) {
084 cli.setNewDateDelta(line.getOptionValue("l"));
085 }
086 cli.execute();
087 }
088
089 public void execute() throws Exception {
090 File srcDir = new File(srcDirName);
091 if (!srcDir.isDirectory()) {
092 throw new IllegalArgumentException(srcDir.getName()
093 + "is not a directory");
094 }
095 traverse(srcDir);
096
097 File destDir = new File(destDirName);
098
099 if (!destDir.isDirectory()) {
100 throw new IllegalArgumentException(destDir.getName()
101 + "is not a directory");
102 }
103 avgTraverse(destDir);
104 }
105
106 void traverse(File dir) throws Exception {
107 File[] files = dir.listFiles();
108 for (int i = 0; i < files.length; i++) {
109 File file = files[i];
110 if (file.isDirectory()) {
111 traverse(file);
112 } else {
113 Pattern pattern = Pattern.compile(FILE_NAME);
114 Matcher matcher = pattern.matcher(file.getName());
115 if (matcher.matches()) {
116 SarAnalyzer analyzer = new SarAnalyzer();
117 analyzer.setSrc(file.getAbsolutePath());
118 if (destDirName != null) {
119 analyzer.setDest(getDest(file.getAbsolutePath()));
120 }
121 analyzer.setParser(matcher.group(1));
122 analyzer.setSkipTime(skipTime);
123 analyzer.setTermTime(termTime);
124 if (newDateDelta >= 0) {
125 analyzer.setNewDateDelta(newDateDelta);
126 }
127 analyzer.analyze();
128 }
129 }
130 }
131
132 }
133
134 void avgTraverse(File dir) throws Exception {
135 File[] files = dir.listFiles();
136 for (int i = 0; i < files.length; i++) {
137 File file = files[i];
138 if (file.isDirectory()) {
139 avgTraverse(file);
140 } else {
141 Pattern pattern = Pattern.compile(CSV_FILE_NAME);
142 Matcher matcher = pattern.matcher(file.getName());
143 if (matcher.matches()) {
144 SarAnalyzer analyzer = new SarAnalyzer();
145 analyzer.setSrc(file.getAbsolutePath());
146 // if (destDirName != null) {
147 // analyzer.setDest(getDest(file.getAbsolutePath()));
148 // }
149 analyzer.setParser(matcher.group(1));
150 // analyzer.setSkipTime(skipTime);
151 // analyzer.setTermTime(termTime);
152 analyzer.average();
153 }
154 }
155 }
156 }
157
158 private String getDest(String filePath) {
159 // for cygwin
160 String srcDirName = this.srcDirName.replace('/', File.separatorChar);
161 if (srcDirName.charAt(srcDirName.length() - 1) == File.separatorChar) {
162 srcDirName = srcDirName.substring(0, srcDirName.length() - 1);
163 }
164
165 String postDir = null;
166
167 try {
168 int index = filePath.indexOf(srcDirName);
169 postDir = filePath.substring(index + srcDirName.length(),
170 filePath.lastIndexOf(File.separatorChar));
171 } catch (IndexOutOfBoundsException e) {
172 System.err.println(e.getMessage());
173 System.err.println("filePath=" + filePath);
174 System.err.println("srcDirName=" + srcDirName);
175 System.err.println("File.separator=" + File.separator);
176 throw e;
177 }
178
179 String dest = destDirName + postDir;
180 File destDir = new File(dest);
181 if (!destDir.isDirectory()) {
182 if (!destDir.mkdirs()) {
183 throw new IllegalArgumentException("destDir " + destDir
184 + " cannot be created");
185 }
186 }
187 String destName = dest
188 + filePath.substring(filePath.lastIndexOf(File.separator),
189 filePath.lastIndexOf('.')) + ".csv";
190 return destName;
191 }
192
193 public String getDestDirName() {
194 return destDirName;
195 }
196
197 public void setDestDirName(String destDirName) {
198 this.destDirName = destDirName;
199 }
200
201 public String getSkipTime() {
202 return skipTime;
203 }
204
205 public void setSkipTime(String skipTime) {
206 this.skipTime = skipTime;
207 }
208
209 public String getSrcDirName() {
210 return srcDirName;
211 }
212
213 public void setSrcDirName(String srcDirName) {
214 this.srcDirName = srcDirName;
215 }
216
217 public String getTermTime() {
218 return termTime;
219 }
220
221 public void setTermTime(String termTime) {
222 this.termTime = termTime;
223 }
224
225 public String getNewDateDelta() {
226 return Long.toString(newDateDelta / 1000);
227 }
228
229 public void setNewDateDelta(String newDateDelta) {
230 long value = Long.parseLong(newDateDelta);
231 this.newDateDelta = value * 1000;
232 }
233 }