- PR -

長〜い文字列を解析/組み立てる汎用的なライブラリ

投稿者投稿内容
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-06-27 15:46
一般的な検索語
データマッピング COBOL JAVA
出てくるのは、汎用機の系列の大規模なもの。
----------------------------
COBOL JAVA 連携
でも、出ます

[ メッセージ編集済み 編集者: MMX 編集日時 2005-06-27 17:33 ]
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2005-06-27 19:30
的外れな意見だったら、すみません。

その「長〜い文字列」の解析/構築が、Javaでは難しいけど、Cだと楽にできるのであれば、CでJavaのNativeメソッドを作ってしまうっていうのはどうでしょうか?
うまく行けば、一度XMLに変換しなくても、ストレートにJavaオブジェクトにできそうな気がしますが。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-06-28 22:21
これは回答ではありません。でもこのテの話題には興味があるので。

課題は次の3点ですよね。

1. 長い文字列の解析
2. POJOの生成
3. 1,2を自動、あるいは支援してくれるライブラリが存在するか?

1.は文字列の形式が割と単純(XMLよりシンプル)であれば、手でもできそうな気がします。

2.は興味がありますが、どうするのかわかりません。
JSPだとソースコード生成→javac実行でしょうし。
要するにソースコードを生成せずに*.classを生成する手段で
プラットフォームに依存しないもの、があればよいのですが。
(Reflectionでクラス自体を生成することってできましたっけ?
あるいはJavaassist
あたりでできるとよいのですが。

3.は全く見当が付きません。(JavaCCだと構文規則書いて、ソースコードを
生成して、できたソースをコンパイルして、って手順になるでしょうし)


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-06-28 23:18
>ちいにぃさん

実行時に動的にクラスを作成しても、コンパイル時点では存在しない為、
動的に生成したクラスを参照するとコンパイル時点でエラーになってしまいます。
良くあるXML-JavaマッピングツールがAntなどでプリコンパイルするのはその為です。

コンパイルできない為、動的に作ったクラスは結局java.lang.Classの
インスタンスとして保持するしかなく、そのクラスのインスタンスも
java.lang.Object型として扱うしかありません。

(キャストの文はエラーになる)
インターフェイスをかませば、そのインターフェイスに型としてキャストできますが、
コンパイル前にインターフェイスがわかるのであれば、
特に自動で型を組み立てる必要がない事になります。

これはJavaが動的な型の解決を行う事ができない為で、
もう諦めるしかありません。。。

蛇足ですが、ソースファイルからクラスを生成してくれるクラスローダがあるみたいです。
http://www.janino.net/
codehausからのプロジェクトですが、最近熱いプロジェクトが多いですね。


そういや、最近ニュースで出ていましたが、文法定義を行う事により
対象の文書をツリー構造のデータとして扱う事ができるツールみたいです。
参考までに。
http://headlines.yahoo.co.jp/hl?a=20050623-00000095-myc-sci
http://pcweb.mycom.co.jp/news/2005/06/22/028.html
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2005-06-29 00:40
引用:

かつのりさんの書き込み (2005-06-28 23:18) より:
実行時に動的にクラスを作成しても、コンパイル時点では存在しない為、
動的に生成したクラスを参照するとコンパイル時点でエラーになってしまいます。
良くあるXML-JavaマッピングツールがAntなどでプリコンパイルするのはその為です。

コンパイルできない為、動的に作ったクラスは結局java.lang.Classの
インスタンスとして保持するしかなく、そのクラスのインスタンスも
java.lang.Object型として扱うしかありません。

(キャストの文はエラーになる)
インターフェイスをかませば、そのインターフェイスに型としてキャストできますが、
コンパイル前にインターフェイスがわかるのであれば、
特に自動で型を組み立てる必要がない事になります。

これはJavaが動的な型の解決を行う事ができない為で、
もう諦めるしかありません。。。



そうですか、Javaで実行時に動的にclassを生成するのは無理ぽいですね。
色々調べてみたのですがORmappingのHibernateのような形式を応用してできないかなと考えています。あらかじめ、枠組みの数分xmlを用意して置いて・・・

Hibernateの場合はRDBとJavaのObjectのマッピングですが、1対多、多対1のマッピング等は応用できそうな気がします。ただ、長い文字列を枠組みで区切って分解するところは自前で考えなければならないと思います。Objectから長い文字列を作るところは項目の順番通りにappendして、桁数に満たない項目はpaddingしてやればいいので分解よりは簡単かも。

あとはJavaではどうしても無理で有ればCで書くと言う方法もあるかなと。実はこの他システムは中継装置を持っていてこれがHTTPサーバなんです。HTTPサーバと接続するシステムの間はHTTPのPOSTメソッドでCGIを通して長い文字列をやりとりしています。中継装置であるHTTPサーバとその他システムの間は専用プロトコル(ソケット通信)しています。

このHTTPサーバがxmlを受け取りxmlを返せば、Javaのシステムは割と簡単にJavaのObjectにマッピング出来そうなきがします。CGIプログラムはCやC++とか何でも使えますからJavaよりは自由度はあるかもしれません。
ちゅうか、これってSOAPそのものですね。この中継装置がSOAPを実装すればいいのか・・・な?
cypher256
会議室デビュー日: 2003/11/05
投稿数: 7
投稿日時: 2005-06-29 01:08
汎用的なツールは無いか? の回答ではありませんが、
自分でやるとしたらまず XML は使いません。
JAXB とかで Java ソースコードを生成できますが、これだと
DTD や XML スキーマが必要ですし。

後々楽だと思うのは Excel ファイルなどの仕様書から POI で
仕様を取り込み、Velocity でインタフェースとなる Java ソース
コードだけを生成。Ant ユーザ定義タスクとかいいと思います。
それで、このインタフェースを実装するクラスは java.lang.instrument
などでクラスロードをフックして Javasist や cglib などで VM 上に
動的生成する。単純にファクトリとして DynamicPojoFactory みたいなのを
作って create メソッドで動的に生成でもいいかもしれません。

実装者に、このインタフェースの実装クラスはどこにあんの? とか
聞かれて、実行時に動的インプリメントされるんだよ っつーのも
かっこいい気がします。桁数などが変わっても実行時解決ですし。
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2005-10-04 22:58
引用:

彷徨える開発者さんの書き込み (2005-06-29 00:40) より:

このHTTPサーバがxmlを受け取りxmlを返せば、Javaのシステムは割と簡単にJavaのObjectにマッピング出来そうなきがします。CGIプログラムはCやC++とか何でも使えますからJavaよりは自由度はあるかもしれません。
ちゅうか、これってSOAPそのものですね。この中継装置がSOAPを実装すればいいのか・・・な?



あまりにも古い自分の書き込みにリプライすると言うのも赤面モノなんですが・・・

結局、このやりとりにはXMLがよかろうという(自分で)結論に達しました。そもそも他システム間の結合はやはりXMLでしょ。開発しているシステムがJavaなのでXMLのパーサは色々あるので自分で使いやすいのを選択すればいいのかなと。その中でもXMLBeansがいいかなと思っています。

さて、XMLから一気にJavaのインスタンスに展開、インスタンスからXMLに書き出しするのはこれらのパーサに任せればいいのですが、XMLから長〜い文字列を生成する場合、逆に長〜い文字列からXMLを生成する場合をどうするかが問題です。

HTTPサーバを実装している中継装置はJavaではなくCで書かれたCGIプログラムなのでCで使えるXMLパーサと言うとこれまた選択肢が少なくlibxml2ぐらいしかありませんし、情報も少ないです。

JavaではXSLTを使えば、XMLから長〜い文字列を生成するのは変換ルールでなんとかできそうな気がするのですが(XMLツリーの要素の文字列を順番に取り出し連結していけばいい)、逆方向の逆に長〜い文字列からXMLを生成する場合はXSLTでできるのでしょうか?

やはりこの長〜い文字列を枠組みに沿って分解するところがJava実現するいい方法がなくて悩んでいます。

スキルアップ/キャリアアップ(JOB@IT)