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

インタフェースMultiDoc


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

インタフェースMultiDocは、docsの"リンク・リスト"に似た抽象化を提供します。 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の印刷データすべてを保持することが必要になりますが、クライアントにはそれが不可能なためです。 このようなクライアントの場合、印刷サービス・プロキシは、インターリーブ化パターンを使用する必要があります。

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

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

  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    現行のdocオブジェクトを取得します。
    docオブジェクト・シーケンス内で次のdocオブジェクトを含むmultidocオブジェクトに移動します。
  • メソッドの詳細

    • getDoc

      Doc getDoc() throws IOException
      現行のdocオブジェクトを取得します。
      戻り値:
      現在のdocオブジェクト
      例外:
      IOException - 文書を読むときにエラーが発生した場合
    • next

      MultiDoc next() throws IOException
      docオブジェクト・シーケンス内で次のdocオブジェクトを含むmultidocオブジェクトに移動します。
      戻り値:
      次のdocオブジェクトを含むmultidocオブジェクト、またはそれ以上のdocオブジェクトがない場合はnull
      例外:
      IOException - 次の文書の検索中にエラーが発生した場合