001 package jp.osdl.jbento2.analyzer; 002 003 import java.io.BufferedReader; 004 import java.io.File; 005 import java.io.FileNotFoundException; 006 import java.io.FileReader; 007 import java.io.IOException; 008 import java.util.ArrayList; 009 import java.util.HashMap; 010 import java.util.Iterator; 011 import java.util.List; 012 import java.util.Map; 013 import java.util.Set; 014 015 import org.apache.commons.cli.*; 016 import org.apache.commons.io.FilenameUtils; 017 018 public class MultiResultCollectorAllCli { 019 020 private final String JBENTO_FILE = "jbento.conf"; 021 private String delimiter = ","; 022 private Map map = null; 023 private String targetRow = null; 024 private String targetColumn = null; 025 private String seriesName = null; 026 private String xLabelName = null; 027 028 public static void main(String[] args) throws Exception { 029 Options options = new Options(); 030 031 options.addOption( 032 OptionBuilder. 033 withArgName("source dir"). 034 hasArg(). 035 withDescription("source directory."). 036 withLongOpt("source"). 037 create("s")); 038 039 options.addOption( 040 OptionBuilder. 041 withArgName("config file"). 042 hasArg(). 043 withDescription("config file"). 044 withLongOpt("conf"). 045 create("f")); 046 047 if (args.length == 0) { 048 HelpFormatter formatter = new HelpFormatter(); 049 formatter.printHelp("MultiResultCollectorAllCli", options, true); 050 return; 051 } 052 053 CommandLineParser parser = new PosixParser(); 054 CommandLine line = null; 055 try { 056 line = parser.parse(options, args); 057 } catch (ParseException ex) { 058 throw ex; 059 } 060 061 if (line.hasOption("h") || 062 (line.getOptions().length == 0 && line.getArgs().length == 0)) { 063 HelpFormatter formatter = new HelpFormatter(); 064 formatter.printHelp("MultiResultCollectorAllCli", options, true); 065 return; 066 } 067 068 String configFile = line.getOptionValue("f"); 069 String srcDir = line.getOptionValue("s"); 070 071 new MultiResultCollectorAllCli().execute(configFile, srcDir); 072 } 073 074 public void execute(String configFileName, String srcDirName) 075 throws IOException, ParseException { 076 File configFile = new File(configFileName); 077 List config = parseConfig(configFile); 078 079 File srcDir = new File(srcDirName); 080 081 if (!srcDir.isDirectory()) { 082 throw new IllegalArgumentException(srcDir.getName() 083 + "is not a directory"); 084 } 085 086 Iterator ite = config.iterator(); 087 while (ite.hasNext()) { 088 ResultCollectConfig conf = (ResultCollectConfig) ite.next(); 089 090 Map constName = new HashMap();// ResultCollector.confの--constNameに設定された値を入れる 091 List param = conf.getParams(); 092 for (int j = 0; j < param.size(); j++) { 093 if (param.get(j).equals("--constName")) { 094 constName.put(param.get(j + 1), param.get(j + 2)); 095 } else if (param.get(j).equals("--xLabelName")) { 096 xLabelName = (String) param.get(j + 1); 097 } else if (param.get(j).equals("--seriesName")) { 098 seriesName = (String) param.get(j + 1); 099 } else if (param.get(j).equals("--target")) { 100 targetRow = (String) param.get(j + 1); 101 targetColumn = (String) param.get(j + 2); 102 } 103 } 104 105 map = new HashMap(); 106 107 traverse(srcDir, conf, constName); 108 109 if (conf.getFileName().indexOf(".") == -1) { 110 return; 111 } 112 113 MultiResultCollector collector = new MultiResultCollector(); 114 collector.setTarget(targetRow); 115 collector.setMap(map); 116 117 String destDirName = 118 srcDir.getAbsolutePath() + File.separator + "result_collect"; 119 File destDir = new File(destDirName); 120 destDir.mkdirs(); 121 String destFileName = 122 FilenameUtils.getBaseName(conf.getFileName()) + ".csv"; 123 collector.setDestName(destDirName + File.separator + destFileName); 124 125 collector.analyzeNumeric(); 126 } 127 } 128 129 void traverse(File src, ResultCollectConfig config, Map constName) 130 throws IOException, ParseException { 131 Map confMap = new HashMap(); 132 String fileName = null;// 検索対象ファイル 133 134 File[] files = src.listFiles(); 135 fileName = config.getFileName(); 136 137 for (int i = 0; i < files.length; i++) { 138 File file = files[i]; 139 if (file.isDirectory()) { 140 traverse(file, config, constName); 141 } else { 142 143 if (file.getName().equals(JBENTO_FILE)) { 144 try { 145 boolean isMatch = false; 146 confMap = readConfFile(file); 147 148 Set const_keyset = constName.keySet(); 149 Iterator ite_const = const_keyset.iterator(); 150 151 // constName指定なし 152 if (const_keyset.size() == 0 153 && confMap.containsKey(seriesName) 154 && confMap.containsKey(xLabelName)) { 155 isMatch = true; 156 } 157 while (ite_const.hasNext()) { 158 String const_key = (String) ite_const.next(); 159 if (confMap.get(const_key).equals( 160 constName.get(const_key))) { 161 if (confMap.containsKey(seriesName) 162 && confMap.containsKey(xLabelName)) { 163 isMatch = true; 164 } 165 } else { 166 isMatch = false; 167 break; 168 } 169 } 170 List xyset = new ArrayList(); 171 // matchしたら、対象ファイルを読み込む 172 if (isMatch) { 173 xyset.add(confMap.get(seriesName)); 174 xyset.add(confMap.get(xLabelName)); 175 findFile(file, xyset, fileName, targetRow); 176 // continue; 177 } else { 178 // noop 179 // continue; 180 } 181 182 } catch (IndexOutOfBoundsException e) { 183 e.printStackTrace(); 184 } 185 } 186 } 187 } 188 } 189 190 protected Map readConfFile(File src) throws IOException { 191 192 BufferedReader reader = null; 193 Map confMap = new HashMap(); 194 try { 195 reader = new BufferedReader(new FileReader(src)); 196 197 while (true) { 198 String line = reader.readLine(); 199 if (line == null) { 200 break; 201 } 202 String[] data = line.split(" "); 203 confMap.put(data[0], data[1]); 204 } 205 206 } finally { 207 if (reader != null) { 208 try { 209 reader.close(); 210 } catch (IOException ignore) { 211 // noop. 212 } 213 } 214 } 215 return confMap; 216 } 217 218 private File determineTargetDir(File src) { 219 String path = src.getAbsolutePath(); 220 if (path.lastIndexOf("conf" + File.separator) == -1) { 221 return null; 222 } 223 return new File( 224 path.substring(0, path.lastIndexOf("conf" + File.separator)) + 225 "report"); 226 } 227 228 protected void findFile(File src, List keyList, String fileName, 229 String target) throws IOException { 230 File targetDir = determineTargetDir(src); 231 if (targetDir == null) { 232 return; 233 } 234 235 String targetFile = null; 236 // sarの結果の場合は「kuma01」等のディレクトリ名が入るので場合分けする 237 if (fileName.indexOf("average") != -1) { 238 targetFile = 239 targetDir.getAbsolutePath() 240 + File.separator 241 + fileName.substring(0, fileName.indexOf(".")) 242 + File.separator + fileName; 243 244 } else { 245 targetFile = 246 targetDir.getAbsolutePath() + File.separator + fileName; 247 } 248 249 BufferedReader reader = null; 250 251 try { 252 reader = new BufferedReader(new FileReader(targetFile)); 253 254 String firstLine = reader.readLine(); 255 String[] columns = firstLine.split(delimiter); 256 int columns_index = -1; 257 258 for (int i = 0; i < columns.length; i++) { 259 260 columns[i] = columns[i].trim(); 261 if (columns[i].equals(target)) { 262 columns_index = i; 263 } 264 } 265 266 while (true) { 267 String line = reader.readLine(); 268 if (line == null) { 269 break; 270 } 271 String[] data = line.split(delimiter); 272 273 for (int i = 0; i < data.length; i++) { 274 data[i] = data[i].trim(); 275 } 276 277 if (!data[0].equals(targetColumn)) { 278 continue; 279 } else { 280 map.put(keyList, data[columns_index]); 281 } 282 } 283 } catch (FileNotFoundException e) { 284 // noop 285 286 } finally { 287 if (reader != null) { 288 try { 289 reader.close(); 290 } catch (IOException ignore) { 291 // noop. 292 } 293 } 294 } 295 } 296 297 List parseConfig(File confFile) throws IOException { 298 List result = new ArrayList(); 299 300 BufferedReader reader = new BufferedReader(new FileReader(confFile)); 301 302 String line = null; 303 ResultCollectConfig config = null; 304 while (true) { 305 line = reader.readLine(); 306 if (line == null) { 307 break; 308 } else if (line.startsWith("#")) { 309 continue; 310 } else if (line.length() == 0) { 311 continue; 312 } else if (line.startsWith(" ") || line.startsWith("\t")) { 313 if (config == null) { 314 throw new IllegalStateException("parse error around " 315 + line); 316 } 317 List list = config.getParams(); 318 line = line.trim(); 319 String[] data = parseLine(line); 320 for (int i = 0; i < data.length; i++) { 321 list.add(data[i]); 322 } 323 } else { 324 config = new ResultCollectConfig(line); 325 result.add(config); 326 } 327 328 } 329 return result; 330 } 331 332 String[] parseLine(String str) { 333 ArrayList result = new ArrayList(); 334 char[] chars = str.toCharArray(); 335 StringBuffer buffer = new StringBuffer(); 336 boolean isInternalQuotes = false; 337 for (int i = 0; i < chars.length; i++) { 338 char c = chars[i]; 339 if (c == ' ') { 340 if (isInternalQuotes) { 341 buffer.append(c); 342 } else { 343 result.add(buffer.toString()); 344 buffer = new StringBuffer(); 345 } 346 } else if (c == '"') { 347 isInternalQuotes = !isInternalQuotes; 348 } else { 349 buffer.append(c); 350 } 351 } 352 if (buffer.length() > 0) { 353 result.add(buffer.toString()); 354 } 355 return (String[]) result.toArray(new String[0]); 356 } 357 358 private class ResultCollectConfig { 359 private String fileName = null; 360 361 private List params = new ArrayList(); 362 363 public ResultCollectConfig(String fileName) { 364 this.fileName = fileName; 365 } 366 367 public List getParams() { 368 return params; 369 } 370 371 public String getFileName() { 372 return fileName; 373 } 374 } 375 }