web で公開されている CSV ファイル中のデータを Google Chart Tools で図にするためには,それらデータが「datasource」としてアクセスできる必要がある.Google Visualization Data Source Library・google-visualization-java は,makes it easy to implement a Visualization data source so that you can easily chart or visualize your data from any of your data stores.
インストラクション「Getting Started」に沿って作業した.
使用したのは RHEL5 x86_64.Tomcat は,rpm パッケージで導入./etc/init.d/tomcat5 start
によって出たエラーメッセージを検索し,パッケージ xml-commons-apis
を追加で入れた.これは依存関係からは入らなかった.
/etc/tomcat5/tomcat5.conf
によると,CATALINA_HOME="/usr/share/tomcat5"
だった./usr/share/tomcat5/webapps/
下に myWebApp/WEB-INF/web.xml
をコピー,/usr/share/tomcat5/webapps/myWebApp/WEB-INF/lib/
下に jar files をコピーした.Tomcat を起動したところ,/usr/share/tomcat5/logs/catalina.out
に次のエラーが出た.
SEVERE: Parse error in application web.xml file at jndi:/localhost/myWebApp/WEB-INF/web.xml
java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name graph
web.xml
を編集し,以下を削除した.
<servlet-mapping>
<servlet-name>graph</servlet-name>
<url-pattern>/graph</url-pattern>
</servlet-mapping>
Tomcat 起動.次のエラーが出た.
SEVERE: Servlet /myWebApp threw load() exception
java.lang.ClassNotFoundException: com.mycompany.mypackage.ControllerServlet
web.xml
を編集し,以下を削除した.
<servlet>
<servlet-name>controller</servlet-name>
(略)
</servlet>
Tomcat 起動.
続いて,インストラクション「Using an External Data Store」 に従って作業.web で公開されている CSV ファイルを datasource としてサービスできた.
しかし,この例示されているサーブレットでは,CSV 中すべての列の type が string として処理されてしまう.このため,例えば google.visualization.ScatterChart
での描図ができない.CsvDataSourceServlet.java
中にも以下のコメントがあった.これを話題にしているフォーラムもあった.
// Note: We assume that all the columns in the CSV file are text columns. In cases where the // column types are known in advance, this behavior can be overridden by passing a list of // ColumnDescription objects specifying the column types. See CsvDataSourceHelper.read() for // more details. dataTable = CsvDataSourceHelper.read(reader, null, true, requestLocale);
このコメントに従って ColumnDescription を渡すのを試すため,書きかえてみた.diff 結果は以下.
20,21d19
< import com.google.visualization.datasource.datatable.ColumnDescription;
< import com.google.visualization.datasource.datatable.value.ValueType;
40,42d37
< import au.com.bytecode.opencsv.CSVReader;
< import java.util.Arrays;
<
91,99c86,90
< CSVReader csvReader = new CSVReader(reader);
< reader.mark((Integer.MAX_VALUE >>> 8));
< String[] headers = csvReader.readNext();
< reader.reset();
< ColumnDescription[] columnDescriptions = new ColumnDescription[headers.length];
< for(int i = 0 ; i < headers.length; i++) {
< columnDescriptions[i] = new ColumnDescription(Integer.toString(i), ValueType.NUMBER, headers[i]);
< }
< dataTable = CsvDataSourceHelper.read(reader, Arrays.asList(columnDescriptions), true, requestLocale);
---
> // Note: We assume that all the columns in the CSV file are text columns. In cases where the
> // column types are known in advance, this behavior can be overridden by passing a list of
> // ColumnDescription objects specifying the column types. See CsvDataSourceHelper.read() for
> // more details.
> dataTable = CsvDataSourceHelper.read(reader, null, true, requestLocale);
とりあえず,すべての列の type を number としてみた.BufferedReader の mark(), reset() は,これをしないと出るエラーへの対処.また,mark() への引数は適切ではない.javac -cp visualization-datasource-1.1.1/visualization-datasource-1.1.1.jar:visualization-datasource-1.1.1/lib/icu4j-4_0_1.jar:visualization-datasource-1.1.1/lib/commons-lang-2.4.jar:visualization-datasource-1.1.1/lib/commons-logging-1.1.1.jar:/usr/share/tomcat5/common/lib/\[servlet\].jar:visualization-datasource-1.1.1/lib/opencsv-1.8.jar CsvDataSourceServlet.java
によりバイトコードを作成.jar を作成して配備,Tomcat を起動して確認した.