|
[最近のツッコミ] |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [全文検索] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ☆基本的に個人的なリンク集、偶に思い出したように文章を綴る日記。 ☆JAVA・Ruby・RELAX NGネタ中心です。O:原文,P:ポップアップ辞書,t:和訳 ☆[category]:カテゴリフィルタ画面 ☆[blogger]:Blogger出張所。徒然。 ☆[kuro]:個人的ライブラリ開発プロジェクト「Kuro Project」サイト。 ☆[kuro-pj]Kuro Project開発日誌。 ☆[ruby]Ruby学習日誌。 ☆[vox]:VOX出張所。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.テンプレートエンジンもどき
2.XMLドリブン...XML定義ファイルに基づいてテンプレート(HTML,XHTML etc)をハンドリング
3.実装言語はJAVA...他言語への移植は実装完了後検討
4.XML定義ファイルのハンドリングにStAXを採用...JAXB2.0RIの利用は保留
5.XML定義ファイルで利用する式言語としてOGNLを採用[3.0P2]
6.テンプレートファイルのハンドリングにMeteorCometを採用...MLの違いを吸収
7.XML定義ファイルはMLに依存しないようにデザイン
TODO.
1.XML定義ファイルの構造決定
2.XMLハンドリングコードの作成
3.本体の作成等
#とりあえず、RELAX NGで定義ファイルのXML構造を書いてみる。
メモメモφ。/* from オレンジニュース */
仕様策定中が7つ。EJB3.0以外全てProposed Final Draft公開済み。EJB3.0はProposed Final Draft作成中。
あぼ〜ん。
メモメモφ。/* from オレンジニュース */
メモメモφ。
メモメモφ。
メモメモφ。
HibernateアーキテクトのGavin Kingも使ってる、Test NG。
メモメモφ。
メモメモφ。
本当に簡素?情報技術系大手ベンダから出てきた簡素な技術を見たことがない...。どれも重厚長大。
/**
* Created by IntelliJ IDEA.
* User: Yasumasa Ashida
* Date: 2005/12/03
* Time: 17:55:56
*/
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.namespace.QName;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Tester {
private static final String fileName = "test.xml";
private static final String ELEMENT = "element";
private static final String ELEMENT_ID = "id";
private static final String ATTR = "attribute";
private static final String ATTR_NAME = "name";
private static final String ATTR_VALUE = "value";
private static final String COMPONENT = "component";
public static void main(String[] args){
// 入力ファクトリを取得する
XMLInputFactory xmlif = XMLInputFactory.newInstance();
try{
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(fileName));
XMLEventReader reader = xmlif.createXMLEventReader(stream);
while(reader.hasNext()){
XMLEvent e = reader.nextEvent();
analyzeElement(e,reader);
analyzeComponent(e,reader);
}
reader.close();
}catch(XMLStreamException e){
e.printStackTrace();
}catch(FileNotFoundException e){
e.printStackTrace();
}
}
private static void analyzeElement(XMLEvent e,XMLEventReader reader) throws XMLStreamException{
if(e.isStartElement()){
StartElement se = (StartElement)e;
if(se.getName().getLocalPart().equals(ELEMENT)){
Attribute attr = se.getAttributeByName(new QName(ELEMENT_ID));
System.out.println(attr.getValue());
analyzeAttributes(e,reader);
}
}
}
private static void analyzeComponent(XMLEvent e,XMLEventReader reader) throws XMLStreamException{
if(e.isStartElement()){
StartElement se = (StartElement)e;
if(se.getName().getLocalPart().equals(COMPONENT)){
System.out.println(se.getName().getLocalPart());
analyzeElements(e,reader);
}
}
}
private static void analyzeAttributes(XMLEvent e,XMLEventReader reader) throws XMLStreamException{
boolean next_flg = false;
while(reader.hasNext() && !next_flg ){
e = reader.nextEvent();
if(e.isStartElement()){
StartElement se = (StartElement)e;
if(se.getName().getLocalPart().equals(ATTR)){
Attribute attr = se.getAttributeByName(new QName(ATTR_NAME));
System.out.print(attr.getValue() + ":");
attr = se.getAttributeByName(new QName(ATTR_VALUE));
System.out.println(attr.getValue());
}else{
next_flg = true;
}
}else if(e.isEndElement()){
EndElement ee = (EndElement)e;
if(!ee.getName().getLocalPart().equals(ATTR)){
next_flg = true;
}
}
}
}
private static void analyzeElements(XMLEvent e,XMLEventReader reader) throws XMLStreamException{
boolean next_flg = false;
while(reader.hasNext() && !next_flg ){
e = reader.nextEvent();
if(e.isStartElement()){
analyzeElement(e,reader);
}else if(e.isEndElement()){
EndElement ee = (EndElement)e;
if(!ee.getName().getLocalPart().equals(ELEMENT) && !ee.getName().getLocalPart().equals(ATTR)){
next_flg = true;
}
}
}
}
}
#test.xml<?xml version="1.0" encoding="Windows-31J" ?>
<test>
<element id="pepe" >
<attribute name="test" value="pc"/>
<attribute name="test" value="pc"/>
</element>
<elementid="popo" >
<attribute name="test" value="pc"/>
</element>
<component>
<elementid="pepe" >
<attribute name="test"value="pc"/>
<attribute name="test" value="pc"/>
</element>
<element id="popo" >
<attribute name="test" value="pc"/>
</element>
</component>
</test>
メモメモφ。/* from ネバーバード日記(on off) and MYCOM(on off) */
-->WEBサービストランザクション(on off)
メモメモφ。
メモメモφ。/* from オレンジニュース */
Ruby製Tracもどき。開発中(現バージョンは0.5)。利用例はこちら(on off)。
/* from momonga-dev.ja ML:03255 */
メモメモφ。/* from オレンジニュース */
メモメモφ。/* from オレンジニュース */
Comet自体がMLの要素を検索し、その要素を構成している属性及び内容に対して変更を行う仕様なので、Novaの
XML定義ファイル自体も要素あるいは要素群に対しての処理を記述するような感じになります。
そこで問題になるのが"ループや分岐等"の制御文をXML定義ファイル内でどのように表現するか...思案中。
操作用要素定義系と制御系のタグを入れ子にはしたくないしなぁ。
#...とか書いているうちにイメージが湧いてきました。それについてはまた今度。
メモメモφ。
あぼ〜ん。
メモメモφ。/* from オレンジニュース */