モジュール java.desktop
パッケージ javax.print

インタフェースMultiDoc



  • public interface MultiDoc
    MultiDocインタフェースは、Print Job用印刷データの複数部分を提供するオブジェクトに対するインタフェースを指定します。 「Doc」は、「印刷データの一部」を意味する、短く発音しやすい用語で、「multidoc」は、複数docのグループです。 クライアントはPrint JobにMultiDocインタフェースを実装するオブジェクトを渡し、Print Jobはそのオブジェクトに対してメソッドを呼び出して印刷データを取得します。

    MultiDocインタフェースは、docの「リンク・リスト」に類似した抽出を提供します。 multidocオブジェクトは、リンク・リスト内のノードに似ており、リスト内の現行docおよびリスト内の次のノード(multidoc)へのポインタを含みます。 Print JobはmultidocのgetDoc()メソッドを呼び出して、現行のdocを取得できます。 次のdocに進む準備ができたら、Print Jobはmultidocのnext()メソッドを呼び出して、次のmultidoc (次のdocを含む)を取得できます。 このため、multidocへのアクセスを実行するPrint Jobコードは、次のようになります。

          void processMultiDoc(MultiDoc theMultiDoc) {
    
              MultiDoc current = theMultiDoc;
    
              while (current != null) {
                  processDoc (current.getDoc());
                  current = current.next();
              }
          }
     

    MultiDocインタフェースは、規約に従って実装できます。実装内でリンク・リストを使用しなくてもかまいません。

    multidoc印刷ジョブの印刷データすべてを取得する場合、Print Serviceプロキシは次の2つのパターンのどれかを使用できます。

    1. インターリーブ化パターン: 現行のmultidocからdocを取得する。 現行のdocからすべての印刷データ表現オブジェクトを取得する。 印刷データ表現オブジェクトからすべての印刷データを取得する。 現行のmultidocから次のmultidocを取得し、次のmultidocが存在しなくなるまでこの操作を繰り返す。 (上記のコード例はインターリーブ化パターンを使用)
    2. 同時発生パターン: 現行のmultidocからdocを取得してリストに保存する。 現行のmultidocから次のmultidocを取得し、次のmultidocが存在しなくなるまでこの操作を繰り返す。 次に、保存済みのdocのリストに対し繰り返し操作を行う。 現行のdocからすべての印刷データ表現オブジェクトを取得する。 印刷データ表現オブジェクトからすべての印刷データを取得する。 リスト内の次のdocに移動し、次のdocが存在しなくなるまでこの操作を繰り返す
    ここで、印刷クライアントがオンザフライで印刷データを生成中だが、印刷データの複数部分を一度に格納するリソースを保持していない場合について考えてみましょう。 印刷サービス・プロキシが、同時発生パターンを使用して印刷データを取得した場合、そのようなクライアントで問題が発生する可能性があります。これは、印刷サービス・プロキシが復帰して印刷データを要求するまで、docの印刷データすべてを保持することが必要になりますが、クライアントにはそれが不可能なためです。 このようなクライアントの場合、印刷サービス・プロキシは、インターリーブ化パターンを使用する必要があります。

    この問題に対処し、クライアントの設計を簡略化してPrint Jobに複数のdocを提供するため、multidoc印刷ジョブをサポートするPrint Serviceプロキシはすべて、インターリーブ化パターンを使用してMultiDocオブジェクトにアクセスする必要があります。 つまり、MultiDocオブジェクトが指定されると、印刷サービス・プロキシは、現行のDocオブジェクトの取得に成功するまで、getDoc()を1回または複数回呼び出します。 印刷サービス・プロキシは、次に現行docの印刷データを取得しますが、すべての印刷データを取得するか、回復不可能なエラーが発生するまで次の作業に進みません。 作業を続行可能な場合、印刷サービス・プロキシは、次のMultiDocオブジェクトまたはこれ以上オブジェクトが存在しないという指示を取得するまで、next()を1回または複数回呼び出します。 MultiDocインタフェースの実装により、印刷サービス・プロキシがこのインターリーブ化パターンに従うものとみなすことができます。その他の使用パターンの場合、MultiDoc実装の動作は保証されません。

    1つのmultidocに同時にアクセス可能なクライアント・スレッドの数に制限はありません。 このため、MultiDocインタフェースの実装はすべて、複数のスレッドに対して安全に設計する必要があります。 実際、Print Jobスレッドが(概念上の)リストの先頭からdocを取得中に、クライアント・スレッドがリストの最後にdocを追加することがあり得ます。multidocオブジェクトが複数のスレッドを適正に同期させるのであれば、2つのスレッドが相互に干渉することはありません。

    • メソッドの詳細

      • getDoc

        Doc getDoc​()
            throws IOException
        現行のdocオブジェクトを取得します。
        戻り値:
        現行のdocオブジェクト
        例外:
        IOException - ドキュメントの読込み中にエラーが発生した場合にスローされる。
      • next

        MultiDoc next​()
               throws IOException
        docオブジェクト・シーケンス内で次のdocオブジェクトを含むmultidocオブジェクトに移動します。
        戻り値:
        次のdocオブジェクトを含むMultidocオブジェクト。または、次のdocオブジェクトが存在しない場合はnull
        例外:
        IOException - 次のドキュメントの検出中にエラーが発生した場合にスローされる。