No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 34 | 35 | 36 |...| 57 | 58 | 59 || Next»

eXist の XQuery で POST と GET を区別するには?

POST でアップされたデータが request:get-data() で取れるらしいのでこいつでデータが取れなかったら GET,取れたら POST と判断してみる.ただ,POST でない場合 Exception が飛んでたのでutil:catch で捕らえてやる.こんな具合に:

     let $postData := util:catch("java.lang.IllegalArgumentException", request:get-data(), "")

こんなんでいいのだろうか?

eXist で XQuery の結果を XML にする…

eXist で,XQuery から XML を生成するとデフォルトでは html のDOCTYPE

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

が付いてしまうので,COCOON の $EXIST_HOME/xquery/sitemap.xmap を編集してXML でシリアライズするようにしなければならない.そのためには,sitemap.xmap のなかの,

	<map:pipelines>
		<map:pipeline>

の中に

            <map:match pattern="book-query.xq*">
                <map:generate src="book-query.xq" type="xquery">
                	<map:parameter name="create-session" value="true"/>
                </map:generate>
                <map:serialize encoding="UTF-8" type="xml"/>
            </map:match>

を追加する.意味は generate で生成して serialize で UTF-8 の xml にシリアライズすると.

余談として,*.xq だと COCOON (XqueryGenerator) に渡されるらしい. COCOON に渡った後の処理は,各所の sitemap.xmap で記述する. *.xql とかだと XQueryServlet に渡されてHTMLが吐かれる(XMLにできるのかなぁ?)   この設定は $EXIST_HOME/WEB-INF/web.xml に書かれている.

さて,一つの問題は解決した.次に移ろう.

今日のはまりどころ

したのコードでは POST のメッセージが飛ばない.

		URLConnection con = new URL(path).openConnection();
		con.setDoOutput(true);
		con.setDoInput(false);
		PrintWriter pw = new PrintWriter(con.getOutputStream());
		pw.println(path + " " + con);
		pw.flush();
		pw.close();
		System.out.println(path + " " + con);

どうやら InputStream を開いてやらないとサーバに POST のメッセージすら送ってくれないらしい.これに気づくのにかなりの時間を喰った… が,あとすこしなのでがむばろう.

eXist をインストールしてみる

フリーのネイティブ XML DB であるところの eXist をインストールしてみた.war 形式のファイルが提供されているので Tomcat の webapps に置くだけでインストール完了.インストールディレクトリにバージョン名とかが入ってないとうまく動かなくて手間取ったがどうにか動いてくれた.さて,今月のお仕事をさっさと片付けるとしましょうか.

継承したメソッドは…

Axis2 で ServiceClass として指定したクラスのオーバライドせずに引き継いだメソッドを公開しようとしたら java2wsdl がうまく動いてくれなかった.メッセージの中身がすべて空になってこけまくる.何かやり方があるのか仕様なのか.よく分からんことで時間を無駄にした.

エラー時に例外投げずにいきなり終了する(System.exit)するライブラリの実装って使いたくないんだけど… これが遠隔地のサーバ上で起きるからデバッグが非常にめんどくさい.System.exit 実行時の挙動を適当に変える方法は無いものか?

libusb-win32 を使ってみる

USBデバイスのハード部分が出来上がったので次はソフト部分.どうやら libusb-win32 というフリーのライブラリがあるようなので利用してみる.とりあえず inf ファイル作っとかないとデバイスが使えないので libusb-win32-device-bin-0.1.10.1.tar.gz とかの中にある inf-wizard.exe で生成.プログラム自体は AVR USB のサンプルコードを参考に作成.無事エコーテスト成功.あとはしつこくポーリングするか受信待ちが出来るなら待ちをしてやればおわる.

libusb を使ったプログラムの流れ(簡易版)は以下のとおり.何より先に usb_init(); して libusb を初期化.んで,usb_find_busses(); usb_find_devices(); でデバイスを探して,

for(bus=usb_get_busses(); bus; bus=bus->next){
    for(dev=bus->devices; dev; dev=dev->next){

のネストループで全デバイスを走査する.走査時に,dev->descriptor.idVendor, dev->descriptor.idProduct をチェックして,ベンダIDとプロダクトIDがマッチしたら handle = usb_open(dev); で開けてみて,

usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) +  dev->descriptor.iVendor, 0x0409, buffer, sizeof(buffer), 1000);
usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) +  dev->descriptor.iProduct, 0x0409, buffer, sizeof(buffer), 1000);

でベンダやプロダクト名を確認する(同一IDに複数のデバイスがあってプロダクト名で識別しないとならないので面倒.usb_get_string でいい気もする).

外れたら usb_close(dev); しとく.

デバイスが見つかったら usb_control_msg でデータのやり取りを.

他の endpoint 開いたほうがいいけど… そんな余裕は無い.

«Prev || 1 | 2 | 3 |...| 34 | 35 | 36 |...| 57 | 58 | 59 || Next»
Search
Feeds

Page Top