2022年7月22日金曜日

ギャラリへカスタム・アプリケーションを登録する

 Oracle APEX 21.1よりサンプル・アプリケーションはGitHubでホストされるようになり、ギャラリから直接インストールすることができなくなりました。Oracle APEX 22.1では、この状況が改善され、サンプル・アプリケーションはギャラリから直接インストールできるようになっています。

サンプル・アプリケーションは変わらずGitHubにあるため、実際にはAPEXの画面から、GitHub上にあるエクスポートされたAPEXアプリケーションのダウンロードとインストールを行なっています。

この新機能に関連して、ユーザーが作成したアプリケーションをカスタム・アプリケーションとしてギャラリに登録できるようになっています。カスタム・アプリケーションも標準のサンプル・アプリケーションと同様に、ギャラリから直接インストールすることができます。

Oracle APEX 22.1の新しいギャラリについて、この機能を開発したDaniel Hochleitnerさんが、AskTOM Office HourのNew in APEX 22.1 (Part 3): Ed. Improvements, REST Enabled SQL Queries , and easy App Gallery Internalsで解説しています。また、カスタム・アプリケーションの登録方法は、Oracle APEX Administration Guideの3.5.8.2.3 Install Custom Apps in the Galleryで説明されています。

Office Hourとマニュアルの両方とも、カスタム・アプリケーションを登録するにはmanifest.jsonというファイルを作成し、JSON形式で登録するアプリケーションの情報を記載する、という手順になっています。

手作業でmanifest.jsonを作成するのは手間なので、manifest.jsonを生成するアプリケーションを作成することにしました。

以下より、APEXアプリケーションとREST APIの作成手順を紹介します。アプリケーションはapex.oracle.com上に作成します。

一番最初に、カスタム・アプリケーションの情報を保持する表を作成します。

SQLワークショップユーティリティクイックSQLを使います。

以下のモデルを与えて、表GALLARY_CUSTOM_APPSGALLERY_CUSTOM_APPS_LANGを作成します。

# prefix: gallery
# auditcols: true
custom_apps
    internal_name vc80 /nn /unique /upper
    author vc160 /nn
    version vc20 /nn
    icon vc400
    url vc400
    source vc400
    zip vc400 /nn
    license vc80
    apex_version vc8

custom_apps_lang
    custom_app_id vc80 /nn /fk custom_apps
    language vc2 /nn /lower
    name vc160 /nn
    description vc800

SQLの生成SQLスクリプトを保存レビューおよび実行を順次クリックします。


SQLスクリプトの確認画面が表示されるので、実行をクリックします。続けて表示される確認のダイアログで即時実行をクリックします。


SQLスクリプトが実行され、表、索引、トリガーが作成されます。


アプリケーションの作成は、この画面からは実施しません。

アプリケーション・ビルダーからアプリケーション作成ウィザードを呼び出します。

アプリケーションの名前カスタム・アプリケーション管理とします。ページの追加をクリックします。


ページのタイプとして、マスター・ディテールを選択します。


ページ名カスタム・アプリケーション管理とします。表示形式には積上げを選択します。マスターとしてGALLERY_CUSTOM_APPSディテール表としてGALLERY_CUSTOM_APPS_LANGを選択します。

ページの追加をクリックします。


表GALLERY_CUSTOM_APPSとGALLERY_CUSTOM_APPS_LANGの双方を編集できるページが追加されました。

アプリケーションの作成を実行します。


 アプリケーションが作成されました。

追加したページをページ・デザイナで開き、ビルド・オプションを使って監査列をすべてコメント・アウトします。両方の表の列CREATEDCREATED_BYUPDATEDUPDATED_BYが監査列に当たります。これらの列の値はトリガーによって設定し、画面からは操作しません。


以上でアプリケーションは完成です。

今回作成したアプリケーションをギャラリにカスタム・アプリケーションとして登録し、インストールできるようします。

ギャラリからインストールすることを考慮して、表GALLERY_CUSTOM_APPS、GALLERY_CUSTOM_APPS_LANGを、アプリケーションをインストールするときに作成するようにします。

クイックSQLを使って表を作成する際に、生成されたSQLスクリプトを保存しています。
SQLワークショップSQLスクリプトを開き、保存したSQLスクリプトの鉛筆アイコンをクリックします。


SQLスクリプトの編集画面が開きます。ダウンロードをクリックし、SQLスクリプトをファイルに落とします。


アプリケーションのサポートするオブジェクトを開きます。


ダウンロードしたファイルをインストール・スクリプトとして登録します。

インストール・スクリプトを開きます。


作成をクリックします。


スクリプトの作成方法を選択します。ダウンロードしたファイルを使うのでファイルから作成を選択し、に進みます。


名前を入力します。今回はgalleryとしています。順序はデフォルトのままにしておきます。インストール・スクリプトはDDLに限らず、データベースで実行できるスクリプトであれば登録できます。データのローディングなども実行可能です。

複数のインストール・スクリプトがある場合は、順序の指定に従って実行されます。

へ進みます。


ファイルとして先ほどダウンロードしたSQLスクリプトのファイルを選択し、スクリプトの作成をクリックします。


インストール・スクリプトが作成されました。これで、アプリケーションのインストール時に表が作成されます。


サンプルとして活用されるアプリケーションだと、不要になって削除されることも多いでしょう。削除スクリプトを作成しておくと、アプリケーションの削除時に表も削除することができます。

削除スクリプトを開きます。


作成をクリックします。


最初から作成を選んで、へ進みます。


以下の2行を記述し、作成をクリックします。外部キー制約が定義されているため、表GALLERY_CUSTOM_APPS_LANGを先にドロップします。

drop table gallery_custom_apps_lang;
drop table gallery_custom_apps;


削除スクリプトが登録されました。


サポートするオブジェクトを確認します。サポートするオブジェクトのページを開きます。

インストール・スクリプト削除スクリプトが、それぞれつづつ作成されていることが確認できます。


アプリケーション定義を開き、バージョンを確認します。


インストールされたアプリケーションのバージョンと、ギャラリに登録されているアプリケーションのバージョンが異なると、インストール済みのカスタム・アプリケーションがアップグレード可能と通知されます。

以上の作業を行なったのち、アプリケーションをエクスポートします。

エクスポート/インポートを開きます。


エクスポートを選択し、へ進みます。


ギャラリからインストールできるアプリケーションのエクスポート形式はZIPのみです。そのため、複数のファイルに分割は必ずONにします。せっかくサポートするオブジェクトも定義しているので、サポートするオブジェクトの定義をエクスポートはいにします。

その他の設定を調整し、エクスポートを実行します。


fアプリケーションID.zipというファイル名で、アプリケーションがエクスポートされます。

このファイルをGitHubにアップロードします。アップロードしたファイルをダウンロードするためのURLを確認しておきます。今回作成したアプリケーションは、以下のURLからダウンロードできます。
https://raw.githubusercontent.com/ujnak/apexapps/master/exports/gallery-custom-apps.zip

作成したアプリケーションを実行し、カスタム・アプリケーションを登録します。

以下は、今回の入力例です。

Internal Name: GALLERY_CUSTOM_APPS   (カスタム・アプリケーションで一意になる文字列を指定します。)
Author: Yuji N (作成者です。)
Version: リリース1.0 (エクスポートしたアプリケーションに定義されているバージョンです。)
Icon: 空白 (表示するアイコンを指定します。)
URLhttps://apexugj.blogspot.com/2022/07/gallery-custom-apps.html(詳細情報へのリンクです。)
Source: 空白  (SQL形式のアプリケーションのエクスポートです。アプリケーションのインストールにはZIPが使われるため、どのような場合に参照されるのか不明です。)
Zip: https://raw.githubusercontent.com/ujnak/apexapps/master/exports/gallery-custom-apps.zip (エクスポートされたアプリケーションです。)
License: 空白 (参考情報です。)
Apex Version: 22.1  (APEXのバージョンです。manifest.jsonには含まれません。)
Language: ja  (アプリケーション・ビルダーが日本語のときに表示されます。英語であればenです。de、es、fr、it、pt-br、zh-tw、zh-cn、koも指定できます。)
Nameギャラリへカスタム・アプリケーションを登録する (カスタム・アプリケーションの名前です。)
Descriptionギャラリへカスタム・アプリケーションを登録するアプリケーションです。REST APIの実装は含みません。 (カスタム・アプリケーションの説明文です。)

以上を入力し、保存をクリックします。


登録されたカスタム・アプリケーションの情報を、JSON形式で出力するREST APIを作成します。

SQLワークショップからRESTfulサービスを呼び出します。


ORDSにスキーマが登録されていない場合は、以下の画面が表示されます。ORDSにスキーマを登録します。


スキーマ属性は通常デフォルトから変更する必要はありませんが、サンプル・サービスのインストールONの場合、RESTfulサービス以外に表EMP、DEPTも作成されます。データベース・オブジェクトが作成されると困る場合は、サンプル・サービスのインストールOFFにします。

スキーマ属性の保存をクリックします。


RESTfulサービス(REST API)の作成ができるようになりました。


最初にモジュールを作成します。

左のツリーよりモジュールを選択し、モジュールの作成をクリックします。


モジュール名ベース・パスともにgalleryと入力し、モジュールの作成をクリックします。


モジュールgalleryが作成されました。続いて、テンプレートの作成を実施します。

テンプレートの作成をクリックします。


URIテンプレートとしてappsを入力し、テンプレートの作成をクリックします。


URIテンプレートappsが作成されました。最後にハンドラを作成します。

ハンドラの作成をクリックします。


メソッドとしてGETソース・タイプMedia Resourceを選択します。ソースとして以下を記述します。

以上を設定して、ハンドラの作成をクリックします。


Oracle REST Data ServicesのREST APIで生のJSONを出力する方法については、米国オラクルのデータベース・ツール部門に所属しているPMのJeff Smithさんのブログ記事ORDS: Returning Raw {JSON}を参照しています。

作成したREST APIが返すJSONドキュメントを確認するため、完全なURLをコピーします。


ブラウザに完全なURLを入力し、レスポンスを確認します。


manifest.jsonの定義に従ったJSONドキュメントが返されていることを確認します。

この情報を参照するように、APEXのインスタンス設定を変更します。

APEXの管理サービスにサインインします。

インスタンスの管理を開きます。


インスタンスの設定を開きます。


インスタンスの設定アプリケーション・ギャラリファイルURLとして、先ほどの完全なURLを追記します。

変更の適用をクリックします。


以上で、ギャラリのカスタム・アプリケーションの構成は完了です。

この記事の先頭のGIF動画で行っているように、アプリケーション・ビルダーよりギャラリにアクセスし、カスタム・アプリケーションのインストールや削除ができるようになっています。

Oracle APEXでは、サンプル・アプリケーションを提供するためにギャラリを利用していますが、企業などでの利用では、例えば会社のテーマを実装したアプリケーションや、認証スキーム、認可スキームといった共有コンポーネントが実装済みのアプリケーションを配布することにより、作成するAPEXアプリケーションの標準化を図るといった活用も考えられます。

補足

削除スクリプトの実行は、アプリケーション削除時に選択することができます。アプリケーションの削除時に、インストール時に作成された表が必ず削除されるわけではありません。


ギャラリのゴミ箱アイコンをクリックしたときは、必ず削除スクリプトが実行されます。要注意です


アプリケーションのエクスポートは、CORSの対応ができていれば、どこでも配置できるようです。