Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » Mobile Link クイックスタート » Mobile Link チュートリアル » チュートリアル:XML との同期

 

レッスン 5:Mobile Link のダイレクトローハンドリングのための Java クラスの作成

このレッスンでは、ダイレクトローハンドリングを使用して、クライアントデータベース内の OrderComments テーブルのローを処理します。handle_UploadData イベント用のダイレクトローハンドリングの GetUpload メソッドを追加します。GetUpload では、アップロードされたコメントを XML ファイルに書き込みます。

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。 レッスン 1:XML データソースの設定を参照してください。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:XML との同期

内容と備考

次の手順では、処理用メソッドを含む Java クラスを作成する方法を示します。 完全なリストについては、MobiLinkOrders の Java コードのリストを参照してください。

 ♦ タスク
  1. MobiLinkOrders というクラスを作成します。

    次のコードを作成します。



    import ianywhere.ml.script.*;
    import java.io.*;
    import java.sql.*;
    
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory;  
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.xml.sax.SAXException;  
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    // For write operation
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.dom.DOMSource;  
    import javax.xml.transform.stream.StreamResult; 
    
    public class MobiLinkOrders {
  2. クラスレベルの DBConnectionContext インスタンスおよび Document インスタンスを宣言します。Document クラスは、XML 文書をオブジェクトとして表します。

    次のコードを作成します。

        // Class level DBConnectionContext
        DBConnectionContext _cc;
        Document _doc;

    Mobile Link サーバによって DBConnectionContext のインスタンスがクラスコンストラクタに渡されます。DBConnectionContext には、Mobile Link 統合データベースとの現在の接続に関する情報がカプセル化されます。

  3. クラスコンストラクタを作成します。

    クラスコンストラクタが、クラスレベルの DBConnectionContext インスタンスを設定します。

    次のコードを作成します。

        public MobiLinkOrders( DBConnectionContext cc ) throws IOException, FileNotFoundException {
            // Declare a class-level DBConnectionContext
            _cc = cc;
        }
    
  4. GetUpload メソッドを作成します。

    GetUpload メソッドでは、OrderComments テーブルを表す UploadedTableData クラスインスタンスを取得します。OrderComments テーブルには、遠隔地の営業部員による特別なコメントが含まれます。このテーブルはレッスンの後半で作成します。

    UploadedTableData の getInserts メソッドでは、注文に対する新しいコメントの結果セットを返します。

    1. メソッドの宣言を作成します。

      次のコードを作成します。

          //  Method for the handle_UploadData synchronization event
          public void GetUpload( UploadData ut ) throws SQLException, IOException {
    2. アップロード済み挿入を Mobile Link クライアントから取得するコードを作成します。

      次のコードを作成します。

              // Get an UploadedTableData for the remote table
              UploadedTableData remoteOrdersTable = ut.getUploadedTableByName("OrderComments");
      
              // Get inserts uploaded by the MobiLink client 
              // as a java.sql.ResultSet    
              ResultSet insertResultSet = remoteOrdersTable.getInserts();
    3. 既存の XML ファイル order_comments.xml を読み込むコードを作成します。

      次のコードを作成します。

              try {
      	    readDom("order_comments.xml");
    4. すべてのアップロード済み挿入を XML ファイルに追加するコードを作成します。

      次のコードを作成します。

         // Write out each insert in the XML file
         while( insertResultSet.next() ) {  
            buildXML(insertResultSet);
         }
    5. XML ファイルに出力するコードを作成します。

      次のコードを作成します。

              writeXML(); 
          }
    6. ResultSet を閉じるコードを作成します。

      次のコードを作成します。

              finally {
          // Close the result set of uploaded inserts
          insertResultSet.close();  
      }
         }
  5. buildXML メソッドを作成します。

    次のコードを作成します。



         private void buildXML( ResultSet rs ) throws SQLException {  
            int order_id = rs.getInt(1);
            int comment_id = rs.getInt(2);
            String order_comment = rs.getString(3);    
    
            // Create the comment object to be added to the XML file
            Element comment = _doc.createElement("comment");
            comment.setAttribute("id", Integer.toString(comment_id));
            comment.appendChild(_doc.createTextNode(order_comment));
    
            // Get the root element (orders)
            Element root = _doc.getDocumentElement();
        
            // Get each individual order
            NodeList rootChildren = root.getChildNodes();
         
            for(int i = 0; i < rootChildren.getLength(); i++) {
                // If the order exists, add the comment to the order      
                Node n = rootChildren.item(i);
                if(n.getNodeType() == Node.ELEMENT_NODE) {
                    Element e = (Element) n;
                    int idIntVal = Integer.parseInt(e.getAttribute("id"));
            
                    if(idIntVal == order_id) {
                        e.appendChild(comment);
                        // The comment has been added to the file, so exit
                        // the function.
                        return;
                    }
                } 
            }
    
            // If the order did not exist already, create it
            Element order = _doc.createElement("order");
            order.setAttribute("id", Integer.toString(order_id));
    
            // Add the comment to the new order
            order.appendChild(comment);    
            root.appendChild(order);
        }
  6. writeXML メソッドを作成します。

    次のコードを作成します。



        private void writeXML() {
            try {
                // Use a Transformer for output
                TransformerFactory tFactory = TransformerFactory.newInstance();
                Transformer transformer = tFactory.newTransformer();
     
                // The XML source is _doc
                DOMSource source = new DOMSource(_doc);
                // Write the xml data to order_comments.xml
                StreamResult result = new StreamResult(new File("order_comments.xml"));
                transformer.transform(source, result);
            } catch (TransformerConfigurationException tce) {
                // Error generated by the parser
                System.out.println ("\n** Transformer Factory error");
                System.out.println("   " + tce.getMessage() );
    
                // Use the contained exception, if any
                Throwable x = tce;
                if (tce.getException() != null) x = tce.getException();
                x.printStackTrace();
            } catch (TransformerException te) {
                // Error generated by the parser
                System.out.println ("\n** Transformation error");
                System.out.println("   " + te.getMessage() );
    
                // Use the contained exception, if any
                Throwable x = te;
                if (te.getException() != null) x = te.getException();
                x.printStackTrace(); 
            }
        } 
  7. readDom メソッドを作成します。

    次のコードを作成します。



        private void readDom(String filename) {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
            try {
                //parse the Document data into _doc
                DocumentBuilder builder = factory.newDocumentBuilder();
                _doc = builder.parse( new File(filename) );
     
            } catch (SAXException sxe) {
                // Error generated during parsing)
                Exception x = sxe;
                if (sxe.getException() != null) x = sxe.getException();
                x.printStackTrace();
    
            } catch (ParserConfigurationException pce) {
                // Parser with specified options can't be built
                pce.printStackTrace();
    
            } catch (IOException ioe) {
                // I/O error
                ioe.printStackTrace();
            }
        }
    }
    
  8. Java コードを MobiLinkOrders.java という名前で作業ディレクトリ c:\MLobjxml に保存します。

    MobiLinkOrders.java のコードを検証する場合は、MobiLinkOrders の Java コードのリストを参照してください。

  9. クラスファイルをコンパイルします

    1. Java のソースファイルが含まれるディレクトリに移動します。

    2. Java 用の Mobile Link サーバ API ライブラリを参照する MobiLinkOrders をコンパイルします。

      %SQLANY16%\Java にある mlscript.jar を参照し、XML DOM ライブラリが正しくインストールされていることを確認する必要があります。

      次のコマンドを実行して、C:\Program Files\SQL Anywhere 16\ を SQL Anywhere 16 ディレクトリに置き換えます。

      javac -classpath "C:\Program Files\SQL Anywhere 16\java\mlscript.jar" MobiLinkOrders.java

結果

Mobile Link のダイレクトローハンドリングのための Java クラスが作成されます。

次の手順

レッスン 6:Mobile Link サーバの起動に進みます。

 参照

MobiLinkOrders の Java コードのリスト