2011-08-12

Google Visualization Data Source Library

web で公開されている CSV ファイル中のデータを Google Chart Tools で図にするためには,それらデータが「datasource」としてアクセスできる必要がある.Google Visualization Data Source Librarygoogle-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 を起動して確認した.