001 package jp.osdl.jbento2.chart; 002 003 import java.io.BufferedReader; 004 import java.io.File; 005 import java.io.FileReader; 006 import java.io.IOException; 007 import java.util.ArrayList; 008 import java.util.Iterator; 009 import java.util.List; 010 import java.util.regex.Matcher; 011 import java.util.regex.Pattern; 012 013 import org.apache.commons.cli.CommandLine; 014 import org.apache.commons.cli.CommandLineParser; 015 import org.apache.commons.cli.HelpFormatter; 016 import org.apache.commons.cli.OptionBuilder; 017 import org.apache.commons.cli.Options; 018 import org.apache.commons.cli.ParseException; 019 import org.apache.commons.cli.PosixParser; 020 021 /** 022 * Generate graphs. graph file name and title is same source csv file. 023 * 024 * 025 */ 026 public class ChartAllCli { 027 028 public static void main(String[] args) throws Exception { 029 Options options = new Options(); 030 031 options.addOption(OptionBuilder.withArgName("source dir").hasArg() 032 .withDescription("source directory.").withLongOpt("source") 033 .create("s")); 034 035 options.addOption(OptionBuilder.withArgName("config file").hasArg() 036 .withDescription("config file").withLongOpt("conf") 037 .create("f")); 038 039 options.addOption(OptionBuilder.withArgName("renew charts") 040 .withDescription("renew charts").withLongOpt("renew").create( 041 "r")); 042 043 if (args.length == 0) { 044 HelpFormatter formatter = new HelpFormatter(); 045 formatter.printHelp("ChartAllCli", options, true); 046 return; 047 } 048 049 CommandLineParser parser = new PosixParser(); 050 CommandLine line = null; 051 try { 052 line = parser.parse(options, args); 053 } catch (ParseException ex) { 054 throw ex; 055 } 056 057 if (line.hasOption("h") 058 || (line.getOptions().length == 0 && line.getArgs().length == 0)) { 059 HelpFormatter formatter = new HelpFormatter(); 060 formatter.printHelp("ChartAllCli", options, true); 061 return; 062 } 063 064 boolean renew = false; 065 if (line.hasOption("r")) { 066 renew = true; 067 } 068 069 String configFile = line.getOptionValue("f"); 070 String srcDir = line.getOptionValue("s"); 071 072 new ChartAllCli().execute(configFile, srcDir, renew); 073 } 074 075 public void execute(String configFileName, String srcDirName, boolean renew) 076 throws IOException, ParseException { 077 File configFile = new File(configFileName); 078 List config = parseConfig(configFile); 079 080 File srcDir = new File(srcDirName); 081 082 if (!srcDir.isDirectory()) { 083 throw new IllegalArgumentException(srcDir.getName() 084 + "is not a directory"); 085 } 086 traverse(srcDir, config, renew); 087 } 088 089 void traverse(File dir, List configList, boolean renew) throws IOException, 090 ParseException { 091 File[] files = dir.listFiles(); 092 for (int i = 0; i < files.length; i++) { 093 File file = files[i]; 094 if (file.isDirectory()) { 095 traverse(file, configList, renew); 096 } else { 097 Iterator ite = configList.iterator(); 098 while (ite.hasNext()) { 099 ChartConfig config = (ChartConfig) ite.next(); 100 String regexName = config.getRegexName(); 101 Pattern pattern = Pattern.compile((String) regexName); 102 Matcher matcher = pattern.matcher(file.getName()); 103 if (matcher.matches()) { 104 // System.out.println("generate chart for " 105 // + file.getAbsolutePath()); 106 try { 107 List src = config.getParams(); 108 List args = new ArrayList(src.size()); 109 for (int j = 0; j < src.size(); j++) { 110 args.add(src.get(j)); 111 } 112 args.add("-s"); 113 args.add(file.getAbsolutePath()); 114 if (renew) { 115 args.add("--renew"); 116 } 117 ChartCli.main((String[]) args 118 .toArray(new String[0])); 119 } catch (IOException e) { 120 e.printStackTrace(System.err); 121 } 122 } 123 } 124 } 125 } 126 } 127 128 List parseConfig(File confFile) throws IOException { 129 List result = new ArrayList(); 130 131 BufferedReader reader = new BufferedReader(new FileReader(confFile)); 132 133 String line = null; 134 ChartConfig config = null; 135 while (true) { 136 line = reader.readLine(); 137 if (line == null) { 138 break; 139 } else if (line.startsWith("#")) { 140 continue; 141 } else if (line.length() == 0) { 142 continue; 143 } else if (line.startsWith(" ") || line.startsWith("\t")) { 144 if (config == null) { 145 throw new IllegalStateException("parse error around " 146 + line); 147 } 148 List list = config.getParams(); 149 line = line.trim(); 150 String[] datas = parseLine(line); 151 for (int i = 0; i < datas.length; i++) { 152 String data = datas[i]; 153 list.add(data); 154 } 155 } else { 156 config = new ChartConfig(line); 157 result.add(config); 158 } 159 160 } 161 return result; 162 } 163 164 String[] parseLine(String str) { 165 ArrayList result = new ArrayList(); 166 char[] chars = str.toCharArray(); 167 StringBuffer buffer = new StringBuffer(); 168 boolean isInternalQuotes = false; 169 for (int i = 0; i < chars.length; i++) { 170 char c = chars[i]; 171 if (c == ' ') { 172 if (isInternalQuotes) { 173 buffer.append(c); 174 } else { 175 result.add(buffer.toString()); 176 buffer = new StringBuffer(); 177 } 178 } else if (c == '"') { 179 isInternalQuotes = !isInternalQuotes; 180 } else { 181 buffer.append(c); 182 } 183 } 184 if (buffer.length() > 0) { 185 result.add(buffer.toString()); 186 } 187 return (String[]) result.toArray(new String[0]); 188 } 189 190 private class ChartConfig { 191 private String regexName = null; 192 193 private List params = new ArrayList(); 194 195 public ChartConfig(String regexName) { 196 this.regexName = regexName; 197 } 198 199 public List getParams() { 200 return params; 201 } 202 203 public String getRegexName() { 204 return regexName; 205 } 206 } 207 208 }