< 目次

JNLP API の使用例


この章では、次のトピックについて説明します。

はじめに

JNLP API の目的は、標準の Java(TM) Platform Standard Edition API 経由では入手不可能な追加情報を、アプリケーションに対して提供することです。次に挙げるサンプルコードは、サービス BasicServiceClipboardServiceDownloadServiceFileOpenServiceFileSaveServicePrintService、および PersistenceService の使い方を示したものです。

JNLP API の公開クラスとインタフェースは、jnlp.jar ファイル内に収められています。JNLP API を使用しているソースファイルをコンパイルする際には、この JAR ファイルをクラスパスに含める必要があります。たとえば、Windows 上では次のようにします。

javac -classpath .;jnlp.jar *.java

jnlp.jar ファイルは、JNLP 開発者向けパックに含まれています。
 

BasicService サービスの使用

javax.jnlp.BasicService サービスが提供する一連のメソッドを使えば、環境に対する問い合わせや対話を行えます。これらのメソッドは、AppletContext が Java アプレットに対して提供するメソッドに似ています。

showURL メソッドは JNLP API を使って、プラットフォーム上のデフォルトブラウザに対し、指定された URL を表示するよう指示します。このメソッドは、要求が成功した場合には true を返し、そうでない場合には false を返します。

import javax.jnlp.*;
   ...

   // URL を表示するメソッド
   boolean showURL(URL url) {
       try {
           // javax.jnlp.BasicService オブジェクトを検索する
           BasicService bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
           // showDocument メソッドを呼び出す
           return bs.showDocument(url);
       } catch(UnavailableServiceException ue) {
           // サービスがサポートされていない
           return false;
       }
    }

ClipboardService サービスの使用

javax.jnlp.ClipboardService サービスが提供するメソッドを使えば、制限された実行環境で実行されているアプリケーションの場合でも、システム全体の共有クリップボードにアクセスできます。

Java Web Start は、クリップボードに格納されている内容 (機密情報が含まれる可能性もある) へのアクセスや、そうした内容の上書きが信頼できないアプリケーションに許可されると、セキュリティー上の問題が発生する可能性があることをユーザーに警告します。

import javax.jnlp;
    ...

    private ClipboardService cs;

    try {
        cs = (ClipboardService)ServiceManager.lookup
                 ("javax.jnlp.ClipboardService");
    } catch (UnavailableServiceException e) {
        cs = null;
    }

    if (cs != null) {
        // システムクリップボードの内容を文字列の選択範囲に設定する
        StringSelection ss = new StringSelection("Java Web Start!");
        cs.setContents(ss);
        // システムクリップボードの内容を取得し、出力する
        Transferable tr = cs.getContents();
        if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
           try {
                String s = (String)tr.getTransferData(DataFlavor.stringFlavor);
                System.out.println("Clipboard contents:" + s);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

DownloadService サービスの使用

javax.jnlp.DownloadService サービスを使えば、アプリケーションは自身のリソースをどのようにキャッシュするかを制御できます。

アプリケーションはこのサービスを使うことで、どのリソースがキャッシュされているかの確認、リソースの強制キャッシュ、およびキャッシュからのリソースの削除を行えます。


import javax.jnlp.*; 
    ... 

    DownloadService ds; 

    try { 
        ds = (DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService"); 
    } catch (UnavailableServiceException e) { 
        ds = null; 
    } 

    if (ds != null) { 

        try { 
            // determine if a particular resource is cached
            URL url = 
                    new URL("http://java.sun.com/products/javawebstart/lib/draw.jar"); 
            boolean cached = ds.isResourceCached(url, "1.0"); 
            // remove the resource from the cache 
            if (cached) { 
                ds.removeResource(url, "1.0"); 
            } 
            // reload the resource into the cache 
            DownloadServiceListener dsl = ds.getDefaultProgressWindow(); 
            ds.loadResource(url, "1.0", dsl); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

DownloadService2 サービスの使用

Java SE 6 update 18 リリースで導入された javax.jnlp.DownloadService2 サービスには次のメソッドがあります。

DownloadService2.ResourceSpec クラスのインスタンスは、確認するリソースの詳細を指定します。

import javax.jnlp.*;
...
DownloadService2 service = (DownloadService2)
                        ServiceManager.lookup("javax.jnlp.DownloadService2");

// create a new instance of ResourceSpec. In this example: 
// - resource is downloaded from a directory on http://foo.bar.com:8080
// - version is 2. [0-9]+
// - resource type is JAR 
ResourceSpec spec = new ResourceSpec("http://foo.bar.com:8080/.*", 2.*, service.JAR)

// returns all cached resources that match the given ResourceSpec  
ResourceSpec results[] = service.getCachedResources(spec);

// returns all resources for which an update is available on the 
// server http://foo.bar.com:8080.
results = service.getUpdateAvailableResources(spec);

DownloadServiceListener サービスの実装

javax.jnlp.DownloadServiceListener サービスは、アプリケーションのダウンロードの進捗を示すカスタマイズされたロード進捗インジケータを指定するためのメソッドを提供します。詳細は、カスタマイズされたロード進捗インジケータの実装に関するトピックを参照してください。

FileOpenService サービスの使用

javax.jnlp.FileOpenService サービスが提供するメソッドを使えば、制限された実行環境で実行されているアプリケーションの場合でも、ローカルディスクからファイルをインポートできます。

このインタフェースの目的は、HTML 使用時に Web 開発者に対して提供されるのと同じ種類のディスクアクセス機能を、信頼できない可能性のある Web 配備アプリケーションに対して提供することです。HTML フォームは、ファイル選択ダイアログによるファイルの組み込みをサポートしています。


import javax.jnlp.*; 
    ... 

    FileOpenService fos; 

    try { 
        fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); 
    } catch (UnavailableServiceException e) { 
        fos = null; 
    } 

    if (fos != null) { 
        try { 
            // ask user to select a file through this service 
            FileContents fc = fos.openFileDialog(null, null); 
            // ask user to select multiple files through this service 
            FileContents[] fcs = fos.openMultiFileDialog(null, null); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

FileSaveService サービスの使用

javax.jnlp.FileSaveService サービスが提供するメソッドを使えば、制限された実行環境で実行されているアプリケーションの場合でも、ローカルディスクにファイルをエクスポートできます。

このインタフェースの目的は、Web ブラウザが表示中の内容に関して提供するのと同レベルのディスクアクセス機能を、信頼できない可能性のある Web 配備アプリケーションに対して提供することです。ほとんどのブラウザは、別名保存ダイアログをユーザーインタフェースの一部として提供しています。


import javax.jnlp.*; 
    ... 

    FileSaveService fss; 
    FileOpenService fos; 

    try { 
        fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); 
        fss = (FileSaveService)ServiceManager.lookup 
                                   ("javax.jnlp.FileSaveService"); 
    } catch (UnavailableServiceException e) { 
        fss = null; 
        fos = null; 
    } 

    if (fss != null && fos != null) { 
        try { 
            // get a file with FileOpenService 
            FileContents fc = fos.openFileDialog(null, null); 
            // one way to save a file 
            FileContents newfc = fss.saveFileDialog(null, null, 
            fc.getInputStream(), "newFileName.txt"); 
            // another way to save a file 
            FileContents newfc2 = fss.saveAsFileDialog(null, null, fc); 

        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

FileContents の使用」も参照してください。

IntegrationService サービスの使用

Java SE 6 update 18 リリースで導入された javax.jnlp.IntegrationService サービスには、ショートカットをプログラムで管理するためのメソッドがあります。アプリケーションではこのサービスを使用して次の操作を実行できます。

import javax.jnlp.*;
...

IntegrationService is = null;
try {
    is = (IntegrationService) ServiceManager.lookup("javax.jnlp.IntegrationService");
} catch(UnavailableServiceException use){
    ...
}

// creates a desktop and system menu shortcut; returns true if the shortcuts 
// were created successfully
boolean result = is.requestShortcut(true, true, null);

//removes all shortcuts for application
result = is.removeShortcuts();

// checks to see if there are shortcuts for the application
result = is.hasMenuShortcut() && is.hasDesktopShortcut());

// associates the application with the specified mime-type and file extensions
String mime = "x-application/aaa";
String [] exts = {"aaa", "abc"};
result = is.requestAssociation(mime, exts);

// checks if the application is associated with the specified mime-type and file extensions
result = is.hasAssociation(mime, exts);

// removes association between the application and the specified mime-type and file extensions
is.removeAssociation(mime, exts);

PrintService サービスの使用

javax.jnlp.PrintService サービスが提供するメソッドを使えば、制限された実行環境で実行されているアプリケーションの場合でも、印刷機能にアクセスできます。

アプリケーションはこのサービスを使うことで、印刷ジョブを発行できます。Java Web Start は、その要求をユーザーに表示し、ユーザーによって承認されると、その要求をプリンタのキューに追加します。

Java Web Start 5.0 では、直接 Java Printing API が使用できるようになりました。サンドボックスでアプリケーションが実行されている場合、この API を起動すると、PrintPermission の付与をユーザーに確認するセキュリティーダイアログが表示されます。JNLP Printing API を使用する必要はなくなりました。どの JNLP アプリケーションでも、Java Printing API にフルアクセスできます。


import javax.jnlp.*; 
    ... 

    PrintService ps; 

    try { 
        ps = (PrintService)ServiceManager.lookup("javax.jnlp.PrintService"); 
    } catch (UnavailableServiceException e) { 
        ps = null; 
    } 

    if (ps != null) { 
        try { 
             
            // get the default PageFormat
            PageFormat pf = ps.getDefaultPage(); 

            // ask the user to customize the PageFormat
            PageFormat newPf = ps.showPageFormatDialog(pf); 

            // print the document with the PageFormat above
            ps.print(new DocToPrint()); 
           
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

    // Code to construct the Printable Document
    class DocToPrint implements Printable {
        public int print(Graphics g, PageFormat pageformat, int PageIndex){
            // code to generate what you want to print   
        }
    }

PersistenceService サービスの使用

javax.jnlp.PersistenceService サービスが提供するメソッドを使えば、制限された実行環境で実行されているアプリケーションの場合でも、クライアントシステム上にローカルにデータを格納できます。

このサービスの設計は、cookie メカニズムが HTML ベースのアプリケーションに提供するサービスに若干似ています。cookie を使用すると、少量のデータをローカルのクライアントシステムに保存できます。そのデータはブラウザによって安全に管理され、同じ URL の HTML ページを参照する場合にのみその保存されたデータが使用されます。


import javax.jnlp.*; 
    ... 

    PersistenceService ps; 
    BasicService bs; 

    try { 
        ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService"); 
        bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService"); 
    } catch (UnavailableServiceException e) { 
        ps = null; 
        bs = null; 
    } 

    if (ps != null && bs != null) { 

        try { 
            // find all the muffins for our URL
            URL codebase = bs.getCodeBase(); 
            String [] muffins = ps.getNames(url); 

            // get the attributes (tags) for each of these muffins. 
            // update the server's copy of the data if any muffins 
            // are dirty 
            int [] tags = new int[muffins.length]; 
            URL [] muffinURLs = new URL[muffins.length]; 
            for (int i = 0; i < muffins.length; i++) { 
                muffinURLs[i] = new URL(codebase.toString() + muffins[i]); 
                tags[i] = ps.getTag(muffinURLs[i]); 
                // update the server if anything is tagged DIRTY 
                if (tags[i] == PersistenceService.DIRTY) { 
                    doUpdateServer(muffinURLs[i]); 
                } 
            } 

            // read in the contents of a muffin and then delete it 
            FileContents fc = ps.get(muffinURLs[0]); 
            long maxsize = fc.getMaxLength(); 
            byte [] buf = new byte[fc.getLength()]; 
            InputStream is = fc.getInputStream(); 
            long pos = 0; 
            while((pos = is.read(buf, pos, buf.length - pos)) > 0) { 
                // just loop 
            } 
            is.close(); 

            ps.delete(muffinURLs[0]); 

            // re-create the muffin and repopulate its data 
            ps.create(muffinURLs[0], maxsize); 
            fc = ps.get(muffinURLs[0]); 
            // don't append 
            OutputStream os = fc.getOutputStream(false); 
            os.write(buf); 
            os.close(); 

        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

   void doUpdateServer(URL url) { 
        // update the server's copy of the persistent data 
        // represented by the given URL 
        ... 
        ps.setTag(url, PersistenceService.CACHED); 
   } 

FileContents の使用

javax.jnlp.FileContents オブジェクトは、ファイルの名前と内容をカプセル化します。このクラスのオブジェクトは、FileOpenServiceFileSaveService、および PersistenceService により使用されます。次のサンプルコードは、FileContents のインスタンスを使ってファイルに対する読み書きを行う方法を示したものです。


import javax.jnlp.*; 
    ... 

    FileOpenService fos; 

    //Initialize fos (see Using the FileOpenService Service example) 
    ... 

    if (fos != null) { 

        try { 

            // get a FileContents object to work with from the 
            // FileOpenService 
            FileContents fc = fos.openFileDialog(null, null); 

            // get the InputStream from the file and read a few bytes 
            byte [] buf = new byte[fc.getLength()]; 
            InputStream is = fc.getInputStream(); 
            int pos = 0; 
            while ((pos = is.read(buf, pos, buf.length - pos)) > 0) { 
                // just loop 
            } 
            is.close(); 

            // get the OutputStream and write the file back out 
            if (fc.canWrite()) { 
               // don't append 
               OutputStream os = fc.getOutputStream(false); 
               os.write(buf); 
            } 

        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

JNLPRandomAccessFile の使用

javax.jnlp.JNLPRandomAccessFile のインスタンスは、ランダムアクセスファイルに対する読み取りと書き込みの両方をサポートします。ランダムアクセスファイルの動作は、ファイルシステムに格納された大規模なバイト配列の動作に似ています。次のサンプルコードは、JNLPRandomAccessFile のインスタンスを使ってランダムアクセスファイルに対する書き込みを行う方法を示したものです。


import javax.jnlp.*; 
    ... 

    FileOpenService fos; 

    //Initialize fos (see Using the FileOpenService Service example) 
    ... 

    if (fos != null) { 
        try { 
           // ask the user to choose a file to open 
           FileContents fc = fos.openFileDialog(null, null); 

           // attempt to increase the maximum file length 
           long grantedLength = fc.getLength(); 
           if (grantedLength + 1024 > fc.getMaxLength()) { 
               // attempt to increase the maximum file size defined by 
               // the client 
               grantedLength = fc.setMaxLength(grantedLength + 1024); 
           } 

           // if we were able to increase the maximum allowable file size, 
           // get a JNLPRandomAccessFile representation of the file, and 
           // write to it 
           if (fc.getMaxSize() > fc.getLength() && fc.canWrite()) { 
               JNLPRandomAccessFile raf = fc.getRandomAccessFile("rw"); 
               raf.seek(raf.length() - 1); 
               raf.writeUTF("Java Web Start!"); 
               raf.close(); 
           } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

SingleInstanceService サービスの使用

javax.jnlp.SingleInstanceService の提供する一連のメソッドを使用すれば、アプリケーションは自身を単独で登録できます。また、アプリケーションの異なるインスタンスから渡された引数を処理するためのリスナーを登録できます。


import javax.jnlp.*; 
    ... 

    SingleInstanceService sis; 

    ... 

    try { 
        sis = 
(SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
    } catch (UnavailableServiceException e) { sis=null; }

    ...

    
    // Register the single instance listener at the start of your application
    
    SISListener sisL = new SISListener();
    sis.addSingleInstanceListener(sisL);

    ...
    
    
    // Remember to remove the listener before your application exits
    
    sis.removeSingleInstanceListener(sisL);
    System.exit(0);

    
    // Implement the SingleInstanceListener for your application
    
    class SISListener implements SingleInstanceListener {
        public void newActivation(String[] params) {
            
            // your code to handle the new arguments here
            
            ...
        }
    }

ExtendedService サービスの使用

javax.jnlp.ExtendedService は、現在の JNLP API サポートを強化します。このサービスを使用すると、クライアントのファイルシステムで、アプリケーションにより特定のファイルが開かれます。


import javax.jnlp.*; 
    ... 

    ExtendedService es; 

    ... 

    try { 
        es = 
(ExtendedService)ServiceManager.lookup("javax.jnlp.ExtendedService");
    } catch (UnavailableServiceException e) { es=null; }

    ...

    
    // Open a specific file in the local machine
    
    File a = new File("c:\somefile.txt");

    ...
    
    
    // Java Web Start will pop up a dialog asking the user to grant permission
    // to read/write the file c:\somefile.txt
    
    FileContents fc_a = es.openFile(a);

    
    // You can now use the FileContents object to read/write the file
    
    ...

    
    // Open a specific set of files in the local machine
    
    File[2] fArray = new File[2];
    
    fArray[0] = a;
    fArray[1] = new File("c:\anotherFile.txt");

    
    // Java Web Start will pop up a dialog asking the user to grant permission
    // to read/write files in fArray
    
    FileContents[] fc_Array = es.OpenFiles(fArray);

    
    // You can now read/write the set of files in fc_Array using the
    // FileContents objects
    
    }

javaws の使い方の詳細は、「javaws コマンド行インタフェース」を参照してください。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.