プログラミング・ガイド

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

Oracle SALT SCAのプログラミング

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

 


概要

SCA (Service Component Architecture)の重要な側面の1つは、新しいプログラミング・モデルが導入されたことです。Oracle Tuxedoアーキテクチャの一部としてSCAを採用することで、SOA環境において高い出力性能、高可用性およびスケーラビリティをバランスよく兼ね備えたアプリケーションを開発できるようになりました。

SCAコンポーネントは、ATMIバインディングを使用してOracle Tuxedoインフラストラクチャ上で実行します。ATMIバインディングを実装することによって、SCAコンポーネント間だけでなく、SCAコンポーネントとOracle Tuxedoプログラム(クライアントとサーバー)の間のネイティブなOracle Tuxedo通信も可能になります。

プログラミング・モデルに加えてSCDL (Service Component Definition Language)を使用することで、コンポーネント間の相互作用において実行できる内容を記述し、必要なリンク(ワイヤ)を設定するようフレームワークに指示します。

 


SCAユーティリティ

Oracle SALT SCAプログラミングとともに、次のユーティリティが使用されます。

詳細は、Oracle SALTコマンド・リファレンスを参照してください。

 


SCAクライアントのプログラミング

実行時の参照バインディング拡張は、SCAコンテナのクライアント側の実装です。他のサービス(SCAコンポーネント、Oracle TuxedoサーバーまたはWebサービスなど)の呼出しに使用される必要なコードを、SCAベースのコンポーネントから透過的にカプセル化します。

SCAクライアントのプログラミング手順

SCAクライアント・プログラムを開発する手順は、次のとおりです。

  1. クライアントのディレクトリ構造を設定する
  2. クライアント・アプリケーションを開発する
  3. SCDL記述子を作成する
  4. クライアント・アプリケーションをビルドします
  5. クライアント・アプリケーションを実行する
  6. TPFAILデータを処理する

クライアントのディレクトリ構造を設定する

アプリケーションの物理表現を定義する必要があります。厳密なSCAクライアント・アプリケーションは、SCAコンポーネント・タイプです。リスト7-1には、アプリケーション内にSCAコンポーネントを配置する際に使用するディレクトリ構造を示します。

リスト7-1 SCAコンポーネントのディレクトリ構造
myApplication/ (top-level directory, designated by the APPDIR environment variable)
    root.composite (SCDL top-level composite, contains the list of components in this application)
    myClient/ (directory containing actual client component described in this section)
        myClient.composite (SCDL for the client component)
        myClient.cpp (client program source file)
        TuxService.h (interface of component called by client program)

リスト7-2には、典型的なroot.compositeの内容の例を示します。

リスト7-2 root.compositeの内容
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
       name="simple.app">
       <component name="myClientComponent">
              <implementation.composite name="myClient"/>
       </component>
</composite>

implementation.composite@nameパラメータは、「myClientComponent」という名前のコンポーネントを格納するディレクトリを参照します。この値は実行時に必要になります。詳細は、「クライアント アプリケーションを実行する」を参照してください。

クライアント・アプリケーションを開発する

クライアント・プログラムには、単一のAPIに対する呼出しを実装する必要があります。次に示すこの呼出しは、SCAランタイムを設定するために必要なものです。

...
CompositeContext theContext = CompositeContext::getCurrent();
...
実際の呼出しは、インタフェースに基づいて行われます。このインタフェースは、通常は呼び出すコンポーネントに合せて開発されます。既存のOracle Tuxedo ATMIサービスの場合は、Oracle Tuxedoメタデータ・リポジトリにアクセスすることで、このインタフェースを生成できます。詳細は、 『Oracle SALT管理ガイド』、および『Oracle SALTリファレンス・ガイド』のtuxscagenscatuxgenに関する項を参照してください。

外部Webサービスを呼び出す場合は、サービスWSDLに適合するインタフェースを指定する必要があります。詳細は、「SCAデータ型のマッピング」のWSDL型とC++型の対応に関する説明を参照してください。

リスト7-3には、インタフェースの例を示します。

リスト7-3 インタフェースの例
#include <string> 
/**
       * Tuxedo service business interface
       */
       class TuxService
       {
       public:
       virtual std::string TOUPPER(const std::string inputString) = 0;
       };

リスト7-3に示すインタフェースでは、単一のメソッドTOUPPERが定義されています。これは、タイプstd::stringの単一のパラメータを取得し、タイプstd::stringの値を返します。このインタフェースは、固有の.hファイル内に記述する必要があり、.hファイルをインクルードすることによって、クライアント・プログラムから参照されます。

リスト7-4には、呼出しを実行するために必要な一連の呼出しの例を示します。

リスト7-4 呼出しの例
// SCA definitions
// These also include a Tuxedo-specific exception definition: ATMIBindingException
#include "tuxsca.h"
// Include interface
#include "TuxService.h"
...
       // A client program uses the CompositeContext class
       CompositeContext theContext = CompositeContext::getCurrent();
...
       // Locate Service
       TuxService* toupperService =
              (TuxService *)theContext.locateService("TOUPPER");
...
       // Perform invocation
       const std::string result = toupperService->TOUPPER("somestring");
...
注: この呼出し自体は、ローカル呼出しを実行するのと同じになります(プログラム自体でリンクが設定されている別のファイルにクラスが存在するのと同じようになります)。
注: 詳細なコード例については、次のディレクトリにあるSCAサンプルを参照してください。

SCDL記述子を作成する

ローカル呼出しと実際のコンポーネントの間のリンクは、SCDLサイドファイルでバインディングを定義することによって設定します。たとえば、リスト7-4では既存のOracle Tuxedo ATMIサービスへの呼出しを示し、リスト7-5に示すSCDL記述子を使用する必要があります。このSCDLは、<componentname>.compositeというファイル内に記述します。

リスト7-5 SCDL記述子
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" 
          name="simpapp.client">
     <reference name="TOUPPER">
        <interface.cpp header="TuxService.h"/>
        <binding.atmi requires="legacy">
           <inputBufferType target="TOUPPER">STRING</inputBufferType>
           <outputBufferType target="TOUPPER">STRING</outputBufferType>
        </binding.atmi>
    </reference>
</composite>

このコンポジット・ファイルはクライアント・コンポーネントがTOUPPERリファレンスへの呼出しを実行し、この呼出しがATMIバインディングを使用して実行される可能性があることを示します。その結果、"TOUPPER" Oracle Tuxedoサービスへのtpcall()が生成されます。このOracle Tuxedoサービスは、実際にある既存のOracle Tuxedo ATMIサービスか、ATMIバインディングを使用して公開される別のSCAコンポーネントである場合があります。詳細は、「SCAコンポーネントのプログラミング」を参照してください。

inputBufferTypeおよびoutputBufferType要素は、データ交換に使用するOracle Tuxedoバッファのタイプを識別するために使用します。詳細は、「SCAデータ型のマッピング」および ATMIバインディング要素のリファレンスbinding.atmi要素で使用できるすべての値に関する記述を参照してください。

クライアント・アプリケーションをビルドします

すべての要素が整ったら、buildscaclientコマンドを使用して、クライアント・プログラムをビルドします。次の手順を実行する必要があります。

  1. クライアントのソースおよびSCDLコンポジット・ファイルが格納されているディレクトリに移動します。
  2. 次のコマンドを実行します。
  3. $ buildscaclient -c myClientComponent -s . -f myClient.cpp

    このコマンドによって、SCDLコードが検証され、必要な次の要素がビルドされます。

    • 生成されたプロキシ・コードを格納する共有ライブラリ(Windowsの場合はDLL)
    • クライアント・プログラム自体

構文エラーやコンパイル・エラーが発生していなければ、クライアント・プログラムは使用できる状態になっています。

クライアント・アプリケーションを実行する

クライアント・プログラムを実行するには、次の環境変数を指定する必要があります。

既存のOracle Tuxedoサービスの呼出し

SCAクライアント・プログラムから既存のOracle Tuxedo ATMIサービスにアクセスする場合は、リスト7-6リスト7-7およびリスト7-8に示す例を使用すると、簡単に行うことができます。

注: これらの例は、サーバー側のSCAコンポーネントにも使用できます。

リスト7-6に示すようにOracle Tuxedo METADATAリポジトリ・エントリから開始し、 tuxscagenコマンドを使用してインタフェースおよびSCDLを生成できます。

リスト7-6 既存のOracle Tuxedoサービスを呼び出すSCAコンポーネント
service=TestString
tuxservice=ECHO
servicetype=service
inbuf=STRING
outbuf=STRING

service=TestCarray
tuxservice=ECHO
servicetype=service
inbuf=CARRAY
outbuf=CARRAY
リスト7-7 生成されるヘッダー

#ifndef ECHO_h
#define ECHO_h
#include <string>
#include <tuxsca.h>
class ECHO
{
public:
    virtual std::string TestString(const std::string arg) = 0;
    virtual std::string TestCarray(const struct carray_t * arg) = 0; }; #endif /* ECHO_h */

リスト7-8 生成されるSCDLリファレンス
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
name="ECHO">
  <reference name="ECHO">
    <interface.cpp header="ECHO.h"/>
    <binding.atmi requires="legacy">
      <serviceType target="TestString">RequestResponse</serviceType>
      <inputBufferType target="TestString">STRING</inputBufferType>
      <outputBufferType target="TestString">STRING</outputBufferType>
      <serviceType target="TestCarray">RequestResponse</serviceType>
      <inputBufferType target="TestCarray">CARRAY</inputBufferType>
      <outputBufferType target="TestCarray">CARRAY</outputBufferType>
    </binding.atmi>
  </reference>
</composite>

これらのサービスを呼び出す手順は、リスト7-6からリスト7-8に示した例と同じです。

TPFAILデータを処理する

非SCA Oracle Tuxedo ATMIサービスを呼び出すとエラーを返すことがありますが、tpreturn(TPFAIL, …)を使用してデータが戻されます。この場合、SCAクライアントやSCAコンポーネントは、ATMIBindingException型によって中断されます。

サービスから返されたデータがある場合は、ATMIBindingException.getData()APIを使用して取得できます。詳細は、「TPFAIL戻り値データ」を参照してください。

リスト7-9の例は、リスト7-10に示すbinding.atmi定義に対応します。

リスト7-9 呼出し中断の例
...
        try {
          const char* result = toupperService->charToup("someInput");
        } catch (tuscany::sca::atmi::ATMIBindingException& abe) {
          // Returns a pointer to data corresponding to
          // mapping defined in <errorBufferType> element
          // in SCDL
          const char* *result = (const char **)abe.getData();
          if (abe.getData() == NULL) {
              // No data was returned
          } else {
              // Process data returned
              ...
          }
        } catch (tuscany::sca::ServiceInvocationException& sie) {
          // Other type of exception is returned
        }
...
リスト7-10 /binding.atmi定義
...
        <binding.atmi requires="legacy">
              <inputBufferType target="charToup">STRING</inputBufferType>
              <outputBufferType target="charToup">STRING</outputBufferType>
              <errorBufferType target="charToup">STRING</errorBufferType>
<binding.atmi/>
...

他のデータ型が返された場合は、対応する型にキャストする必要があります。たとえば、commonj::sdo::DataObjectPtrを返す呼出しは、リスト7-11に示すようになります。

リスト7-11 SCDL呼出しの例
...
       <errorBufferType target="myMethod">FML32/myType</errorBufferType>
...

ATMIBindingException.getData()の結果は、リスト7-12に示すようになります。

リスト7-12 ATMIBindingException.getData()の結果
...
              catch (tuscany::sca::atmi::ATMIBindingException& abe) {
              const commonj::sdo::DataObjectPtr *result =
              (const commonj::sdo::DataObjectPtr *)abe.getData();
...

呼出し側のアプリケーションにTPFAILデータを返すルールは、次のとおりです。

Oracle Tuxedoバッファ・タイプとC++データ情報の間の変換ルールの詳細は、「SCAデータ型のマッピング」を参照してください。

 


SCAコンポーネントのプログラミング

SCAコンポーネントという用語は、他のSCAランタイム・コンポーネントや非SCAランタイム・コンポーネントから呼び出すことができるSCAランタイム・アーティファクトを指します。同様に、SCAコンポーネントは、他のSCAコンポーネントや非SCAコンポーネントに対する呼出しも実行できます。一方、厳密なSCAクライアントは、他のSCAコンポーネントや非SCAコンポーネントに対する呼出しは実行できても、それらからSCAクライアントを呼び出すことはできません。

Oracle SALTのSCAコンテナは、Oracle Tuxedoサーバー環境でSCAコンポーネントをホストする機能を提供します。これにより、Oracle Tuxedoの実証された品質である信頼性スケーラビリティおよびパフォーマンスを最大限に活用できます。

表7-1は、SCAコンポーネントとOracle Tuxedoサーバーのマッピング・ルールをまとめたものです。

表7-1 SCAコンポーネントとOracle Tuxedoサーバーのマッピング・ルール

SCAコンポーネントとOracle Tuxedoサーバーのマッピング・ルール

Oracle Tuxedoリファレンスを使用しているSCAコンポーネントに特別な処理は必要ありませんが、サービスを提供しているSCAコンポーネントは引き続きOracle Tuxedo環境で処理する必要があります。

マッピングは次のとおりです。

SCAコンポジットをOracle Tuxedoアプリケーションにデプロイするには、生成されたSCAサーバーのインスタンスをUBBCONFIGファイルに構成します。複数のインスタンスをデプロイできます。マルチスレッド機能も使用可能で、既存のOracle Tuxedo機能を使用して制御できます。

SCAコンポーネントのプログラミング手順

SCAコンポーネント・プログラムを開発する手順は、次のとおりです。

  1. コンポーネント・ディレクトリを設定します
  2. コンポーネント実装を開発する
  3. SCDL記述子を作成する
  4. コンポーネントをコンパイルしてリンクを設定する
  5. Oracle Tuxedoサーバー・ホストの構築

コンポーネント・ディレクトリを設定します

まず、アプリケーションの物理表現を定義する必要があります。リスト7-13には、アプリケーション内にSCAコンポーネントを配置する際に使用するディレクトリ構造を示します。

リスト7-13 SCAコンポーネントのディレクトリ構造
myApplication/ (top-level directory, designated by the APPDIR environment variable)
    root.composite (SCDL top-level composite, contains the list of components in this application)
    myComponent/ (directory containing actual component described in this section)
        myComponent.composite (SCDL for the component)
        myComponent.componentType
        myComponentImpl.cpp (component implementation source file)
        TuxService.h (interface of component being exposed)
        TuxServiceImpl.h (component implementation definitions)

リスト7-14には、典型的なroot.compositeの内容を示します。

リスト7-14 root.compositeの内容
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" 
       name="simple.app">
       <component name="myComponent">
              <implementation.composite name="myComponent"/>
       </component>
</composite>

implementation.composite@nameパラメータは、「myComponent」コンポーネントを格納するディレクトリを参照します。

コンポーネント実装を開発する

他のコンポーネントから呼び出すように設計されたコンポーネントでは、SCAランタイムを認識する必要はありません。ただし、インタフェース機能については次の制限があります。

リスト7-15には、クライアント・プログラム用に実装するインタフェースの例を示します。

リスト7-15 コンポーネント実装のインタフェース
#include <string> 
/**
  * Tuxedo service business interface
  */
  class TuxService
  {
  public:
       virtual std::string TOUPPER(const std::string inputString) = 0;
  };

コンポーネント実装は、通常は2つのソース・ファイルで構成されます(リスト7-16およびリスト7-17にそれぞれ示します)。

また、サイドファイル(componentType)も必要です。これには、SCAラッパーの生成に必要な情報が格納されます。場合によっては(このコンポーネントが別のコンポーネントを呼び出す場合)、プロキシ・コードが格納されます。

このcomponentTypeファイル(<componentname>Impl.componentType)はSCDLファイル・タイプです。リスト7-18には、componentTypeファイル(TuxServiceImpl.componentType)の例を示します。

リスト7-18 componentTypeファイルの例
<?xml version="1.0" encoding="UTF-8"?> 
 <componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" >
       <service name="TuxService">
              <interface.cpp header="TuxService.h"/>
       </service>
 </componentType>

SCDL記述子を作成する

ローカル実装と実際のコンポーネントの間のリンクは、SCDLサイドファイルでバインディングを定義することによって設定します。たとえば、リスト7-18のファイル・タイプでは、Oracle Tuxedo ATMIサービスとして公開するには、リスト7-19のSCDLを使用する必要があります。このSCDLは、<componentname>.compositeというファイル(たとえばmyComponent.composite)内に記述します。

リスト7-19 SCDL記述子の例
<?xml version="1.0" encoding="UTF-8"?>     
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="myComponent">  
  <service name="TuxService">                                        
     <interface.cpp header="TuxService.h"/>                                                                  
        <binding.atmi requires="legacy"/>                           
   <map target="toupper">TUXSVC</map>   
   <inputBufferType target="toupper">STRING</inputBufferType>
   <outputBufferType target="toupper">STRING</outputBufferType>
          <reference>MYComponent</reference>    
    </service>   
    <component name="MYComponent">  
        <implementation.cpp library="TuxService" header="TuxServiceImpl.h"/> 
    </component>                                               
</composite>

このコンポジット・ファイルは、サービスmySVCをOracle Tuxedoインフラストラクチャを介して呼び出すことができることを示しています。また、Oracle Tuxedoシステム内で、toupper()メソッドがTUXSVCサービスとして公開されることも示しています。このサービスを初期化すると、他のSCAコンポーネントや非SCA Oracle Tuxedo ATMIクライアントから呼び出せるようになります。

inputBufferTypeおよびoutputBufferType要素は、データ交換に使用するOracle Tuxedoバッファのタイプを識別するために使用します。詳細は、「SCAデータ型のマッピング」および ATMIバインディング要素のリファレンスbinding.atmi要素で使用できるすべての値に関する記述を参照してください。

注: mycomponent.componentTypeサービス名は、コンポジット・ファイルと同じにする必要があります。それ以外の場合は例外が発生します。

コンポーネントをコンパイルしてリンクを設定する

すべての要素が整ったら、 buildscacomponentコマンドを使用して、コンポーネントをビルドします。手順は次のとおりです。

  1. APPDIRディレクトリに移動します。コンポーネントおよびサイドファイルは、1レベル下の専用のディレクトリに格納されている必要があります。
  2. 次のコマンドを実行します。
  3. $ buildscacomponent -c myComponent -s . -f TuxServiceImpl.cpp

    このコマンドによって、SCDLコードが検証され、必要な次の要素がビルドされます。

    • 生成されたプロキシ・コードを格納する共有ライブラリ(Windowsの場合はDLL)

Oracle Tuxedoサーバー・ホストの構築

コンポーネントがOracle Tuxedo環境でサポートされるようにするには、ホストOracle Tuxedoサーバーを構築する必要があります。これはbuildscaserverコマンドを使用して実行できます。

例: $ buildscaserver -c myComponent -s . -o mySCAServer

コマンドを実行すると、mySCAServerが使用できるようになります。SCDLに従ってデプロイするコンポーネントが自動的に検索され、Oracle TuxedoとSCAの間の適切な関連付けが行われます。

 


SCA Python、RubyおよびPHPプログラミング

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

SCA Python、RubyおよびPHPプログラミングの概要

SALTを介したOracle Tuxedoなどの環境でのPythonスクリプト、RubyスクリプトまたはPHPスクリプトの統合は、プログラム開発において、柔軟性をより高めることを目的としています。

Python、RubyおよびPHPは、C/C++に対して次の多くの利点を提供する、比較可能なオブジェクト指向スクリプト言語です。

SALT SCA Python、RubyおよびPHPサポートでは、Python、RubyまたはPHPのクライアント・プログラムからSCA呼出しを実行するAPIのセット、および、Python、RubyまたはPHPコンポーネントを呼び出す言語拡張子が提供されます。詳細は、「Python、RubyおよびPHPクライアント・プログラミング」および「Python、RubyおよびPHPコンポーネント・プログラミング」を参照してください。

buildscaclientbuildscaserverおよびbuildscacomponentコマンドは、実行ファイルやコンポーネント・ライブラリの作成に必要ではないため、Python、RubyまたはPHPプログラムでの使用に適合させる必要はありません。

注: システム・サーバーSCAHOSTは、Python、RubyまたはPHPスクリプトに対するリクエストおよびレスポンスを正しくマーシャルするために提供されます。これには、(Oracle Tuxedoメタデータ・リポジトリを介して)SCAサービスとして公開されるPython、RubyおよびPHPスクリプトが含まれます。定義では、パラメータを記述し、それに対応する公開されたPython、RubyまたはPHP関数のタイプが返されます。
注: 詳細は、「Python、RubyおよびPHPデータ型のマッピング」のサービス・メタデータ・リポジトリの入力例を参照してください。

使用可能なバインディングは、Python、RubyまたはPHPプログラムから使用するか、Python、RubyまたはPHPコンポーネントの呼出しに使用されます。C++などのPython、RubyおよびPHP言語拡張子は、バインディングに依存していません。

図7-2には、SALT SCA環境のPython、RubyおよびPHPのサポート・アーキテクチャの概要を示しています。

図7-2 SALT SCA Python、RubyおよびPHPのプログラミング・サポート・アーキテクチャ

SALT SCA Python、RubyおよびPHPのプログラミング・サポート・アーキテクチャ

Python、RubyおよびPHPクライアント・プログラミング

SCDLクライアント

クライアント・コンポーネントの観点から、SCDLコードのみが、参照コンポーネントと、場合によっては使用するバインディングを記述する必要があります(つまり、インタフェース要素は必要ありません)。

たとえば、次のスニペットによって、Python、RubyまたはPHPクライアントは、デフォルトのバッファ・タイプ(STRING入力、STRING出力)を使用して、ATMIバインディングを介したSCAコンポーネントを呼び出すことができます。

<reference name="CalculatorComponent">
     <binding.atmi/>
</reference>

Pythonクライアント

PythonプログラムからSCAコンポーネントを呼び出すには、次を実行する必要があります。

  1. 次のコマンドを使用して、SCAライブラリをインポートします。
  2. import sca

  3. 次のAPIを使用して、サービスを検索します。
  4. calc = sca.locateservice("CalculatorComponent")

    calcオブジェクトは、「追加」操作の呼出しに使用されます(例: result = calc.add(val1, val2))。

Rubyクライアント

RubyプログラムからSCAコンポーネントを呼び出すには、次を実行する必要があります。

  1. 次のように、Rubyプロキシ拡張をロードします。
  2. require("sca_ruby")

  3. 次のAPIを使用して、サービスを検索します。
  4. calculator = SCA::locateService("CalculatorComponent")

    calculatorオブジェクトは、「追加」操作の呼出しに使用されます(例: x = calculator.add(3, 2))。

PHPクライアント

PHPプログラムからSCAコンポーネントを呼び出すには、次を実行する必要があります。

  1. ユーザーは最初に、SCAライブラリを次のようにロードする必要があります。
  2. <?php

    dl('sca.so');

  3. 次のAPIを使用して、サービスを検索します。
  4. $svc = Sca::locateService("uBikeService");

    この時点で次のように、svcオブジェクトをsearchBike操作の呼出しに使用できます。

    $ret = $svc->searchBike('YELLOW');

Python、RubyおよびPHPコンポーネント・プログラミング

SCDLコンポーネント

コンポーネントとしてSCAでPython、RubyまたはPHPスクリプトを使用するために、implementation.pythonimplementation.rubyおよびimplementation.phpパラメータを使用する必要があります。

注: implementation.pythonimplementation.rubyおよびimplementation.phpの使用方法は、implementation.cpp要素に似ています(リスト7-19およびリスト7-31を参照)。相違点は、interface.python要素とinterface.ruby要素、または.componentTypeは必要ないという点です。

構文および属性は、次のようになります。

リスト7-20には、ATMIバインディングを使用してアクセスできるSCAコンポジット内のPythonコンポーネントの例を示します。この例では、ランタイムは、コンポジット・ファイルと同じ場所でToupperService.pyという名前のファイルにあるPythonコンポーネントを探します。

同様に、コンポジット・ファイルと同じ場所のToupperService.rbという名前のファイルに、Rubyコンポーネントが必要です。

リスト7-20 SCAコンポジット内のPythonコンポーネント
<?xml version="1.0" encoding="UTF-8"?>

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
              name="simpapp.server">

       <service name="SCASVC">
              <binding.atmi/>
              <reference>ToupperServiceComponent</reference>
</service>

<component name="ToupperServiceComponent">
       <implementation.python module="ToupperService"
                                   scope="composite"/>
</component>
       
</composite>

リスト7-21には、ATMIバインディングを使用してアクセスできるSCAコンポジット内のPHPコンポーネントの例を示します。

リスト7-21 SCAコンポジット内のPHPコンポーネント
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" 
		name="simpapp.PHP">
	<service name="TESTPHP">
	  <!-- No interface, it is contained in TMMETADATA -->
	  <binding.atmi>
	    <map target="charToup">TOUPPHP</map>
	    <inputBufferType target="charToup">STRING</inputBufferType>
	    <outputBufferType target="charToup">STRING</outputBufferType>
	  </binding.atmi>
	  <reference>ToupperServiceComponent</reference>
</service>
<component name="ToupperServiceComponent">
	<implementation.php script="toupper.php" 
					class="Toupper"/>
					scope="composite"/>
</component>
       	
</composite>

Pythonコンポーネント

Python操作は、Pythonモジュール・ファイルに含まれるモジュール・レベルの関数として公開されます。たとえば、ToupperService.pyファイルには、リスト7-22に示すコードが含まれます。

リスト7-22 Pythonモジュール・ファイル
def charToup(val1):
    print "input: " + val1
    result = "result"
    print "Python - toupper"
    return result

パラメータおよび戻り値型は、実行時に動的に決定されます。アプリケーション例外は、拡張ランタイムによって取得され、tuscany::sca::ServiceInvocationExceptionとして再スローされます。

入力中に、サポートされていない型や入力DataObjectのエラー処理がある場合、次の例外が発生します。
tuscany::sca::ServiceDataException

出力中に、単純な戻り値型が常に処理されます。(XMLデータからの)DataObjectの生成でエラーがある場合、次の例外が発生します。
tuscany::sca::ServiceDataException

詳細は、「Python、RubyおよびPHPデータ型のマッピング」を参照してください。

Rubyコンポーネント

Ruby操作は、Rubyスクリプト・ファイル(.rb拡張子)に含まれる実装クラスのメソッドとして公開されます。たとえば、ToupperService.rbファイルには、リスト7-23に示すコードが含まれます。

リスト7-23 Rubyスクリプト・ファイル
class ToupperService

  def initialize()
    print "Ruby - ToupperService.initialize\n"
  end

  def charToup(arg1)
    print "Ruby - ToupperService.div\n"
    arg1.ToUpper()
  end

end

パラメータおよび戻り値型は、実行時に動的に決定されます。アプリケーション例外は、拡張ランタイムによって取得され、tuscany::sca::ServiceInvocationExceptionとして再スローされます。

入力中に、サポートされていない型や入力DataObjectのエラー処理がある場合、次の例外が発生します。
tuscany::sca::ServiceDataException

出力中に、単純な戻り値型が常に処理されます。(XMLデータからの)DataObjectの生成でエラーがある場合、次の例外が発生します。 tuscany::sca::ServiceDataException

詳細は、「Python、RubyおよびPHPデータ型のマッピング」を参照してください。

PHPコンポーネント

PHP操作は、PHPクラスに含まれる関数として公開されます。たとえば、toupper.phpファイルには、リスト7-24に示すコードが含まれます。

リスト7-24 PHPクラス
<?php 
class MyClass { 
    public static function toupper(val) {
    print "PHP - toupper";
    return val.toupper();
  }
}
?>

パラメータおよび戻り値型は、実行時に動的に決定されます。アプリケーション例外は、拡張ランタイムによって取得され、tuscany::sca::ServiceInvocationExceptionとして再スローされます。

入力中に、サポートされていない型や入力DataObjectのエラー処理がある場合、次の例外が発生します。
tuscany::sca::ServiceDataException

出力中に、単純な戻り値型が常に処理されます。(XMLデータからの)DataObjectの生成でエラーがある場合、次の例外が発生します。 tuscany::sca::ServiceDataException

詳細は、「Python、RubyおよびPHPデータ型のマッピング」を参照してください。

 


SCA構造体のサポート

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

注: この項の内容は、アプリケーションで定義された構造体のみに適用されます。Oracle SALT SCAの定義済の構造体に関する詳細は、「SCAデータ型のマッピング」を参照してください。

SCA構造体のサポートの概要

SCA構造体のサポートでは、次が提供されます。

次に示すように、SCAメソッド・パラメータ定義またはSCAメソッドからの戻り値の定義で指定されるstructデータ型を使用する必要があります。

構造体の中の要素は、SCAパラメータとしてサポートされている、次に示す単純なデータ型/配列のいずれかになります。

SCA構造体の制限

SCA構造体記述ファイルの使用

構造体記述ファイルは、SCA構造体パラメータのフォーマットの記述に使用できます。構造体記述ファイルは、SCAに追加された機能において、Oracle Tuxedoのビュー・ファイルと非常に似ています。

注: 構造体記述ファイルの使用は省略可能で、構造体要素に対応するFMLフィールド名が構造体要素の名前と異なる場合、またはその他の非デフォルト構造体に関連する機能が必要な場合のみ、構造体記述ファイルを使用する必要があります。アプリケーションが、Associated Length Member、Associated Count Member、または構造体要素のアプリケーション指定のデフォルト値を使用する場合、構造体記述ファイルを使用するよう選択できます。

特定の構造体に構造体記述ファイルを指定しない場合、アプリケーション・コードで使用される構造体定義が使用され、SCA-ATMIモードでのFMLフィールド名は、構造体要素名と同じです。SCA-SCAアプリケーションではフィールド番号が自動的に生成されるため、これらのアプリケーションでは構造体記述ファイルを指定する必要がありません。

構造体記述ファイルの形式は、Oracle Tuxedoビュー・ファイルの形式と同じですが、次の例外があります。

構造体記述ファイルに記述された構造体がSCA-ATMIアプリケーションで実行時にFML32またはFMLバッファに対して変換される場合、対応するFMLフィールドの名前は、列3に指定したfbname値(存在する場合)で、列3に指定した値がない場合は、列2に指定したcname値です。コンパイル時に、リスト7-25に示すように、構造体記述ファイルはバイナリ構造体記述ファイルを作成します。バイナリ構造体ヘッダー・ファイルは、リスト7-26に示します。

注: SCA-SCAアプリケーションでは、FML32フィールド番号は自動的に生成されます。
リスト7-25 SCA構造体記述ファイル
VIEW empname
#TYPE       CNAME     FBNAME        COUNT      FLAG      SIZE      NULL
string      fname     EMP_FNAME       1          -        25        -
char        minit     EMP_MINI       1          -         -        -
string      lname     EMP LNAME       1          -        25        -
END

VIEW emp
struct         empname      ename     1          -         -        -
unsignedlong   id           EMP_ID    1          -         -        -
long           ssn          EMP_SSN   1          -         -        -
double         salaryhist   EMP_SAL   10         -         -        -
END
リスト7-26 バイナリ構造体ヘッダー・ファイル
struct empname {
  char fname[25];
  char minit;
  char lname[25];
};

struct emp {
  struct empname ename;
  unsigned long id;
  long ssn;
  double salaryhist[10];
}

scastructc32およびscastructcコマンドは、ソース構造体記述ファイルをバイナリ構造体記述ファイルに変換し、構造体記述ファイルに構造体を記述するヘッダー・ファイルの生成に使用されます。scastructdis32およびscastructdisコマンドは、viewdis32およびviewdisと同じ引数を受け付けます。詳細は、「Oracle SALTコマンド・リファレンス」を参照してください。

注: scastructc32およびscastructcでは、UNIXの場合は接尾辞.Vで、Windowsの場合は接尾辞.VVで、バイナリ・ファイルが生成されます。
注: Oracle Tuxedoビューで使用できないSCA拡張が構造体記述ファイルに含まれていない場合、バイナリ構造体記述ファイルのmagic値は、viewc32で使用されるmagic値と同じになります。SCA固有の拡張が使用されている場合、バイナリ構造体記述ファイルには別のmagic値が使用されます。

tuxscagenを使用した構造体の生成

オプション-Sで呼び出すとき、 tuxscagenは、関数パラメータの構造体を生成するか、生成しない場合はDataObjectPtrを使用して渡された値を戻します。

注: tuxscagen -Sを実行すると、-Sオプションなしでtuxscagenを実行した場合と同じように、単純なデータ型が生成されます。1つのメタデータ・リポジトリ内に、単純なデータ型、構造体、および他の複雑なデータ型を混在させることができます。構造体も使用するアプリケーションで単純なデータ型を使用するために、 -Sなしでtuxscagenを実行する必要はありません。

 


SCAリモート・プロトコルのサポート

SCA Oracle Tuxedo呼出しでは、次のリモート・プロトコルがサポートされます。

/WS

SCAコンテナを使用して行うSCA呼出しは、Oracle Tuxedo WorkStationプロトコル(/WS)を使用して実行できます。これを行うには、<binding.atmi>要素の<remoteAccess>要素に、値WorkStationを指定します(WebServicesとの混同を避けるため、短縮しません)。

このモードで使用できるのは、参照タイプの呼出しのみです。サービス・タイプの呼出しは、/WSを使用して透過的に実行する場合があります(動作や構成に違いはなく、SCAサービスの<remoteAccess>要素をWorkStationに設定しても影響はありません)。

ネイティブなライブラリとWorkStationライブラリを同じプロセス内に混在させることはできないため、選択したリモート・アクセスのタイプに応じて、クライアント・プロセスを個別にビルドする必要があります。

注: /binding.atmi/@requiresに値propagatesTransactionを使用すると、実際のATMIバインディングの動作では、トランザクションの伝播が実行されません。このプロトコルの使用は、Oracle Tuxedo (SCAまたは非SCA)アプリケーションへのクライアント側のアクセスに対してのみ予約されるため、実際にはトランザクションが開始されます。詳細は、「ATMIバインディング」を参照してください。

/Domains

SCAコンテナを使用して行うSCA呼出しは、Oracle Tuxedo /Domainsプロトコルを使用して実行できます。SCDLファイル内の<binding.atmi>宣言には、追加の構成は必要ありません。

注: /Domains相互運用性の構成は、Oracle Tuxedo管理者が制御します。
注: Oracle Tuxedo /Domainsに構成されたSCAサービス名は、次のとおりです。
注: 詳細は、「SCAとOracle Tuxedoの相互運用性」を参照してください。

 


SCAバインディング

Oracle SALTでは、次をサポートします。

ATMIバインディング

Oracle Tuxedo通信は、<binding.atmi>要素を使用してSCDLで構成されます。これによってATMIトランスポートに固有の構成要素、たとえばTUXCONFIGファイルの場所、使用されるネイティブOracle Tuxedoバッファ・タイプ、Oracle Tuxedo固有の認証、または/WS (WorkStation)構成要素などを指定できます。

リスト7-27には、<binding.atmi>要素の要約を示します。

注: ?は、0または1回指定できるパラメータを表します。
注: *は、0回以上指定できるパラメータを表します。

詳細は、Oracle SALTリファレンス・ガイド 付録F「Oracle SALT SCA ATMIバインディングのリファレンス」を参照してください。

リスト7-27 ATMIバインディングの擬似スキーマ
<binding.atmi requires="transactionalintent legacyintent"?>
       <tuxconfig>...</tuxconfig>?
       <map target="name">...</map>*
       <serviceType target="name">...</serviceType>*
       <inputBufferType target="name">...</inputBufferType>*
       <outputBufferType target="name">...</outputBufferType>*
       <errorBufferType target="name">...</errorBufferType>*
       <workStationParameters>?
              <networkAddress>...</networkAddress>?
              <secPrincipalName>...</secPrincipalName>?
              <secPrincipalLocation>...</secPrincipalLocation>?
              <secPrincipalPassId>...</secPrincipalPassId>?
              <encryptBits>...</encryptBits>?
       </workStationParameters>
       <authentication>?
              <userName>...</userName>?
              <clientName>...</clientName>?
              <groupName>...</groupName>?
              <passwordIdentifier>...</passwordIdentifier>?
              <userPasswordIdentifier>...
                                          </userPasswordIdentifier>?
       </authentication>
       <fieldTablesLocation>...</fieldTablesLocation>?
       <fieldTables>...</fieldTables>?
       <fieldTablesLocation32>...</fieldTablesLocation32>?
       <fieldTables32>...</fieldTables32>?
       <viewFilesLocation>...</viewFilesLocation>?
       <viewFiles>...</viewFiles>?
       <viewFilesLocation32>...</viewFilesLocation32>?
       <viewFiles32>...</viewFiles32>?
       <remoteAccess>...</remoteAccess>?
       <transaction timeout="xsd:long"/>?
</binding.atmi>

Java ATMI (JATMI)バインディング

Java ATMI (JATMI)バインディングを使用すると、Javaで記述したSCAクライアントからOracle TuxedoサービスやSCAコンポーネントを呼び出すことができます。Oracle Tuxedo WorkStationプロトコル(/WS)に基づいて、Oracle Tuxedoサービスの一方向呼出しを提供します。この呼出しは、Java環境からサーバーとして動作するOracle Tuxedoアプリケーションへのアウトバウンド通信にのみ使用できます。SCDLバインディング宣言のコンポジット・ファイルと異なり、外部構成は必要ありません。サービス名、ワークステーション・アドレスおよび認証データは、バインディング宣言内で提供されます。

注: Oracle 11gR1 JCA Adapterを介したSSLはサポートされています。LLEは現時点ではサポートされていません。

JATMIバインディングは、Oracle Tuxedo CPP ATMIバインディング要素のほとんどでサポートされており、使用方法も同じです。ただし、基礎となるテクノロジの違いおよび実行環境の違いにより、サポートされない要素や、サポートされていても要素名が異なる要素があります。

次のOracle Tuxedo CPP ATMIバインディング要素はサポートされません。

次のOracle Tuxedo CPP ATMIバインディングworkStationParameters要素はサポートされません。

次のOracle Tuxedo CPP ATMIバインディング要素は、制限付きでサポートされます。

次に示す要素内のすべてのクラスは、JavaのCLASSPATHに指定する必要があります。

リスト7-28には、Oracle Tuxedoサービスのバインディング宣言を記述した「ECHO」という名前のコンポジット・ファイルの例を示します。

リスト7-28 ECHOコンポジット・ファイル
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:f="binding-atmi.xsd"
name="ECHO">
    <reference name="ECHO" promote="EchoComponent/ECHO">
       <interface.java interface="com.abc.sca.jclient.Echo" />
       <f:binding.atmi requires="legacy">
       <f:inputBufferType target="echoStr">STRING</f:inputBufferType>
         <f:outputBufferType target="echoStr">STRING</f:outputBufferType>
           <f:errorBufferType target="echoStr">STRING</f:errorBufferType>
            <f:workStationParameters>

<f:networkAddress>//STRIATUM:9999,//STRIATUM:1881</f:networkAddr
ess>
            </f:workStationParameters>
            <f:remoteAccess>WorkStation</f:remoteAccess>
        </f:binding.atmi>
    </reference>
    <component name="EchoComponent">
      <implementation.java class="com.abc.sca.jclient.EchoComponentImpl" />
    </component>
</component>

リスト7-29には、リスト7-28に記述した例のインタフェースを示します。

リスト7-29 ECHOインタフェース
package com.abc.sca.jclient;

import com.oracle.jatmi.AtmiBindingException;

public interface Echo {
        String echoStr(String requestString) throws AtmiBindingException;
}

リスト7-30には、SCAクライアント実装の例を示します。

リスト7-30 SCAクライアント実装
package com.abc.sca.jclient;

import org.osoa.sca.annotations.Constructor;
import org.osoa.sca.annotations.Reference;
import com.oracle.jatmi.AtmiBindingException;

/**
* A simple client component that uses a reference with a JATMI binding.
*/
public class EchoComponentImpl implements Echo {

       private Echo echoReference;

        @Constructor
       public EchoComponentImpl(@Reference(name = "ECHO", required = true) Echo
 echoReference) {
                this.echoReference = echoReference;
       }

        public String echoStr(String requestString) throws AtmiBindingException {
                return echoReference.echoStr(requestString);
        }
}

Python、RubyおよびPHPバインディング

Python、RubyおよびPHP言語拡張子は、バインディングに依存していません。つまり、バインディング拡張では、クライアントやコンポーネントの言語が認識されません。言語拡張子からは、使用するバインディングは認識されません。

バインディング拡張は、Python、RubyおよびPHPプログラム・サポートに準拠するよう変更されません。次のことに注意してください。

Python、RubyおよびPHPバインディングの制限

Python、RubyおよびPHPバインディングを使用する場合、次の制限があります。

Webサービス・バインディング

Webサービス・バインディング(binding.ws)では、WebサービスのトラフィックをGWWSゲートウェイ経由にすることで、以前からのOracle SALT機能を利用します。SCAコンポーネントはOracle Tuxedoサーバーでホストされ、それらのサーバーとの通信はGWWSゲートウェイ経由で行います。

サーバーを実行する環境が、Oracle Tuxedo環境である場合も、ネイティブなTuscany環境(たとえばAxis2 Webサービス・バインディングでコンポーネントを公開する環境)である場合も、Webサービス・バインディングを使用するSCAクライアントを変更する必要はありません。

注: HTTPSは現時点ではサポートされていません。

SCAコンポーネントをWebサービス・バインディング(binding.ws)を使用して公開する場合、ツールによって、WSDF情報、メタデータ・エントリおよびFML32フィールド定義の生成が実行されます。

SCAコンポーネントのSCDLコードを、<binding.ws>要素を含むOracle Tuxedoドメイン(たとえばサービス要素)でホストする場合、buildscaserverコマンドを実行すると、service.wsdf(serviceは公開するサービスの名前)というファイルにWSDFエントリが生成されます。これに伴い、Webサービスに関連付けられたWSDLインタフェースの内容に基づいて、service.mifおよびservice.fml32フィールド表ファイルも生成されます。WSDLインタフェースはユーザーが構成する必要があります。WSDLインタフェースが見つからない場合は、エラー・メッセージが生成されます。

Oracle TuxedoドメインからWebサービス・バインディング(たとえばSCDLのreference要素)を使用してアクセスするWebサービスは、次の手順に従って手動で構成する必要があります。

  1. wsdlcvtツールを使用して、WSDLファイルをWSDFエントリに変換します。同時に、サービス・メタデータ・エントリ・ファイル(.mif)とfml32マッピング・ファイルが生成されます。
  2. UBBソースにTMMETADATAおよびGWWSサーバーが構成されていることを確認します。
  3. WSDFファイルをSALTDEPLOYファイルにインポートします。
  4. wsloadcfを使用して、SALTDEPLOYファイルをバイナリに変換します。
  5. tmloadreposコマンドを使用して、サービス・メタデータ・エントリ・ファイル(.mif)をサービス・メタデータ・リポジトリにロードします。
  6. GWWSプロセスを起動(または再起動)して、新しいデプロイメントを初期化します。

Webサービス・バインディングの参照拡張によって、Webサービス呼出しが初期化されます。

リスト7-31には、Webサービスとして公開されるSCAコンポーネント・サービスを示します。

リスト7-31 Webサービスとして公開されるSCAコンポーネント・サービスの例
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
       name="bigbank.account">
...
   <service name="AccountService">
       <interface.wsdl interface="http://www.bigbank.com/AccountService
              #wsdl.interface(AccountService)"/>
       <binding.ws/>
       <reference>AccountServiceComponent</reference>
   </service>

   <component name="AccountServiceComponent">
       <implementation.cpp
                     library="Account" header="AccountServiceImpl.h"/>
       <reference name="accountDataService">
              AccountDataServiceComponent
       </reference>
   </component>
...
</composite>

対応するサービスを公開するのに必要な手順は、次のとおりです。

  1. コンポーネント・インタフェースに一致するWSDLインタフェースを構成します。
  2. 通常のSCAコンポーネントをビルドするのと同様に、buildscacomponentを使用してアプリケーション・コンポーネント・ランタイムをビルドします。
  3. buildscaserver -wを使用して、SCDLコードをWSDFエントリに変換し、デプロイ可能なサーバー(Oracle Tuxedoサーバー + ライブラリ + SCDL)を作成します。
  4. 上述のSCDLからのサービスによって、リスト7-32に示すようなWSDFエントリが作成されます。

    リスト7-32 WSDFエントリ
    <Definition>
           <WSBinding id="AccountService_binding">
                  <ServiceGroup id="AccountService">
                         <Service name="TuxAccountService"/>
                  </ServiceGroup>
           </WSBinding>
    </Definition>
  5. buildscaserver -wでも、SCDLおよびインタフェースの解析に基づいて、サービス・メタデータ・リポジトリ・エントリが作成されます。インタフェースはWSDL形式である必要があり、このリリースでは手動で構成する必要があります。
  6. UBBソースにTMMETADATAおよびGWWSサーバーが構成されていることを確認します。
  7. tmloadreposコマンドを使用して、サービス・メタデータ・リポジトリ・エントリがサービス・メタデータ・リポジトリにロードされます。
  8. wsloadcfを使用して、WSDFファイルをSALTDEPLOYファイルにインポートし、SALTDEPLOYをバイナリに変換する必要があります。
  9. サービス・メタデータ・エントリ・ファイル(.mif)がサービス・メタデータ・リポジトリにロードされます。
  10. WebサービスをホストするOracle Tuxedoサーバーが起動し、使用できる状態になります。
  11. GWWSが再起動され、新しいデプロイメントが有効になります。

Webサービス処理(たとえばGWInstanceやサーバー・レベル・プロパティの構成など)に使用するGWWSゲートウェイを設定するためには、SALTDEPLOYの構成に加えて、これらの手順を実行する必要があります。手順が完了すると、(SCAまたはその他の)Webサービス・クライアントからWebサービスにアクセスできるようになります。

リスト7-33には、Webサービスにアクセスする参照を示します。

リスト7-33 Webサービスにアクセスする参照の例
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
       name="bigbank.account">
...
       <reference name="StockQuoteWebService">
              <interface.wsdl interface="http://www.webserviceX.NET/#
                            wsdl.interface(StockQuoteSoap)"/>
              <binding.ws endpoint="http://www.webserviceX.NET/#
                            wsdl.endpoint(StockQuote/StockQuoteSoap)"/>
       </reference>
...
</composite>

Webサービスにアクセスするのに必要な手順は、次のとおりです。

  1. WSDLファイルが必要です。通常は、Webサービス・プロバイダによってパブリッシュされます。
  2. wsdlcvtツールを使用して、WSDLファイルをWSDFエントリに変換する必要があります。同時に、サービス・メタデータ・エントリ・ファイル(.mif)とfml32マッピング・ファイルが生成されます。
  3. wsloadcfを使用して、WSDFファイルをSALTDEPLOYファイルにインポートし、SALTDEPLOYをバイナリに変換する必要があります。
  4. tmloadreposコマンドを使用して、サービス・メタデータ・エントリ・ファイル(.mif)をサービス・メタデータ・リポジトリにロードします。
  5. GWWSプロセスが再起動され、新しいデプロイメントが有効になります。

Webサービス処理(たとえばGWInstanceやサーバー・レベル・プロパティの構成など)に使用するGWWSゲートウェイを設定するためには、SALTDEPLOYの構成に加えて、これらの手順を実行する必要があります。手順が完了すると、SCAクライアントからWebサービスにアクセスできるようになります。

クライアントが、スタンドアロンSCAプログラムの場合でも、Webサービス・バインディングを介した別のSCAコンポーネントを参照する(すでにサーバーである)SCAコンポーネントの場合でも、このプロセスは同じです。

 


SCAデータ型のマッピング

ATMIバインディングを使用すると、Oracle Tuxedoインフラストラクチャを活用できます。そのため、SCAコンポーネント間のデータ交換や、Oracle Tuxedoクライアント/サービスとSCAクライアント/コンポーネントの間のデータ交換は、Oracle Tuxedoタイプ・バッファを使用して行われます。表7-1から表7-10に、ネイティブ・タイプとOracle Tuxedoバッファ/タイプの間の対応(および適用可能な場合はSOAPタイプとの対応)をまとめます。

リスト7-34の例では、実装がOracle Tuxedo STRINGバッファを送受信しています。ソフトウェア(バインディングおよび参照の拡張実装)においては、SCDL構成内の/binding.atmi/inputBufferType/binding.atmi/outputBufferType、または/binding.atmi/errorBufferType要素の内容と、サーバー(またはクライアント)から返された(または送信された)バッファのタイプに従って、実際に使用するOracle Tuxedoバッファを決定します。ここでは、クライアントやサーバーがATMIプログラムかSCAコンポーネントであるかは関係ありません。

Oracle Tuxedoのsimpappサービスには、namespace services内に独自のnamespaceがあります。C++のメソッドtoupperは、このサービスに関連付けられています。

リスト7-34 C++インタフェースの例
#include <string>
namespace services
{
    namespace simpapp
    {
        /**
         * business interface
         */
           class ToupperService
        {
        public:

        virtual std::string
           toupper(const std::string inputString) = 0;
        };

    } // End simpapp
} // End services

次のデータ型マッピング・ルールが適用されます。

実行時のデータ型のマッピング

単純なOracle Tuxedoバッファ・データのマッピング

単純なOracle Tuxedoバッファとみなされるのは、次のバッファです。

表7-1では、SCAバインディングにマップされる単純なOracle Tuxedoバッファ・タイプを示します。

表7-1 単純なOracle Tuxedoバッファ・タイプ・データのマッピング
C++またはSTLの型
Javaの型
Oracle Tuxedoバッファ・タイプ
注:
char*char array またはstd::string
java.lang.String
STRING
 
CARRAY_T
byte[]またはjava.lang.Byte[]
CARRAY
 
X_OCTET_T
byte[]またはjava.lang.Byte[]
X_OCTET
 
XML_T
byte[]またはjava.lang.Byte[]
XML
このタイプは、構造体XMLのデータ要素内のC++ 配列、またはJavaのbyte配列として渡されます。SDOに変換されます。
wchar_t *またはwchar_t array
該当なし
MBSTRING
std::wstring
java.lang.String
MBSTRING

SCAクライアントから呼び出されたサービスが正常に返されると、サービスによって返されたデータへのポインタが、buildscaclientによって生成されたプロキシ・スタブに渡されます。プロキシ・スタブは、このポインタを逆参照し、データをアプリケーションに返します。

表7-1は次のように解釈できます。

マルチバイト文字列のデータ・マッピング

Oracle Tuxedoでは、マルチバイト文字列を使用してマルチバイト文字データを表現します。使用するエンコーディング名は、Oracle Tuxedoで定義されているiconvに基づきます。C++では、wstringwchar_t*またはwchar_t[]データ型を使用してマルチバイト文字データを表現します。使用するエンコーディング名は、C++ライブラリで定義されています。

特定のマルチバイト・エンコーディングを表すエンコーディング名が、Oracle TuxedoとC++で異なる場合があります。Oracle Tuxedoエンコーディング名とC++エンコーディング名の間のマッピングは、次のとおりです。

複雑な戻り値型のマッピング

(戻り値型として使用される)C++の次の組込み型は、複雑な型とみなされ、「複雑なOracle Tuxedoバッファ・データのマッピング」に示す複雑なバッファ・マッピング・ルールに従って、単一の汎用フィールドとしてFML/FML32バッファに自動的にカプセル化されます。このメカニズムによって、対応するOracle Tuxedoバッファを使用できない型を返す必要がある場合に対処できます。

注: 組込み型を返すインタフェースでは、FML/FML32が出力バッファ・タイプとみなされます。この汎用フィールドの名前は、返されるデータの型に基づいて、TUX_RTNdatatypeになります。TUX_RTNdatatypeフィールドは、Oracle Tuxedoに付属のUsysflds.h/Usysfl32.hおよびUsysflds/Usysfl32で定義されます。

複雑なOracle Tuxedoバッファ・データのマッピング

複雑なOracle Tuxedoバッファとみなされるのは、次のバッファです。

表7-2では、SCAバインディングにマップされる複雑なOracle Tuxedoバッファ・タイプを示します。

FMLおよびFML32バッファの場合は、インタフェース内のパラメータ名をフィールド名に対応させ、Oracle Tuxedoフィールドに適用される制限(長さ、使用可能な文字)に従う必要があります。tuxscagen(1)を使用してこれらのインタフェースをメタデータから生成した場合は、生成されたコードに適切なフォーマットのパラメータ名が含まれています。

アプリケーションで、パラメータ名を使用せずに手動でインタフェースを開発したり、手動で誤ったインタフェースを開発したり、SALTによって生成されたインタフェースに互換性のない変更を加えたりすると、誤った結果が発生する可能性があります。

VIEW(および等価のX_*)とVIEW32バッファでは、SDOのDataObjectラッパーを使用する必要があります。

リスト7-35には、インタフェースの例を示します。(インタフェースの後に)関連付けられているフィールド定義は、プロセス環境内に配置する必要があります。

表7-2 複雑なOracle Tuxedoバッファ・タイプ・データのマッピング
C++、STLまたはSDOの型
Javaの型
Oracle Tuxedoフィールド型
Oracle Tuxedoビュー型
注:
bool
booleanまたはjava.lang.Boolean
FLD_CHAR
char
「T」または「F」にマップします。(これにより、SALT内の他の部分で使用されているマッピングと一致します。)
char、signed charまたはunsigned char
byteまたはjava.lang.Byte
FLD_CHAR
char
 
shortまたはunsigned short
shortまたはjava.lang.Short
FLD_SHORT
short
unsigned shortは、 FLD_SHORTまたはshortに変換される前に、shortにキャストされます。
intまたはunsigned int
intまたはjava.lang.Integer
FLD_LONG
int
FMLまたはFML32に変換されたunsigned intは、FLD_LONGまたはlongに変換される前にlongにキャストされます。VIEWまたはVIEW32メンバーに変換されたunsigned intは、intにキャストされます。
longまたはunsigned long
longまたはjava.lang.Long
FLD_LONG
long
32ビット・プラットフォームで、64-bit longの値がFLD_LONGまたはlongに適合しない場合は、例外が発生します。unsigned longは、FLD_LONGまたはlong.に変換される前にlongにキャストされます。
long longまたはunsigned long long
該当なし
FLD_LONG
long
データ値がFLD_LONGまたはlongに適合しない場合は、例外が発生します。unsigned long long は、FLD_LONGlongに変換される前にlong longにキャストされます。
float
floatまたはjava.lang.Float
FLD_FLOAT
float
 
double
doubleまたはjava.lang.Double
FLD_DOUBLE
double
 
long double
N/A
FLD_DOUBLE
double
 
char*またはchar array
該当なし
FLD_STRING
string
 
std::string
java.lang.String
FLD_STRING
string
 
CARRAY_TまたはX_OCTET_T
class CARRAY
FLD_CARRAY
carray
GWWSルールに従って外部的にマップします。これは、(それらをサポートしない)OSOA仕様に反しているため、改善を検討する必要があります。
Bytes
該当なし
FLD_CARRAY
Carray
このマッピングは、DataObjectの一部である場合に使用されます。
wchar_t*またはwchar_t array
該当なし
FLD_MBSTRING (FML32のみ)
mbstring (VIEW32のみ)
(JavaのcharはUnicodeで、有効な範囲は-32768から+32767までです。)
std::wstring
java.lang.String
FLD_MBSTRING (FML32のみ)
mbstring (VIEW32のみ)
commonj::sdo::DataObjectPtr
TypedFML32
FLD_FML32(FML32のみ)
該当なし
データ変換例外が生成されます。これは、アプリケーションに返される前の次のタイミングでATMIBindingExceptionに変換されます。
  • FML32以外のOracle Tuxedoバッファでフィールドを追加しようとしたとき
  • データ・オブジェクトが型付きではないとき(つまり、それを記述した対応スキーマがないとき)
commonj::sdo::DataObjectPtr
TypedVIEW32
FLD_VIEW32(FML32のみ)
該当なし
struct structurename
該当なし
FLD_FML32(FML32のみ)
structurename

リスト7-35 インタフェースの例
...
int myService(int param1, float param2); ...
Field table definitions
#name         number type          flag comment
#---------------------------------------------------------
param1 20     int           -     Parameter 1
param2 30     float         -     Parameter 2
...
SDOマッピング

パラメータまたは戻り値型としてcommonj::sdo::DataObjectPtrオブジェクトを使用するC++のメソッド・プロトタイプは、FML、FML32、VIEWまたはVIEW32バッファにマップされます。

SDOオブジェクトを記述するXMLスキーマを提供する必要があります。このスキーマをサービスや参照の拡張ランタイムに対して使用可能にするには、影響を受ける参照やサービスの定義が格納されているSCDLコンポジット・ファイルと同じ場所に、スキーマ・ファイル(.xsdファイル)を配置する必要があります。このスキーマは、要素名とフィールド名の関連付けのために内部的に使用されます。

注: viewまたはview32を使用する場合は、使用するviewまたはview32に一致する名前のスキーマ・タイプ(たとえばcomplexType)が必要になります。

詳細は、SALT 11g リリース1(11.1.1.0)コマンド・リファレンス 「mkfldfromschema」および 「mkfld32fromschema」を参照してください。

たとえば、C++のメソッド・プロトタイプは、ヘッダー内に次のように定義されています。

long myMethod(commonj::sdo::DataObjectPtr data);

リスト7-36には、関連付けられるスキーマを示します。

リスト7-36 スキーマ
<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema
     xmlns="http://www.example.com/myExample"
     targetNamespace="http://www.example.com/myExample">

     <xsd:element name="bike" type="BikeType"/>
     <xsd:element name="comment" type="xsd:string"/>

     <xsd:complexType name="BikeType">
         <xsd:sequence>
             <xsd:element name="serialNO" type="xsd:string"/>
             <xsd:element name="name" type="xsd:string"/>
             <xsd:element name="type" type="xsd:string"/>
             <xsd:element name="price" type="xsd:float"/>
         </xsd:sequence>
     </xsd:complexType>
</xsd:schema>

表7-3には、生成されるフィールド表を示します。

表7-3 生成されるフィールド表
名前
番号
フラグ
コメント
bike
20
fml32
-
 
comment
30
string
-
 
serialNO
40
string
-
 
name
50
string
-
 
type
60
string
-
 
price
70
float
-
 

XMLスキーマの次の制限が適用されます。

SCAユーティリティ・データ型のマッピング

scatuxgenおよび tuxscagenユーティリティは、SCAデータ型のマッピングを手動で生成するのに使用されます。scatuxgenマッピング・ルールは次のようになります。

注: tuxscagenのマッピング・ルールは、逆方向で実行されます(Oracle Tuxedoバッファ・タイプ→C++パラメータ型)。

C++パラメータ型/戻り値型とOracle Tuxedoバッファ・タイプのマッピング

表7-4には、パラメータ/戻り値型とOracle Tuxedoバッファ・タイプ間の対応を示します(inbufサービス・レベル・キーワード)。

表7-4 「inbuf」キーワードのバッファ・タイプ・マッピング表
C++パラメータ型
Oracle Tuxedoバッファ・タイプ
std::stringまたはchar*
STRING
struct carray_t
CARRAY
char
FML32
short
fml32
int
fml32
long
fml32
float
fml32
double
fml32
wchar_t[ ]
MBSTRING
struct xml_t
XML
struct x_octet_t
X_OCTET
commonj::sdo::DataObjectPtr
intputBufferType設定に応じて、X_COMMON、X_C_TYPE、VIEW、VIEW32、FMLまたはFML32
struct structurename
intputBufferType設定に応じて、X_COMMON、X_C_TYPE、VIEW、VIEW32、FMLまたはFML32
複数のパラメータ、または1つのcommonj::sdo::DataObjectPtrやstruct structurenameでbinding.atmiや対応するinputBufferTypeがないと、コマンドライン・オプションを使用して入力バッファが指定されません。
fml32

表7-5には、パラメータ/戻り値型とOracle Tuxedoバッファ・タイプ間の対応を示します(outbufまたはerr bufサービス・レベル・キーワード)。

表7-5 「outbuf」または「errbuf」キーワードのバッファ・タイプ・マッピング表
C++戻り値型
Oracle Tuxedoバッファ・タイプ
std::stringまたはchar*
STRING
struct carray_t
CARRAY
char
FML32
short
fml32
int
fml32
long
fml32
float
FML33
double
fml32
wchar_t[]、wstring
MBSTRING
struct xml_t
XML
struct x_octet_t
X_OCTET
commonj::sdo::DataObjectPtr
binding.atmi/outputBufferTypeまたはbinding.atmi/errorBufferType設定に応じて、X_COMMON、X_C_TYPE、VIEW、VIEW32、FMLまたはFML32
commonj::sdo::DataObjectPtr
binding.atmiが設定されていない場合はFML32。binding.atmiが設定されるとbinding.atmi/outputBufferTypeまたはbinding.atmi/errorBufferTypeは指定されません。
struct structurename
binding.atmi/outputBufferTypeまたはbinding.atmi/errorBufferType設定に応じて、X_COMMON、X_C_TYPE、VIEW、VIEW32、FMLまたはFML32
struct structurename
binding.atmiが設定されていない場合はFML32。binding.atmiが設定されるとbinding.atmi/outputBufferTypeまたはbinding.atmi/errorBufferTypeは指定されません。

C++パラメータ型とOracle Tuxedoパラメータ型のマッピング

表7-7には、メソッド・シグネチャで複数のパラメータが使用されている場合、scatuxgenがインタフェース・パラメータ型を処理し、Oracle Tuxedoサービス・メタデータ・リポジトリのパラメータ・レベルのキーワード値に変換する方法を示します。

表7-6 パラメータ・レベル/フィールド型のマッピング表
C++パラメータのデータ型
Oracle Tuxedoのパラメータ・レベルのキーワード(FMLフィールド型)
char
byte(FLD_CHAR)
short
short(FLD_SHORT)
int
integer(FLD_LONG)
long
integer(FLD_LONG)
float
float(FLD_FLOAT)
double
double(FLD_DOUBLE)
std::stringまたはchar *
string(FLD_STRING)
struct carray_t
carray(FLD_CARRAY)
std::wstring
mbstring(FLD_MBSTRING)
commonj::sdo::DataObjectPtr
fml32(FLD_FML32)
struct structurename
fml32(FLD_FML32)

C++パラメータ型とOracle Tuxedoの複雑な型のマッピング

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

SDOマッピング

メソッドが引数としてSDOオブジェクトを取得するか、またはSDOオブジェクトを返す場合、たとえば次のようになります。commonj::sdo::DataObjectPtr myMethod(commonj::sdo::DataObjectPtr input)

リスト7-37に示すように、対応するランタイム型がXMLスキーマによって記述され、リスト7-38に示すように、バインディングで参照されます。

リスト7-37 XMLスキーマ
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="tuxedo" targetNamespace="tuxedo">

    <xsd:complexType name="BikeInventory">
        <xsd:sequence>
           <xsd:element name="BIKES" type="Bike"
                       minOccurs="0" maxOccurs="unbounded"/>
           <xsd:element name="STATUS" type="xsd:string" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="Bike">
        <xsd:sequence>
           <xsd:element name="SERIALNO" type="xsd:string"/>
           <xsd:element name="SKU" type="xsd:string"/>
           <xsd:element name="NAME" type="xsd:string"/>
           <xsd:element name="TYPE" type="xsd:string"/>
           <xsd:element name="PRICE" type="xsd:float"/>
           <xsd:element name="SIZE" type="xsd:int"/>
           <xsd:element name="INSTOCK" type="xsd:string"/>
           <xsd:element name="ORDERDATE" type="xsd:string"/>
           <xsd:element name="COLOR" type="xsd:string"/>
           <xsd:element name="CURSERIALNO" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>
リスト7-38 バインディング
...  
  <reference name="UBIK">
    <interface.cpp header="uBikeService.h"/>
    <binding.atmi>
       <inputBufferType>FML32/Bike</inputBufferType>
       <outputBufferType>FML32/BikeInventory</outputBufferType>
    </binding.atmi>
  </reference>
  ...

このようなスキーマが存在する場合、scatuxgenはこれを解析し、表7-7に示すように、対応するパラメータ・レベルのマッピング・エントリを生成します。

表7-7 パラメータ・レベル/フィールド型のマッピング
XMLスキーマの要素タイプ
Oracle Tuxedoのパラメータ・レベルのキーワード(FMLフィールド型)
xsd:byte
byte(FLD_CHAR)
xsd:short
short(FLD_SHORT)
xsd:int
integer(FLD_LONG)
xsd:long
integer(FLD_LONG)
xsd:float
float(FLD_FLOAT)
xsd:double
double(FLD_DOUBLE)
xsd:string
string(FLD_STRING)
xsd:string
-tオプションが指定される場合、mbstring(FLD_MBSTRING)
xsd:base64binary
carray(FLD_CARRAY)
xsd:complexType
fml32(FLD_FML32)
xsd:minOccurs
requiredcount
xsd:maxOccurs

C構造体のマッピング

メソッドが引数としてC構造体を取得するか、またはC構造体を返す場合(例: リスト7-39)、scatuxgenはこれを解析し、表7-8に示すように、対応するパラメータ・レベルのマッピング・エントリを生成します。

リスト7-39 C構造体
struct customer {
    char firstname[80];
    char lastname[80];
    char address[240];
};

struct id {
    int SSN;
    int zipCode;
};

struct customer* myMethod(struct *id input);

表7-8 パラメータ・レベル/フィールド型のマッピング
構造体のメンバー・タイプ
Oracle Tuxedoのパラメータ・レベルのキーワード(FMLフィールド型)
char、unsigned char、signed char
byte(FLD_CHAR)
char [ ]
string(FLD_STRING)
wchar_t [ ]
mbstring(FLD_MBSTRING)
short、unsigned short
short(FLD_SHORT)
int、unsigned int
integer(FLD_LONG)
long、unsigned long、long long、unsigned long long
integer(FLD_LONG)
float
float(FLD_FLOAT)
double、long double
double(FLD_DOUBLE)
struct nestedstructname(詳細は、「SCA構造体のサポート」を参照してください。)




fml32 (FLD_FML32)
array type
count=requiredcount=array specifier

パラメータ・レベル・キーワードへのパラメータ型および戻り値型の制限

パラメータ・レベルのキーワードの場合、Oracle Tuxedoバッファ・タイプ/パラメータ型の制限は、tmloadreposに必要な内容と一致しています。表7-9および表7-10に示されていない組合せを一致させようとすると、エラー・メッセージが返されます。

表7-9 Oracle Tuxedoバッファ・タイプ/パラメータ型の制限(パート1)
パラメータ型/Oracle Tuxedoバッファ
byte(char)
short
integer
float
double
String
CARRAY
           
FML
X
X
X
X
X
X
fml32
X
X
X
X
X
X
VIEW
X
X
X
X
X
X
VIEW32
X
X
X
X
X
X
X_COMMON
 
X
 
X
 
X
X_C_TYPE
X
X
X
X
X
X
X_OCTET
           
STRING
         
X
XML
         
X
MBSTRING
           

表7-10 Oracle Tuxedoバッファ・タイプ/パラメータ型の制限(パート2)
パラメータ型/Oracle Tuxedoバッファ
carray
xml
view32
fml32
mbstring
CARRAY
X
       
FML
X
       
fml32
X
X
X
X
X
VIEW
X
       
VIEW32
X
     
X
X_COMMON
         
X_C_TYPE
         
X_OCTET
X
       
STRING
         
XML
 
X
     
MBSTRING
X
     
X

Python、RubyおよびPHPデータ型のマッピング

次の項では、ネイティブでC/C++ベースの環境に関して、およびATMIバインディングで必要なOracle Tuxedoサービス・メタデータ・リポジトリ・インタフェースの書込みに対応するために、Python、RubyおよびPHPクライアントまたはコンポーネントでサポートされているデータ型について説明します。ATMIバインディングまたはWebサービス・バインディングで使用するための、対応するOracle Tuxedoバッファおよびフィールド型も示します。

Pythonデータ型のマッピング

Pythonでは、クライアントまたはコンポーネントのみが、パラメータを使用し、表7-11に示すタイプの値を返します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。

注: バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。

表7-11 サポートされているPython、C++およびOracle Tuxedバッファ・タイプ
Pythonパラメータまたは戻り値型
C/C++ネイティブ・タイプ
ATMIバインディング・タイプ
バッファ・タイプ/フィールド型
int
short、unsigned short
FML32/FLD_SHORT
long
short、unsigned short
FML32/FLD_SHORT
int
long、unsigned long
FML32/FLD_LONG
long
long、unsigned long
FML32/FLD_LONG
bool
bool
FML32/FLD_CHAR
float
float
FML32/FLD_FLOAT
float
double、long double
FML32/FLD_DOUBLE
string of length 1
char
FML32/FLD_CHAR
string
char *、std::string
STRING
xml
commonj::sdo::DataObjectPtr
FML32、VIEW、VIEW32

注: int (short)、long、int (long)、float (float)は、C++からPython方向のみで使用できます。Pythonランタイムは、オーバーフローの状況を捕捉します(例: C++ longをPython intにコピーする場合)。
注: string of length 1をchar*/std::string/STRINGにマップするために、開始Python変数には、最後にゼロを2つ付ける必要があります(例: 't = "a\x00")。

PythonでサポートされているXMLオブジェクトは、xml.etree.ElementTree objectsである必要があります(つまり、言語拡張子は、xml.etree.ElementTreeオブジェクトをcommonj::sdo::DataObjectPtrオブジェクトに変換し、commonj::sdo::DataObjectPtrオブジェクトをxml.etree.ElementTreeオブジェクトに変換します)。

「Pythonパラメータ」および「ディクショナリ」で説明するように、リストおよびディクショナリの使用もサポートされています。

注: リストおよびディクショナリはパラメータとしては使用できますが、リストおよびディクショナリを返すことはできません。

複数のパラメータおよびリストに関する制限が、バインディングの使用に対して有効になる場合があります。詳細は、「Python、RubyおよびPHPバインディング」を参照してください。

Pythonパラメータ

リストの表記法(*)を使用して、不明なパラメータ数をPythonプログラムに対して渡すことができます。たとえば、次のようになります。

def test(*params)

for p in params:

print "parameter:", p

呼出しの例: test(1, 2, 3, 4, 5)

この表記法は、次のようなパラメータの実際のリストがあることと同じになります。

def test(parm1, parm2, parm3, parm4, parm5)

...

サポートされている個々のタイプは、表7-11に示すタイプに制限されています。

ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてPython関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。

呼出し時に、Python関数は、インタフェースが指定するものに正確に対応するパラメータのリストを受信します。クライアントが渡した余分なパラメータは無視され、タイプの不一致によりデータ・マッピング例外が発生します。

注: この表記法の使用は、ローカル呼出し(バインディングなし)またはSCAコンポーネント間のATMIバインディングの使用(つまり、requires="legacy"属性がない<binding.atmi>要素)に制限されます。

ローカル呼出し(バインディングを指定しない)または参照の場合、インタフェースは必要ありません。

ディクショナリ

名前付きパラメータの表記法(**)を使用して、ディクショナリとも呼ばれる名前/値のペアを、Pythonプログラムに対して渡すことができます。たとえば、次のようになります。

def test(**params):

for p in params.keys():

print "key:", p, " parameter:", params[p]

呼出しの例: test(a=1, b=2)

サポートされている個々のタイプは、表7-11に示すタイプに制限されています。

ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてPython関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。

たとえば、リスト7-40に示すOracle Tuxedoサービス・メタデータ・リポジトリ・エントリを考えてみます。

リスト7-40 PythonのOracle Tuxedoサービス・メタデータ・リポジトリ・エントリ
##
service=testPython2
tuxservice=TESTPT
inbuf=FML32
outbuf=FML32

param=NUMBER
type=long
access=in

param=TEXT
type=string
access=in

param=FNUMBER
type=double
access=in
##

呼出し時に、Python関数は、インタフェースが指定するものに正確に対応するパラメータのリストを受信します。クライアントが渡した余分なパラメータは無視され、タイプの不一致によりデータ・マッピング例外が発生します。

パラメータの名前は、Python関数に渡されるキー名と一致します。インタフェースを取得するには、TMMETADATAサーバーへの内部呼出しを行います。Python、RubyまたはPHP関数を呼び出すために、TMMETADATAサーバーを実行している必要があります。

インタフェースを使用して呼び出されるPython関数は、次のPython呼出しと同じです。

test(a=1, b=2)

Rubyデータ型のマッピング

表7-12では、サポートされているRuby、C/C++およびOracle Tuxedoバッファ・タイプを示します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。

バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。

表7-12 サポートされているRuby、C++およびOracle Tuxedバッファ・タイプ
Rubyパラメータまたは戻り値型
C/C++ネイティブ・タイプ
ATMIバインディング・タイプ
バッファ・タイプ/フィールド型
Fixnum
short、unsigned short
FML32/FLD_SHORT
Fixnum
long、unsigned long
FML32/FLD_LONG
Bignum
double、long double
FML32/FLD_DOUBLE
True/false
bool
FML32/FLD_CHAR
Float
float
FML32/FLD_FLOAT
Float
double、long double
FML32/FLD_DOUBLE
String
char *、std::string
STRING
REXML Object
commonj::sdo::DataObjectPtr
FML32、VIEW、VIEW32

注: Rubyランタイムは、オーバーフロー例外を捕捉することがあります。
注: Ruby BignumがC++ doubleより大きい場合、精度が失われる可能性があります。
注: Float (float)は、C++からRuby方向のみで使用できます。
注: Rubyで使用可能な単一の文字(char/FLD_CHAR)へのマッピングはありません。

RubyでサポートされているXMLオブジェクトは、REXMLである必要があります(つまり、言語拡張子は、REXML::Documentオブジェクトをcommonj::sdo::DataObectオブジェクトに変換し、commonj::sdo::DataObjectPtrオブジェクトをREXML::Documentオブジェクトに変換します)。

次の段落で説明するように、可変引数のリストおよびハッシュの使用もサポートされています。

注: 可変引数のリストおよびハッシュはパラメータとしては使用できますが、可変引数のリストおよびハッシュを返すことはできません。

複数のパラメータおよびリストに関する制限が、バインディングの使用に対して有効になる場合があります。詳細は、「Python、RubyおよびPHPバインディング」を参照してください。

Rubyパラメータ

リストの表記法(*)を使用して、不明なパラメータ数をRubyスクリプトに対して渡すことができます。たとえば、次のようになります。

def func(a, b, *otherargs)

puts a

puts b

otherargs.each { |arg| puts arg }

end

次のように呼び出すことができます: func(1, 2, 3, 4, 5)

サポートされている個々のタイプは、表7-12に示すタイプに制限されています。

ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてRuby関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。

たとえば、リスト7-41に示すOracle Tuxedoサービス・メタデータ・リポジトリ・エントリを考えてみます。

リスト7-41 RubyのOracle Tuxedoサービス・メタデータ・リポジトリ・エントリ
##
service=testRuby
tuxservice=TESTRU
inbuf=FML32
outbuf=FML32

param=first
type=char
access=in

param=next
type=long
access=in

param=last
type=string
access=in
##

呼出し時に、Ruby関数は、インタフェースが指定するものに正確に対応するパラメータのリストを受信します。クライアントが渡した余分なパラメータは無視され、タイプの不一致によりデータ・マッピング例外が発生します。

注: この表記法の使用は、ローカル呼出し(バインディングなし)またはSCAコンポーネント間のATMIバインディングの使用(つまり、requires="legacy"属性がない<binding.atmi>要素)に制限されます。
注: ローカル呼出し(バインディングを指定しない)または参照では、インタフェースは必要ありません。
ハッシュ

名前付きパラメータを使用して、ハッシュ・タイプ・パラメータの形式で、名前/値のペアをRubyスクリプトに対して渡すことができます。たとえば、次のようになります。

def func2(hash)

hash.each_pair do |key, val|

puts "#{key} -> #{val}"

end

end

次のように呼び出すことができます: func2("first" => true, "next" => 5, "last" => "hi")

サポートされている個々のタイプは、表7-12に示すタイプに制限されています。

ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてRuby関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。

呼出し時に、Ruby関数は、インタフェースが指定するものに正確に対応するパラメータのリストを受信します。クライアントが渡した余分なパラメータは無視され、タイプの不一致によりデータ・マッピング例外が発生します。

パラメータの名前は、Ruby関数に渡されるキー名と一致します(つまり、上述のインタフェースを使用して呼び出されるRuby関数は、次のRubyクライアント呼出しと同じです)。

func2("first" => true, "next" => 5, "last" => "hi")

値「true」、「5」および「hi」は任意で、キーではありません。

PHPデータ型のマッピング

表7-13では、サポートされているRuby、C/C++およびOracle Tuxedoバッファ・タイプを示します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。

バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。

表7-13 サポートされているPHP、C++およびOracle Tuxedバッファ・タイプ
PHPパラメータまたは戻り値型
C/C++ネイティブ・タイプ
ATMIバインディング・タイプ
バッファ・タイプ/フィールド型
integer
short、unsigned short
FML32/FLD_SHORT
integer
long、unsigned long
FML32/FLD_LONG
ブール
bool
FML32/FLD_CHAR
float1
   
float
FML32/FLD_FLOAT
 
float
double、long double
FML32/FLD_DOUBLE
string of length 1
char
FML32/FLD_CHAR
string
char *、std::string
STRING
string (戻り値型、次を参照)
commonj::sdo::DataObjectPtr
FML32、VIEW、VIEW32
object of type SimpleXMLElement (パラメータ、次を参照)
commonj::sdo::DataObjectPtr
FML32、VIEW、VIEW32

PHPでXMLデータが返される場合は、次のようにSTRINGオブジェクトが返され、そのオブジェクトがSimpleXMLElementに変換されます。

$ret = $svc->searchBike('YELLOW');

$xml = new SimpleXMLElement($ret, LIBXML_NOWARNING);

XMLオブジェクトが一度構築されると、次のようにアクセスされるようになります。

echo "First serialno:".$xml->BIKES[0]->SERIALNO."\n";

echo "Second serialno:".$xml->BIKES[1]->SERIALNO."\n";

パラメータのリスト

PHP拡張子を使用してSCAリファレンスを作成する際、不明なパラメータ数を渡すことができます。たとえば、次のようになります。

test(1, 2, 3, 4, 5);

サポートされている個々のタイプは、表7-13に示すタイプに制限されています。commonj::sdo::DataObjectPtr objectsから生じるタイプ、または結果的にこのようになるタイプは例外です。

注: この表記法の使用対象は次のとおりです。
注: インタフェースは必要ありません。
名前付きパラメータ

名前付きパラメータを使用して、PHP SCA拡張子を使用して名前/値のペアを渡すことができます。たとえば、次のようになります。

$svc->searchBike(array('COLOR' => 'RED', 'TYPE' => 'MTB'));

サポートされている個々のタイプは、表7-13に示すタイプに制限されています。

SCA構造体データ型のマッピング

SCA-ATMIアプリケーションでは、SCA構造体パラメータを、ATMI FML32、FML、VIEW32、VIEW、X_COMMONまたはX_C_TYPEデータ型にマップできます。これは、SCAコンポジット・ファイルで指定されるデータ型です。

VIEW32、VIEW、X_COMMONまたはX_C_TYPEデータ型を指定した場合、このビューは、SCAパラメータまたは戻り値型として使用される構造体と正確に一致する必要があります。

注: ビューを構造体と正確に一致させるために、ビューのコンパイルでは、アプリケーションで使用される構造体と同じフィールドおよびオフセットを持つ、同じ構造体を作成する必要があります。

SCA構造体およびFML32またはFMLのマッピング

SCA構造体パラメータをFML32またはFMLにマップする場合、関連付けられたFML32またはFMLフィールドのフィールド型は、SCA構造体のデータ型に対して変換できる型になります。詳細は、「SCAデータ型のマッピング」を参照してください。

FMLフィールドのネーミング要件

SCA-SCAアプリケーションでは、フィールドはフィールド番号によって識別され、FML32フィールド番号は自動的に生成されます。ネストされた構造体の場合は、内部構造体が外部構造体の中に定義された場所で外部構造体のフラット・フィールドとして内部構造体のフィールドが生じるのと同じように、フィールド番号が割り当てられます。

SCA-ATMIアプリケーションでは、構造体要素に関連付けられたFML32またはFMLフィールド名を構造体記述ファイルから取得します。詳細は、「SCA構造体記述ファイルの使用」を参照してください。

Long要素の切捨て

FML32またはFMLのstring、carrayまたはmbstringフィールドを構造体要素に変換する際、構造体要素に適合しないデータは、指定された長さに(警告なしで)切り捨てられます。

たとえば、構造体要素がchar COMPANY_NAME[20]で、値が「International Business Machines」のFMLフィールドCOMPANY_NAMEをこの構造体要素にマップする場合、「International Busine」が末尾のnull文字なしで構造体要素にコピーされます。

SCA構造体およびVIEW32、VIEW、X_OCTETまたはX_C_TYPEのマッピング

SCA構造体をVIEW32、VIEW、X_OCTETまたはX_C_TYPEデータ型にマップする場合、Oracle Tuxedoのビュー・ベースの型に使用する構造体は、SCA構造体に正確に一致する必要があり、バイト単位でコピーされます。つまり、SCA構造体およびビューの間で変換する際に、データのマーシャリングは行われません。データのマーシャリングが必要な場合は、FML32またはFMLを使用する必要があります。

SCA構造体をOracle Tuxedoのビュー・ベースの型にマップする場合、SCA構造体の中に、boolwchar_tlong longunsigned long longlong double、またはネストされた構造体のデータ型を指定できません。これは、対応するデータ型がOracle Tuxedoのビュー内に存在しないためです。Oracle TuxedoのAssociated Count MemberまたはAssociated Length Memberフィールドに対応する要素を指定する必要があります。SCA構造体をOracle Tuxedoのビューに変換する場合、このような要素に適した値をアプリケーションで指定する必要もあります。

SCA構造体およびMbstringのマッピング

現時点で、mbstringフィールド型はVIEW32に存在します(詳細は、tpconvvmb32を参照してください)。SCA構造体は、mbstringフィールド型をVIEW32の場合と同じ方法で処理します。エンコーディング情報は、mbstringの構造体要素の一部であり、構造体のmbstringデータを使用して、アプリケーション・プログラムにFmbunpack32()およびFmbpack32()を使用する必要があります。

TPFAIL戻り値データ

TPFAILで返されるデータとして構造体ポインタを指定できるのは、正常な出力でも同じ構造体ポインタが返される場合です。SCAには、アプリケーション・データとともに、返された構造体を記述する内部情報を格納する必要があるため、リスト7-42に示すように、<tuxsca.h>は構造体およびtypedefの定義に使用されます。

リスト7-42 <tuxsca.h> SCA構造体およびTypedefの定義
struct scastruct_t {
  void *data;
  void *internalinfo;
};
typedef struct scastruct_t *SCASTRUCT_PTR;

アプリケーションが通常、「struct mystruct *」データを返す場合、リスト7-42に示すように、TPFAILデータにアクセスします。

リスト7-43 TPFAILの例
… catch (Tuscany::sca::atmi::ATMIBindingException& abe) {
  SCASTRUCT_PTR *scap = (SCASTRUCT_PTR *)abe.getData();
  struct mystruct *result = (struct mystruct *)scap->data;
}

 


SCAとOracle Tuxedoの相互運用性

既存のOracle Tuxedoサービスと相互運用するには、/binding.atmi/@requires属性の値として「legacy」を使用します。値「legacy」を指定した場合、次の動作を使用して、呼出しが実行されます。

それ以外の場合の動作は次のとおりです。

また、FML32やFMLのフィールド表が必要ないように、 /binding.atmi/@requires属性を使用して内部的にデータ・マッピングを管理します。

注: 指定しない場合、実際のOracle Tuxedoサービス名が/service/@nameまたは/reference/@nameと実際のメソッド名から構成されている、SCA→SCAのセマンティクスで通信するとみなされます(リスト7-27に示す擬似スキーマを参照)。

 


SCAトランザクション

ATMIバインディング・スキーマでは、/binding.atmi/@requires属性と3つのトランザクション値を使用して、SCAトランザクション・ポリシーをサポートします。これらのトランザクション値によって、ATMIバインディングの使用時にバインディング拡張が従うトランザクション動作を指定します(リスト7-27に示す擬似スキーマを参照)。

トランザクション値は次のとおりです。

 


SCAセキュリティ

SCA参照は、binding.atmi SCDL要素の<authentication>要素を使用して、資格証明を渡します。

SCAサービスは、内部名を参照することによってACLで保護できます。SCA→SCAモードの場合は/binding.atmi/service/@name属性の後に「/」とメソッド名を付加し、legacyモード(SCA→Tux相互運用モード)の場合は/binding.atmi/service/@name属性を使用します。

詳細は、「SCAとOracle Tuxedoの相互運用性」を参照してください。

 


関連項目


  先頭に戻る       前  次