第10章 Fuse Online のカスタマイズ

Fuse Online は、一般的なアプリケーションやサービスへの接続に使用できるコネクターを多数提供します。一般的な方法でデータを処理する組み込みの手順も複数あります。しかし、Fuse Online が必要な機能を提供しない場合は、要件について開発者と話し合う必要があります。経験のある開発者は、以下を提供してインテグレーションのカスタマイズに協力できます。

  • REST API クライアントのコネクターを作成するために Fuse Online が使用できる OpenAPI ドキュメント

    このスキーマを Fuse Online にアップロードすると、Fuse Online はスキーマにしたがってコネクターを作成します。その後、コネクターを使用してインテグレーションに追加できるコネクションを作成します。たとえば、多くのインターネットショップの Web サイトは、開発者が OpenAPI ドキュメントでキャプチャーできる REST API クライアントインターフェースを提供します。

  • REST API サービスを定義する OpenAPI ドキュメント。

    このスキーマを Fuse Online にアップロードします。Fuse Online は API サービスを利用可能にし、API 呼び出しの URL を提供します。これにより、API 呼び出しでインテグレーションの実行をトリガー できます。

  • Fuse Online エクステンションを実装する JAR ファイル。エクステンションは以下の 1 つになります。

    • コネクション間のインテグレーションデータを操作する 1 つ以上のステップ。
    • アプリケーションまたはサービスのコネクター。
    • プロプライエタリー SQL データベースの JDBC ドライバーなどのライブラリーリソース。

      この JAR ファイルを Fuse Online にアップロードすると、Fuse Online はエクステンションによって提供されるカスタム機能を利用可能にします。

詳細は以下のトピックを参照してください。

10.1. REST API クライアントコネクターの開発

Fuse Online は、HTTP (Hypertext Transfer Protocol) をサポートする REST API (Representational State Transfer Application Programming Interface) のコネクターを作成できます。これには、接続する REST API を記述する有効な OpenAPI 2.0 ドキュメントが Fuse Online に必要です。API サービスプロバイダーが OpenAPI ドキュメントを利用可能にしない場合、経験のある開発者が OpenAPI ドキュメントを作成する必要があります。

REST API コネクターを開発するための情報および手順は、以下を参照してください。

10.1.1. REST API クライアントコネクターの要件

OpenAPI スキーマを Fuse Online にアップロードすると、REST API へのコネクターが利用可能になります。コネクターを選択すると REST API クライアントコネクションを作成できます。その後、新しいインテグレーションを作成し、REST API クライアントコネクションを追加するか、既存のインテグレーションを編集して REST API クライアントコネクションを追加します。

Fuse Online コネクターは OAuth 2.0、HTTP の BASIC 認証、および API キーをサポートします。REST API へのアクセスに TLS (Transport Layer Security) が必要な場合、API は認められた認証局 (CA) が発行する有効な証明書を使用する必要があります。

OAuth を使用する REST API には、クライアントコールバック URL を入力とする承認 URL が必要です。Fuse Online がコネクターを作成した後、コネクターを使用してコネクションを作成する前に、その URL にアクセスして Fuse Online 環境を REST API のクライアントとして登録する必要があります。これにより、Fuse Online 環境による REST API へのアクセスが承認されます。登録の一環として、Fuse Online コールバック URL を提供します。詳細は、「Fuse Online のアプリケーションおよびサービスへの接続、Fuse Online を REST API クライアントとして登録」の説明を参照してください。

OAuth を使用する REST API では、Fuse Online は承認の取得に Authorization Code Grant フローのみをサポートします。コネクターを作成するためにアップロードする OpenAPI ドキュメントの securityDefinitions オブジェクトで、flow 属性を accessCode に設定する必要があります。例を以下に示します。

securityDefinitions:
  OauthSecurity:
    type: oauth2
    flow: accessCode
    authorizationUrl: 'https://oauth.simple.api/authorization'
    tokenUrl: 'https://oauth.simple.api/token'

flowimplicitpassword、または application に設定しないでください。

REST API クライアントコネクターの OpenAPI スキーマは、循環 (Cyclic) スキーマ参照を持つことができません。たとえば、リクエストまたは応答ボディーを指定する JSON スキーマは、そのスキーマ自体を全体的に参照することはできず、任意数の中間スキーマを介してそれ自体を部分的に参照することもできません。

Fuse Online は、HTTP 2.0 プロトコルをサポートする REST API のコネクターを作成できません。

10.1.2. REST API クライアントコネクターの OpenAPI スキーマのガイドライン

Fuse Online が REST API クライアントコネクターを作成するとき、OpenAPI ドキュメントの各リソースオペレーションをコネクションアクションにマップします。アクション名とアクションの説明は、OpenAPI ドキュメントのドキュメントから提供されます。

OpenAPI ドキュメントが提供する詳細が多いほど、API への接続時に Fuse Online が提供するサポートも多くなります。たとえば、API 定義はリクエストおよび応答のデータタイプを宣言する必要はありません。タイプ宣言がない場合、Fuse Online は対応するコネクションアクションをタイプレス (タイプがない) として定義します。ただし、インテグレーションでは、タイプレスアクションを実行する API コネクションの直前および直後に、データマッピングステップを追加することはできません。

これに対処するには、OpenAPI ドキュメントにより多くの情報を追加します。API コネクションが実行するアクションにマップする OpenAPI リソースオペレーションを特定します。OpenAPI ドキュメントにて、各オペレーションのリクエストおよび応答タイプを指定する YAML または JSON スキーマがあることを確認します。

スキーマをアップロードした後、OpenAPI ドキュメントをベースとした API 設計のビジュアルエディターである Apicurito で、スキーマを確認および編集する機会が与えられます。詳細の追加や更新の保存を行うことができ、Fuse Online は更新に対応する API クライアントコネクターを作成します。Fuse Online がクライアントコネクターを作成した後、OpenAPI ドキュメントを編集できなくなります。変更を実装するには、新しいクライアントコネクターを作成する必要があります。

API の OpenAPI ドキュメントが、application/json コンテンツタイプおよび application/xml コンテンツタイプのサポートを宣言する場合、コネクターは JSON 形式を使用します。OpenAPI ドキュメントが、application/json および application/xml の両方を定義する consumes または produces パラメーターを指定する場合、コネクターは JSON 形式を使用します。

10.1.3. クライアントクレデンシャルをパラメーターで提供

Fuse Online が OAuth2 アプリケーションへアクセスするための承認の取得を試みると、HTTP Basic 認証を使用してクライアントのクレデンシャルを提供します。必要な場合は、このデフォルトの動作を変更し、Fuse Online が HTTP Basic 認証を使用する代わりに、クライアントクレデンシャルをパラメーターとしてプロバイダーに渡すことができます。これは、OAuth アクセストークンの取得に使用される tokenUrl エイドポイントの使用に影響します。

重要

これは テクノロジープレビュー 機能です。

Fuse Online がクライアントクレデンシャルをパラメーターとして渡すよう指定するには、OpenAPI ドキュメントの securityDefinitions セクションで、設定が truex-authorize-using-parameters ベンダーエクステンションを追加します。以下の例では、最後の行は x-authorize-using-parameters を指定しています。

securityDefinitions:
  concur_oauth2:
    type: 'oauth2'
    flow: 'accessCode'
    authorizationUrl: 'https://example.com/oauth/authorize'
    tokenUrl: 'https://example.com/oauth/token'
    scopes:
      LIST: Access List API
    x-authorize-using-parameters: true

x-authorize-using-parameters ベンダーエクステンションの設定は true または false です。

  • true は、クライアントクレデンシャルがパラメーターであることを示しています。
  • デフォルトは false で、Fuse Online は HTTP Basic 認証を使用してクライアントクレデンシャルを提供します。

10.1.4. アクセストークンの自動更新

アクセストークンに有効期限がある場合、そのトークンを使用してアプリケーションに接続する Fuse Online インテグレーションは、トークンの期限が切れると、正常に実行を停止します。新しいアクセストークンを取得するには、アプリケーションに再接続するか、アプリケーションで再登録する必要があります。

必要な場合は、このデフォルトの動作を変更し、Fuse Online が以下の状況で新しいアクセストークンを自動的にリクエストできるようにします。

  • 期限切れになった場合。
  • 指定した HTTP 応答ステータスコードが受信された場合。
重要

これは テクノロジープレビュー 機能です。

前述の状況で Fuse Online が新しいアクセストークンを自動的に取得するよう指定するには、OpenAPI ドキュメントの securityDefinitions セクションで x-refresh-token-retry-statuses ベンダーエクステンションを追加します。このエクステンションの設定は、HTTP 応答ステータスコードを指定するコンマ区切りのリストです。アクセストークンの期限が切れたり、Fuse Online が OAuth2 プロバイダーから受信したメッセージにこれらの応答ステータスコードの 1 つがある場合、Fuse Online は自動的に新しいアクセストークンの取得を試みます。以下の例では、最後の行は x-refresh-token-retry-statuses を指定しています。

securityDefinitions:
  concur_oauth2:
    type: 'oauth2'
    flow: 'accessCode'
    authorizationUrl: 'https://example.com/oauth/authorize'
    tokenUrl: 'https://example.com/oauth/token'
    scopes:
      LIST: Access List API
    x-refresh-token-retry-statuses: 401,402,403
注記

場合によっては API オペレーションが失敗し、その失敗によりアクセストークンが更新されます。この場合、新しいアクセストークンの取得に成功しても、API オペレーションが失敗します。つまり、Fuse Online は新しいアクセストークンを受信した後に、失敗した API オペレーションを再試行しません。

10.2. REST API クライアントコネクターの追加および管理

Fuse Online は OpenAPI ドキュメントから REST API クライアントコネクターを作成できます。OpenAPI ドキュメントの内容に関する情報は「REST API クライアントコネクターの開発」を参照してください。

REST API クライアントコネクターを追加および管理するための情報および手順は以下を参照してください。

REST API クライアントコネクターの作成後、このコネクターを使用するには「Fuse Online のアプリケーションおよびサービスへの接続、REST API への接続」の詳細を参照してください。

10.2.1. REST API クライアントコネクターの作成

OpenAPI ドキュメントをアップロードし、Fuse Online が REST API クライアントコネクターを作成できるようにします。

前提条件

Fuse Online が作成するコネクターの OpenAPI ドキュメントが必要です。

手順

  1. Fuse Online のナビゲーションパネルで、Customizations > API Client Connectors をクリックします。すでに利用可能な API クライアントコネクターが表示されます。
  2. Create API Connector をクリックします。
  3. Create API Client Connector ページで、以下のいずれかを行います。

    • 点線のボックスをクリックし、アップロードする OpenAPI ファイルを選択します。
    • Use a URL 選択し、入力フィールドに OpenAPI ドキュメントの URL を貼り付けます。
  4. Next をクリックします。無効なコンテンツや不足しているコンテンツがある場合、必要な修正に関する情報が Fuse Online に表示されます。アップロードする別の OpenAPI ファイルを選択するか、Cancel をクリックします。OpenAPI ファイルを訂正し、更新されたファイルをアップロードします。

    スキーマが有効な場合、Fuse Online はコネクターが提供するアクションの概要を表示します。これには、アクション定義に関するエラーおよび警告が含まれる可能性があります。

  5. アクションの概要が適切であれば Next をクリックします。

    OpenAPI ドキュメントを訂正する場合は、右下の Review/Edit をクリックして Apicurito エディターを開きます。必要に応じてスキーマを更新します。右上の Save クリックし、更新を新しい API クライアントコネクターに反映します。Next をクリックして API クライアントコネクターの作成を続行します。

    Apicurito の使用に関する詳細は、「Designing and developing an API definition with Apicurito」を参照してください。

    OpenAPI ドキュメントの URL を提供する場合、Fuse Online はドキュメントをアップロードできても、開いて編集できないことがあります。通常、これはファイルのホストの設定が原因です。スキーマを開いて編集するには、ファイルのホストに以下が必要です。

    • https URL(http URL は動作しません)
    • 有効な CORS。
  6. API のセキュリティー要件を示します。Fuse Online は OpenAPI 定義を読み取り、API のセキュリティー要件を満たすためにコネクターの設定に必要な情報を判断します。Fuse Online は以下のいずれかを表示できます。

    1. No Security (セキュリティーなし)
    2. HTTP Basic Authorization (HTTP Basic 認証) - API サービスが HTTP Basic 認証を使用する場合は、このチェックボックスを選択します。後で、このコネクターを使用してコネクションを作成するときに、Fuse Online はユーザー名とパスワードの入力を要求します。
    3. OAuth 2.0 — Fuse Online は以下を入力するよう要求します。

      1. Authorization URL は、Fuse Online を API のクライアントとして登録する場所です。登録によって Fuse Online の API へのアクセスが承認されます。『Fuse Online のアプリケーションおよびサービスへの接続』の「Fuse Online を REST API クライアントとして登録」を参照してください。OpenAPI ドキュメントまたは API の他のドキュメントはこの URL を指定する必要があります。指定しない場合、サービスプロバイダーに連絡してこの URL を取得する必要があります。
      2. OAuth 承認には、アクセストークン URL が必要です。この場合も、OpenAPI ドキュメントまたは API の他のドキュメントがこの URL を提供する必要があります。提供しない場合、サービスプロバイダーに連絡する必要があります。
    4. API Key - API サービスに API キーが必要な場合、Fuse Online はコネクターの作成に必要な情報を要求します。プロンプトは OpenAPI 定義に基づきます。たとえば、API キーがメッセージヘッダーまたはクエリーパラメーターにあるかを示す必要がある可能性があります。OpenAPI 定義が API キーのセキュリティーと他のセキュリティータイプを指定する場合、チェックボックスを選択し、このコネクターを基にしてコネクションに API キーセキュリティーを使用することを示します。後で、このコネクターを使用してコネクションを作成するときに、Fuse Online は API キーの値を入力するよう要求します。
  7. Next をクリックします。Fuse Online は OpenAPI ドキュメントによって示されるコネクターの名前、説明、ホスト、およびベース URL を表示します。このコネクターから作成するコネクションの場合は以下を行います。

    • Fuse Online は、コネクションのエンドポイントを定義するため、ホストおよびベース URL 値を連結します。たとえば、ホストが https://example.com で、ベース URL が /api/v1 の場合、コネクションエンドポイントは https://example.com/api/v1 になります。
    • Fuse Online は OpenAPI ドキュメントをデータマッピングステップに適用します。OpenAPI ドキュメントが複数のスキーマをサポートする場合、Fuse Online は TLS (HTTPS) スキーマを使用します。
  8. コネクターの詳細を確認し、必要に応じてコネクターのアイコンをアップロードします。アイコンをアップロードしない場合、Fuse Online はアイコンを生成します。後でアイコンをアップロードできます。Fuse Online でインテグレーションのフローが表示されるときに、コネクターから作成されたコネクションを表すコネクターのアイコンが表示されます。
  9. OpenAPI ファイルから取得した値を上書きするには、変更するフィールド値を編集します。

    重要

    Fuse Online がコネクターを作成した後、これを変更することはできません。変更を反映にするには、Fuse Online が新しいコネクターを作成できるよう、更新された OpenAPI ドキュメントをアップロードしたり、同じスキーマをアップロードして Apicurito で変更する必要があります。その後、新しい API クライアントコネクターを作成するプロセスを続行します。

  10. コネクターの詳細に満足したら、Create API Connector をクリックします。Fuse Online は他のコネクターを持つ新しいコネクターを表示します。

次のステップ

新しい API コネクターの使用に関する詳細は「Fuse Online のアプリケーションおよびサービスへの接続、REST API への接続」を参照してください。

10.2.2. 新規コネクターを作成して API クライアントコネクターを更新

API クライアントコネクターを作成した OpenAPI ドキュメントに更新があり、API クライアントコネクターがそれらの更新を使用するようにするには、新しい API クライアントコネクターを作成する必要があります。API クライアントコネクターを直接更新することはできません。新しい API クライアントコネクターの作成後に、そのコネクターを使用して新しいコネクションを作成し、古いコネクターから作成されたコネクションを使用する各インテグレーションを編集します。

前提条件

以下のいずれかを行う準備をする必要があります。

  • 更新された OpenAPI ドキュメントをアップロードします。
  • 古いスキーマを再度アップロードし、Apicurito で更新します。

手順

  1. 更新された OpenAPI ドキュメントを基にして新しい API クライアントコネクターを作成します。古いコネクターと新しいコネクターを区別しやすくするため、コネクター名またはコネクターの説明にバージョン番号を指定することもできます。

    REST API クライアントコネクターの作成」を参照してください。

  2. 新しいコネクターから新しいコネクションを作成します。ここでも、古いコネクターから作成されたコネクションと、新しいコネクターから作成されたコネクションを簡単に区別できるようにすることができます。コネクション名またはコネクションの説明のバージョン番号を使用すると便利です。
  3. 古いコネクションを削除し、新しいコネクションを追加して、古いコネクターから作成されたコネクションを使用する各インテグレーションを編集します。
  4. 更新された各インテグレーションをパブリッシュします。
  5. 必須ではありませんが、古いコネクターおよびコネクションを削除することが推奨されます。

10.2.3. API クライアントコネクターの削除

コネクターから作成されたコネクションがある場合や、このコネクションがインテグレーションで使用される場合は、コネクターを削除することはできません。API クライアントコネクターの削除後、そのコネクターから作成されたコネクションを使用することはできません。

手順

  1. 左側のパネルで Customizations > API Client Connectors をクリックします。
  2. 削除するコネクター名の右側にある Delete をクリックします。
  3. コネクターを削除する場合は、確認ポップアップの Delete をクリックします。

10.3. Fuse Online エクステンションの開発

Fuse Online がインテグレーションの作成に必要な機能を提供しない場合、開発者が必要な動作を提供するエクステンションを作成することができます。Syndesis エクステンションリポジトリー https://github.com/syndesisio/syndesis-extensions にエクステンションの例が含まれています。

ビジネスインテグレーターは、エクステンションを作成する開発者と要件を共有します。開発者は、エクステンションが含まれる .jar ファイルを提供します。ビジネスインテグレーターは Fuse Onlineに .jar ファイルをアップロードして、カスタムコネクター、カスタムステップ、またはライブラリーリソースを Fuse Online で使用できるようにします。

Red Hat Developer Studio への Fuse Tooling プラグインは、ステップのエクステンションまたはコネクターのエクステンションの開発に役立つウィザードを提供します。Developer Studio またはその他の IDE で、ステップエクステンションまたはコネクターエクステンションを開発するかどうかは、個人的に選択できます。Developer Studio プラグインの使用に関する詳細は、「Developing extensions for Fuse Online integration」を参照してください。

選択した IDE でエクステンションを開発するための手順の概要、要件の説明、および追加の例については以下を参照してください。

10.3.1. エクステンション開発の一般的な手順

エクステンションの開発を開始する前に、実行する必要のあるタスクについて理解しておく必要があります。

前提条件

  • Maven を理解している必要があります。
  • コネクターを提供するエクステンションを開発したり、コネクション間のデータを操作するインテグレーションステップを提供するエクステンションを開発する場合は、Camel を理解している必要があります。
  • プログラミングの経験が必要です。
注意

インテグレーション Pod は、フラットなクラスパスを持つ Java プロセスで実行されます。バージョンの競合を避けるため、エクステンションが使用する依存関係が、以下のすべてのソースからインポートされた BOM (Bill of Materials) に対応することを確認してください。

  • org.springframework.boot:spring-boot-dependencies:$SPRING_BOOT_VERSION
  • org.apache.camel:camel-spring-boot-dependencies:$CAMEL_VERSION
  • io.syndesis.integration:integration-bom:$SYNDESIS_VERSION

インポートされた BOM の一部ではない追加の依存関係がある場合、以下を行う必要があります。

  • lib ディレクトリーにあるエクステンション JAR ファイルでパッケージ化する必要があります。
  • エクステンションの JSON 記述子ファイルの dependencies プロパティーから省略します。

手順

  1. 拡張された機能の動作の理解します。機能要件を理解するために、ビジネスの関係者と話し合います。
  2. ステップエクステンション、コネクターエクステンション、またはライブラリーエクステンションを開発する必要があるかどうかを判断します。
  3. エクステンションを開発する Maven プロジェクトを設定します。
  4. ステップエクステンションを開発する場合は以下を行います。

    1. Camel ルートとして実装するか、または Syndesis Step API を使用して実装するかを決定します。Syndesis API に関する情報は http://javadoc.io/doc/io.syndesis.extension/extension-api を参照してください。
    2. Camel ルートとしてエクステンションを実装する場合は、XML フラグメント、RouteBuilder クラス、または Bean を実装するかどうかを決定します。
    3. Maven プロジェクトで、schemaVersion、エクステンション nameextensionId などの必要なメタデータを指定します。
  5. 機能を実装するクラスを作成します。
  6. 依存関係をプロジェクトの pom.xml ファイルに追加します。
  7. コネクターおよびライブラリーエクステンションと、XML に実装するステップエクステンションに、エクステンションを定義する JSON ファイルを作成します。

    Java に実装するステップエクステンションでは、Maven プロジェクトで対応するデータ構造の値を指定するときに Maven は JSON エクステンション定義ファイルを生成できます。

  8. Maven を実行してエクステンションを構築し、エクステンションの JAR ファイルを作成します。
  9. JAR ファイルを Fuse Online 開発環境にアップロードして、エクステンションをテストします。
  10. エクステンションをパッケージ化する JAR ファイルを Fuse Online 本番環境にアップロードするビジネス関係者に、そのファイルを提供します。JAR ファイルを提供するときに、Fuse Online の Web インターフェースに表示される情報以外の設定について、ビジネス関係者に説明します。

10.3.2. エクステンションの種類の説明

エクステンションは以下のいずれかを定義します。

  • コネクション間のインテグレーションデータを操作する 1 つ以上のカスタムステップ。各カスタムステップは 1 つのアクションを実行します。これは、ステップエクステンションです。
  • インテグレーションランタイムが使用するライブラリーリソース。たとえば、ライブラリーエクステンションは、Oracle などのプロプライエタリー SQL データベースに接続するための JDBC ドライバーを提供できます。
  • 統合する特定のアプリケーションまたはサービスへのコネクションを作成するための単一のカスタムコネクター。これは、コネクターエクステンションです。

    注記

    Fuse Online は OpenAPI ドキュメントを使用して REST API クライアントのコネクターを作成できます。「REST API クライアントコネクターの開発」を参照してください。

ビジネスインテグレーターは、エクステンションを作成する開発者と要件を共有します。開発者は、エクステンションが含まれる .jar ファイルを提供します。ビジネスインテグレーターは Fuse Online で .jar ファイルをアップロードし、カスタムコネクター、カスタムステップ、または Fuse Online 内で使用できるライブラリーリソースを作成します。

Fuse Online にアップロードするエクステンション .jar ファイルには、常に 1 つのエクステンションが含まれます。

コネクション間のデータを操作するステップを提供するエクステンションのアップロード例および使用例については、 AMQ から REST API へのサンプルインテグレーションのチュートリアル を参照してください。

10.3.3. エクステンションコンテンツおよび構造の概要

エクステンションとは、.jar ファイルにパッケージ化されるクラス、依存関係、およびリソースのコレクションです。

Fuse Online は Spring Boot を使用してエクステンションをロードします。そのため、Spring Boot の実行可能な JAR 形式に従い、エクステンションをパッケージ化する必要があります。たとえば、ZipEntry.STORED() を使用して、ネストされた JAR ファイルを保存するようにします。

エクステンションをパッケージ化する .jar ファイルの構造は次のとおりです。

extension.jar
|
+- META-INF
|  |
|  +- syndesis
|     |
|     +- syndesis-extension-definition.json 1
|
+- mycompany
|  |
|  +-project
|    |
|    +-YourClasses.class 2
|
+- lib 3
  |
  +-dependency1.jar
  |
  +-dependency2.jar
1
エクステンションを定義するデータ構造を指定する JSON スキーマファイル。これは、エクステンション定義の JSON ファイルです。
2
エクステンションが提供する動作を実装する Java クラス。
3
カスタム機能をビルドおよび実行するために必要な追加の依存関係。

10.3.4. エクステンション定義の JSON ファイルの要件

各エクステンションには、名前、説明、サポートされるアクション、依存関係などのデータ構造の値を指定してエクステンションを定義する .json ファイルが必要です。以下の表は、Maven がエクステンション定義 JSON ファイルを生成するかどうかと、必要になるデータ構造をエクステンションタイプ別に示しています。

エクステンションタイプMaven によるエクステンション定義の生成必要なデータ構造

Java のステップエクステンション

可能

schemaVersion
name
description
version
extensionId
extensionType
actions
dependencies *

XML のステップエクステンション

不可能

schemaVersion
name
description
version
extensionId
extensionType
actions
dependencies *

コネクターエクステンション

不可能

schemaVersion
name
description
version
extensionId
extensionType
properties
actions
dependencies *
componentScheme
connectorCustomizers
connectorFactory

ライブラリーエクステンション

不可能

schemaVersion
name
description
version
extensionId
extensionType
dependencies *

* dependencies の指定は必ずしも必要ではありませんが、ほとんどの場合で指定の必要な依存関係が存在します。

通常、エクステンション定義ファイルのレイアウトは次のようになります。

{
  "schemaVersion": "v1",
  "name": "",
  "description": "",
  "version": "",
  "extensionId": "",
  "extensionType": "",
  "properties": {
  },
  "actions": [
  ],
  "dependencies": [
  ],
}
  • schemaVersion は、エクステンション定義スキーマのバージョンを定義します。Syndesis は内部的に schemaVersion を使用して、エクステンション定義を内部モデルにマップする方法を決定します。これにより、古いバージョンの Syndesis に対して開発されたエクステンションを、より新しいバージョンの Syndesis にデプロイすることが可能になります。
  • name は、エクステンションの名前です。Fuse Online にエクステンションをアップロードするときに、この名前が表示されます。
  • description は、指定する便利な情報です。Fuse Online はこの値を操作しません。
  • version は、エクステンションへの更新を区別するのに便利です。Fuse Online はこの値を操作しません。
  • extensionId は、エクステンションの一意の ID を定義します。これは、少なくとも Syndesis 環境全体で一意である必要があります。
  • extensionType は、エクステンションが提供するものを Syndesis に示します。Syndesis バージョン 1.3 時点で、以下のエクステンションタイプがサポートされます。

    • Steps
    • Connectors
    • Libraries
  • コネクターエクステンションのトップレベルで properties が必要です。このオブジェクトは、Fuse Online ユーザーがコネクターを選択してコネクションを作成する時に Fuse Online で何を表示するかを制御します。この properties オブジェクトには、コネクションを作成するための各フォームコントロールのプロパティーセットが含まれます。以下に例を示します。

    "myControlName": {
      "deprecated": true|false,
      "description": "",
      "displayName": "",
      "group": "",
      "kind": "",
      "label": "",
      "required": true|false,
      "secret": true|false,
      "javaType": "",
      "type": "",
      "defaultValue": "",
      "enum": {
      }
    }

    コネクターエクステンションでは、ネストされた properties オブジェクトはコネクションアクションを設定するための HTML フォームコントロールを定義します。ステップエクステンションでは、actions オブジェクトに properties オブジェクトが含まれます。properties オブジェクトは、ステップを設定するための各フォームコントロールのプロパティーセットを定義します。「ユーザーインターフェースプロパティーの説明」も参照してください。

  • actions はコネクターが実行できるオペレーションや、コネクション間のステップが実行できるオペレーションを定義します。コネクターおよびステップエクステンションのみが指定するアクションを使用します。アクションの指定形式は以下のようになります。

    {
        "id": "",
        "name": "",
        "description": "",
        "actionType": "step|connector",
        "descriptor": {
        }
    }
    • id は、アクションの一意の ID です。これは、少なくとも Syndesis 環境内で一意である必要があります。
    • name は、Fuse Online に表示されるアクション名です。インテグレーターは、この値をコネクションアクションの名前またはコネクション間のインテグレーションデータを操作するステップの名前として解釈します。
    • description は、Fuse Online に表示されるアクションの説明です。インテグレーターがアクションの動作を理解するよう、このフィールドを使用します。
    • actionType は、アクションがコネクションまたはコネクション間のステップによって実行されるかどうかを示します。
    • descriptor は、kindentrypointinputDataType、および outputDatatype などのネストされた属性を指定します。
  • dependencies は、このエクステンションが必要とする Fuse Online が提供するリソースを定義します。

    以下のように依存関係を定義します。

    {
      "type": "MAVEN",
      "id"   : "org.apache.camel:camel-telegram:jar:2.21.0"
    }
    • type は依存関係のタイプを示します。MAVEN を指定します。(他のタイプは今後サポートされる予定です)
    • id は、Maven 依存関係 (Maven GAV) の ID です。

10.3.5. ユーザーインターフェースプロパティーの説明

コネクターエクステンションおよびステップエクステンションで、エクステンション定義 JSON ファイルまたは Java クラスファイルにユーザーインターフェースプロパティーを指定します。これらのプロパティーの設定は、Fuse Online ユーザーがコネクションの作成、コネクションアクションの設定、またはエクステンションによって提供されるステップの設定を行うときに Fuse Online が表示する HTML フォームコントロールを定義します。

Fuse Online コンソールのエクステンションのユーザーインターフェースに表示する各フォームコントロールのプロパティーを指定する必要があります。各フォームコントロールで、一部またはすべてのプロパティーを任意の順序で指定します。

ユーザーインターフェースプロパティーの指定例

IRC コネクターの一部である JSON ファイルでは、トップレベルの properties オブジェクトは、Fuse Online ユーザーがコネクションを作成するための IRC コネクターを選択した後に HTML フォームコントロールを定義します。3 つのフォームコントロールには、hostnamepassword、および port の 3 つのセットのプロパティー定義があります。

"properties": {
   "hostname": {
     "description": "IRC Server hostname",
     "displayName": "Hostname",
     "labelHint": "Hostname of the IRC server to connect to",
     "order": "1",
     "required": true,
     "secret": false,
     "type": "string"
   },
   "password": {
     "description": "IRC Server password",
     "displayName": "Password",
     "labelHint": "Required if IRC server requires it to join",
     "order": "3",
     "required": false,
     "secret": true,
     "type": "string"
   },
   "port": {
     "description": "IRC Server port",
     "displayName": "Port",
     "labelHint": "Port of the IRC server to connect to",
     "order": "2",
     "required": true,
     "secret": false,
     "tags": [],
     "type": "int"
   }
 },

これらのプロパティー指定を基にして、Fuse Online ユーザーが IRC コネクターを選択すると、Fuse Online に以下のダイアログが表示されます。ユーザーが 2 つの必須フィールドに値を入力し、Next をクリックすると、Fuse Online は Fuse Online ユーザーが入力する値で IRC コネクションを作成します。

Hostname

エクステンション定義 JSON ファイルの properties オブジェクト

コネクターエクステンションでは以下が行われます。

  • トップレベルの properties オブジェクトが必要です。このオブジェクトは、Fuse Online ユーザーがコネクターを選択してコネクションを作成する時に Fuse Online で何を表示するかを制御します。この properties オブジェクトには、コネクションを作成するための各フォームコントロールのプロパティーセットが含まれます。
  • actions オブジェクトでは、アクションごとに properties オブジェクトがあります。これらの properties オブジェクトごとに、そのアクションを設定するための各フォームコントロールのプロパティーセットがあります。

ステップエクステンションでは、actions オブジェクトに properties オブジェクトが含まれます。properties オブジェクトは、ステップを設定するための各フォームコントロールのプロパティーセットを定義します。JSON 階層は、以下のようになります。

"actions": [
   {
      ...

      "propertyDefinitionSteps": [
         {
            ...

            "properties":
               {
                  "control-ONE": {
                     "type": "string",
                     "displayName": "Topic Name",
                     "order": "2",
                     ...,
                     }

                  "control-TWO": {
                     "type": "boolean",
                     "displayName": "Urgent",
                     "order": "3",
                     ...
                     }

                  "control-THREE": {
                     "type": "textarea",
                     "displayName": "Comment",
                     "order": "1",
                     ...,
                     }
 } } ]

Java ファイルのユーザーインターフェースプロパティー

Java ファイルでユーザーインターフェースのフォームコントロールを定義するには、コネクション、アクション、またはステップのユーザー設定を定義する各クラスファイルに io.syndesis.extension.api.annotations.ConfigurationProperty をインポートします。Fuse Online コンソールが表示する各フォームコントロールに対して、@ConfigurationProperty アノテーションと後続のプロパティーリストを指定します。指定できるプロパティーに関する詳細は、このセクションの最後にあるユーザーインターフェースプロパティーの参照テーブルを参照してください。

以下のコードは、単一のフォームコントロールのプロパティー定義を表しています。このコードは、RouteBuilder で Camel ルートを開発する例になります。

public class LogAction extends RouteBuilder {
    @ConfigurationProperty(
        name = "prefix",
        description = "The Log body prefix message",
        displayName = "Log Prefix",
        type = "string")

以下のコードは、2 つのコントロールのプロパティー定義を表しています。このコードは、Syndesis Step API をした例です。

@Action(id = "split", name = "Split", description = "Split your exchange")
public class SplitAction implements Step {

    @ConfigurationProperty(
        name = "language",
        displayName = "Language",
        description = "The language used for the expression")
    private String language;

    @ConfigurationProperty(
        name = "expression",
        displayName = "Expression",
        description = "The expression used to split the exchange
     private String language;

コントロールフォーム入力タイプの説明

各 HTML フォームコントロールのプロパティーセットでは、type プロパティーが Fuse Online が表示するフォームコントロールの入力タイプを定義します。HTML フォームの入力タイプに関する詳細は、https://www.w3schools.com/html/html_form_input_types.asp を参照してください。

以下の表に、Fuse Online フォームコントロールの可能な入力タイプを示します。制御のプロパティーのセットで、不明な type の値を指定すると、Fuse Online は 1行のテキストを許可する入力フィールドを表示します。デフォルトは "type": "text" です。

type プロパティーの値HTMLFuse Online が表示するもの

boolean

<input type="checkbox">

ユーザーが選択可能または不可能なチェックボックス。

duration

Fuse Online ユーザーが時間の単位を選択できるようにするカスタム制御。ミリ秒、秒、分、時、または日を選択できます。また、ユーザーは番号を入力し、Fuse Online はミリ秒数を返します。例:
"properties": {
   "period": {
      "type": "duration"
      "defaultValue": 60000,
      "description": "Period",
      "displayName": "Period",
      "labelHint": "Delay between integration executions.",
      "required": true,
      "secret": false,
   }
}

hidden

<input type="hidden">

このフィールドは Fuse Online コンソールに表示されません。他のプロパティーを使用して、テキストデータなどのこのフィールドに関連するデータを指定できます。Fuse Online ユーザーはこのデータを表示または変更できませんが、ユーザーが Fuse Online ページの View Source を選択すると、ソース表示に非表示のフィールドが表示されます。そのため、セキュリティーの目的で非表示フィールドを使用しないでください。

int, integer, long, number

<input type="number">

数字を許可する入力フィールドです。

password

<input type="password">

ユーザーが入力する文字を通常はアスタリスクでマスクする入力フィールド。

select

<select> 要素。例:
<select name="targets">
  <option value="queue">Queue</option>
  <option value="topic">Topic</option>
</select>

フォームコントロールの enum プロパティーで指定するラベルと値のペアのエントリーが含まれるドロップダウンメニュー。

textstring、または未知の値

<input type="text">`

1 行のテキストを許可する入力フィールド。

textarea

<input type="textarea"

textarea 要素が使用されます。

コントロールフォームのユーザーインターフェースプロパティーの説明

コネクターまたはステップエクステンションでは、Fuse Online コンソールに表示される各 HTML フォームコントロールに対して、以下の表に説明があるプロパティーを 1 つ以上指定できます。HTML フォームの入力タイプに関する詳細は、https://www.w3schools.com/html/html_form_input_types.asp を参照してください。

プロパティー名タイプ説明

type

文字列

Fuse Online が表示するフォームコントロールの種類を制御します。詳細は、前述の表を参照してください。

cols

number

textarea フィールドに設定された場合、textarea 制御で最初に表示される列数を制御します。

controlHint または controlTooltip

文字列

設定された場合、値はフォームコントロール要素の HTML title 属性にマッピングされます。title 属性を持つ他の要素と同様に、コントロールにカーソルを合わせるとツールチップが表示されます。ツールチップの内容は、controlHint または controlTooltip プロパティーの値から取得されます。

dataList

array

type プロパティーの値が textの場合、Fuse Online は dataList プロパティーの値を使用してタイプアヘッドサポートを追加します。文字列の配列を指定します。

defaultValue

type プロパティーの値によって異なります。

Fuse Online は、最初にこの値をフォームフィールドに表示します。defaultValue プロパティーの設定のタイプは、type プロパティーの値と一致する必要があります。たとえば、type プロパティーが number に設定された場合、defaultValue 設定は number になります。ユーザーがこの初期フィールド値を変更しないと、Fuse Online は defaultValue を使用します。

description

文字列

設定されている場合、Fuse Online はこの値をフォームコントロールの下に表示します。通常、これはコントロールに関する短い便利なメッセージです。

displayName

文字列

Fuse Online はこの値を表示します。

enum

array

設定した場合、Fuse Online は type プロパティーの設定をオーバーライドし、select コントロールを実装します。配列を label および value 属性のセットとして指定します。label 属性は、選択項目のラベルとしてユーザーインターフェースに表示されます。value 属性は、対応する選択項目の値になります。

labelHint または labelTooltip

文字列

設定されている場合、表示名の横に ? アイコンが表示されます。Fuse Online ユーザーが ?アイコンをクリックすると、labelHint プロパティーの値が表示されます。

max

number

number フィールドが設定されている場合、許容される最大値を定義します。

min

number

number フィールドが設定されている場合、許容される最小値を定義します。

multiple

ブール値

select フィールドまたは enum プロパティーセットを持つフィールドに true が設定されている場合、Fuse Online は選択ドロップダウンの代わりに複数選択コントロールを表示します。

order

number

Fuse Online コンソールでの制御の順序を決定します。Fuse Online は昇順を適用します。つまり、"order": "1" のコントロールが最初に表示されます。order プロパティーを指定しないと、Fuse Online は JSON ファイルが定義する順序でコントロールを表示します。

placeholder

文字列

設定された場合、ユーザーに想定される入力を分かりやすく示すため、この値を薄いフォントで入力フィールドに表示します。

required

ブール値

required 属性がコントロールに設定されるかどうかを制御します。true の場合、Fuse Online ユーザーはこのコントロールの値を入力する必要があります。

rows

number

type プロパティーの値が textarea の場合、rows プロパティーは textarea コントロールに最初に表示される行数を制御します。

secret

ブール値

指定された場合、Fuse Online はコントロールの type プロパティーの設定を password に変更します。

10.3.6. エクステンションをサポートする Maven プラグインの説明

extension-maven-plugin は、エクステンションを有効な Spring Boot モジュールとしてパッケージ化し、エクステンションの開発をサポートします。Java に実装するステップエクステンションでは、このプラグインでエクステンション定義 JSON ファイルを生成できます。

Maven プロジェクトの pom.xml ファイルに、以下のプラグイン宣言を追加します。

<plugin>
    <groupId>io.syndesis.extension</groupId>
    <artifactId>extension-maven-plugin</artifactId>
    <version>${syndesis.version}</version>
    <executions>
        <execution>
        <goals>
            <goal>generate-metadata</goal>
            <goal>repackage-extension</goal>
        </goals>
        </execution>
    </executions>
</plugin>

extension-maven-plugin は以下のゴールを定義します。

  • generate-metadata は、生成された JAR ファイルに含まれる JSON エクステンション定義ファイルを以下のように生成します。

    1. Maven は META-INF/syndesis/syndesis-extension-definition.json ファイルにあるデータ構造の指定から開始します (このファイルがある場合)。

      XML でコーディングする場合、エクステンション定義 JSON ファイルを独自に定義する必要があり、そのファイルに必要なデータ構造をすべて指定する必要があります。

      コネクターまたはライブラリーエクステンションを開発する場合、エクステンション定義 JSON ファイルを独自に定義する必要があり、そのファイルに必要なデータ構造をすべて指定する必要があります。

      Java でステップエクステンションを開発する場合、以下を行うことが可能です。

      • エクステンション定義 JSON ファイルをユーザー自身が作成します。
      • Java コードで、必要なデータ構造すべてを定義するアノテーションを指定します。ユーザーはエクステンション定義 JSON ファイルを作成しません。
      • エクステンション定義 JSON ファイルを作成し、一部のデータ構造を指定します。
    2. Java で開発するステップエクステンションの場合、Maven はコードアノテーションから、不足している指定を取得します。
    3. Maven は、scope が provided で、extension-bom を介して管理される依存関係を指定する、依存関係リストを追加します。
  • repackage-extension はエクステンションをパッケージ化します。

    • extension-bom を介して管理されない依存関係および関連する推移的依存関係は、生成された JAR の lib フォルダーにあります。
    • ライブラリーエクステンションの場合、scope が system の依存関係は、生成された JAR の lib フォルダーにあります。

たとえば、Maven プロジェクトに以下の pom.xml ファイルがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.company</groupId>
  <artifactId>my-extension</artifactId>
  <version>1.0.0</version>
  <name>MyExtension</name>
  <description>A Sample Extension</description>
  <packaging>jar</packaging>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.syndesis.extension</groupId>
        <artifactId>extension-bom</artifactId>
        <version>1.3.10</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>io.syndesis.extension</groupId>
      <artifactId>extension-api</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.github.lalyos</groupId>
      <artifactId>jfiglet</artifactId>
      <version>0.0.8</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>io.syndesis.extension</groupId>
        <artifactId>extension-maven-plugin</artifactId>
        <version>1.3.10</version>
        <executions>
          <execution>
            <goals>
              <goal>generate-metadata</goal>
              <goal>repackage-extension</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

この pom.xml ファイルを基にすると、生成されたエクステンション定義 JSON ファイルは以下のようになります。

{
  "name": "MyExtension",
  "description": "A Sample Extension",
  "extensionId": "com.company:my-extension",
  "version": "1.0.0",
  "dependencies": [ {
    "type": "MAVEN",
    "id": "io.syndesis.extension:extension-api:jar:1.3.10"
  } ],
  "extensionType": "Libraries",
  "schemaVersion": "v1"
}

生成されたアーカイブの構造と内容は次のようになります。

my-extension-1.0.0.jar
|
+- lib
|  |
|  + jfiglet-0.0.8.jar
|
+- META-INF
  |
  +- MANIFEST.MF
     |
     +- syndesis
        |
        +- syndesis-extension-definition.json

10.3.7. エクステンションでデータシェイプを指定する方法

データシェイプは、データマッパーによって使用されるデータタイプメタデータを保持します。データマッパーはこのメタデータを、データマッパーユーザーインターフェースでソースおよびターゲットデータフィールドを表示するために使用する内部ドキュメントに変換します。コネクターまたはカスタムステップのエクステンション定義 JSON ファイルでは、各アクションの指定が入力データシェイプ (inputDataShape) および出力データシェイプ (outputDataShape) を定義します。

エクステンションを開発する場合、データマッパーがソースおよびターゲットフィールドを正しく処理および表示できるようにするデータシェイププロパティーを指定することが重要になります。以下のデータシェイププロパティーは、データマッパーの動作に影響します。

  • kind
  • type
  • specification
  • name
  • description

kind プロパティー

データシェイプ kind プロパティーは DataShapeKinds 列挙によって表されます。kind プロパティーで使用可能な値は次のとおりです。

  • java は、データタイプが Java クラスによって表されることを示します。type プロパティーの完全修飾クラス名を指定して、"kind": "java" 宣言に従います。以下に例を示します。

    "outputDataShape": {
         "kind": "java",
         "type": "org.apache.camel.component.telegram.model.IncomingMessage"
    },
  • json-schema はデータタイプが JSON スキーマによって表されることを示します。kindjson-schema に設定された場合、JSON スキーマをデータシェイプの specification プロパティーの値として指定します。以下に例を示します。

    "inputDataShape": {
      "description": "Person data",
      "kind": "json-schema",
      "name": "Person",
      "specification": "{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"title\":\"Person\",\"type\":\"object\",\"properties\":{\"firstName\":{...}}}"
    }

    SAP Concur コネクターのコードには、JSON スキーマによって指定されるデータシェイプの例 が含まれています。

  • json-instance は、データタイプが JSON インスタンスで表されることを示しています。kindjson-instance に設定された場合、JSON インスタンスをデータシェイプの specification プロパティーの値として指定します。以下に例を示します。

    "inputDataShape": {
      "description": "Person data",
      "kind": "json-instance",
      "name": "Person",
      "specification": "{\"firstName\":\"John\",...}"
    }
  • xml-schema は、データタイプが XML スキーマで表されることを示しています。kindxml-schema に設定された場合、XML スキーマをデータシェイプの specification プロパティーの値として指定します。以下に例を示します。

    "inputDataShape": {
      "description": "Person data",
      "kind": "xml-schema",
      "name": "Person",
      "specification": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">...</xs:schema>"
    }
  • xml-instance は、データタイプが XML インスタンスによって表されることを示しています。kindxml-instance に設定された場合、XML インスタンスをデータシェイプの specification プロパティーの値として指定します。以下に例を示します。

    "inputDataShape": {
      "description": "Person data",
      "kind": "xml-instance",
      "name": "Person",
      "specification": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Person><firstName>Jane</firstName></Person>"
    }
  • anyは、データタイプが構造化されていないことを示します。たとえば、バイト配列やフリーフォーマットテキストであることがあります。データマッパーは、kind プロパティーが any に設定されている場合にデータシェイプを無視します。つまり、データはデータマッパーに表示されないため、このデータとフィールドの間にマッピングを作成することはできません。

    しかし、kind プロパティーが any に設定された場合、カスタムコネクターから作成したコネクションを設定するときに、Fuse Online は入力および出力データタイプを指定するよう要求します。これは、コネクションをインテグレーションに追加するときに発生します。データシェイプのスキーマの種類、指定するスキーマの種類に対応するドキュメント、およびデータタイプの名前を指定できます。

  • none はデータタイプがないことを示します。入力データシェイプでは、コネクションまたはステップがデータを読み取らないことを示します。出力データシェイプでは、コネクションまたはステップがデータを変更しないことを示します。たとえば、入力メッセージボディーが出力メッセージボディーに転送される場合は、kind プロパティーを none に設定すると、データが通過することを意味します。データマッパーは、kindnone に設定された場合にデータシェイプを無視します。つまり、データはデータマッパーに表示されないため、このデータとフィールドの間にマッピングを作成することはできません。

type プロパティー

kind プロパティーの値が java の場合、"kind": "java" 宣言の後に完全修飾 Java クラス名を指定する type 宣言が続きます。以下に例を示します。

"outputDataShape": {
     "kind": "java",
     "type": "org.apache.camel.component.telegram.model.IncomingMessage"
},

kind プロパティーが java 以外に設定された場合、type プロパティーの設定は無視されます。

specification プロパティー

kind プロパティーの設定は、以下の表のように、specification プロパティーの設定を決定します。

kind プロパティーの設定specification プロパティーの設定

java

Java インスペクションの結果。

Java で作成する各エクステンションに、extension-maven-plugin を使用して、最低でも Java インスペクションの結果を取得します。プラグインは、Java インスペクションの結果を specification プロパティーの設定として JSON エクステンション定義ファイルに挿入します。これは、Fuse Online のデータマッピングに必要な Java インスペクションの結果を取得する唯一の方法です。

Java で記述されたステップエクステンションの場合、extension-maven-plugin は JSONエクステンション定義ファイルを生成し、必要なコンテンツを追加します。コネクターエクステンションでは、extension-maven-plugin は Java インスペクションの結果を JSON エクステンション定義ファイルに挿入しますが、プラグインが挿入しない必要なコンテンツを手作業で追加する必要があります。

json-schema

実際の JSON スキーマのドキュメント。設定をドキュメントへの参照とすることはできず、参照の手段として JSON スキーマが他の JSON スキーマドキュメントを示すことはできません。

json-instance

サンプルデータが含まれる実際の JSON ドキュメント。データマッパーは、サンプルデータからデータタイプを取得します。この設定をドキュメントへの参照とすることはできません。

xml-schema

実際の XML スキーマドキュメント。設定をドキュメントへの参照とすることはできず、参照の手段として XML スキーマが他の XML スキーマドキュメントを示すことはできません。

xml-instance

実際の XML インスタンスドキュメントです。この設定をドキュメントへの参照とすることはできません。

any

specification プロパティーは必要ありません。設定は無視されます。

none

specification プロパティーは必要ありません。設定は無視されます。

name プロパティー

データシェイプの name プロパティーは、データタイプの人間が判読できる名前を指定します。データマッパーは、この名前をデータフィールドのラベルとしてユーザーインターフェースに表示します。以下のイメージの Twitter Mention は、name プロパティーの値が表示される場所の例になります。

Name example

この名前は、Fuse Online フロービジュアライゼーションのデータタイプインジケーターにも表示されます。

description プロパティー

データシェイプの description プロパティーは、データマッパーユーザーインターフェースのデータタイプ名にカーソルを合わせたときにツールチップとして表示されるテキストを指定します。

10.3.8. ステップエクステンションの開発例

ステップエクステンションは、1 つまたは複数のカスタムステップを実装します。各カスタムステップは、コネクション間のインテグレーションデータを処理するために 1 つのアクションを実装します。以下の例は、ステップエクステンション開発の代替を示します。

Syndesis は、syndesis-extension-plugin とともに使用できる、カスタム Java アノテーションを提供します。ステップエクステンションまたはコネクターエクステンションを Java で実装する場合、Maven がアクション定義をエクステンション定義 JSON ファイルに追加できるようにするアノテーションを指定できます。アノテーションの処理を有効にするには、以下の依存関係を Maven プロジェクトに追加します。

<dependency>
  <groupId>io.syndesis.extension</groupId>
  <artifactId>extension-annotation-processor</artifactId>
  <optional>true</optional>
</dependency>

Spring Boot はインテグレーションランタイムであるため、Bean を Camel コンテキストにインジェクトするには、Spring Boot の標準の方法に従う必要があります。たとえば、自動設定クラスを作成 し、Bean を作成します。ただし、デフォルトの動作では、エクステンションコードはパッケージスキャンの対象ではありません。したがって、ステップエクステンションの META-INF/spring.factories ファイルを作成し、内容を追加する必要があります。

10.3.8.1. XML フラグメントでの Camel ルートの開発例

カスタムステップを開発するには、direct などの入力がある Camel ルートである XML フラグメントとして、アクションを実装できます。Syndesis ランタイムは、このルートを他の Camel ルートを呼び出す同じ方法で呼び出します。

たとえば、任意の接頭辞を持つメッセージのボディーをログに記録するステップを作成する場合に以下の XML はこれを行う Camel ルートを定義します。

<?xml version="1.0" encoding="UTF-8"?>
<routes xmlns="http://camel.apache.org/schema/spring"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://camel.apache.org/schema/spring
      http://camel.apache.org/schema/spring/camel-spring.xsd">

  <route id="log-body-with-prefix">
    <from uri="direct:log"/>
    <choice>
      <when>
        <simple>${header.prefix} != ''</simple>
        <log message="${header.prefix} ${body}"/>
      </when>
      <otherwise>
        <log message="Output ${body}"/>
      </otherwise>
    </choice>
  </route>

</routes>

XML でエクステンションを開発する場合は、エクステンション定義 JSON ファイルを独自に作成する必要があります。この XML フラグメントに対し、src/main/resources/META-INF/syndesis/syndesis-extension-definition.json ファイルは以下のようにアクションを定義できます。

{
  "actionType": "step",
  "id": "log-body-with-prefix",
  "name": "Log body with prefix",
  "description": "A simple body log with a prefix",
  "descriptor": {
    "kind": "ENDPOINT", 1
    "entrypoint": "direct:log", 2
    "resource": "classpath:log-body-action.xml", 3
    "inputDataShape": {
      "kind": "none"
    },
    "outputDataShape": {
      "kind": "none"
    },
  "propertyDefinitionSteps": [ {
    "description": "extension-properties",
    "name": "extension-properties",
    "properties": { 4
      "prefix": {
        "componentProperty": false,
        "deprecated": false,
        "description": "The Log body prefix message",
        "displayName": "Log Prefix",
        "javaType": "String",
        "kind": "parameter",
        "required": false,
        "secret": false,
        "type": "string"
      }
    }
  } ]
  }
}
1
アクションのタイプは ENDPOINT です。ランタイムは、Camel エンドポイントを呼び出して、このカスタムステップによって提供されるアクションを実行します。
2
呼び出す Camel エンドポイントは direct:log です。これはルートの from 指定です。
3
これは、XML フラグメントの場所になります。
4
これらは、このカスタムステップでアクションが定義したプロパティーで、このステップをインテグレーションに追加するインテグレーターに公開します。Fuse Online では、インテグレーターがユーザーインターフェースで指定する値は、プロパティーと同じ名前を持つメッセージヘッダーにマップされます。この例では、インテグレーターは Log Prefix 表示名を持つ 1 つの入力フィールドを確認できます。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。
警告

Syndesis は、完全な Camel XML 設定をサポートしません。Syndesis は <routes> タグのみをサポートします。

10.3.8.2. RouteBuilder を使った Camel ルートの開発例

カスタムステップを実装するには、RouteBuilder クラスを利用してアクションを Camel ルートとして開発します。このようなルートには、direct などの入力があります。Syndesis は、他の Camel ルートの呼び出しと同じ方法でこのルートを呼び出します。

任意の接頭辞でメッセージのボディーをログに記録するステップを作成する例を実装するには、以下のように記述します。

import org.apache.camel.builder.RouteBuilder;

import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;

@Action( 1
    id = "log-body-with-prefix",
    name = "Log body with prefix",
    description = "A simple body log with a prefix",
    entrypoint = "direct:log")
public class LogAction extends RouteBuilder {
    @ConfigurationProperty( 2
        name = "prefix",
        description = "The Log body prefix message",
        displayName = "Log Prefix",
        type = "string")
    private String prefix;

    @Override
    public void configure() throws Exception {
        from("direct::start") 3
            .choice()
                .when(simple("${header.prefix} != ''"))
                    .log("${header.prefix} ${body}")
                .otherwise()
                    .log("Output ${body}")
            .endChoice();
    }
}
1
@Action アノテーションは、アクション定義を示します。
2
@ConfigurationProperty アノテーションは、ユーザーインターフェースのフォームコントロールの定義を示します。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。
3
これはアクションの実装です。

この Java コードは Syndesis アノテーションを使用するため、extension-maven-plugin はアクション定義を自動的に生成できます。エクステンション定義 JSON ファイルのアクション定義は以下のようになります。

{
  "id": "log-body-with-prefix",
  "name": "Log body with prefix",
  "description": "A simple body log with a prefix",
  "descriptor": {
    "kind": "ENDPOINT", 1
    "entrypoint": "direct:log", 2
    "resource": "class:io.syndesis.extension.log.LogAction", 3
    "inputDataShape": {
      "kind": "none"
    },
    "outputDataShape": {
      "kind": "none"
    },
    "propertyDefinitionSteps": [ {
      "description": "extension-properties",
      "name": "extension-properties",
      "properties": { 4
        "prefix": {
          "componentProperty": false,
          "deprecated": false,
          "description": "The Log body prefix message",
          "displayName": "Log Prefix",
          "javaType": "java.lang.String",
          "kind": "parameter",
          "required": false,
          "secret": false,
          "type": "string",
          "raw": false
        }
      }
    } ]
  },
  "actionType": "step"
}
1
アクションのタイプは ENDPOINT です。ランタイムは Camel エンドポイントを呼び出して、このステップが実装するアクションを実行します。
2
これが呼び出す Camel エンドポイントです。これはルートの from 指定です。
3
これは、RoutesBuilder を実装するクラスです。
4
これらは、このカスタムステップでアクションが定義したプロパティーで、このステップをインテグレーションに追加するインテグレーターに公開します。Fuse Online では、インテグレーターがユーザーインターフェースで指定する値は、プロパティーと同じ名前を持つメッセージヘッダーにマップされます。この例では、インテグレーターは Log Prefix 表示名を持つ 1 つの入力フィールドを確認できます。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。

10.3.8.3. RouteBuilder および Spring Boot を使った Camel ルートの開発例

RouteBuilder クラスと Spring Boot を利用してアクションを Camel ルートとして開発します。この例では、Spring Boot は RouteBuilder オブジェクトを Camel コンテキストに登録するファシリティーです。Syndesis は、他の Camel ルートの呼び出しと同じ方法でこのルートを呼び出します。

任意の接頭辞でメッセージのボディーをログに記録するステップを作成する例を実装するには、以下のように記述します。

import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActionsConfiguration {

    @Action( 1
        id = "log-body-with-prefix",
        name = "Log body with prefix",
        description = "A simple body log with a prefix",
        entrypoint = "direct:log")
    @ConfigurationProperty( 2
        name = "prefix",
        description = "The Log body prefix message",
        displayName = "Log Prefix",
        type = "string")
    @Bean 3
    public RouteBuilder logBodyWithprefix() {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct::start") 4
                    .choice()
                        .when(simple("${header.prefix} != ''"))
                            .log("${header.prefix} ${body}")
                        .otherwise()
                            .log("Output ${body}")
                    .endChoice();
             }
        };
    }
}
1
@Action アノテーションは、アクション定義を示します。
2
@ConfigurationProperty アノテーションは、ユーザーインターフェースのフォームコントロールの定義を示します。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。
3
RouteBuilder オブジェクトを Bean として登録します。
4
これはアクションの実装です。

この Java コードは Syndesis アノテーションを使用するため、extension-maven-plugin はアクション定義を自動的に生成できます。エクステンション定義 JSON ファイルのアクション定義は以下のようになります。

{
  "id": "log-body-with-prefix",
  "name": "Log body with prefix",
  "description": "A simple body log with a prefix",
  "descriptor": {
    "kind": "ENDPOINT", 1
    "entrypoint": "direct:log", 2
    "inputDataShape": {
      "kind": "none"
    },
    "outputDataShape": {
      "kind": "none"
    },
    "propertyDefinitionSteps": [ {
      "description": "extension-properties",
      "name": "extension-properties",
      "properties": { 3
        "prefix": {
          "componentProperty": false,
          "deprecated": false,
          "description": "The Log body prefix message",
          "displayName": "Log Prefix",
          "javaType": "java.lang.String",
          "kind": "parameter",
          "required": false,
          "secret": false,
          "type": "string",
          "raw": false
        }
      }
    } ]
  },
  "actionType": "step"
}
1
アクションのタイプは ENDPOINT です。ランタイムは Camel エンドポイントを呼び出して、このステップが実装するアクションを実行します。
2
これが呼び出す Camel エンドポイントです。これはルートの from 指定です。
3
これらは、このカスタムステップでアクションが定義したプロパティーで、このステップをインテグレーションに追加するインテグレーターに公開します。Fuse Online では、インテグレーターがユーザーインターフェースで指定する値は、プロパティーと同じ名前を持つメッセージヘッダーにマップされます。この例では、インテグレーターは Log Prefix 表示名を持つ 1 つの入力フィールドを確認できます。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。
重要

Spring Boot が設定クラスを検出できるようにするには、以下のように META-INF/spring.factories という名前のファイルにこれらのクラスを記載する必要があります。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.company.ActionsConfiguration

Spring Boot では、設定クラスに最終的に登録するすべての Bean を Camel コンテキストで利用できます。詳細は、独自の自動設定を作成するための Spring Boot ドキュメントを参照してください。

10.3.8.4. Camel Bean の使用例

アクションを Camel Bean プロセッサーとして開発すると、カスタムステップを実装できます。任意の接頭辞でメッセージのボディーをログに記録するステップを作成する例を実装するには、以下のように記述します。

import org.apache.camel.Body;
import org.apache.camel.Handler;
import org.apache.camel.Header;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;

@Action(
    id = "log-body-with-prefix",
    name = "Log body with prefix",
    description = "A simple body log with a prefix")
public class LogAction  {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogAction.class);

    @ConfigurationProperty(
        name = "prefix",
        description = "The Log body prefix message",
        displayName = "Log Prefix",
        type = "string")
    private String prefix;

    @Handler 1
    public void process(@Header("prefix") String prefix, @Body Object body) {
        if (prefix == null) {
            LOGGER.info("Output {}", body);
        } else {
            LOGGER.info("{} {}", prefix, body);
        }
    }
}
1
これは、アクションを実装する関数です。

この Java コードは Syndesis アノテーションを使用するため、extension-maven-plugin はアクション定義を自動的に生成できます。エクステンション定義 JSON ファイルのアクション定義は以下のようになります。

{
  "id": "log-body-with-prefix",
  "name": "Log body with prefix",
  "description": "A simple body log with a prefix",
  "descriptor": {
    "kind": "BEAN", 1
    "entrypoint": "io.syndesis.extension.log.LogAction::process", 2
    "inputDataShape": {
      "kind": "none"
    },
    "outputDataShape": {
      "kind": "none"
    },
    "propertyDefinitionSteps": [ {
      "description": "extension-properties",
      "name": "extension-properties",
      "properties": {
        "prefix": { 3
          "componentProperty": false,
          "deprecated": false,
          "description": "The Log body prefix message",
          "displayName": "Log Prefix",
          "javaType": "java.lang.String",
          "kind": "parameter",
          "required": false,
          "secret": false,
          "type": "string",
          "raw": false
        }
      }
    } ]
  },
  "actionType": "step"
}
1
アクションのタイプは BEAN です。ランタイムは、Camel Bean プロセッサーを呼び出して、このカスタムステップのアクションを実行します。
2
この Camel Bean を呼び出します。
3
これらは、このカスタムステップでアクションが定義したプロパティーで、このステップをインテグレーションに追加するインテグレーターに公開します。Fuse Online では、インテグレーターがユーザーインターフェースで指定する値は、プロパティーと同じ名前を持つメッセージヘッダーにマップされます。この例では、インテグレーターは Log Prefix 表示名を持つ 1 つの入力フィールドを確認できます。詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。

Bean を使用する場合、交換ヘッダーからユーザープロパティーを取得する代わりに、ユーザープロパティーを Bean にインジェクトすると便利である可能性があります。これには、インジェクトするプロパティーに getter および setter メソッドを実装します。アクション実装は以下のようになります。

import org.apache.camel.Body;
import org.apache.camel.Handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;

@Action(
    id = "log-body-with-prefix",
    name = "Log body with prefix",
    description = "A simple body log with a prefix")
public class LogAction  {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogAction.class);

    @ConfigurationProperty(
        name = "prefix",
        description = "The Log body prefix message",
        displayName = "Log Prefix",
        type = "string")
    private String prefix;

    public void setPrefix(String prefix) { 1
        this.prefix = prefix;
    }

    public String getPrefix() { 2
        return prefix;
    }

    @Handler
    public void process(@Body Object body) {
        if (this.prefix == null) {
            LOGGER.info("Output {}", body);
        } else {
            LOGGER.info("{} {}", this.prefix, body);
        }
    }
}
1
これは、プロパティーの setter メソッドです。
2
これは、プロパティーの getter メソッドです。

10.3.8.5. Syndesis Step API の使用例

Syndesis Step API を使用することで、カスタムステップを実装できます。これにより、ランタイムルートの作成と対話することが可能になります。ProcessorDefinition クラスによって提供されるすべてのメソッドを使用でき、さらに複雑なルートを作成できます。Syndesis API に関する情報は http://javadoc.io/doc/io.syndesis.extension/extension-api を参照してください。

以下は、スプリットアクションを実装するために Syndesis Step API を使用するステップエクステンションの例になります。

import java.util.Map;
import java.util.Optional;

import io.syndesis.extension.api.Step;
import io.syndesis.extension.api.annotations.Action;
import io.syndesis.extension.api.annotations.ConfigurationProperty;
import org.apache.camel.CamelContext;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.Expression;
import org.apache.camel.builder.Builder;
import org.apache.camel.processor.aggregate.AggregationStrategy;
import org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy;
import org.apache.camel.spi.Language;

@Action(id = "split", name = "Split", description = "Split your exchange")
public class SplitAction implements Step {

    @ConfigurationProperty(
        name = "language",
        displayName = "Language",
        description = "The language used for the expression")
    private String language;

    @ConfigurationProperty(
        name = "expression",
        displayName = "Expression",
        description = "The expression used to split the exchange")
    private String expression;

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public String getExpression() {
        return expression;
    }

    public void setExpression(String expression) {
        this.expression = expression;
    }

    @Override
    public Optional<ProcessorDefinition> configure(
            CamelContext context,
            ProcessorDefinition route,
            Map<String, Object> parameters) { 1

        String languageName = language;
        String expressionDefinition = expression;

        if (ObjectHelper.isEmpty(languageName) && ObjectHelper.isEmpty(expressionDefinition)) {
            route = route.split(Builder.body());
        } else if (ObjectHelper.isNotEmpty(expressionDefinition)) {

            if (ObjectHelper.isEmpty(languageName)) {
                languageName = "simple";
            }

            final Language splitLanguage = context.resolveLanguage(languageName);
            final Expression splitExpression = splitLanguage.createExpression(expressionDefinition);
            final AggregationStrategy aggreationStrategy = new UseOriginalAggregationStrategy(null, false);

            route = route.split(splitExpression).aggregationStrategy(aggreationStrategy);
        }

        return Optional.of(route);
    }
}
1
これは、カスタムステップが実行するアクションの実装です。

この Java コードは Syndesis アノテーションを使用するため、extension-maven-plugin はアクション定義を自動的に生成できます。エクステンション定義 JSON ファイルのアクション定義は以下のようになります。

{
  "id": "split",
  "name": "Split",
  "description": "Split your exchange",
  "descriptor": {
    "kind": "STEP", 1
    "entrypoint": "io.syndesis.extension.split.SplitAction", 2
    "inputDataShape": {
      "kind": "none"
    },
    "outputDataShape": {
      "kind": "none"
    },
    "propertyDefinitionSteps": [ {
      "description": "extension-properties",
      "name": "extension-properties",
      "properties": {
        "language": {
          "componentProperty": false,
          "deprecated": false,
          "description": "The language used for the expression",
          "displayName": "Language",
          "javaType": "java.lang.String",
          "kind": "parameter",
          "required": false,
          "secret": false,
          "type": "string",
          "raw": false
        },
        "expression": {
          "componentProperty": false,
          "deprecated": false,
          "description": "The expression used to split the exchange",
          "displayName": "Expression",
          "javaType": "java.lang.String",
          "kind": "parameter",
          "required": false,
          "secret": false,
          "type": "string",
          "raw": false
        }
      }
    } ]
  },
  "tags": [],
  "actionType": "step"
}
1
アクションのタイプは STEP です。
2
これは、Step インターフェースを実装するクラスです。

その他のリソース

ユーザーインターフェースプロパティーの詳細は「ユーザーインターフェースプロパティーの説明」を参照してください。

10.3.9. コネクターエクステンションの開発例

Fuse Online が、インテグレーションで接続するアプリケーションやサービスのコネクターを提供しない場合、経験のある開発者は Fuse Online に新しいコネクターを提供するエクステンションを作成できます。

重要

コネクターエクステンションでは、Java コードからエクステンション定義 JSON ファイルを自動的に生成できません。

コネクターは基本的に Camel コンポーネントのプロキシーになります。コネクターは基盤のコンポーネントを設定し、エクステンション定義で定義されるオプションや、Fuse Online Web インターフェースが収集するユーザー提供のオプションに応じてエンドポイントを作成します。

コネクターエクステンションの定義は、以下の追加のデータ構造を使用して、ステップエクステンションに必要なエクステンション定義を拡張します。

  • componentScheme

    コネクターが使用する Camel コンポーネントを定義します。コネクターまたはアクションに componentScheme を設定できます。componentScheme をコネクターとアクションの両方に設定した場合、アクションの設定が優先されます。

  • connectorCustomizers

    ComponentProxyCustomizer クラスを実装するクラスの一覧を指定します。各クラスはコネクターの動作をカスタマイズします。たとえば、クラスはプロパティーが基礎となるコンポーネントやエンドポイントに適用される前にプロパティーを操作したり、クラスは事前または事後のエンドポイントロジックを追加する場合があります。各クラスに対して、com.mycomponent.MyCustomizer のように実装の完全クラス名を指定します。connectorCustomizers はアクションおよびコネクターに設定できます。Fuse Online は設定に応じて、カスタマイザーを最初にコネクターに適用した後、アクションに適用します。

  • connectorFactory

    基盤のコンポーネント/エンドポイントの作成や設定を行う、ComponentProxyFactory クラスを実装するクラスを定義します。実装の完全クラス名を指定します。コネクターまたはアクションに connectorFactory を設定できます。アクションには優先順位があります。

カスタマイザーの例

以下のカスタマイザーの例は、個別のオプションから DataSource を設定します。

public class DataSourceCustomizer implements ComponentProxyCustomizer, CamelContextAware {
    private final static Logger LOGGER = LoggerFactory.getLogger(DataSourceCustomizer.class);

    private CamelContext camelContext;

    @Override
    public void setCamelContext(CamelContext camelContext) { 1
        this.camelContext = camelContext;
    }

    @Override
    public CamelContext getCamelContext() { 2
        return this.camelContext;
    }

    @Override
    public void customize(ComponentProxyComponent component, Map<String, Object> options) {
        if (!options.containsKey("dataSource")) {
            if (options.containsKey("user") && options.containsKey("password") && options.containsKey("url")) {
                try {
                    BasicDataSource ds = new BasicDataSource();

                    consumeOption(camelContext, options, "user", String.class, ds::setUsername); 3
                    consumeOption(camelContext, options, "password", String.class, ds::setPassword); 4
                    consumeOption(camelContext, options, "url", String.class, ds::setUrl); 5

                    options.put("dataSource", ds);
                } catch (@SuppressWarnings("PMD.AvoidCatchingGenericException") Exception e) {
                    throw new IllegalArgumentException(e);
                }
            } else {
                LOGGER.debug("Not enough information provided to set-up the DataSource");
            }
        }
    }
}
1 2
 Syndesis は CamelContextAware を実装することで Camel コンテキストをインジェクトし、カスタマイズメソッドを呼び出します。
3 4 5
 オプションを処理し、オプションマップから削除します。

プロパティーのインジェクト例

カスタマイザーが Java Bean の慣例に従う場合、以下のようにプロパティーもインジェクトできます (前述の例を編集)。

public class DataSourceCustomizer implements ComponentProxyCustomizer, CamelContextAware {
    private final static Logger LOGGER = LoggerFactory.getLogger(DataSourceCustomizer.class);

    private CamelContext camelContext;
    private String userName;
    private String password;
    private String url;

    @Override
    public void setCamelContext(CamelContext camelContext) { 1
        this.camelContext = camelContext;
    }

    @Override
    public CamelContext getCamelContext() { 2
        return this.camelContext;
    }

    public void setUserName(String userName) { 3
      this.userName = userName;
    }

    public String getUserName() { 4
      return this.userName;
    }

    public void setPassword(String password) { 5
      this.password = password;
    }

    public String getPassword() { 6
      return this.password;
    }

    public void setUrl(String url) { 7
      this.url = url;
    }

    public String getUrl() { 8
      return this.url;
    }

    @Override
    public void customize(ComponentProxyComponent component, Map<String, Object> options) {
        if (!options.containsKey("dataSource")) {
            if (userName != null && password != null && url != null) {
                try {
                    BasicDataSource ds = new BasicDataSource();
                    ds.setUserName(userName);
                    ds.setPassword(password);
                    ds.setUrl(url);

                    options.put("dataSource", ds);
                } catch (@SuppressWarnings("PMD.AvoidCatchingGenericException") Exception e) {
                    throw new IllegalArgumentException(e);
                }
            } else {
                LOGGER.debug("Not enough information provided to set-up the DataSource");
            }
        }
    }
}
1 2 3
 Syndesis は CamelContextAware を実装することで Camel コンテキストをインジェクトし、カスタマイズメソッドを呼び出します。このサンプルコードは、setCamelContext() および getCamelContext() メソッドを上書きし、ユーザー名を設定します。
4 5 6 7 8
 サンプルコードはインジェクトされたオプションを処理し、オプションマップから自動的に削除します。

カスタマイザーを使用した before/after 論理の設定

以下の例のように、カスタマイザーを使用して before/after 論理を設定できます。

public class AWSS3DeleteObjectCustomizer implements ComponentProxyCustomizer {
  	private String filenameKey;

    public void setFilenameKey(String filenameKey) {
      this.filenameKey = filenameKey;
    }

    public String getFilenameKey() {
        return this.filenameKey;
    }

    @Override
    public void customize(ComponentProxyComponent component, Map<String, Object> options) {
      	component.setBeforeProducer(this::beforeProducer);
    }

    public void beforeProducer(final Exchange exchange) throws IOException {
      	exchange.getIn().setHeader(S3Constants.S3_OPERATION, S3Operations.deleteObject);

    	  if (filenameKey != null) {
    		    exchange.getIn().setHeader(S3Constants.KEY, filenameKey);
    	  }
    }
}

ComponentProxyComponent の動作のカスタマイズ

ComponentProxyFactory クラスは、基礎となるコンポーネント/エイドポイントの作成や設定を行います。ComponentProxyFactory が作成する ComponentProxyComponent オブジェクトの動作をカスタマイズするには、以下のメソッドのいずれかをオーバーライドします。

  • createDelegateComponent()

    Syndesis は、プロキシーの開始時にこのメソッドを呼び出し、最終的に componentScheme オプションによって定義されたスキームでコンポーネントの専用インスタンスを作成します。

    このメソッドのデフォルトの動作は、いずれかのコネクター/アクションオプションがコンポーネントレベルで適用されるかどうかを判断します。同じオプションをエンドポイントに適用できない場合のみ、メソッドによってカスタムコンポーネントインスタンスが作成され、適用可能なオプションに応じて設定されます。

  • configureDelegateComponent()`

    Syndesis は、委譲されたコンポーネントインスタンスの追加の動作を設定するためにカスタムコンポーネントインスタンスが作成された場合に限り、このメソッドを呼び出します。

  • createDelegateEndpoint()

    Syndesis は、プロキシーがエンドポイントを作成するときにこのメソッドを呼び出し、デフォルトで Camel カタログファシリティーを使用してエンドポイントを作成します。

  • configureDelegateEndpoint()

    委譲されたエンドポイントの作成後に、Syndesis がこのメソッドを呼び出し、委譲されたエンドポイントインスタンスの追加動作を設定します。以下に例を示します。

    public class IrcComponentProxyFactory implements ComponentProxyFactory {
    
        @Override
        public ComponentProxyComponent newInstance(String componentId, String componentScheme) {
            return new ComponentProxyComponent(componentId, componentScheme) {
                @Override
                protected void configureDelegateEndpoint(ComponentDefinition definition, Endpoint endpoint, Map<String, Object> options) throws Exception {
                    if (!(endpoint instanceof IrcEndpoint)) {
                        throw new IllegalStateException("Endpoint should be of type IrcEndpoint");
                    }
    
                    final IrcEndpoint ircEndpoint = (IrcEndpoint)endpoint;
                    final String channels = (String)options.remove("channels");
    
                    if (ObjectHelper.isNotEmpty(channels)) {
                        ircEndpoint.getConfiguration().setChannel(
                            Arrays.asList(channels.split(","))
                        );
                    }
                }
            };
        }
    }

10.3.10. ライブラリーエクステンションの開発方法

ライブラリーエクステンションは、インテグレーションがランタイムに必要なリソースを提供します。ライブラリーエクステンションは、ステップやコネクターを Fuse Online に提供しません。

ライブラリーエクステンションのサポートは拡大中です。本リリースでは、Fuse Online Web インターフェースは以下を行います。

  • インテグレーションを作成するときに、インテグレーションに含まれる必要があるライブラリーエクステンションを選択できません。
  • データベースコネクションをインテグレーションに追加するとき、Fuse Online は jdbc-driver タグがあるすべてのエクステンションをインテグレーションランタイムに追加します。

ライブラリーエクステンションは、いかなるアクションも定義しません。以下は、ライブラリーエクステンションの定義例になります。

{
  "schemaVersion" : "v1",
  "name" : "Example JDBC Driver Library",
  "description" : "Syndesis Extension for adding a custom JDBC Driver",
  "extensionId" : "io.syndesis.extensions:syndesis-library-jdbc-driver",
  "version" : "1.0.0",
  "tags" : [ "jdbc-driver" ],
  "extensionType" : "Libraries"
}

ライブラリーエクステンションの構造は、アクションがないこと以外は、ステップまたはコネクターエクステンションの構造と同じです。

ライブラリーエクステンションを作成する Maven プロジェクトで、Maven リポジトリーから使用できない依存関係を追加するには、以下のように system 依存関係を指定します。

<dependency>
    <groupId>com.company</groupId>
    <artifactId>jdbc-driver</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/jdbc-driver-1.0.jar</systemPath>
</dependency>

10.3.11. JDBC ドライバーライブラリーエクステンションの作成

Apache Derby、MySQL、および PostgreSQL 以外の SQL データベースに接続するには、接続するデータベースの JDBC ドライバーをラップするライブラリーエクステンションを作成します。Fuse Online にこのエクステンションをアップロードした後、Fuse Online が提供する Database コネクターはドライバーにアクセスしてプロプライエタリーデータベースへのコネクションを検証および作成することができます。特定のデータベースに新しいコネクターを作成しません。

Syndesis オープンソースコミュニティーは、JDBC ドライバーをラップするエクステンションを作成するためのプロジェクトを提供します。

エクステンションで 1 つのドライバーのみをパッケージ化します。これにより、特定のデータベースを管理する一環として、エクステンションの管理が容易になります。ただし、複数のドライバーをラップするライブラリーエクステンションを作成することは可能です。

前提条件

Syndesis プロジェクトを使用するには、GitHub アカウントが必要です。

手順

  1. 以下のいずれかを行って、接続するデータベースの JDBC ドライバーへアクセスできるようにします。

    1. ドライバーが Maven リポジトリーにあることを確認します。
    2. ドライバーをダウンロードします。
  2. ブラウザーのタブで https://github.com/syndesisio/syndesis-extensions にアクセスします。
  3. syndesis-extensions リポジトリーを GitHub アカウントにフォークします。
  4. フォークからローカルのクローンを作成します。
  5. syndesis-extensions のクローンで以下を行います。

    1. このドライバーが Maven リポジトリーにない場合、syndesis-library-jdbc-driver/lib フォルダーにコピーします。
    2. syndesis-library-jdbc-driver/pom.xml ファイルを編集します。

      1. Name 要素の値を更新し、このエクステンションに選択する名前にします。
      2. Description 要素の値を更新し、このエクステンションに関する便利な情報を提供します。
      3. このドライバーが Maven リポジトリーにある場合は、その Maven リポジトリーへの参照が pom.xml ファイルにあることを確認します。
      4. pom.xml ファイルの残りの内容を確認し、必要に応じて関連するメタデータを変更します。
    3. syndesis-library-jdbc-driver フォルダーで、mvn clean package を実行してエクステンションを構築します。

生成された .jar ファイルは syndesis-library-jdbc-driver/target フォルダーにあります。Fuse Online にアップロードするこの .jar ファイルを提供します。

注記

現在 Fuse Online には、インテグレーションに含まれる必要があるライブラリーエクステンションを選択する方法がありません。データベースコネクションをインテグレーションに追加するとき、Fuse Online は jdbc-driver タグがあるすべてのエクステンションをインテグレーションランタイムに追加します。これは、今後のリリースで改善される予定です。

10.4. エクステンションの追加および管理

エクステンションを使用すると、Fuse Online にカスタマイズを追加できるため、アプリケーションを好きなように統合できます。エクステンションで提供されるカスタマイズを使い始めた後、これらのカスタマイズを使用するインテグレーションを特定できます。これは、エクステンションを更新または削除する前に便利です。

詳細は以下のトピックを参照してください。

10.4.1. カスタム機能の使用

インテグレーションでカスタム機能を使用できるようにするには、エクステンションを Fuse Online にアップロードします。

前提条件

  • 開発者によって、Fuse Online エクステンションが含まれる .jar ファイルが提供済みである必要があります。

手順

  1. Fuse Online の左パネルで Customizations > Extensions をクリックします。
  2. Import Extension をクリックします。
  3. アップロードするエクステンションが含まれる .jar ファイルをドラッグアンドドロップまたは選択します。

    Fuse Online は、ファイルにエクステンションが含まれることを即座に検証しようとします。問題がある場合、Fuse Online はエラーに関するメッセージを表示します。エクステンションの開発者と協力して、更新された .jar ファイルを取得する必要があります。取得後、そのファイルをアップロードします。

  4. エクステンションの詳細を確認します。

    Fuse Online はファイルの検証後、エクステンションの名前、ID、説明、およびタイプを抽出および表示します。タイプは、カスタムコネクター、コネクション間のデータを操作する 1 つ以上のカスタムステップ、またはプロプライエタリーデータの JDBC ドライバーをエクステンションが定義するかどうかを示します。JDBC ドライバーを提供するエクステンションは、ライブラリーエクステンションと呼ばれます。

    コネクターエクステンションの場合、Fuse Online はこのカスタムコネクターから作成されたコネクションで使用できるアクションを表示します。エクステンションでは、開発者は、このコネクターから作成されたアプリケーションコネクションを表すために Fuse Online が使用するアイコンを提供することがあります。このアイコンは、エクステンションの詳細ページには表示されませんが、カスタムコネクターからコネクションを作成すると表示されます。エクステンションの開発者がエクステンションのアイコンを指定しなかった場合、Fuse Online はアイコンを生成します。

    ステップエクステンションでは、Fuse Online はエクステンションが定義する各カスタムステップの名前を表示します。

    ライブラリーエクステンションでは、このエクステンションに以前にアップロードした新しいバージョンの JDBC ドライバーが含まれている場合は、クラスパスから古いバージョンを削除する必要があります。クラスパスにあるのは、このドライバーの 1 つのバージョンのみで、アップロードする新しいドライバーへの参照があることを確認します。稼働中のインテグレーションや、古いドライバーを基にしてコネクションを使用するインテグレーションは影響を受けません。作成する新しいコネクションは新しいドライバーを使用します。古いドライバーで作成されたコネクションがあるインテグレーションを開始する場合、Fuse Online は代わりに新しいドライバーを自動的に使用します。

  5. Import Extension をクリックします。Fuse Online はカスタムコネクターまたはカスタムステップを使用できるようにし、エクステンションの詳細ページを表示します。

10.4.2. エクステンションを使用するインテグレーションの特定

エクステンションを更新または削除する前に、そのエクステンションが提供するカスタマイズを使用するインテグレーションを特定する必要があります。

手順

  1. Fuse Online の左パネルで Customizations > Extensions をクリックします。
  2. エクステンションの一覧で、更新または削除するエクステンションのエントリーを見つけ、Details ボタンをクリックします。

結果

Fuse Online は、エクステンションに関する詳細を表示します。これには、エクステンションが提供するカスタマイズを使用するインテグレーションのリストが含まれます。

10.4.3. エクステンションの更新

開発者がエクステンションを更新する場合、更新された .jar ファイルをアップロードし、インテグレーションで更新を実装することができます。

前提条件

開発者は、以前にアップロードしたエクステンションの更新された .jar ファイルを提供する必要があります。

手順

  1. Fuse Online の左側のパネルで Customizations > Extensions をクリックします。
  2. 更新するエクステンションのエントリーの右側にある Update をクリックします。
  3. 点線のボックスをクリックして、更新された .jar ファイルに移動および選択し、Open をクリックします。
  4. エクステンションの詳細が正しいことを確認し、Import Extension をクリックします。
  5. 更新されたエクステンションの詳細ページで、エクステンションに定義されたコネクターまたはカスタムステップを使用するインテグレーションを特定します。

更新されたエクステンションからカスタムコネクターまたはカスタムステップを使用する各インテグレーションを更新するのに何が必要であるかを確認するのはユーザー次第です。少なくとも、更新されたエクステンションに定義されたカスタマイズを使用する各インテグレーションを再パブリッシュする必要があります。

インテグレーションを編集し、カスタマイズの設定詳細を変更または追加する必要が場合があります。インテグレーションの更新方法を理解するには、エクステンションの開発者と対話する必要があります。

10.4.4. エクステンションの削除

実行中のインテグレーションがエクステンションによって提供されるステップを使用したり、エクステンションによって提供されたコネクターから作成されたコネクションを使用しても、そのエクステンションを削除できます。エクステンションの削除後に、そのエクステンションによって提供されたカスタマイズを使用するインテグレーションを開始することはできません。

手順

  1. Fuse Online の左パネルで Customizations > Extensions をクリックします。
  2. エクステンションの一覧で、削除するエクステンションのエントリーを見つけ、エントリーの右側に表示される Delete をクリックします。

結果

削除するエクステンションによって提供されるカスタマイズを使用する、停止したインテグレーションまたは下書きのインテグレーションが存在する可能性があります。このようなインテグレーションを実行するには、インテグレーションを編集して、カスタマイズを削除する必要があります。