7 Oracle JDeveloperを使用したOracle Enterprise Schedulerアプリケーションの生成

この章は、Oracle Enterprise Schedulerを使用してジョブ・リクエストを実行するアプリケーションを作成および実行する方法について説明し、Oracle Enterprise Schedulerを使用するアプリケーションをOracle JDeveloperで作成する方法を示すチュートリアルです。

次に、この章では2つの分割されたアプリケーションである、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)を使用する、サンプル・アプリケーションのバリエーションを示します。

この章の内容は次のとおりです。

7.1 JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法

Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションを開発する場合は、ミドルウェア・ホームの環境変数をOracle JDeveloper自体のインストール場所に設定する必要があります。Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションの開発を始める前に、必ずこの変数を設定してください。

JDeveloperには、スクリーン・リーダー、スクリーン拡大鏡、キーボード・ナビゲーション用の標準ショートカット・キーのサポートなどのアクセシビリティ・オプションが用意されています。フォントのサイズや色、オブジェクトの色や形などを変えて、判読性を高めるためにJDeveloperをカスタマイズすることもできます。JDeveloperでのアクセシビリティについて、およびこれを構成する手順は、『Oracle JDeveloperによるアプリケーションの開発』Oracle JDeveloperのアクセシビリティ情報に関する項を参照してください。

Oracle Enterprise Schedulerアプリケーションをビルドするための環境を設定するには:

  1. コマンド・プロンプトを開きます。
  2. ディレクトリをOracle JDeveloperのインストール場所に変更します。たとえば、Windowsでは次を実行します:
    >cd c:\Oracle\Middleware\jdeveloper
    
  3. MW_HOMEをOracle JDeveloperの場所に設定します。次に例を示します。
    >set MW_HOME=c:\Oracle\Middleware
    
  4. Oracle JDeveloperを起動します。
    >jdeveloper

7.2 Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解

Oracle Enterprise Schedulerアプリケーションを開発するためにOracle JDeveloperでプロジェクトを作成すると、特定のプロジェクト・テクノロジのサポートを指定することで、アプリケーション機能に対する基礎となるサポートが追加されます。

Oracle Enterprise Schedulerアプリケーションの作成の詳細は、「組み合されたOracle Enterprise Schedulerアプリケーションのビルド」および「分割された発行者アプリケーションおよびホスティング・アプリケーションのビルド」を参照してください。

Oracle JDeveloperを使用してアプリケーションを作成する場合は、アプリケーションの要件に応じて、次のテクノロジから選択します。

  • ホスティング・アプリケーションを開発するためのESSホスト・サポート。これには次のものが含まれます。

    • アプリケーション・サポートのためのweblogic-application.xmlの更新。

    • プロジェクト・サポートのためのEJBデプロイメント・プロファイルの更新。

    • アプリケーション・サポートのためのEARデプロイメント・プロファイルの更新。

    • Oracle Enterprise Schedulerライブラリの追加。

    • プロジェクトへのコンテキスト・メニューの追加(プロジェクトを右クリックして「エンタープライズ・スケジューラ・プロパティ」を選択することでアクセスします)。これにより、ejb-jar.xmlプロパティ(論理アプリケーション名、アプリケーション・ポリシー・ストライプ、JPSインターセプタ・アプリケーション名)を変更することが可能になります。

  • クライアント・アプリケーションを開発するためのESSクライアント・サポートであり、次のものが含まれます。

    • アプリケーション・サポートのためのweblogic-application.xmlの更新。

    • プロジェクト・サポートのためのEJBデプロイメント・プロファイルの更新。

    • Oracle Enterprise Schedulerライブラリの追加。

    • プロジェクトへのコンテキスト・メニューの追加(プロジェクトを右クリックして「エンタープライズ・スケジューラ・プロパティ」を選択することでアクセスします)。これにより、ejb-jar.xmlプロパティ(JPSインターセプタ・アプリケーション名)を変更することが可能になります。

  • スケジューラ・アプリケーションを開発するためのESSジョブ・サポート。これには次のものが含まれます。

    • MARプロファイルの作成と更新。

    • プロジェクト・サポートのためのJARデプロイメント・プロファイルの作成。

    • Oracle Enterprise Schedulerライブラリの追加。

7.3 組み合されたOracle Enterprise Schedulerアプリケーションのビルド

このチュートリアルでビルドするEssDemoAppサンプル・アプリケーションには、Oracle Enterprise Scheduler APIを使用してOracle JDeveloperでビルドする完全なアプリケーションが含まれます。

この例では、ホスティング・アプリケーションおよび簡単なJavaジョブ実装を作成します。ここでの例は簡単ですが、そのジョブ・クラスによってExecutableインタフェースが実装され、このインタフェースから、より複雑なJavaジョブがその作業の一部として他のコードを呼び出すことができます。

ジョブ・リクエストをスケジュールするアプリケーションを作成するには、次を実行します:

  • Oracle Enterprise Schedulerでスケジュールして実行するロジックを指定するJavaクラスを作成します。

  • Oracle Enterprise Schedulerメタデータおよびジョブ・リクエストの特性を指定します。

  • Oracle Enterprise Scheduler APIを使用してジョブ・リクエストを指定および発行するJavaアプリケーションを定義します。アプリケーションは、2つのプロジェクトで構成されます。1つはジョブをホストするため、もう1つはジョブを発行するためのものです。

  • Oracle Enterprise Scheduler APIを使用するJavaアプリケーションをアセンブルおよびデプロイします。

  • Oracle Enterprise Scheduler APIを使用するJavaアプリケーションを実行します。

ノート:

この章の説明は、以前に保存したプロジェクトやその他の保存されたOracle JDeveloperがない状態でインストールした、新しいOracle JDeveloperを使用していることを前提としています。Oracle JDeveloperが以前に使用したものである場合、一部の手順がこの章で示す手順と正確には一致しなかったり、手順を短縮し、同じアクションをより少ないステップで実行できることがあります。場合によっては、Oracle JDeveloperの過去の使用に基づき、Oracle JDeveloperで一部のダイアログが表示されません。

Oracle Enterprise Schedulerを使用する場合、アプリケーション・メタデータはMDSを使用して格納されます。MDSを使用するには、MDSユーザーおよびスキーマが構成されたデータベースにアクセスできる必要があります。

Oracle Enterprise Schedulerがスタンドアロン・モードでデプロイされるWebLogic Serverインスタンスも必要です。Oracle Enterprise Schedulerスキーマがインストールされたデータベースにアクセスできる必要があります。

この項では、次の内容について説明します。

7.3.1 EssDemoAppアプリケーションのアプリケーションおよびプロジェクトの作成

Oracle JDeveloperを使用して、アプリケーションおよびそのアプリケーション内のプロジェクト(アプリケーション用のコードとサポート・ファイルが含まれている)を作成します。サンプル・アプリケーションを作成するには、次を実行する必要があります:

  • Oracle JDeveloperでアプリケーションを作成します。

  • Oracle JDeveloperでプロジェクトを作成します。2つのプロジェクトを作成します。1つはHello WorldスタイルのJavaジョブを開発するための、もう1つはジョブによってリクエストを発行するクライアントを開発するためのプロジェクトです。

7.3.1.1 EssDemoAppアプリケーションおよびホスト・プロジェクトの作成方法

Oracle Enterprise Schedulerを使用するには、最初にOracle JDeveloperでアプリケーションを作成する必要があります。ジョブの実行をサポートするホスティング・アプリケーションも作成します。

EssDemoAppアプリケーションおよびホスト・プロジェクトを作成するには:

  1. 「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、Oracle JDeveloperを起動します。

  2. 「ロールの選択」ダイアログで「デフォルトのロール」を選択し、「OK」をクリックします。

  3. 「アプリケーション」メニューをクリックし、次に「新規」をクリックして「ギャラリから」オプションを選択します。

  4. 「アプリケーションの名前付け」ウィンドウで、新規アプリケーションの名前と場所を入力します。

    1. 「新規ギャラリ」ウィンドウで、一般カテゴリ・アプリケーション項目の下にリストされた「カスタム・アプリケーション」を選択し、「OK」をクリックします。

    2. 「アプリケーション名」フィールドで、アプリケーション名を入力します。このサンプル・アプリケーションの場合は、EssDemoAppと入力します。

    3. 「ディレクトリ」フィールドで、デフォルトを使用します。

    4. アプリケーション・パッケージ接頭辞を入力するか、またはデフォルトである接頭辞なしを受け入れます。

      接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。

    5. 「次」をクリックします。

  5. 「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。図7-1を参照してください。

    1. 「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssHostと入力します。

    2. 「プロジェクトの機能」タブの「選択可能」の下で、「ESSホスト・サポート」および「ESSジョブ・サポート」をダブルクリックし、これらがダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。

      これらの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。

    3. 「次」をクリックします。

    図7-1 カスタム・アプリケーションの作成

    図7-1の説明が続きます
    「図7-1 カスタム・アプリケーションの作成」の説明
  6. 「Java設定の構成」ウィンドウの「デフォルト・パッケージ」フィールドに、oracle.esshostと入力します。

    「次」をクリックします。

  7. 「EJB設定の構成」ウィンドウで、次のものを選択します。

    • 「EJBバージョン」の下で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。

    • 「EJBバージョン3.x」の下で、「ejb-jar.xmlをこのプロジェクトで生成します」チェック・ボックスを選択します。

    「次」をクリックします。

  8. 「ESSホスト・サポート設定の構成」ウィンドウの「アプリケーションID」フィールドに、EssDemoAppと入力します。

    「終了」をクリックします。

    「EssDemoApp概要」ページが表示されます。このページのセクションを使用して、作成しているアプリケーションの状況に関する情報を取得し、開発の進捗状況を管理できます。次に、ジョブの作成をサポートするプロジェクトのアーティファクトの作成に進みます。

7.3.1.2 クライアント・プロジェクトの作成方法

前のステップで、ジョブをホストするアプリケーションを開発するプロジェクトを作成しました。この項では、Oracle JDeveloperを使用して、EssDemoAppアプリケーションに別のプロジェクトを作成します。この2番目のプロジェクトでは、クライアントとホスティング・アプリケーションの対話をサポートします。

クライアント・プロジェクトを作成するには:

  1. 「ファイル」メニューをクリックし、「新規」→「プロジェクト」をクリックします。

  2. 「新規ギャラリ」の「カテゴリ」で、「一般」を開き、「プロジェクト」をクリックします。

  3. 「アイテム」で「カスタム・プロジェクト」をクリックし、「OK」をクリックします。

  4. 「プロジェクトの名前付け」ウィンドウで、作成するクライアント・プロジェクトの名前を入力し、サポートするテクノロジを選択します。図7-2を参照してください。

    1. 「プロジェクト名」フィールドに、クライアント・プロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssClientと入力します。

    2. 「プロジェクトの機能」タブの「選択可能」の下で、次の項目をダブルクリックし、ダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。

      ESSクライアント・サポート

      HTMLおよびCSS

      JSF

      SPおよびサーブレット

      XML

      この詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。

    3. 「次」をクリックします。

    図7-2 カスタム・プロジェクトの作成

    図7-2の説明が続きます
    「図7-2 カスタム・プロジェクトの作成」の説明
  5. 「Java設定の構成」ウィンドウの「デフォルト・パッケージ」フィールドに、oracle.essclientと入力します。

    「次」をクリックします。

  6. 「EJB設定の構成」ウィンドウで、次のものを選択します。

    • 「EJBバージョン」の下で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。

    「次」をクリックします。

  7. 「ESSクライアント・サポート設定の構成」ウィンドウの「アプリケーションID」フィールドで、EssDemoAppが表示されていることを確認します。

    「終了」をクリックします。

7.3.2 EssDemoAppアプリケーションのメタデータおよび実装クラスの作成

ここで追加するJavaジョブの場合は、実装クラスによって、ジョブのロジック、つまり、ジョブの実際の作業を実行するコードが実装されます。クラスによってoracle.as.scheduler.Executableインタフェースが実装されます。インタフェースのexecuteメソッドによって、ジョブのロジックを追加できる場所が提供されます。この例のコードは非常に簡単ですが、executeメソッドは、Javaジョブがアクセスできるコードへ続く処理の開始点としても使用できます。

PL/SQLやプロセス・ジョブなどの他のジョブ・タイプと同様に、メタデータがJavaジョブの作業のガイドとなります。このメタデータによって、Oracle Enterprise Scheduler定義のシステム・プロパティ、ユーザーが作成するプロパティ、およびメタデータにアクセスできるユーザーの制御を含めることができる、ジョブ固有のコンテキストが形成されます。たとえば、メタデータを使用して、インスタンス・データを収集してダウンストリームのコードに渡すことができます。

EssDemoAppサンプル・アプリケーションを使用してジョブ・リクエストを発行するには、次のものを作成する必要があります。

  • Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位となる、ジョブ定義の形式のメタデータ

  • Javaジョブ実装クラス

7.3.2.1 EssDemoAppアプリケーションのメタデータの作成方法

この項では、Oracle JDeveloperを使用してジョブ定義メタデータおよびJavaジョブの簡単な実装クラスを作成します。

アプリケーションのメタデータを作成するには:

  1. アプリケーション・ナビゲータで、EssHostプロジェクトを選択します。

  2. [Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。

  3. 「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。

  4. 図7-3に示すように、「アイテム」領域で「ジョブ定義」を選択します。

    図7-3 サンプル・アプリケーションへのジョブ・タイプ・メタデータの追加

    サンプル・アプリケーションへのジョブ定義メタデータの追加
  5. 「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。

  6. 「ジョブ定義の作成」ダイアログで、次を指定します。

    1. 「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDefinitionを入力します。

    2. 「パッケージ」フィールドに、パッケージ名を入力します。この例では、/oracle/esshost/metadataと入力します。

      メタデータ・パッケージ名で名前を区切るには、ドットではなくスラッシュを使用する必要があります。「.metadata」で終わるメタデータ・パッケージは、Oracle JDeveloperでは表示されません。

    3. 「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。

      ドロップダウンにジョブ・タイプが表示されない場合は、「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、Oracle JDeveloperを起動したことを確認します。

    4. 「Javaクラスの作成」チェック・ボックスおよび「同期」オプション・ボタンが選択されていることを確認します。

      「Javaクラスの作成」チェック・ボックスを選択することにより、JavaジョブのJavaクラスの作成を要求し、後で作成する手間を省くことができます。「同期」オプションを選択することによって、そのジョブが同期Javaジョブになることを指定します。

    5. 「Javaクラス」で、作成するJavaクラスの詳細を指定します。「Javaパッケージ」フィールドに、パッケージ名(ここでは、oracle.esshost.impl)を入力します。図7-4に示すように、「クラス名」フィールドに、クラスの名前(ここでは、HelloWorldImpl)を入力します。

      図7-4 ジョブ定義作成ウィザードによるジョブ定義の作成

      ジョブ定義の作成
    6. 「OK」をクリックします。

      要求したJavaクラスがHelloWorldJobDefinition.xmlファイルとともに作成されます。Oracle JDeveloperでXMLファイルのコンテンツが「ジョブ定義」ページに表示されます。

      「ジョブ定義」ページで、ジョブのパラメータ、メタデータへのアクセスおよびローカライズに使用するリソース・バンドルを指定するプロパティを含むジョブ定義メタデータを編集できます。

  7. 「ジョブ定義」ページの「説明」フィールドに、ジョブ・タイプの説明を入力します。この例では、Sample Java Job Definitionと入力します。

    残りのメタデータは変更しません。

  8. 「アプリケーション・ナビゲータ」で、プロジェクト・パネルの項目を「EssHost」→「アプリケーション・ソース」→「oracle.esshost.impl」→「HelloWorldImpl.java」の順に開き、作成したクラスを検索します。

  9. ソース・エディタでHelloWorldImpl.javaを開きます。

  10. ソース・エディタで、簡単なコードを追加してexecuteメソッドを実装します。executeメソッドは、Javaジョブの実行が開始される場所です。HelloWorldImplクラスは、例7-1のように表示されます。

  11. HelloWorldImpl.javaを保存して閉じます。

例7-1 Executeメソッドが実装されたHelloWorldImpl

public class HelloWorldImpl implements Executable, Cancellable
{
  public void execute(RequestExecutionContext ctx, RequestParameters params)
    throws ExecutionErrorException, ExecutionWarningException,
           ExecutionCancelledException, ExecutionPausedException
  {
      System.out.println("**** Sample Job Running, Request ID: " +
          ctx.getRequestId());
  }
 
  public void cancel()
  {
  }
}

7.3.3 ジョブ・リクエストを発行するアプリケーション・コードの追加

Oracle Enterprise Schedulerアプリケーションでは、アプリケーションのいずれかのコンポーネントからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppサンプル・アプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。

7.3.3.1 ジョブ・リクエストを発行するアプリケーション・コードの追加方法

この項では、ジョブ発行リクエストを受信するためのサーブレットを作成します。

ジョブ・リクエストの発行をサポートするサーブレットを追加するには:

  1. 「アプリケーション・ナビゲータ」で、EssClientプロジェクトを選択します。

  2. [Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。

  3. 「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。

  4. 図7-5に示すように、「アイテム」領域で「HTTPサーブレット」を選択します。

    図7-5 サンプル・アプリケーションへのジョブ・タイプ・メタデータの追加

    サンプル・アプリケーションへのジョブ定義メタデータの追加
  5. 「OK」をクリックします。「HTTPサーブレット作成」ウィザードが表示されます。

  6. 「ようこそ」ページで「次へ」をクリックします。

  7. 「HTTPサーブレット作成 - ステップ2/4: サーブレット情報」ページで、次のように指定します。

    1. 「クラス」フィールドに、サーブレット・クラスの名前を入力します。この例では、名前EssDemoを入力します。

    2. 「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle.essclient.servletと入力します。

    3. 「作成するコンテンツ・タイプ」フィールドのドロップダウン・リストで、「HTML」が選択されていることを確認します。

    4. 図7-6に示すように、「実装するメソッド」領域で、「doGet()」および「doPost()」チェック・ボックスを選択します。

      図7-6 サーブレットの作成 -- ステップ2/4

      サンプル・アプリケーションへのジョブ定義メタデータの追加
    5. 「登録」領域で、「構成ファイル(web.xml)」ラジオ・ボタンを選択します。

    6. 「次」をクリックします。

  8. 「HTTPサーブレット作成 - ステップ3 / 4: マッピング情報」ページで、次のように指定します。

    1. 「名前」フィールドに、サーブレットの名前を入力します。この例では、名前EssDemoを入力します。

    2. 「URLパターン」フィールドに、サーブレットのマッピングのURLを入力します。この例では、/essdemo/*と入力します。

    3. 「終了」をクリックします。

    提供されたEssDemoアプリケーションには、完了したサーブレットが含まれています。ソース・コードをプロジェクトにコピーする必要があります。これを行うには、Oracle JDeveloperで、サーブレットのコンテンツをサンプル・アプリケーションに用意されているファイルEssDemo.javaのコンテンツで置き換えます。

7.3.4 Oracle Enterprise Schedulerプロパティの設定

Oracle Enterprise Schedulerプロパティでは、アプリケーションに関連付けられているejb-jar.xmlファイルで使用される設定の値を設定します。それらのプロパティは、次のとおりです。

  • 論理アプリケーション名

    アプリケーションを識別するために使用される論理名を指定します。アプリケーションをコンテナにデプロイするときに使用されるアプリケーション名とは区別します。この値を使用すると、論理アプリケーション名をソース・コードに安全にハードコードできます。

  • アプリケーション・ポリシー・ストライプ

    セキュリティ・チェックを実行するために使用されるJPSセキュリティ・ストライプ(またはセキュリティ・コンテキスト)を指定します。

  • JPSインターセプタ・アプリケーション名

    適用可能なセキュリティ・ポリシーのセットを判別するために実行時に使用される、アプリケーション・ストライプ名を指定します。

7.3.4.1 アプリケーションのOracle Enterprise Schedulerプロパティを設定する方法

この項では、Oracle Enterprise Schedulerプロパティのデフォルト値を設定します。

Oracle Enterprise Schedulerプロパティの値を設定するには:

  1. 「アプリケーション・ナビゲータ」でEssHostプロジェクトを右クリックし、「エンタープライズ・スケジューラ・プロパティ」をクリックします。
  2. 「エンタープライズ・スケジューラ・プロパティ」ダイアログで、表示される3つのフィールド「論理アプリケーション名」「アプリケーション・ポリシー・ストライプ」および「JPSインターセプタ・アプリケーション名」すべてにEssDemoAppと入力します。
  3. 「OK」をクリックします。

図7-7 Oracle Enterprise Schedulerプロパティの値の設定

図7-7の説明が続きます
「図7-7 Oracle Enterprise Schedulerプロパティの値の設定」の説明

7.3.5 EssDemoAppアプリケーションのアセンブル

サンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。

アプリケーションをアセンブルするには、次を実行します:

  • EJB JARファイルを作成します。

  • アプリケーションMARファイルを作成します。

  • アプリケーションEARファイルを作成します。

  • WARファイル・オプションを更新します。

7.3.5.1 EssDemoAppのEJB-JARデプロイメント・プロファイルの作成方法

サンプル・アプリケーションには、必要なEJBディスクリプタが含まれている必要があります。ejb-jar.xmlおよびweblogic-ejb-jar.xmlファイルを作成し、これらのファイルを、作成したJava実装クラスとともに含める必要があります。

Oracle Enterprise Schedulerがアプリケーションのかわりにジョブ・リクエストを実行している間にアプリケーションのエントリ・ポイントを検出できるように、Oracle Enterprise Schedulerには、EJB JARをアセンブルおよび提供するアプリケーションが必要です。このEJB jarでは、ejb-jar.xmlおよびweblogic-ejb-jarに必要なEJBディスクリプタがあること、およびOracle Enterprise Schedulerに対して発行されるすべてのJavaクラス実装が必要です。ディスクリプタ・ファイルejb-jar.xmlおよびweblogic-ejb-jarには、Oracle Enterprise Scheduler EJBについての記述が含まれている必要があり、これらのファイルは変更できません。

EJB-JARデプロイメント・プロファイルを作成するには:

  1. 「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、EssHostプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
  2. 「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
  3. 「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
  4. 「デプロイメント・プロファイルの作成」ダイアログで、「プロファイル・タイプ」ドロップダウンから「EJB JARファイル」を選択します。
  5. 「名前」フィールドに、EJBの名前を入力します。この例では、ess-ejbと入力します。
  6. 「OK」をクリックします。

    図7-8 EJB-JARデプロイメント・プロファイルの作成

    図7-8の説明が続きます
    「図7-8 EJB-JARデプロイメント・プロファイルの作成」の説明
  7. 「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲータで、「一般」をクリックします。
  8. 「一般」ウィンドウで、「エンタープライズ・アプリケーション名」フィールドにEssDemoAppと入力します。
  9. ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「コントリビュータ」の順に開きます。
  10. 「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
    • プロジェクトの出力ディレクトリ

    • プロジェクトのソースパス

    • プロジェクトの依存性

  11. ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「フィルタ」の順に開きます。
  12. 「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
    • META-INF(およびそのコンテンツ)

    • oracle (およびそのコンテンツ)

  13. 「JARオプション」ウィンドウで、「Manifestファイルを含める」項目を選択解除します。
  14. 「OK」をクリックします。
  15. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
7.3.5.2 WARアーカイブ・オプションの更新方法

この項では、Oracle JDeveloperでWARファイルの生成に使用できる情報を指定します。

WARアーカイブ・オプションを更新するには:

  1. 「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、EssClientプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
  2. 「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
  3. 「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
  4. 「デプロイメント・プロファイルの作成」ダイアログで、「アーカイブ・タイプ」ドロップダウンから「WARファイル」を選択します。
  5. 「名前」フィールドにWAR_EssDemoAppと入力します。
  6. 「OK」をクリックします。
  7. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲータで、「一般」をクリックします。
  8. 「WARオプション」ウィンドウで、「manifestファイルを含める(META-INF/MANIFEST.MF)」を選択解除します。
  9. 「一般」ウィンドウで、「Java EE Webコンテキスト・ルートを指定」オプションを選択します。オプションの下のフィールドに、EssDemoAppと入力します。
  10. ナビゲータで、「ファイル・グループ」→「Webファイル」→「コントリビュータ」の順に開きます。
  11. 「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します(図7-9を参照)。
    • プロジェクトの出力ディレクトリ

    • プロジェクトのHTMLルート・ディレクトリ

    • プロジェクトのソースパス

    図7-9 WARアーカイブ・オプションの更新

    図7-9の説明が続きます
    「図7-9 WARアーカイブ・オプションの更新」の説明
  12. ナビゲータで、「ファイル・グループ」→「Webファイル」→「フィルタ」の順に開きます。
  13. 「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
    • oracle (およびそのコンテンツ)

    • WEB-INF (およびそのコンテンツ)

    「OK」をクリックします。

  14. 「プロジェクト・プロパティ」「ライブラリとクラスパス」ウィンドウに移動します。「ライブラリの追加」ボタンを使用して、次のライブラリを追加します。
    • ADF共通ランタイム

    • ADF Facesランタイム11

    • ADF共通Webランタイム

    • ADFページ・フロー・ランタイム

    • ADFコントローラ・スキーマ

    • ADFコントローラ・ランタイム

7.3.5.3 アプリケーションMARファイルの作成

MARオプションを作成するには:

  1. 「アプリケーション」メニューをクリックし、「アプリケーションのプロパティ」をクリックします。
  2. 「アプリケーションのプロパティ」ダイアログのナビゲーション・ペインで、「デプロイメント」をクリックします。
  3. 「デプロイメント・プロファイル」ウィンドウで、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
  4. ドロップダウン・メニューからMARファイル・オプションを選択し、デプロイメント・プロファイルの名前としてMAR_EssDemoAppを入力します。
  5. 「OK」をクリックします。
  6. 「MARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲーション・ペインで、「メタデータ・ファイル・グループ」→「ユーザー・メタデータ」に移動します。
  7. EssDemoApp/EssHost/essmetaディレクトリを追加します。

    これにより、アプリケーションについて適切なOracle Enterprise Schedulerユーザー・メタデータが選択されます。

  8. 「OK」をクリックします。
  9. 「MARデプロイメント・プロファイルのプロパティの編集」ウィンドウで「編集」をクリックします。
  10. 「メタデータ・ファイル・グループ」→「ユーザー・メタデータ」→「ディレクトリ」に移動し、「ディレクトリ」を選択します。ツリーの最下部のディレクトリを選択します。デフォルト値を選択します。

    これは、ネームスペースの作成元のディレクトリです。たとえば、oracleを選択すると、ネームスペースはoracleになります。productディレクトリを選択すると、ネームスペースはoracle/apps/productになります。ネームスペース/oracle/esshost/metadataを作成するには、metadataディレクトリをクリックします。このダイアログで選択するフォルダによって、adf-config.xmlファイルの最上位レベルのネームスペースが決定されます。

  11. 「OK」をクリックします。
7.3.5.4 EARオプションの更新方法

この項では、EssDemoAppサンプル・アプリケーションをアセンブルするEARファイルを準備します。EARアーカイブは次のもので構成されます。

  • Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JAR。

  • EssDemoサーブレットを含むWARアーカイブ。

EARオプションを更新するには:

  1. 「アプリケーション」メニューをクリックし、「アプリケーションのプロパティ」をクリックします。
  2. 「アプリケーションのプロパティ」ダイアログのナビゲーション・ペインで、「デプロイメント」をクリックします。
  3. 「デプロイメント」ウィンドウで、「新規」をクリックします。
  4. 「デプロイメント・プロファイルの作成」ダイアログで、ドロップダウン・メニューから「EARファイル」を選択します。「名前」フィールドで、デプロイメント・プロファイルの名前としてEAR_EssDemoAppと入力します。

    「OK」をクリックします。

  5. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲーション・ペインで、「アプリケーション・アセンブリ」をクリックします。
  6. 「アプリケーション・アセンブリ」ウィンドウの「Java EEモジュール」で、すべての項目のチェック・ボックスが選択されていることを確認します。
  7. 「EARオプション」ウィンドウで、「manifestファイルを含める」を選択し、EssHost/src/META-INF/MANIFEST.MFを追加します。
  8. 「OK」をクリックします。
  9. 「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。

図7-10 EARアーカイブ・オプションの更新

図7-10の説明が続きます
「図7-10 EARアーカイブ・オプションの更新」の説明
7.3.5.5 アプリケーションのセキュリティの構成

EssApplicationRoleロールに割り当てられるユーザーを作成する必要があります。次のステップは、バックエンド・ホスティング・アプリケーションのセキュリティを構成する方法を示しています。

  1. メイン・メニューから、「アプリケーション」「保護」「ADFセキュリティの構成」の順に選択します。
  2. 「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択し、「次へ」をクリックします。
  3. 「認証タイプ」ページで、「Webプロジェクト」ドロップダウンから「EssClient.jpr」を選択します。
  4. 「HTTP Basic認証」を選択します。
  5. 「終了」をクリックします。

    jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」および「META-INF」を開いて確認できます。このファイルには、アプリケーションに基づいて名前が付けられたセキュリティ・コンテキストまたはセキュリティ・ストライプが含まれています。

  6. メイン・メニューから、「アプリケーション」「保護」「テスト・ユーザーとロール」の順に選択します。

    jazn-data.xmlという名前のファイルが生成されます。

  7. jazn-data.xmlファイルの概要エディタで、「ユーザー」リストの「追加」ボタンをクリックします。

    名前をEssUserに設定し、パスワードをwelcome1に設定します。

  8. 「アプリケーション・ロール」ナビゲーション・タブをクリックして、「アプリケーション・ロール」ウィンドウを開きます(図7-11を参照)。

    図7-11 「アプリケーション・ロール」ウィンドウ

    図7-11の説明が続きます
    「図7-11 「アプリケーション・ロール」ウィンドウ」の説明
  9. 「ロール」リスト内の「追加」ボタンをクリックして、「新しいロールの追加」を選択します。
  10. 名前をEssApplicationRoleに設定します。
  11. 「マッピング」タブ内の「追加」ボタンをクリックして、「ユーザーの追加」を選択します。
  12. 「EssUser」を選択して「OK」をクリックします。
7.3.5.6 ジョブ定義でのESSアプリケーション・ロールに対するリソース権限の追加

次のステップは、ESSアプリケーション・ロールに対するリソース権限を追加してジョブ定義を更新する方法を示しています。

  1. HelloWorldJobDefinition.xmlの「ジョブ定義」ページの「説明」フィールドに、HelloWorld Exampleと入力します。
  2. 「システム・プロパティ」セクションで、「追加」ボタンをクリックします。
  3. 「システム・プロパティの追加」ダイアログで、「名前」ドロップダウン・メニューからSYS_effectiveApplicationを選択します。
  4. 「初期値」フィールドに、EssDemoAppと入力します。
  5. 「OK」をクリックします。
  6. 「アクセス制御」セクションで、「追加」ボタンをクリックします。
  7. 「アクセス制御の追加」ダイアログで、「ロール」ドロップダウン・メニューのEssApplicationRoleを選択します。これは、「アプリケーションのセキュリティの構成」で作成したロールです。
  8. 「読取り」および「実行」アクションを選択します。
  9. 「OK」をクリックします。
  10. 生成されたファイルのコンテンツが例7-2と同じであることを確認します。

例7-2 jazn-data.xml

<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?>
<jazn-data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/jazn-data.xsd">
  <jazn-realm default="jazn.com">
   <realm>
    <name>>Username / password is: EssUser / welcome1</name>
     <users>
      <user>
       <name>EssUser</name>
       <credentials>{903}LmqEdVs3zO0/QmP90tihXv4nRq5YqYSL</credentials>
      </user>
     </users>
    </realm>
   </jazn-realm>
   <policy-store>
    <applications>
     <application>
      <name>EssDemoApp</name>
      <app-roles>
       <app-role>
        <name>EssApplicationRole</name>                                      
        <class>oracle.security.jps.service.policystore.ApplicationRole</class>
        <members>
         <member>                                   
        <class>oracle.security.jps.internal.core.principals.JpsXmlUserImpl</class>
          <name>EssUser</name>
         </member>
        </members>
       </app-role>
      </app-roles>
     <jazn-policy>
      <grant>
       <grantee>
        <principals>
         <principal>                                    
          <class>oracle.security.jps.service.policystore.ApplicationRole</class>
          <name>EssApplicationRole</name>
         </principal>
        </principals>
       </grantee>
       <permissions>
        <permission>                            
                    <class>oracle.as.scheduler.security.MetadataPermission</class>                            
        <name>oracle.esshost.metadata.JobDefinition.HelloWorldJobDefinition</name>
         <actions>Read,Update,Delete,Execute</actions>
        </permission>
       </permissions>
      </grant>
     </jazn-policy>
    </application>
   </applications>
  </policy-store>
 <system-policy/>
</jazn-data> 
7.3.5.7 weblogic-application.xmlファイルの構成

ソース・エディタを使用して、weblogic-application.xmlから次の行を削除します。

<library-ref>
  <library-name>oracle.applcp.runtime</library-name>
</library-ref>
<library-ref>
  <library-name>oracle.xdo.runtime</library-name>
</library-ref>
7.3.5.8 EssHost MANIFESTファイルの更新

EssHost META-INF/MANIFEST.INFファイルのコンテンツを次の行と置き換えます。

Manifest-Version: 1.0
Weblogic-Application-Version: 3.0
Extension-List: essruntime
essruntime-Extension-Name: oracle.ess.runtime
essruntime-Specification-Version: 12
7.3.5.9 「レルム」フィールドの変更

「EssClient」「Webコンテンツ」「WEB-INF」「web.xml」の順に移動します(図7-12を参照)。「セキュリティ」ウィンドウの「レルム」フィールドの次の値を変更します。

  • jazn.com

変更後:

  • Username / password is: EssUser / welcome1

図7-12 「レルム」フィールドの変更

図7-12の説明が続きます
「図7-12 「レルム」フィールドの変更」の説明
7.3.5.10 EssDemoAppアプリケーションのadf-config.xmlファイルの編集
  1. 「アプリケーション・リソース」パネルで、「ディスクリプタ」「ADF META-INF」を開き、adf-config.xmlをダブルクリックします。
  2. ソース・エディタで、adf-config.xmlファイルのコンテンツを例7-3に示すXMLコードで置き換えます。

例7-3 EssDemoAppアプリケーションのadf-config.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:sec="http://xmlns.oracle.com/adf/security/config">
  <sec:adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config">
    <CredentialStoreContext credentialStoreClass="oracle.adf.share.security.providers.jps.CSFCredentialStore"                         credentialStoreLocation="../../src/META-INF/jps-config.xml"/>
    <sec:JaasSecurityContext initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactory"                            jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext"
    authorizationEnforce="false" authenticationRequire="true"/>
  </sec:adf-security-child>
  <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
    <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config">
      <persistence-config>
        <metadata-namespaces>
          <namespace path="/oracle/as/ess/core" metadata-store-usage="ess-core"/>
        </metadata-namespaces>
        <metadata-store-usages>
          <metadata-store-usage id="ess-core" deploy-target="false"                 default-cust-store="false">
            <metadata-store                class-name="oracle.mds.persistence.stores.db.DBMetadataStore">
              <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/>
              <property name="repository-name" value="mds-ESS_MDS_DS"/>
              <property name="partition-name" value="essapp-internal-partition"/>
            </metadata-store>
          </metadata-store-usage>
        </metadata-store-usages>
      </persistence-config>
    </mds-config>
  </adf-mds-config>
</adf-config>

7.3.6 EssDemoAppアプリケーションのデプロイおよび実行

EssDemoAppアプリケーションをビルドおよびアセンブルするステップを完了した後、Oracle WebLogic Serverにアプリケーションをデプロイする必要があります。アプリケーションを正常にデプロイした後、アプリケーションを実行できます。EssDemoAppサンプル・アプリケーションでは、ブラウザを使用してEssDemoサーブレットを実行し、Oracle WebLogic Serverで実行中のOracle Enterprise Schedulerにジョブ・リクエストを発行します。

7.3.6.1 EssDemoAppアプリケーションのデプロイ方法

EssDemoAppアプリケーションをデプロイするには、正しく構成され実行されているOracle WebLogic Server、およびアクティブなメタデータ・サーバーが必要です。アプリケーションをデプロイすると、Oracle JDeveloperで「デプロイメント構成」ページが表示されます。ドロップダウン・リストからリポジトリを選択し、パーティション名を入力します(パーティション名はデフォルトでアプリケーション名に設定されます)。

EssDemoAppアプリケーションをデプロイするには:

  1. Oracle WebLogic Serverが起動され、実行中であることを確認します。Oracle WebLogic Serverが実行中でない場合は、サーバーを起動します。Oracle JDeveloperにサーバーへの接続があることを確認します(例: MyConnection)。

  2. 「アプリケーション・ナビゲータ」で、EssDemoAppアプリケーションを選択します。

  3. 「アプリケーション・ナビゲータ」で、「アプリケーション・メニュー」から「デプロイ」→「EAR_EssDemoApp」「デプロイ先」「MyConnection」の順に選択します。

  4. Oracle JDeveloperで「デプロイメント構成」ページが表示されます。「メタデータ・リポジトリ」で適切なオプションを選択します。

  5. デプロイメント時に要求された場合次の選択をします。「メタデータ・リポジトリ」セクションで、次および図7-13に示すようにリポジトリおよびパーティション名を選択します。

    1. リポジトリ名: mds-ESS_MDS_DS

    2. パーティション名: essUserMetadata

    図7-13 「Oracleデプロイメント構成」ウィンドウ

    図7-13の説明が続きます
    「図7-13 「Oracleデプロイメント構成」ウィンドウ」の説明
  6. 「デプロイ」をクリックします。

  7. デプロイメント・ログを使用してデプロイメントを確認します。

7.3.6.2 EssDemoAppサンプル・アプリケーションの実行方法

EssDemoAppサンプル・アプリケーションを実行するには、ブラウザでEssDemoサーブレットにアクセスします。

EssDemoサーブレットにアクセスするには:

  1. ブラウザに次のURLを入力します。

    http://host:http-port/context-root/essdemo

    次に例を示します。

    http://myserver.example.com:7101/EssDemoApp/essdemo
    

    図7-14に示すように、EssDemoサーブレットが表示されます。

    図7-14 Oracle Enterprise Schedulerサンプル・アプリケーションのEssDemoサーブレットの実行

    サンプル・アプリケーションのEssDemoサーブレットの実行
  2. 「ジョブ」ドロップダウン・メニューからジョブ定義を選択します。
  3. 「スケジュール」ドロップダウン・メニューから値を選択します。
  4. 「送信」をクリックします
  5. ブラウザをリフレッシュして、図7-15に示すように、「リクエスト・ステータス」領域でジョブの進捗状況を確認します。

    図7-15 発行されたリクエストのリクエスト・ステータスが示された、実行中のEssDemoサーブレット

    発行されたリクエストのリクエスト・ステータスを含むEssDemoサーブレットの実行
7.3.6.3 EssDemoAppサンプル・アプリケーションでのジョブのパージ方法

EssDemoAppサンプル・アプリケーションおよびEssDemoサーブレットを使用して、完了したジョブを「リクエスト・ステータス」リストから削除できます。

完了したジョブを削除するには:

  1. リクエストをパージするには、「パージ」をクリックします。
  2. RUNNINGまたはWAITINGのリクエストを取り消すには、「取消」をクリックします。

7.4 分割された発行者アプリケーションおよびホスティング・アプリケーションのビルド

Oracle Enterprise Schedulerアプリケーションをビルドおよびデプロイする場合、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)の2つの分割されたアプリケーションを使用できます。この設計を使用する場合、各アプリケーションは、このような分割構成をサポートするオプションを使用して構成およびデプロイする必要があります。

さらに、一部のOracle Enterprise Schedulerデプロイメントでは、ホスティング・アプリケーションと発行元アプリケーションに別のOracle WebLogic Serverを使用します。このデプロイメント・オプションでは、発行元アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serverにデプロイされます。Oracle Enterprise Schedulerの発行者アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serversで実行される場合は、発行元アプリケーションがホスティング・アプリケーションを検出できるようにホスティング・アプリケーションのOracle WebLogic Serverを構成する必要があります。

ノート:

この項では、新しいアプリケーションを作成します。「EssDemoAppアプリケーションのアプリケーションおよびプロジェクトの作成」で開始する項でEssDemoAppを作成した場合、この項で同じ名前のプロジェクトを作成することに注意してください。この項でEssDemoAppのアプリケーション名を使用するには、アプリケーションに対して異なる場所を選択するか、または前のアプリケーションを削除する必要があります。

サンプルの分割されたアプリケーションをビルドするには、次を実行します:

  1. スケジュールおよび実行されるコードを含むバックエンドのホスティング・アプリケーションをビルドします。
  2. ジョブ・リクエストを開始するフロントエンドの発行者アプリケーションをビルドします。

7.4.1 EssDemoAppのバックエンドのホスティング・アプリケーションを作成する方法

Oracle JDeveloperを使用して、バックエンドのアプリケーションを作成します。EssDemoAppのバックエンドのサンプル・アプリケーションを作成するには、次を実行します:

  • バックエンドのアプリケーションおよびプロジェクトを作成します。

  • セキュリティを構成します。

  • デプロイメント・ディスクリプタを定義します。

  • Oracle Enterprise Schedulerのexecutableインタフェースを実装するJavaクラスを作成します。

  • ジョブを記述するOracle Enterprise Schedulerメタデータを作成します。

  • アプリケーションをアセンブルします。

  • アプリケーションをデプロイします。

7.4.1.1 バックエンドのホスティング・アプリケーションの作成

分割されたアプリケーションでOracle Enterprise Schedulerを使用するには、Oracle JDeveloperを使用してバックエンドのアプリケーションおよびプロジェクトを作成し、Oracle Enterprise Schedulerの拡張機能をプロジェクトに追加します。

バックエンドのホスティング・アプリケーションを作成するには:

  1. JDeveloperのメイン・メニューから、「ファイル」「新規」を選択します。

  2. 「新規ギャラリ」で「一般」を開き、「アプリケーション」「カスタム・アプリケーション」を選択し、「OK」をクリックします。

  3. 汎用アプリケーションの作成ウィザードの「アプリケーションの名前付け」ページで、「アプリケーション名」フィールドをEssDemoAppに設定します。

  4. 「次」をクリックします。

  5. 「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。

    1. 「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、SuperEssと入力します。

    2. 「プロジェクトの機能」タブの「選択可能」で、「ESSホスト・サポート」および「ESSジョブ・サポート」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。

      これらの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。

    3. 「次」をクリックします。

    図7-16 バックエンドのホスティング・アプリケーションの作成

    図7-16の説明が続きます
    「図7-16 バックエンドのホスティング・アプリケーションの作成」の説明
  6. 「Java設定の構成」ページで、デフォルト・パッケージをoracle.apps.ess.howtoに変更し、「次へ」をクリックします。

  7. 「EJB設定の構成」ページで、「ejb-jar.xmlをこのプロジェクトで生成します」を選択し、「次へ」をクリックします。

  8. 「ESSホスト・サポート設定の構成」ページで、「アプリケーションID」フィールドにEssDemoAppと入力します。

  9. 「終了」をクリックします。

7.4.1.2 バックエンドのホスティング・アプリケーションのセキュリティの構成

EssDempAppRoleロールに割り当てられたユーザーを作成する必要があります。

バックエンドのホスティング・アプリケーションのセキュリティを構成するには:

  1. メイン・メニューから、「アプリケーション」「保護」「ADFセキュリティの構成」の順に選択します。
  2. 「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択し、「次へ」をクリックします。
  3. このアプリケーションには保護するWebモジュールがないため、「認証タイプ」ページでデフォルト値をそのまま使用します。
  4. 「終了」をクリックします。

    jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」「META-INF」を開いて確認できます。このファイルには、アプリケーションに基づいて名前が付けられたセキュリティ・コンテキストまたはセキュリティ・ストライプが含まれています。

  5. メイン・メニューから、「アプリケーション」「保護」「テスト・ユーザーとロール」の順に選択します。

    jazn-data.xmlという名前のファイルが生成されます。

  6. jazn-data.xmlファイルの概要エディタで、「ユーザー」リストの「追加」ボタンをクリックします。
  7. 名前をEssDemoAppUserに設定し、パスワードをwelcome1に設定します。
  8. 「アプリケーション・ロール」ナビゲーション・タブをクリックします。
  9. 「ロール」リスト内の「追加」ボタンをクリックして、「新しいロールの追加」を選択します。
  10. 名前をEssDemoAppRoleに設定します。
  11. 「マッピング」タブ内の「追加」ボタンをクリックして、「ユーザーの追加」を選択します。
  12. EssDemoAppUserを選択し、「OK」をクリックします。

    図7-17 セキュリティの構成

    図7-17の説明が続きます
    「図7-17 セキュリティの構成」の説明
7.4.1.3 バックエンドのホスティング・アプリケーションのメタデータの定義

Oracle Enterprise Schedulerの分割されたアプリケーションを使用してジョブ・リクエストを発行するには、次を含むジョブ・リクエストを定義するメタデータを作成する必要があります。

  • ジョブ・タイプ: 実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。

  • ジョブ定義: Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。

バックエンドのホスティング・アプリケーションのメタデータを作成するには:

  1. 「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを選択します。

  2. [Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。

  3. 「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。

  4. 図7-18に示すように、「アイテム」領域で「ジョブ定義」を選択します。

    図7-18 サンプル・アプリケーションへのジョブ定義の追加

    サンプル・アプリケーションへのジョブ定義メタデータの追加
  5. 「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。

  6. 「ジョブ定義の作成」ダイアログで、次を指定します(図7-19を参照)。

    1. 「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDefを入力します。

    2. 「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle/apps/ess/howto/metadataと入力します。

    3. 「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。

      ドロップダウンにジョブ・タイプが表示されない場合は、「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、Oracle JDeveloperを起動したことを確認します。

    4. 「Javaクラスの作成」チェック・ボックスおよび「同期」オプション・ボタンが選択されていることを確認します。

      「Javaクラスの作成」チェック・ボックスを選択することにより、JavaジョブのJavaクラスの作成を要求し、後で作成する手間を省くことができます。「同期」オプションを選択することによって、そのジョブが同期Javaジョブになることを指定します。

    5. 「Javaクラス」で、作成するJavaクラスの詳細を指定します。「Javaパッケージ」フィールドに、パッケージ名(ここでは、oracle.apps.ess.howto)を入力します。「クラス名」フィールドに、クラスの名前(ここでは、HelloWorldJob)を入力します。

    6. 「OK」をクリックします。

      要求したJavaクラスがHelloWorldJobDefinition.xmlファイルとともに作成されます。Oracle JDeveloperでXMLファイルのコンテンツが「ジョブ定義」ページに表示されます。

      「ジョブ定義」ページで、ジョブのパラメータ、メタデータへのアクセスおよびローカライズに使用するリソース・バンドルを指定するプロパティを含むジョブ定義メタデータを編集できます。

      図7-19 ジョブ定義の作成

      図7-19の説明が続きます
      「図7-19 ジョブ定義の作成」の説明
  7. HelloWorldJobDef.xmlの「ジョブ定義」ページの「説明」フィールドに、HelloWorld Exampleと入力します。

  8. 「システム・プロパティ」セクションで、「追加」ボタンをクリックします。

  9. 「システム・プロパティの追加」ダイアログで、「名前」ドロップダウンからSYS_effectiveApplicationを選択します。

  10. 「初期値」フィールドに、EssDemoAppと入力します。

  11. 「OK」をクリックします。

  12. 「アクセス制御」セクションで、「追加」ボタンをクリックします。

  13. 「アクセス制御の追加」ダイアログで、「ロール」ドロップダウンのEssDemoAppRoleが選択されていることを確認します。これは、「バックエンドのホスティング・アプリケーションのセキュリティの構成」で作成したロールです。

  14. 図7-20に示すように、「読取り」および「実行」を選択します。

    図7-20 「アクセス制御の追加」ダイアログ

    図7-20の説明が続きます
    「図7-20 「アクセス制御の追加」ダイアログ」の説明
  15. 「OK」をクリックします。

7.4.1.4 バックエンドのホスティング・アプリケーションでのJava実装クラスの作成

Oracle Enterprise Schedulerの制御の下でJavaクラスを実行するアプリケーションを定義するには、Oracle Enterprise Scheduler Executableインタフェースを実装するJavaクラスを作成する必要があります。Executableインタフェースでは、Oracle Enterprise Schedulerを使用したJavaクラスの呼出しを可能にする規定を指定します。

executeメソッドを実装するには:

  1. 「アプリケーション・ナビゲータ」で、プロジェクト・パネルの項目を「SuperEss」→「アプリケーション・ソース」→「oracle.apps.ess」→「howto」→「HelloWorldJob.java」の順に開き、作成したクラスを検索します。
  2. ソース・エディタでHelloWorldJob.javaを開きます。
  3. ソース・エディタで、次のコードを追加してexecuteメソッドを実装します。executeメソッドは、Javaジョブの実行が開始される場所です。メソッド内のコードは、例7-4のように表示されます。

例7-4 HelloWorldJob Executeメソッドのコード

StringBuilder sb = new StringBuilder(1000);
sb.append("\n==================================");
sb.append("\n= EssDemoApp request is now running");
long myRequestId = ctx.getRequestId();
sb.append("\n= Request Id = " + myRequestId);
sb.append("\n= Request Properties:");
for (String paramKey : params.getNames()) {
    Object paramValue = params.getValue(paramKey);
    sb.append("\n=\t(" + paramKey + ", " + paramValue + ")");
}
sb.append("\n=");
sb.append("\n==================================");
Logger logger = Logger.getLogger("oracle.apps.ess.howto");
logger.info(sb.toString());
7.4.1.5 Oracle Enterprise Schedulerプロパティの設定

Oracle Enterprise Schedulerプロパティでは、アプリケーションに関連付けられているejb-jar.xmlファイルで使用される設定の値を設定します。それらのプロパティは、次のとおりです。

  • 論理アプリケーション名

    アプリケーションを識別するために使用される論理名を指定します。アプリケーションをコンテナにデプロイするときに使用されるアプリケーション名とは区別します。この値を使用すると、論理アプリケーション名をソース・コードに安全にハードコードできます。

  • アプリケーション・ポリシー・ストライプ

    セキュリティ・チェックを実行するために使用されるJPSセキュリティ・ストライプ(またはセキュリティ・コンテキスト)を指定します。

  • JPSインターセプタ・アプリケーション名

    適用可能なセキュリティ・ポリシーのセットを判別するために実行時に使用される、アプリケーション・ストライプ名を指定します。

Oracle Enterprise Schedulerプロパティの値を設定するには:

  1. 「アプリケーション・ナビゲータ」でSuperEssプロジェクトを右クリックし、「エンタープライズ・スケジューラ・プロパティ」をクリックします。
  2. 「エンタープライズ・スケジューラ・プロパティ」ダイアログで、表示される3つのフィールド「論理アプリケーション名」「アプリケーション・ポリシー・ストライプ」および「JPSインターセプタ・アプリケーション名」すべてにEssDemoAppと入力します。
  3. 「OK」をクリックします。
7.4.1.6 Oracle Enterprise Schedulerのバックエンドのホスティング・アプリケーションのアセンブル

バックエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。

バックエンドのアプリケーションをアセンブルするには、次を実行します:

  • EJB Javaアーカイブの作成

  • アプリケーションMARおよびEARファイルの作成

7.4.1.6.1 バックエンドのホスティング・アプリケーションのEJB JARファイルをアセンブルする方法

EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。

EJB-JARデプロイメント・プロファイルを作成するには:

  1. 「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、SuperEssプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
  2. 「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
  3. 「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
  4. 「デプロイメント・プロファイルの作成」ダイアログで、「プロファイル・タイプ」ドロップダウンから「EJB JARファイル」を選択します。
  5. 「名前」フィールドに、EJBの名前を入力します。この例では、JAR_SuperEssEjbJarと入力します。
  6. 「OK」をクリックします。
  7. 「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「コントリビュータ」の順に開きます。
  8. 「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
    • プロジェクトの出力ディレクトリ

    • プロジェクトのソースパス

    • プロジェクトの依存性

  9. ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「フィルタ」の順に開きます。
  10. 「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
    • META-INF(およびそのコンテンツ)

    • oracle (およびそのコンテンツ)

  11. 「JARオプション」ウィンドウで、「Manifestファイルを含める」項目を選択解除します。
  12. 「OK」をクリックします。
  13. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
7.4.1.6.2 バックエンドのホスティング・アプリケーションのMARおよびEARファイルをアセンブルする方法

この項では、EssDemoAppサンプル・アプリケーションをアセンブルするEARファイルを準備します。EARアーカイブは、Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JARで構成されます。

EARオプションを更新するには:

  1. 「アプリケーション」メニューをクリックし、「アプリケーションのプロパティ」をクリックします。
  2. 「アプリケーションのプロパティ」ダイアログのナビゲーション・ペインで、「デプロイメント」をクリックします。
  3. デフォルトのMARファイルのプロファイルを選択し、「編集」をクリックします。
  4. 「MARデプロイメント・プロファイルのプロパティの編集」ダイアログでのナビゲーション・ペインで、「メタデータ・ファイル・グループ」「ユーザー・メタデータ」を展開し、「追加」ボタンをクリックしてコントリビュータを追加し、ディレクトリEssDemoApp/SuperEss/essmetaを追加します。
  5. 「OK」をクリックします。
  6. 「MARデプロイメント・プロファイルのプロパティの編集」ウィンドウで「編集」をクリックします。
  7. 「ディレクトリ」ウィンドウで「oracle.apps.ess.howto」チェック・ボックスを選択し、「OK」をクリックします。
  8. 「デプロイメント・プロファイル」ウィンドウにリストされているすべてのプロファイルを削除し、「新規」をクリックします。
  9. EssDemoApp/EssHost/essmetaディレクトリを追加します。
    これにより、アプリケーションについて適切なOracle Enterprise Schedulerユーザー・メタデータが選択されます。
  10. 「OK」をクリックします。
  11. 「MARデプロイメント・プロファイルのプロパティの編集」ウィンドウで「編集」をクリックします。
  12. 「デプロイメント・プロファイルの作成」ダイアログで、「プロファイル・タイプ」ドロップダウンから「EARファイル」を選択します。
  13. 「名前」フィールドに、EAR_EssDemoAppEarと入力します。

    「OK」をクリックします。

  14. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲーション・ペインで、「一般」をクリックします。
  15. 「一般」ウィンドウで、「アプリケーション名」フィールドにEssDemoAppと入力します。
  16. ナビゲーション・ペインで「アプリケーション・アセンブリ」を選択します。
  17. 「アプリケーション・アセンブリ」ウィンドウで、すべての項目のチェック・ボックスが選択されていることを確認します(図7-21を参照)。

    図7-21 EARデプロイメント・プロファイル・プロパティの編集

    図7-21の説明が続きます
    「図7-21 EARデプロイメント・プロファイル・プロパティの編集」の説明
  18. 「EARオプション」ウィンドウで、「manifestファイルを含める」を選択し、EssDemoApp/SuperEss/src/META-INF/MANIFEST.MFを追加します。
  19. 「OK」をクリックします。
  20. 「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
7.4.1.7 SuperEss MANIFESTファイルの更新

SuperEss META-INF/MANIFEST.INFファイルのコンテンツを次の行と置き換えます。

Manifest-Version: 1.0																																																																							
Weblogic-Application-Version: 3.0
Extension-List: essruntime
essruntime-Extension-Name: oracle.ess.runtime
essruntime-Specification-Version: 12
7.4.1.8 weblogic-application.xmlファイルの構成

ソース・エディタを使用して、weblogic-application.xmlから次の行を削除します。

WebLogicアプリケーションのパス:

EssDemoApp/src/META-INF/weblogic-application.xml
<library-ref>
  <library-name>oracle.applcp.runtime</library-name>
</library-ref>
<library-ref>
  <library-name>oracle.xdo.runtime</library-name>
</library-ref>
7.4.1.9 バックエンドのホスティング・アプリケーションのデプロイ

アプリケーションをアセンブルした後、サーバーにデプロイできます。

バックエンドのホスティング・アプリケーションをデプロイするには:

  1. メイン・メニューから、「アプリケーション」→「デプロイ」→「EAR_EssDemoAppEar...」の順に選択します。
  2. アプリケーションをコンテナに設定し、デプロイします。
  3. 「デプロイメント構成」ダイアログが表示されたら、デフォルト値をノートにとりますが、デフォルト値は変更しないでください。
7.4.1.10 EssDemoAppアプリケーションのadf-config.xmlファイルの編集

「アプリケーション・リソース」パネルで、次を行います。

  1. 「ディスクリプタ」を開きます。
  2. 「ADF META-INF」を開きます。
  3. 「adf-config.xml」をダブルクリックします。
  4. ソース・エディタで、adf-config.xmlファイルのコンテンツを例7-5に示すXMLで置き換えます。

例7-5 adf-config.xmlファイル

<?xml version="1.0" encoding="UTF-8" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:config="http://xmlns.oracle.com/bc4j/configuration">
  <adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config">
    <JaasSecurityContext initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactory"           jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext"
         authorizationEnforce="false" authenticationRequire="true"/>
  </adf-security-child>
  <adf-adfm-config xmlns="http://xmlns.oracle.com/adfm/config">
    <defaults changeEventPolicy="ppr" useBindVarsForViewCriteriaLiterals="true"            useBindValuesInFindByKey="true"/>
    <startup>
       <amconfig-overrides>
         <config:Database jbo.locking.mode="optimistic"/>
      </amconfig-overrides>
    </startup>
  </adf-adfm-config>
   <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
    <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config">
      <persistence-config>
        <metadata-namespaces>
          <namespace path="/oracle/as/ess/core" metadata-store-usage="ess-core"/>
        </metadata-namespaces>
        <metadata-store-usages>
          <metadata-store-usage id="ess-core" deploy-target="false"             default-cust-store="false">
            <metadata-store                     class-name="oracle.mds.persistence.stores.db.DBMetadataStore">
              <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/>
              <property name="repository-name" value="mds-ESS_MDS_DS"/>
              <property name="partition-name" value="essapp-internal-partition"/>
            </metadata-store>
          </metadata-store-usage>
        </metadata-store-usages>
      </persistence-config>
    </mds-config>
  </adf-mds-config>
</adf-config>

7.4.2 Oracle Enterprise Schedulerのフロントエンドの発行者アプリケーションを作成する方法

Oracle Enterprise Schedulerの分割されたアプリケーションでは、フロントエンドのアプリケーションからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppUIアプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。

フロントエンドの発行者サンプル・アプリケーションを作成するには、次を実行します:

  • フロントエンドのアプリケーションおよびプロジェクトを作成します。

  • ejb-jar.xmlファイルを構成します。

  • Webプロジェクトを作成します。

  • セキュリティを構成します。

  • HTTPサーブレットを作成します。

  • web.xmlファイルを編集します。

  • weblogic-application.xmlファイルを編集します。

  • adf-configファイルを編集します。

  • アプリケーションをアセンブルします。

  • アプリケーションをデプロイします。

7.4.2.1 フロントエンドの発行者アプリケーションの作成

フロントエンドの発行者アプリケーションをビルドするには、JDeveloperでバックエンドのホスティング・アプリケーションの場合に使用したのと同様のステップを使用します。

フロントエンドの発行者アプリケーションを作成するには:

  1. 「バックエンドのホスティング・アプリケーションの作成」のステップを完了しますが、ここではアプリケーションの名前としてESSDemoAppUIを使用します。ESSホスト・サポートの設定を構成する場合は、「アプリケーションID」フィールドに、必ずEssDemoAppと入力してください。
7.4.2.2 SuperWebプロジェクトの作成

サーブレットのWebプロジェクトを作成する必要があります。

SuperWebプロジェクトを作成するには:

  1. SuperEssプロジェクトを右クリックし、「新規」を選択します。

  2. 「新規ギャラリ」で「一般」を開き、「プロジェクト」「カスタム・プロジェクト」を選択して、「OK」をクリックします。

  3. 「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。

    1. 「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、SuperWebと入力します。

    2. 「プロジェクトの機能」タブの「選択可能」で、ESSクライアント・サポート「JSPおよびサーブレット」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。

      ESSクライアント・サポートの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。

    「次」をクリックします。

  4. Java設定の構成ウィンドウの「デフォルト・パッケージ」フィールドで、oracle.apps.ess.howtoを入力します。「次」をクリックします。

  5. EJB設定の構成ウィンドウの「EJBのバージョン」で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。

  6. EJB設定の構成ウィンドウの「EJBのバージョン」で、「ejb-jar.xmlをこのプロジェクトで生成します」チェック・ボックスを選択します。

  7. 「終了」をクリックします。

7.4.2.3 フロントエンドの発行者アプリケーションのセキュリティの構成

アプリケーションのセキュリティを構成する必要があります。EssDemoAppUIアプリケーションはEssDemoAppアプリケーションによって作成されたユーザーおよびロールを共有するため、ユーザーやロールを作成する必要はありません。

フロントエンドの発行者アプリケーションのセキュリティを構成するには:

  1. メイン・メニューから、「アプリケーション」「保護」「ADFセキュリティの構成」の順に選択します。
  2. 「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択します。
  3. 「認証タイプ」ページで、「Webプロジェクト」ドロップダウン・リストから「SuperWeb.jpr」を選択します。
  4. 「HTTP Basic認証」を選択します。

    図7-22 ADFセキュリティの構成

    図7-22の説明が続きます
    「図7-22 ADFセキュリティの構成」の説明
  5. 「終了」をクリックします。

    jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」「META-INF」を開いて確認できます。

7.4.2.4 フロントエンドの発行者アプリケーションのHTTPサーブレットの作成

通常は、Oracle Application Development Frameworkなどの重量フレームワーク上に作成されるより複雑なユーザー・インタフェースが使用されますが、簡単にするために、発行者アプリケーションには基本のHTTPサーブレットを使用します。

フロントエンドの発行者アプリケーションのHTTPサーブレットを作成するには:

  1. SuperWebプロジェクトを右クリックし、「新規」を選択します。
  2. 「新規ギャラリ」で「Web層」を開き、「サーブレット」「HTTPサーブレット」を選択して、「OK」をクリックします。
  3. 「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで、「クラス」フィールドにEssDemoAppServletと入力します。
  4. 選択を「注釈」から「構成ファイル(web.xml)」に変更します。
  5. 「パッケージ」フィールドにoracle.apps.ess.howtoと入力し、「次へ」をクリックします。
  6. 「終了」をクリックします。
  7. ソース・エディタで、ESSDemoAppServlet.javaのコンテンツを例7-6に示すコードで置き換えます。

例7-6 フロントエンドの発行者アプリケーションのHTTPサーブレット・コード

package oracle.apps.ess.howto;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import oracle.as.scheduler.MetadataObjectId;
import oracle.as.scheduler.MetadataObjectId.MetadataObjectType;
import oracle.as.scheduler.MetadataService;
import oracle.as.scheduler.MetadataService.QueryField;
import oracle.as.scheduler.MetadataServiceHandle;
import oracle.as.scheduler.RequestDetail;
import oracle.as.scheduler.RequestParameters;
import oracle.as.scheduler.RuntimeService;
import oracle.as.scheduler.RuntimeServiceHandle;
import oracle.as.scheduler.State;
import oracle.as.scheduler.core.JndiUtil;
 
 
public class EssDemoAppServlet extends HttpServlet {
    @SuppressWarnings("compatibility:4685800289380934682")
    private static final long serialVersionUID = 1L;
 
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
    private static final String MESSAGE_KEY = "Message";
    private static final String PATH_SUBMIT = "/submitRequest";
    private static final String PATH_ALTER = "/alterRequest";
    private static final String MDO_SEP = ";";
    private static final String ACTION_CANCEL = "Cancel";
    private static final String ESS_UNAVAIL_MSG =
        "<p>Enterprise Scheduler Service is currently unavailable. Cause: %s</p>";
 
    private enum PseudoScheduleChoices {
        Immediately(0),
        InTenSeconds(10),
        InTenMinutes(10 * 60);
 
        @SuppressWarnings("compatibility:-5637079380819677366")
        private static final long serialVersionUID = 1L;
 
        private int m_seconds;
 
        private PseudoScheduleChoices(int seconds) {
            m_seconds = seconds;
        }
 
        public int getSeconds() {
            return m_seconds;
        }
    }
 
 
 
 
 
    public EssDemoAppServlet() throws ServletException {
        super();
    }
 
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
 
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType(CONTENT_TYPE);
 
        HttpSession session = request.getSession(true);
        String lastMessage = String.valueOf(session.getAttribute(MESSAGE_KEY));
 
        if ("null".equals(lastMessage)) {
            lastMessage = "";
        }
 
        try {
            RuntimeLists runtimeLists = getRuntimeLists();
            MetadataLists metadataLists = getMetadataLists();
            renderResponse(metadataLists, runtimeLists,
                           request, response, lastMessage);
        } catch (ServletException se) {
            throw se;
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
 
    @Override
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)
        throws ServletException, IOException
    {
        response.setContentType(CONTENT_TYPE);
        request.setCharacterEncoding("UTF-8");
 
        HttpSession session = request.getSession(true);
        String pathInfo = request.getPathInfo();
 
        // Clear the message on every post request
        StringBuilder message = new StringBuilder("");
 
        try {
          // Select each handler based on the form action
          if ("".equals(pathInfo)) {
            // No processing
          } else if (PATH_SUBMIT.equals(pathInfo)) {
            postSubmitRequest(request, message);
          } else if (PATH_ALTER.equals(pathInfo)) {
            postAlterRequest(request, message);
          } else {
            message.append(String.format("<p>No handler for pathInfo=%s</p>",
                                         pathInfo));
          }
        }
        catch (ServletException se) {
            Throwable t = se.getCause();
            String cause = (t == null) ? se.toString() : t.toString();
            message.append (String.format(ESS_UNAVAIL_MSG, cause));
        }
 
        // Storing the messages in the session allows them to persist
        // through the redirect and across refreshes.
        session.setAttribute(MESSAGE_KEY, message.toString());
 
        // render the page by redirecting to doGet(); this intentionally
        // strips the actions and post data from the request.
        response.sendRedirect(request.getContextPath() +
                              request.getServletPath());
    }
 
    /**
     * Handle the job submission form.
     * @param request
     * @param message
     * @throws ServletException
     */
    private void postSubmitRequest(HttpServletRequest request,
                                   StringBuilder message)
        throws ServletException
    {
        String jobDefName = request.getParameter("job");
        String scheduleDefName = request.getParameter("schedule");
 
        // Various required args for submission
        Calendar start = Calendar.getInstance();
        start.add(Calendar.SECOND, 2);
 
 
        // Launch the job based on form contents
        if (jobDefName == null || scheduleDefName == null) {
            message.append("Both a job name and a schedule name must be specified\n");
        } else {
            PseudoScheduleChoices pseudoSchedule = null;
 
            // See if schedule given is actually a pseudo schedule
            try {
                pseudoSchedule = PseudoScheduleChoices.valueOf(scheduleDefName);
            } catch (IllegalArgumentException e) {
                // The string is not a valid member of the enum
                pseudoSchedule = null;
            }
 
 
            MetadataObjectId scheduleDefId = null;
            String scheduleDefNamePart = null;
            MetadataObjectId jobDefId = stringToMetadataObjectId(jobDefName);
 
            // Don't look up schedules that aren't real
            if (pseudoSchedule != null) {
                scheduleDefNamePart = scheduleDefName;
                start.add(Calendar.SECOND, pseudoSchedule.getSeconds());
            } else {
                scheduleDefId = stringToMetadataObjectId(scheduleDefName);
                scheduleDefNamePart = scheduleDefId.getNamePart();
            }
 
            String jobDefNamePart = jobDefId.getNamePart();
            String requestDesc = jobDefNamePart + "@" + scheduleDefNamePart;
 
 
            Logger logger = getLogger();
            long requestId = submitRequest(pseudoSchedule, requestDesc,
                                           jobDefId, scheduleDefId, start, logger);
 
            // Populate the message block based on results
            message.append(String.format("<p>New request %d launched using %s</p>",
                                         requestId, requestDesc));
        }
    }
 
    private Long submitRequest(final PseudoScheduleChoices pseudoSchedule,
                               final String requestDesc,
                               final MetadataObjectId jobDefId,
                               final MetadataObjectId scheduleDefId,
                               final Calendar start,
                               final Logger logger)
        throws ServletException
    {
        RuntimeServicePayload<Long> myPayload = new RuntimeServicePayload<Long>() {
            @Override
            Long execute(RuntimeService service,
                         RuntimeServiceHandle handle,
                         Logger logger)
                throws Exception
            {
                RequestParameters params = new RequestParameters();
                return (null != pseudoSchedule)
                    ? service.submitRequest(handle, requestDesc, jobDefId,
                                            start, params)
                    : service.submitRequest(handle, requestDesc, jobDefId,
                                            scheduleDefId, null,
                                            start, null, params);
            }
        };
        try {
            return performOperation(myPayload, logger);
        } catch (Exception e) {
            throw new ServletException("Error submitting request using job: " +
                                       jobDefId + " and schedule: " +
                                       scheduleDefId, e);
        }
    }
 
    /**
     * Handle the "Cancel" and "Purge" actions from the form enclosing
     * the Request Status table.
     * @param request
     * @param message
     * @throws ServletException
     */
    private void postAlterRequest(HttpServletRequest request,
                                  StringBuilder message)
        throws ServletException
    {
        String cancelID = null;
 
        /*
         * there are a few assumptions going on here...
         * the HTTP button being used to transmit the action and
         * request is backwards from its normal usage (eg. the name
         * should be invariable, and the value variable).  Because we
         * want to display either "Purge" or "Cancel" on the button, and
         * transmit the reqId with it, we are reversing the map entry
         * to get the key (which in this case is the reqID), and
         * match it to the value (Purge or Cancel).
         * Assumptions are that there is only one entry in the map
         * per request (one purge or cancel).  Also, that the datatypes
         * for the key and value are those documented for
         * ServletRequest (<K,V> = <String, String[]>).
         */
        Map requestMap = request.getParameterMap();
        Iterator mapIter = requestMap.entrySet().iterator();
        while (mapIter.hasNext()) {
            Map.Entry entry = (Map.Entry)mapIter.next();
            String key = (String)entry.getKey();
            String[] values = (String[])entry.getValue();
            if (ACTION_CANCEL.equals(values[0])) {
                cancelID = key;
            }
        }
 
        if (cancelID != null) {
            try {
                final String cancelId2 = cancelID;
                RuntimeServicePayload<Void> myPayload = new RuntimeServicePayload<Void>() {
                    @Override
                    Void execute(RuntimeService service,
                                 RuntimeServiceHandle handle,
                                 Logger logger)
                        throws Exception
                    {
                        service.cancelRequest(handle, Long.valueOf(cancelId2));
                        return null;
                    }
                };
 
                Logger logger = getLogger();
                performOperation(myPayload, logger);
                message.append
                    (String.format("<p>Cancelled request %s</p>", cancelID));
            } catch (Exception e) {
                throw new ServletException
                    ("Error canceling or purging request", e);
            }
        } else {
            message.append("<p>No purge or cancel action specified</p>");
        }
    }
 
    private String metadataObjectIdToString(MetadataObjectId mdoID)
        throws ServletException {
 
        String mdoString =
            mdoID.getType().value() + MDO_SEP + mdoID.getPackagePart() +
            MDO_SEP + mdoID.getNamePart();
 
        return mdoString;
    }
 
    private MetadataObjectId stringToMetadataObjectId(String mdoString)
        throws ServletException {
        String[] mdoStringParts = mdoString.split(Pattern.quote(MDO_SEP));
        if (mdoStringParts.length != 3) {
            throw new ServletException(String.format("Unexpected number of components %d found " +
                                                     "when converting %s to MetadataObjectID",
                                                     mdoStringParts.length,
                                                     mdoString));
        }
 
        MetadataObjectType mdType =
            MetadataObjectType.getMOType(mdoStringParts[0]);
        String mdPackage = mdoStringParts[1];
        String mdName = mdoStringParts[2];
 
        MetadataObjectId mdoID =
            MetadataObjectId.createMetadataObjectId(mdType, mdPackage, mdName);
        return mdoID;
    }
 
    /**
     * this changes the format used in this class for job definitions to the one
     * which is used in the runtime query.
     * @param strMetadataObject
     * @return string representing object in runtime store
     * @throws ServletException
     */
    private String fixMetadataString(String strMetadataObject)
        throws ServletException {
        String fslash = "/";
        String[] mdoStringParts =
            strMetadataObject.split(Pattern.quote(MDO_SEP));
        if (mdoStringParts.length != 3) {
            throw new ServletException(String.format("Unexpected number of components %d found " +
                                                     "when converting %s to MetadataObjectID",
                                                     mdoStringParts.length,
                                                     strMetadataObject));
        }
        String[] trimStringParts = new String[mdoStringParts.length];
        for (int i = 0; i < mdoStringParts.length; i++) {
            String mdoStringPart = mdoStringParts[i];
            trimStringParts[i] = mdoStringPart.replaceAll(fslash, " ").trim();
        }
 
        MetadataObjectType mdType =
            MetadataObjectType.getMOType(trimStringParts[0]);
        String mdPackage = fslash + trimStringParts[1];
        String mdName = trimStringParts[2];
        MetadataObjectId metadataObjId =
            MetadataObjectId.createMetadataObjectId(mdType, mdPackage, mdName);
        return metadataObjId.toString();
    }
 
    private Set<String> getSetFromMetadataEnum(Enumeration<MetadataObjectId> enumMetadata)
        throws ServletException {
        Set<String> stringSet = new HashSet<String>();
 
        while (enumMetadata.hasMoreElements()) {
            MetadataObjectId objId = enumMetadata.nextElement();
            String strNamePart = objId.getNamePart();
            stringSet.add(strNamePart);
        }
        return stringSet;
    }
 
    //****************************************************************************
    //
    //   HTML Rendering Methods
    //
    //****************************************************************************
 
    /**
     * Rendering code for the page displayed.
     * In a real application this would be done using JSP, but this approach
     * keeps everything in one file to make the example easier to follow.
     * @param response The response object from the main request.
     * @param message Text that appears in the message panel, may contain HTML
     * @throws IOException
     */
    private void renderResponse(MetadataLists ml,
                                RuntimeLists rl,
                                HttpServletRequest request,
                                HttpServletResponse response,
                                String message)
        throws IOException, ServletException
    {
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
 
        String urlBase = request.getContextPath() + request.getServletPath();
 
        // Indents maintained for clarity
        out.println("<html>");
        out.println("<head><title>EssDemo</title></head>");
        out.println("<body>");
        out.println("<table align=\"center\"><tbody>");
        out.println("  <tr><td align=\"center\"><h1>Oracle Enterprise Scheduler Tutorial</h1></td></tr>");
        out.println("  <tr><td align=\"center\"><table cellspacing=6><tr>");
 
        // Job launch form
        out.println("    <td align=\"center\">");
        out.println("      <h2>Launch Job</h2>");
        renderLaunchJobForm(ml, out, urlBase);
        out.println("    </td>");
 
        out.println("    <td align=\"center\" bgcolor=\"blue\" width=\"2\"/>");
 
        out.println("  </tr></table></td></tr>");
 
        out.println("  <tr><td bgcolor=\"red\"/></tr>");
 
        // Message panel
        out.println("      <tr><td align=\"center\"><h3>Messages</h3></td></tr>");
        out.println("      <tr><td>");
        out.println(message);
        out.println("    </td></tr>");
 
        out.println("  <tr><td bgcolor=\"red\"/></tr>");
 
        // Request status
        out.println("  <tr><td align=\"center\">");
        out.println("    <form name=\"attrs\" action=\"" + urlBase +
                    PATH_ALTER + "\" method=\"post\">");
        out.println("    <h2>Request Status</h2>");
        out.println("    <table border=2><tbody>");
        out.println("          <th>reqID</th>");
        out.println("          <th>Description</th>");
        out.println("          <th>Scheduled time</th>");
        out.println("          <th>State</th>");
        out.println("          <th>Action</th>");
 
        renderStatusTable(out, rl.requestDetails);
 
        out.println("    </tbody></table>");
        out.println("    </form>");
        out.println("  </td></tr>");
        out.println("</tbody></table>");
        out.println("</body></html>");
        out.close();
    }
 
    private void renderLaunchJobForm(MetadataLists ml, PrintWriter out, String urlBase)
        throws ServletException {
        out.println("      <form name=\"attrs\" action=\"" + urlBase +
                    PATH_SUBMIT + "\" method=\"post\">");
        out.println("        <table><tbody>");
        out.println("          <tr><td align=\"right\">");
        out.println("            <b>Job:</b>");
        out.println("            <select name=\"job\">");
 
        renderMetadataChoices(out, ml.jobDefList, false);
        renderMetadataChoices(out, ml.jobSetList, false);
 
        out.println("            </select>");
        out.println("          </td></tr>");
        out.println("          <tr><td align=\"right\">");
        out.println("            <b>Schedule:</b>");
        out.println("            <select name=\"schedule\">");
 
        renderPseudoScheduleChoices(out);
        renderMetadataChoices(out, ml.scheduleList, false);
 
        out.println("            </select>");
        out.println("          </td></tr>");
        out.println("          <tr><td align=\"center\">");
        out.println("            <input name=\"submit\" value=\"Submit\" type=\"submit\">");
        out.println("          </td></tr>");
        out.println("        </tbody></table>");
        out.println("      </form>");
    }
 
    /**
     *
     * @param out - printwriter
     * @param jobChoices --  metadata to be displayed
     * @param bBlankFirst -- blank first (so that this param is not required)
     * @throws ServletException
     */
    private void renderMetadataChoices(PrintWriter out,
                                       Enumeration<MetadataObjectId> jobChoices,
                                       boolean bBlankFirst)
        throws ServletException
    {
        if (jobChoices == null)
            return;
 
        boolean bFirst = true;
        while (jobChoices.hasMoreElements()) {
            MetadataObjectId job = jobChoices.nextElement();
            String strJob = metadataObjectIdToString(job);
            String strNamePart = job.getNamePart();
            if (strNamePart.compareTo("BatchPurgeJob") == 0) {
                continue;
            } else {
                if (bFirst && bBlankFirst) {
                    out.printf("<option value=\"%s\">%s</option>", "", "");
                    bFirst = false;
                }
                out.printf("<option value=\"%s\">%s</option>", strJob,
                           strNamePart);
            }
        }
    }
 
    /**
     * helper method for rendering choices based on strings, adding an empty
     * string to the beginning of the list
     * @param out
     * @param choices
     */
    private void renderStringChoices(PrintWriter out, Set<String> choices) {
        if (choices == null)
            return;
 
        choices.add("");
        SortedSet<String> sorted = new TreeSet<String>(choices);
        Iterator choiceIter = sorted.iterator();
        while (choiceIter.hasNext()) {
            String choice = (String)choiceIter.next();
 
            out.printf("<option value=\"%s\">%s</option>", choice, choice);
        }
    }
 
    private void renderPseudoScheduleChoices(PrintWriter out) {
        for (PseudoScheduleChoices c : PseudoScheduleChoices.values()) {
            out.printf("<option value=\"%s\">%s</option>", c, c);
        }
    }
 
    private void renderStatusTable
        (PrintWriter out, List<RequestDetail> reqDetails)
    {
        if (reqDetails == null) {
            return;
        }
 
        for (RequestDetail reqDetail : reqDetails) {
            State state = reqDetail.getState();
 
            Calendar scheduledTime = reqDetail.getScheduledTime();
            String scheduledTimeString = null;
 
            if (scheduledTime == null) {
                scheduledTimeString = "null scheduled time";
            } else {
                scheduledTimeString = String.valueOf(scheduledTime.getTime());
            }
 
            final String actionButton;
            if (!state.isTerminal()) {
                String action = ACTION_CANCEL;
                String reqId = String.valueOf(reqDetail.getRequestId());
                actionButton = String.format
                    ("<button type=submit value=%s name=\"%s\">%s</button>",
                     action, reqId, action);
            } else {
                actionButton = "&nbsp;";
            }
 
            out.printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
                       reqDetail.getRequestId(), reqDetail.getDescription(),
                       scheduledTimeString, state, actionButton);
        }
    }
 
 
    private MetadataService getMetadataService() throws Exception {
        return JndiUtil.getMetadataServiceEJB();
    }
 
    private RuntimeService getRuntimeService() throws Exception {
        return JndiUtil.getRuntimeServiceEJB();
    }
 
    private abstract class Payload<SERVICE, HANDLE, RETURN> {
        abstract SERVICE getService() throws Exception;
        abstract HANDLE getHandle(SERVICE service) throws Exception;
        abstract void closeHandle(SERVICE service,
                                  HANDLE handle,
                                  boolean abort)
            throws Exception;
        abstract RETURN execute(SERVICE service, HANDLE handle, Logger logger)
            throws Exception;
    }
 
    private abstract class MetadataServicePayload<T>
        extends Payload<MetadataService, MetadataServiceHandle, T>
    {
        @Override
        MetadataService getService() throws Exception {
            return getMetadataService();
        }
 
        @Override
        MetadataServiceHandle getHandle(MetadataService service)
            throws Exception
        {
            return service.open();
        }
 
        @Override
        void closeHandle(MetadataService service,
                         MetadataServiceHandle handle,
                         boolean abort)
            throws Exception
        {
            service.close(handle, abort);
        }
    }
 
    private abstract class RuntimeServicePayload<T>
        extends Payload<RuntimeService, RuntimeServiceHandle, T>
    {
        @Override
        RuntimeService getService() throws Exception {
            return getRuntimeService();
        }
 
        @Override
        RuntimeServiceHandle getHandle(RuntimeService service)
            throws Exception
        {
            return service.open();
        }
 
        @Override
        void closeHandle(RuntimeService service,
                         RuntimeServiceHandle handle,
                         boolean abort)
            throws Exception
        {
            service.close(handle, abort);
        }
    }
 
    private <S, H, R> R performOperation
            (Payload<S, H, R> payload, Logger logger)
        throws Exception
    {
        S service = payload.getService();
        H handle = payload.getHandle(service);
 
        Exception origException = null;
        try {
            return payload.execute(service, handle, logger);
        } catch (Exception e2) {
            origException = e2;
            throw e2;
        } finally {
            if (null != handle) {
                try {
                    boolean abort = (null != origException);
                    payload.closeHandle(service, handle, abort);
                } catch (Exception e2) {
                    if (null != origException) {
                        logger.log(Level.WARNING, "An error occurred while " +
                            "closing handle, however, a previous failure was " +
                            "detected.  The following error will be logged " +
                            "but not reported: " + stackTraceToString(e2));
                    }
                }
            }
        }
    }
 
    private final String stackTraceToString(Exception e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        pw.flush();
        pw.close();
        return sw.toString();
    }
 
    private Logger getLogger() {
        return Logger.getLogger(this.getClass().getName());
    }
 
    private class MetadataLists {
        private final Enumeration<MetadataObjectId> jobDefList;
        private final Enumeration<MetadataObjectId> jobSetList;
        private final Enumeration<MetadataObjectId> scheduleList;
        private final Enumeration<MetadataObjectId> jobTypeList;
 
        private MetadataLists(Enumeration<MetadataObjectId> jobDefList,
                              Enumeration<MetadataObjectId> jobSetList,
                              Enumeration<MetadataObjectId> scheduleList,
                              Enumeration<MetadataObjectId> jobTypeList)
        {
            this.jobDefList   = jobDefList;
            this.jobSetList   = jobSetList;
            this.scheduleList = scheduleList;
            this.jobTypeList  = jobTypeList;
        }
    }
 
    private class RuntimeLists {
        private final List<RequestDetail> requestDetails;
        private final Set<String> applicationChoices;
        private final Set<String> stateChoices;
        private final Set<MetadataObjectId> jobDefMDOChoices;
 
        private RuntimeLists(List<RequestDetail> requestDetails,
                             Set<String> applicationChoices,
                             Set<String> stateChoices,
                             Set<MetadataObjectId> jobDefMDOChoices)
        {
            super();
            this.requestDetails = requestDetails;
            this.applicationChoices = applicationChoices;
            this.stateChoices = stateChoices;
            this.jobDefMDOChoices = jobDefMDOChoices;
        }
    }
 
    /**
     * Retrieve lists of jobs, schedules, and status for use by the renderer
     * @throws ServletException
     */
    private MetadataLists getMetadataLists() throws Exception {
        Logger logger = getLogger();
 
        MetadataServicePayload<MetadataLists> myPayload =
            new MetadataServicePayload<MetadataLists>()
        {
            @Override
            MetadataLists execute(MetadataService service,
                                  MetadataServiceHandle handle,
                                  Logger logger)
                throws Exception
            {
                Enumeration<MetadataObjectId> jobDefs =
                    service.queryJobDefinitions(handle, null, QueryField.NAME, true);
                Enumeration<MetadataObjectId> jobSets =
                    service.queryJobSets(handle, null, QueryField.NAME, true);
                Enumeration<MetadataObjectId> schedules =
                    service.querySchedules(handle, null, QueryField.NAME, true);
                Enumeration<MetadataObjectId> jobTypes =
                    service.queryJobTypes(handle, null, QueryField.NAME, true);
 
                return new MetadataLists(jobDefs, jobSets, schedules, jobTypes);
            }
        };
        MetadataLists ml = performOperation(myPayload, logger);
        return ml;
    }
 
    private RuntimeLists getRuntimeLists() throws Exception {
        Logger logger = getLogger();
 
        RuntimeServicePayload<List<RequestDetail>> myPayload2 =
            new RuntimeServicePayload<List<RequestDetail>>()
        {
            @Override
            List<RequestDetail> execute(RuntimeService service,
                                        RuntimeServiceHandle handle,
                                        Logger logger)
                throws Exception
            {
                List<RequestDetail> reqDetails =
                    new ArrayList<RequestDetail>(10);
                Enumeration requestIds = service.queryRequests
                    (handle, null, RuntimeService.QueryField.REQUESTID, true);
 
                while (requestIds.hasMoreElements()) {
                    Long reqId = (Long)requestIds.nextElement();
                    RequestDetail detail = service.getRequestDetail(handle, reqId);
                    reqDetails.add(detail);
                }
 
                return reqDetails;
            }
        };
        List<RequestDetail> reqDetails = performOperation(myPayload2, logger);
        RuntimeLists rl = getRuntimeLists(reqDetails);
        return rl;
    }
 
    private RuntimeLists getRuntimeLists(List<RequestDetail> reqDetails) {
        Set<String> applicationSet = new HashSet<String>(10);
        Set<String> stateSet = new HashSet<String>(10);
        Set<MetadataObjectId> jobDefMOSet = new HashSet<MetadataObjectId>(10);
 
        if (reqDetails != null) {
            ListIterator detailIter = reqDetails.listIterator();
            while (detailIter.hasNext()) {
                RequestDetail detail = (RequestDetail)detailIter.next();
                applicationSet.add(detail.getDeployedApplication());
                State state = detail.getState();
                if (state.isTerminal())
                    stateSet.add(state.name());
                jobDefMOSet.add(detail.getJobDefn());
            }
        }
 
        RuntimeLists rl = new RuntimeLists
            (reqDetails, applicationSet, stateSet, jobDefMOSet);
        return rl;
    }
 
}
7.4.2.5 フロントエンドの発行者アプリケーションのweb.xmlファイルの編集

Oracle Enterprise SchedulerメタデータおよびランタイムEJB参照を追加するには、web.xmlファイルを編集する必要があります。

フロントエンドの発行者アプリケーションのweb.xmlファイルを編集するには:

  1. 「アプリケーション・ナビゲータ」で「SuperWeb」「Webコンテンツ」「WEB-INF」の順に開き、「web.xml」をダブルクリックします。
  2. 概要エディタで「参照」ナビゲーション・タブをクリックし、「EJB参照」セクションを開きます。
  3. 表7-1に示す情報を含む2つのEJBリソースを追加します。

    表7-1 フロントエンドの発行者アプリケーションのEJBリソース

    EJB名 インタフェース・タイプ EJBタイプ ローカル/リモート・インタフェース

    ess/metadata

    ローカル

    セッション

    oracle.as.scheduler.MetadataServiceLocal

    ess/runtime

    ローカル

    セッション

    oracle.as.scheduler.RuntimeServiceLocal

  4. 「サーブレット」ナビゲーション・タブをクリックし、「サーブレット・マッピング」タブをクリックします。
  5. /essdemoappservlet URLパターンを/essdemoappservlet/*に変更します。
7.4.2.6 フロントエンドの発行者アプリケーションのweblogic-application.xmlファイルの編集

weblogic-application.xmlファイルを作成し、編集する必要があります。

フロントエンドの発行者アプリケーションのweblogic-application.xmlファイルを編集するには:

  1. 「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
  2. 「新規ギャラリ」で「一般」を開き、「デプロイメント・ディスクリプタ」「Weblogicデプロイメント・ディスクリプタ」を選択し、「OK」をクリックします。
  3. 「ディスクリプタの選択」ページでweblogic-application.xmlを選択します。
  4. 「次へ」をクリックし、再度「次へ」をクリックして「終了」をクリックします。
  5. ソース・エディタで、作成したweblogic-application.xmlファイルのコンテンツを例7-7に示すXMLで置き換えます。

例7-7 フロントエンドの発行者アプリケーションのweblogic-application.xmlにコピーするコンテンツ

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application
 
http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd"
                      xmlns="http://www.bea.com/ns/weblogic/weblogic-application">
 
    <!-- The following application parameter tells JPS which stripe it should
       - use to upload the jazn-data.xml policy.  If this parameter is not
       - specified, it uses the Java EE deployment name plus the version
       - number (e.g. EssDemoApp#V2.0).
      -->
    <application-param>
        <param-name>jps.policystore.applicationid</param-name>
        <param-value>EssDemoAppUI</param-value>
    </application-param>
 
    <!-- This listener allows JPS to configure itself and upload the
       - jazn-data.xml policy to the appropriate stripe
      -->
    <listener>
        <listener-class>oracle.security.jps.wls.listeners.JpsApplicationLifecycleListener</listener-class>
    </listener>
 
    <!-- This listener allows MDS to configure itself and upload any metadata
       - as defined by the MAR profile and adf-config.xml
      -->
    <listener>
        <listener-class>oracle.mds.lcm.weblogic.WLLifecycleListener</listener-class>
    </listener>
 
    <!-- This listener allows Oracle Enterprise Scheduler to configure itself
      -->
    <listener>
        <listener-class>oracle.as.scheduler.platform.wls.deploy.ESSApplicationLifecycleListener</listener-class>
    </listener>
 
    <!-- This shared library contains all the Oracle Enterprise Scheduler classes
      -->
    <library-ref>
        <library-name>oracle.ess.client</library-name>
    </library-ref>
    <library-ref>
        <library-name>adf.oracle.domain</library-name>
    </library-ref>
</weblogic-application>
7.4.2.7 フロントエンドの発行者アプリケーションのadf-configファイルの編集

ホスティング・アプリケーションで作成されたメタデータを共有するようにアプリケーションに通知するには、adf-config.xmlファイルを編集する必要があります。

フロントエンドの発行者アプリケーションのadf-config.xmlファイルを編集するには:

  1. 「アプリケーション・リソース」パネルで、「ディスクリプタ」「ADF META-INF」を開き、adf-config.xmlをダブルクリックします。
  2. ソース・エディタで、adf-config.xmlファイルのコンテンツを例7-8に示すXMLで置き換えます。

例7-8 フロントエンドの発行者アプリケーションのadf-config.xmlにコピーするコンテンツ

<?xml version="1.0" encoding="UTF-8" ? >
<adf-config xmlns="http://xmlns.oracle.com/adf/config" 
    xmlns:sec="http://xmlns.oracle.com/adf/security/config">
  <sec:adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config">  <CredentialStoreContext 
 credentialStoreClass="oracle.adf.share.security.providers.jps.CSFCredentialSto 
 re" 
                           
 credentialStoreLocation="../../src/META-INF/jps-config.xml"/> 
   sec:JaasSecurityContext 
 initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactor 
 y" 
                             
 jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext" 
 . 
                            authorizationEnforce="false" 
                            authenticationRequire="true"/ 
  </sec:adf-security-child> 
  <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config"> 
    <mds-config version="11.1.1.000" 
xmlns="http://xmlns.oracle.com/mds/config"> 
    <type-config> 
             <type-definitions> 
               <classpathschema/Exclusion.xsd/classpath> 
               <classpathschema/Incompatibility.xsd/classpath> 
               <classpathschema/JobDefinition.xsd/classpath> 
               <classpathschema/JobSet.xsd/classpath> 
               <classpathschema/JobType.xsd/classpath> 
               <classpathschema/Schedule.xsd/classpath> 
               <classpathschema/Specialization.xsd/classpath> 
               <classpathschema/Trigger.xsd/classpath> 
               <classpathschema/TriggerExpression.xsd/classpath> 
               <classpathschema/WorkAssignment.xsd/classpath> 
               <classpathschema/Workshift.xsd/classpath> 
             </type-definitions> 
           </type-config> 
    <persistence-config> 
        <metadata-namespaces> 
           <namespace path="/oracle/as/ess/core" 
 metadata-store-usage="ess-core"/> 
           namespace path="/oracle/apps/ess" 
 metadata-store-usage="demo-app"/> 
        </metadata-namespaces> 
        <metadata-store-usages> 
        <metadata-store-usage id="ess-core" deploy-target="false" 
 default-cust-store="false"> 
           <metadata-store 
 class-name="oracle.mds.persistence.stores.db.DBMetadataStore">           
             <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/> 
             <property name="repository-name" value="mds-ESS_MDS_DS"/> 
             <property name="partition-name" 
 value="essapp-internal-partition"/> 
           </metadata-store> 
        </metadata-store-usage> 
        metadata-store-usage id="demo-app" deploy-target="true" 
 default-cust-store="false"> 
           <metadata-store 
 class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> 
             <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/>
             <property name="repository-name" value="mds-ESS_MDS_DS"/> 
             <property name="partition-name" value="essUserMetadata"/> 
           </metadata-store> 
        </metadata-store-usage> 
        </metadata-store-usages> 
      </persistence-config> 
    </mds-config> 
  </adf-mds-config> 
 </adf-config>
7.4.2.8 Oracle Enterprise Schedulerのフロントエンドの発行者アプリケーションのアセンブル

フロントエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。

フロントエンドのアプリケーションをアセンブルするには、次を実行します:

  • EJB Javaアーカイブの作成

  • WARファイルの作成

  • アプリケーションMARおよびEARファイルの作成

7.4.2.8.1 フロントエンドの発行者アプリケーションのEJB JARファイルをアセンブルする方法

EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。

フロントエンドの発行者アプリケーションのEJB JARファイルをアセンブルするには:

  1. 「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
  2. 「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」「EJB JARファイル」を選択して、「OK」をクリックします。
  3. 「デプロイメント・プロファイルの作成」ダイアログで、「デプロイメント・プロファイル名」JAR_SuperEssEjbJarに設定します。
  4. 「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「OK」をクリックします。
  5. デフォルトで作成されるJARプロファイルを削除します。EJBとWARのみを含めます。
  6. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
7.4.2.8.2 フロントエンドの発行者アプリケーションのWARファイルをアセンブルする方法

WebアプリケーションのWebアーカイブ・ファイルを作成する必要があります。

フロントエンドの発行者アプリケーションのWARファイルをアセンブルする手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、SuperWebプロジェクトを右クリックし、「新規」を選択します。
  2. 「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」「WARファイル」を選択して、「OK」をクリックします。
  3. 「デプロイメント・プロファイルの作成」ダイアログで、「デプロイメント・プロファイル名」WAR_SuperWebWarに設定します。
  4. 「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「Java EE Webコンテキスト・ルートを指定」を選択してESSDemoAppUIと入力します。
  5. 「OK」をクリックします。
  6. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
7.4.2.8.3 フロントエンドのホスティング・アプリケーションのMARおよびEARファイルをアセンブルする方法

サンプル・アプリケーションには、EssDemoAppのバックエンドのアプリケーションをアセンブルするMARプロファイルおよびEARファイルが含まれている必要があります。

フロントエンドの発行者アプリケーションのMARおよびEARファイルを作成するには:

  1. メイン・メニューから、「アプリケーション・メニュー」「アプリケーションのプロパティ」を選択します。
  2. 「アプリケーションのプロパティ」ダイアログで、「デプロイメント・プロファイル」にリストされているプロファイルを削除して「新規」をクリックします。
  3. 「デプロイメント・プロファイルの作成」ダイアログで「プロファイル・タイプ」ドロップダウン・リストから「MARファイル」を選択します。
  4. 「名前」フィールドにMAR_EssDemoAppUIMarと入力し、「OK」をクリックします。
  5. 「OK」をクリックします。
  6. 「アプリケーションのプロパティ」ダイアログの「デプロイメント」ページで、「新規」をクリックします。
  7. 「デプロイメント・プロファイルの作成」ダイアログで「プロファイル・タイプ」ドロップダウン・リストから「EARファイル」を選択します。
  8. 「名前」フィールドにEAR_EssDemoAppUIEarと入力し、「OK」をクリックします。
  9. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「アプリケーション名」フィールドにEssDemoAppUIと入力します。
  10. WAR_SuperWebWarを選択します。
  11. 「アプリケーション・アセンブリ」ナビゲーション・タブをクリックし、MAR_ESSDemoAppUIMarを選択してJAR_SuperEssEjbJarを選択します。
  12. 「OK」をクリックします。
  13. 「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
7.4.2.8.4 ADFライブラリの追加

「プロジェクト・プロパティ」→「SuperWeb」→「ライブラリとクラスパス」ウィンドウに移動します。「ライブラリの追加」ボタンを使用して、次のライブラリを追加します。

  • ADF共通ランタイム

  • ADF Facesランタイム11

  • ADF共通Webランタイム

  • ADFページ・フロー・ランタイム

  • ADFコントローラ・スキーマ

  • ADFコントローラ・ランタイム

7.4.2.8.5 アプリケーションのOracle Enterprise Schedulerプロパティの設定

次のステップは、Oracle Enterprise Schedulerプロパティの値を設定する方法を示しています。

  1. 「アプリケーション・ナビゲータ」でSuperEssプロジェクトを右クリックし、「エンタープライズ・スケジューラ・プロパティ」をクリックします。
  2. 「Enterprise Schedulerのプロパティ」ダイアログで、次の3つのフィールドすべての値としてEssDemoAppUIを入力します。
    • 論理アプリケーション名

    • アプリケーション・ポリシー・ストライプ

    • JPSインターセプタ・アプリケーション名

  3. 「OK」をクリックします。
7.4.2.9 weblogic-application.xmlファイルの構成

ソース・エディタを使用して、weblogic-application.xmlから次の行を削除します。

<library-ref
  <library-name>oracle.xdo.runtime</library-name>
</library-ref>
<library-ref>
 <library-name>oracle.applcp.runtime</library-name>
</library-ref>
7.4.2.10 フロントエンドの発行者アプリケーションのデプロイ

アプリケーションをアセンブルした後、サーバーにデプロイできます。

フロントエンドの発行者アプリケーションをデプロイするには:

  1. メイン・メニューから、「アプリケーション」→「デプロイ」→「EAR_EssDemoUIEar...」の順に選択します。
  2. アプリケーションをコンテナに設定し、デプロイします。
  3. 「デプロイメント構成」ダイアログで、「共有メタデータ・リポジトリ」パネルに2つのエントリがあります。/oracle/apps/ess/howtoネームスペースにマップされた共有リポジトリを見つけます。そのパーティションを、EssDemoAppのデプロイ時に使用したパーティションに変更します。デフォルト値を使用した場合、これはEssDemoApp_V2.0になります。

    図7-23 「Oracleデプロイメント構成」ウィンドウ

    図7-23の説明が続きます
    「図7-23 「Oracleデプロイメント構成」ウィンドウ」の説明
  4. 「OK」をクリックします。
7.4.2.11 EssHost MANIFESTファイルの更新

EssHost META-INF/MANIFEST.INFファイルのコンテンツを次の行と置き換えます。

Manifest-Version:1.0 Weblogic-Application-Version: 3.0
Extension-List: essruntime
essruntime-Extension-Name: oracle.ess.runtime
essruntime-Specification-Version: 12
7.4.2.12 分割されたアプリケーションの実行

分割されたアプリケーションを実行するには:

  1. ブラウザに次のURLを入力します。

    http://host:http-port:/ESSDemoAppUI/essdemoappservlet

    次に例を示します。

    http://myserver.example.com:7101/EssDemoAppUI/essdemoappservlet
    
  2. パスワードwelcome1を使用してEssDemoAppUserとしてログインします。
  3. 組み合されたアプリケーションと同じステップに従います。