最後のステップは、実際のコールバックイベントの解析と処理です。この作業をスムーズに行うため、「XML を生成する」で作成した Event クラスを変更します。このクラスを使用して、XML ドキュメントから Event を構築し、XML Element を作成できます。この変更は、XML ドキュメントを受け付ける別のコンストラクタ、retrieveValues メソッド、2 つの新たなメンバー変数 (vendor と publisher ) 、全フィールドのアクセッサメソッド、および出力メソッドを必要とします。
上記のロジックを実装する Java コードを作成します。
このコードは、「登録応答を解析する」で説明している RegReply クラスのコードに似ていることに注目してください。
public Event(Document doc) { nvpairs = new Vector(); retrieveValues(doc); } public void print(PrintStream out) { out.println("\tCLASS=" + regClass); out.println("\tSUBCLASS=" + regSubclass); out.println("\tVENDOR=" + vendor); out.println("\tPUBLISHER=" + publisher); for (int i = 0; i < nvpairs.size(); i++) { NVPair tempNv = (NVPair) (nvpairs.elementAt(i)); out.print("\t\t"); tempNv.print(out); } } private void retrieveValues(Document doc) { Node n; NodeList nl; String nodeName; // SC_EVENT 要素を検出する nl = doc.getElementsByTagName("SC_EVENT"); if (nl.getLength() != 1) { System.out.println("Error in parsing: can't find " + "SC_EVENT node."); return; } n = nl.item(0); // // CLASS、SUBCLASS、VENDOR、およびPUBLISHER // 属性の値を取得する。 // regClass = ((Element)n).getAttribute("CLASS"); regSubclass = ((Element)n).getAttribute("SUBCLASS"); publisher = ((Element)n).getAttribute("PUBLISHER"); vendor = ((Element)n).getAttribute("VENDOR"); // すべての nv ペアを取得する。 for (Node child = n.getFirstChild(); child != null; child = child.getNextSibling()) { nvpairs.add(new NVPair((Element)child)); } } public String getRegClass() { return (regClass); } public String getSubclass() { return (regSubclass); } public String getVendor() { return (vendor); } public String getPublisher() { return (publisher); } public Vector getNvpairs() { return (nvpairs); } private String vendor, publisher;
XML 解析をサポートする、NVPair クラスのコンストラクタとメソッドを別途実装します。
手順 1で Event クラスに変更を加えたため、NVPair クラスにも類似した変更を加える必要があります。
public NVPair(Element elem) { retrieveValues(elem); } public void print(PrintStream out) { out.println("NAME=" + name + " VALUE=" + value); } private void retrieveValues(Element elem) { Node n; NodeList nl; String nodeName; // NAME 要素を検出する。 nl = elem.getElementsByTagName("NAME"); if (nl.getLength() != 1) { System.out.println("Error in parsing: can't find " + "NAME node."); return; } // TEXT セクションを取得する。 n = nl.item(0).getFirstChild(); if (n == null || n.getNodeType() != Node.TEXT_NODE) { System.out.println("Error in parsing: can't find " + "TEXT section."); return; } // 値を取得する。 name = n.getNodeValue(); // ここで要素を取得する。 nl = elem.getElementsByTagName("VALUE"); if (nl.getLength() != 1) { System.out.println("Error in parsing: can't find " + "VALUE node."); return; } // TEXT セクションを取得する n = nl.item(0).getFirstChild(); if (n == null || n.getNodeType() != Node.TEXT_NODE) { System.out.println("Error in parsing: can't find " + "TEXT section."); return; } // 値を取得する value = n.getNodeValue(); } public String getName() { return (name); } public String getValue() { return (value); } }
EventReceptionThread でイベントコールバックを待機する while ループを実装します。
EventReceptionThread については、「イベント受信スレッドを定義する」 を参照してください。
while(true) { Socket sock = listeningSock.accept(); Document doc = db.parse(sock.getInputStream()); Event event = new Event(doc); client.processEvent(event); sock.close(); }