目次 前 次 PDF


Oracle Tuxedo SCAプログラミング

Oracle Tuxedo 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 Tuxedo SCAプログラミングとともに、次のユーティリティが使用されます。
buildscaclient: SCAコンポーネントを呼び出すクライアント・プロセスをビルドします。
buildscacomponent: SCAコンポーネントをビルドします。
buildscaserver: SCAコンポーネントを含むOracle Tuxedoサーバーをビルドします。
SCAHOST: Python、RubyまたはPHP SCAコンポーネントの一般的なサーバー。
scatuxgen: SCAインタフェースから、Oracle Tuxedoサービス・メタデータ・リポジトリのインタフェース情報を生成します。
scastructc32、scastructc: 構造体記述ファイル・コンパイラ。
scastructdis32、scastructdis: バイナリ構造体ファイルおよびビュー・ファイルの逆アセンブラ。
tuxscagen: Oracle Tuxedoサービス用にSCAファイル、SCDLファイル、およびサーバー側のインタフェース・ファイルを生成します。
詳細は、「SCAコマンド・リファレンス」を参照してください。
SCAクライアントのプログラミング
実行時の参照バインディング拡張は、SCAコンテナのクライアント側の実装です。他のサービス(SCAコンポーネント、Oracle TuxedoサーバーまたはWebサービスなど)の呼出しに使用される必要なコードを、SCAベースのコンポーネントから透過的にカプセル化します。
SCAクライアントのプログラミング手順
SCAクライアント・プログラムを開発する手順は、次のとおりです。
1.
2.
3.
4.
5.
6.
クライアントのディレクトリ構造を設定する
アプリケーションの物理表現を定義する必要があります。厳密なSCAクライアント・アプリケーションは、SCAコンポーネント・タイプです。リスト2-1には、アプリケーション内にSCAコンポーネントを配置する際に使用するディレクトリ構造を示します。
リスト2-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)
 
リスト2-2には、典型的なroot.compositeの内容の例を示します。
リスト2-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メタデータ・リポジトリにアクセスすることで、このインタフェースを生成できます。
外部Webサービスを呼び出す場合は、サービスWSDLに適合するインタフェースを指定する必要があります。詳細は、「SCAデータ型のマッピング」のWSDL型とC++型の対応に関する説明を参照してください。
リスト2-3には、インタフェースの例を示します。
リスト2-3 インタフェースの例
#include <string>
/**
       * Tuxedo service business interface
       */
       class TuxService
       {
       public:
       virtual std::string TOUPPER(const std::string inputString) = 0;
       };
 
リスト2-3に示すインタフェースでは、単一のメソッドTOUPPERが定義されています。これは、タイプstd::stringの単一のパラメータを取得し、タイプstd::stringの値を返します。このインタフェースは、固有の.hファイル内に記述する必要があり、.hファイルをインクルードすることによって、クライアント・プログラムから参照されます。
リスト2-4には、呼出しを実行するために必要な一連の呼出しの例を示します。
リスト2-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サンプルを参照してください。
UNIXサンプル: $TUXDIR/samples/salt/sca
Windowsサンプル: %TUXDIR%\samples\salt\sca
SCDL記述子を作成する
ローカル呼出しと実際のコンポーネントの間のリンクは、SCDLサイドファイルでバインディングを定義することによって設定します。たとえば、リスト2-4では既存のOracle Tuxedo ATMIサービスへの呼出しを示し、リスト2-5に示すSCDL記述子を使用する必要があります。このSCDLは、<componentname>.compositeというファイル内に記述します。
リスト2-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.
次のコマンドを実行します。
$ buildscaclient -c myClientComponent -s . -f myClient.cpp
このコマンドによって、SCDLコードが検証され、必要な次の要素がビルドされます。
生成されたプロキシ・コードを格納する共有ライブラリ(Windowsの場合はDLL)
クライアント・プログラム自体
構文エラーやコンパイル・エラーが発生していなければ、クライアント・プログラムは使用できる状態になっています。
クライアント・アプリケーションを実行する
クライアント・プログラムを実行するには、次の環境変数を指定する必要があります。
APPDIR - アプリケーション・ディレクトリを指定します。SCAの場合は、通常、ここに最上位のSCDLコンポジットが格納されています。
SCA_COMPONENT - デフォルトのSCAコンポーネント(リスト2-2に示す例では、値「myClientComponent」)これは、locateService()呼出しでサービスを検索する際に開始する場所をSCAランタイムに示します。
既存のOracle Tuxedoサービスの呼出し
SCAクライアント・プログラムから既存のOracle Tuxedo ATMIサービスにアクセスする場合は、リスト2-6リスト2-7およびリスト2-8に示す例を使用すると、簡単に行うことができます。
注意:
これらの例は、サーバー側のSCAコンポーネントにも使用できます。
リスト2-6に示すようにOracle Tuxedo METADATAリポジトリ・エントリから開始し、tuxscagen(1)コマンドを使用してインタフェースおよびSCDLを生成できます。
リスト2-6 既存のOracle Tuxedoサービスを呼び出すSCAコンポーネント
service=TestString
tuxservice=ECHO
servicetype=service
inbuf=STRING
outbuf=STRING

service=TestCarray
tuxservice=ECHO
servicetype=service
inbuf=CARRAY
outbuf=CARRAY
 
リスト2-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 */
 
リスト2-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>
 
これらのサービスを呼び出す手順は、リスト2-6からリスト2-8に示した例と同じです。
TPFAILデータを処理する
非SCA Oracle Tuxedo ATMIサービスを呼び出すとエラーを返すことがありますが、tpreturn(TPFAIL, …)を使用してデータが戻されます。この場合、SCAクライアントやSCAコンポーネントは、ATMIBindingException型によって中断されます。
サービスから返されたデータがある場合は、ATMIBindingException.getData()APIを使用して取得できます。詳細は、「TPFAIL戻り値データ」を参照してください。
リスト2-9の例は、リスト2-10に示すbinding.atmi定義に対応します。
リスト2-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
        }
...
 
リスト2-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を返す呼出しは、リスト2-11に示すようになります。
リスト2-11 SCDL呼出しの例
...
       <errorBufferType target="myMethod">FML32/myType</errorBufferType>
...
 
ATMIBindingException.getData()の結果は、リスト2-12に示すようになります。
リスト2-12 ATMIBindingException.getData()の結果
...
              catch (tuscany::sca::atmi::ATMIBindingException& abe) {
              const commonj::sdo::DataObjectPtr *result =
              (const commonj::sdo::DataObjectPtr *)abe.getData();
...
 
呼出し側のアプリケーションにTPFAILデータを返すルールは、次のとおりです。
<errorBufferType>ごとに、<errorBufferType>を変換する標準型が定義されています。<errorBufferType><outputBufferType>と同じである場合、標準型は、サービスが正常に実装されたときに返されるC++型と同じになります。
<errorBufferType><outputBufferType>と異なる場合、標準型は次のようになります。
STRINGバッファの場合は、C++ char*またはchar[ ]データ型になります。
MBSTRINGバッファの場合は、C++ wchar_t*またはwchar_t[ ]になります。
CARRAYバッファの場合は、C++ CARRAY_PTRになります。
X_OCTETバッファの場合は、C++ X_OCTET_PTRになります。
XMLバッファの場合は、C++ XML_PTRになります。
FML、FML32、VIEW、VIEW32、X_COMMONおよびX_C_TYPEバッファの場合は、C++ commonj::sdo::DataObjectPtrになります。
それぞれの場合で、getData()によって返される値は、上述の型の1つへのポインタになります。
Oracle Tuxedoバッファ・タイプとC++データ情報の間の変換ルールの詳細は、「SCAデータ型のマッピング」を参照してください。
SCAコンポーネントのプログラミング
SCAコンポーネントという用語は、他のSCAランタイム・コンポーネントや非SCAランタイム・コンポーネントから呼び出すことができるSCAランタイム・アーティファクトを指します。同様に、SCAコンポーネントは、他のSCAコンポーネントや非SCAコンポーネントに対する呼出しも実行できます。一方、厳密なSCAクライアントは、他のSCAコンポーネントや非SCAコンポーネントに対する呼出しは実行できても、それらからSCAクライアントを呼び出すことはできません。
Oracle TuxedoのSCAコンテナは、Oracle Tuxedoサーバー環境でSCAコンポーネントをホストする機能を提供します。これにより、Oracle Tuxedoの実証された品質である信頼性スケーラビリティおよびパフォーマンスを最大限に活用できます。
図2-1は、SCAコンポーネントとOracle Tuxedoサーバーのマッピング・ルールをまとめたものです。
図2-1 SCAコンポーネントとOracle Tuxedoサーバーのマッピング・ルール
Oracle Tuxedoリファレンスを使用しているSCAコンポーネントに特別な処理は必要ありませんが、サービスを提供しているSCAコンポーネントは引き続きOracle Tuxedo環境で処理する必要があります。
マッピングは次のとおりです。
<binding.atmi>定義を使用して1つ以上のサービスを宣言しているSCAコンポジットは、SCAコンポジットと同じ数のサービスを通知している単一のOracle Tuxedoサーバーにマップします。
複数のコンポジットが存在できます。
コンポジットはネストできます。
プロモーションは次のように処理します。
ネストされたコンポーネント内のサービスをコンポジットがプロモートすると、プロモートされたサービスがOracle Tuxedoサービスとして通知されます。
コンポーネント内に通知されているがプロモートされていないサービスは、通知されません。
結果として生じるOracle Tuxedoサーバーによって、SCDL定義のbinding.atmiセクションにあるサービスと同じ数のサービスが通知されます。
インタフェースには、複数のメソッドを宣言できます。各メソッドは、/binding.atmi/@map属性を使用したOracle Tuxedoのネイティブ・サービスにリンクされます。/binding.atmi/@map属性によって宣言されていないメソッドは、Oracle Tuxedoからアクセスできません。重複したサービス名の使用はサーバーの生成時に検出されるため、単一のOracle Tuxedoサーバー・インスタンス内でのOracle Tuxedoサービス名とインタフェース・メソッドとのマッピングは、1対1になります。
生成されたOracle TuxedoサーバーはSCAコンポーネントのプロキシとして機能します。この生成されたサーバーのインスタンスは、SCDL構成で定義されたとおりにSCAコンポジットに対応します。このようなサーバーはOracle Tuxedo管理者によって必要に応じてデプロイされます。
SCAコンポジットをOracle Tuxedoアプリケーションにデプロイするには、生成されたSCAサーバーのインスタンスをUBBCONFIGファイルに構成します。複数のインスタンスをデプロイできます。マルチスレッド機能も使用可能で、既存のOracle Tuxedo機能を使用して制御できます。
SCAコンポーネントのプログラミング手順
SCAコンポーネント・プログラムを開発する手順は、次のとおりです。
1.
2.
3.
4.
5.
コンポーネント・ディレクトリを設定します
まず、アプリケーションの物理表現を定義する必要があります。リスト2-13には、アプリケーション内にSCAコンポーネントを配置する際に使用するディレクトリ構造を示します。
リスト2-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)
 
リスト2-14には、典型的なroot.compositeの内容を示します。
リスト2-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ランタイムを認識する必要はありません。ただし、インタフェース機能については次の制限があります。
C++のクラス(std::stringおよびcommonj::sdo::DataObjectPtr以外)は、パラメータや戻り値としては使用できません。
パラメータ配列はサポートされません。
詳細は、「SCAデータ型のマッピング」を参照してください。
リスト2-15には、クライアント・プログラム用に実装するインタフェースの例を示します。
リスト2-15 コンポーネント実装のインタフェース
#include <string>
/**
  * Tuxedo service business interface
  */
  class TuxService
  {
  public:
       virtual std::string TOUPPER(const std::string inputString) = 0;
  };
 
コンポーネント実装は、通常は2つのソース・ファイルで構成されます(リスト2-16およびリスト2-17にそれぞれ示します)。
コンポーネント実装の定義(<servicename>Impl.hファイルに記述)
コンポーネント実装(<servicename>Impl.cppファイルに記述)
リスト2-16 例(TuxServiceImpl.h)
#include "TuxService.h"
 
      /**
       * TuxServiceImpl component implementation class
       */
      class TuxServiceImpl: public TuxService
      {
      public:
       virtual std::string toupper(const std::string inputString);
      };
 
リスト2-17 例(TuxServiceImpl.cpp)
#include "TuxServiceImpl.h"
 #include "tuxsca.h"
 
using namespace std;
using namespace osoa::sca;
 
/**
* TuxServiceImpl component implementation
*/
std::string TuxServiceImpl::toupper(const string inputString)
{
    string result = inputString;
        
    int len = inputString.size();

    for (int i = 0; i < len; i++) {
       result[i] = std::toupper(inputString[i]);
    }
 
    return result;
}
 
また、サイドファイル(componentType)も必要です。これには、SCAラッパーの生成に必要な情報が格納されます。場合によっては(このコンポーネントが別のコンポーネントを呼び出す場合)、プロキシ・コードが格納されます。
このcomponentTypeファイル(<componentname>Impl.componentType)はSCDLファイル・タイプです。リスト2-18には、componentTypeファイル(TuxServiceImpl.componentType)の例を示します。
リスト2-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サイドファイルでバインディングを定義することによって設定します。たとえば、リスト2-18のファイル・タイプでは、Oracle Tuxedo ATMIサービスとして公開するには、リスト2-19のSCDLを使用する必要があります。このSCDLは、<componentname>.compositeというファイル(たとえばmyComponent.composite)内に記述します。
リスト2-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.
次のコマンドを実行します。
$ 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プログラミング
この項には次のトピックが含まれます:
前提条件
Python 2.5.5のインストール。
Ruby 1.9.xのインストール。
PHP 5.3.2のインストール。
Python、Ruby、PHPは共有ライブラリを有効にして構築されている必要があります。通常、初回のインストールではこのような設定になっています。ソースから構築する場合は、--enable-sharedオプションを構成手順で使用する必要があります。
一般的なデータベースまたはサードパーティ・ライブラリのサポートの制約はありません。
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言語拡張子は、バインディングに依存していません。
図2-2には、SALT SCA環境のPython、RubyおよびPHPのサポート・アーキテクチャの概要を示しています。
図2-2 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ライブラリをインポートします。
import sca
2.
次のAPIを使用して、サービスを検索します。
calc = sca.locateservice("CalculatorComponent")
calcオブジェクトは、「追加」操作の呼出しに使用されます(例: result = calc.add(val1, val2))。
Rubyクライアント
RubyプログラムからSCAコンポーネントを呼び出すには、次を実行する必要があります。
1.
次のように、Rubyプロキシ拡張をロードします。
require("sca_ruby")
2.
次のAPIを使用して、サービスを検索します。
calculator = SCA::locateService("CalculatorComponent")
calculatorオブジェクトは、「追加」操作の呼出しに使用されます(例: x = calculator.add(3, 2))。
PHPクライアント
PHPプログラムからSCAコンポーネントを呼び出すには、次を実行する必要があります。
1.
ユーザーは最初に、SCAライブラリを次のようにロードする必要があります。
<?php
dl('sca.so');
2.
次のAPIを使用して、サービスを検索します。
$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要素に似ています(リスト2-19およびリスト2-31を参照)。相違点は、interface.python要素とinterface.ruby要素、または.componentTypeは必要ないという点です。
構文および属性は、次のようになります。
implementation.python
<implementation.python
     module="string"
     scope="scope"? >
<implementation.python/>
implementation.python要素には次の属性があります。
module: string (1..1)
このコンポーネントがモジュール・レベルの関数の形式で提供する操作を含むPythonモジュール(.pyファイル)の名前。
scope: PythonImplementationScope(0..1)
コンポーネント実装の範囲を特定します。デフォルトはstatelessで、サービス・リクエストのディスパッチに使用する実装インスタンス間の相関がないことを示します。composite値は、含まれるコンポジットの存続期間中、すべてのサービス・リクエストが同じ実装インスタンスにディスパッチされることを示します。
implementation.ruby
<implementation.ruby
     script="string"
     class="string"
     scope="scope"? >
<implementation.ruby/>
implementation.ruby要素には次の属性があります。
script: string(1..1)
コンポーネントがスクリプト・ファイルに含まれるクラスのメソッドの形式で提供する操作を含むRubyスクリプト(.rbファイル)の名前。スクリプトの名前は、その完全な名前です(つまり.rb拡張子も含まれます)。
class: string(1..1)
コンポーネントが提供する操作を含むRubyクラス(.rbファイル)の名前。
scope: RubyImplementationScope(0..1)
コンポーネント実装の範囲を特定します。デフォルトはstatelessで、サービス・リクエストのディスパッチに使用する実装インスタンス間の相関がないことを示します。composite値は、含まれるコンポジットの存続期間中、すべてのサービス・リクエストが同じ実装インスタンスにディスパッチされることを示します。
implementation.php
<implementation.php
     script="string"
     class="string"
     scope="scope"? >
<implementation.php/>
implementation.php要素には次の属性があります。
script: string(1..1)
このコンポーネントがスクリプト・ファイルに含まれるクラスのメソッドの形式で提供する操作を含むPHPスクリプト(.phpファイル)の名前。スクリプトの名前は、その完全な名前です(つまり.php拡張子も含まれます)。
class: string(1..1)
このコンポーネントが提供する操作を含むPHPクラス(.phpファイル)の名前。
scope: PHPImplementationScope(0..1)
コンポーネント実装の範囲を特定します。デフォルトはstatelessで、サービス・リクエストのディスパッチに使用する実装インスタンス間の相関がないことを示します。composite値は、含まれるコンポジットの存続期間中、すべてのサービス・リクエストが同じ実装インスタンスにディスパッチされることを示します。
リスト2-20には、ATMIバインディングを使用してアクセスできるSCAコンポジット内のPythonコンポーネントの例を示します。この例では、ランタイムは、コンポジット・ファイルと同じ場所でToupperService.pyという名前のファイルにあるPythonコンポーネントを探します。
同様に、コンポジット・ファイルと同じ場所のToupperService.rbという名前のファイルに、Rubyコンポーネントが必要です。
リスト2-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>
 
リスト2-21には、ATMIバインディングを使用してアクセスできるSCAコンポジット内のPHPコンポーネントの例を示します
リスト2-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ファイルには、リスト2-22に示すコードが含まれます。
リスト2-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ファイルには、リスト2-23に示すコードが含まれます。
リスト2-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ファイルには、リスト2-24に示すコードが含まれます。
リスト2-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 Tuxedo SCAの定義済の構造体に関する詳細は、「SCAデータ型のマッピング」を参照してください。
SCA構造体のサポートの概要
SCA構造体のサポートでは、次が提供されます。
追加のC++構造体機能
大きな未利用領域がない構造体に配置できるアプリケーション処理データのパフォーマンスの向上
次に示すように、SCAメソッド・パラメータ定義またはSCAメソッドからの戻り値の定義で指定されるstructデータ型を使用する必要があります。
struct structurename *
struct structurename &
構造体の中の要素は、SCAパラメータとしてサポートされている、次に示す単純なデータ型/配列のいずれかになります。
bool
char、unsigned char、signed char
wchar_t
short、unsigned short
int、unsigned int
long、unsigned long
long long、unsigned long long
float
double
long double
struct nestedstructurename
typedef
注意:
scagenユーティリティは、typedefおよびstructキーワードを解析します。詳細は、「SCAコマンド・リファレンス」を参照してください。
SCA構造体の制限
構造体の一部として、次を指定できません。
DataObjectPtr
Pointデータ型
std::stringまたはstd::wstring
union
struct carray_tstruct_x_octet_tまたはstruct xml_t
CARRAYデータは、ビューでサポートされているのと同じ方法でサポートされます。
構造体の使用を参照している.hファイルおよび.cppファイルは、使用されている構造体およびその構造体の中に含まれるネストされた構造体の定義をインクルードするために必要です。
SCA構造体記述ファイルの使用
構造体記述ファイルは、SCA構造体パラメータのフォーマットの記述に使用できます。構造体記述ファイルは、SCAに追加された機能において、Oracle Tuxedoのビュー・ファイルと非常に似ています。
注意:
構造体記述ファイルの使用は省略可能で、構造体要素に対応するFMLフィールド名が構造体要素の名前と異なる場合、またはその他の非デフォルト構造体に関連する機能が必要な場合のみ、構造体記述ファイルを使用する必要があります。アプリケーションが、Associated Length Member、Associated Count Member、または構造体要素のアプリケーション指定のデフォルト値を使用する場合、構造体記述ファイルを使用するよう選択できます。
特定の構造体に構造体記述ファイルを指定しない場合、アプリケーション・コードで使用される構造体定義が使用され、SCA-ATMIモードでのFMLフィールド名は、構造体要素名と同じです。SCA-SCAアプリケーションではフィールド番号が自動的に生成されるため、これらのアプリケーションでは構造体記述ファイルを指定する必要がありません。
構造体記述ファイルの形式は、Oracle Tuxedoビュー・ファイルの形式と同じですが、次の例外があります。
列1のタイプ・パラメータでは、追加の値であるboolunsignedcharsignedcharwchar_tunsignedintunsignedlonglonglongunsignedlonglonglongdoubleおよびstructが許可されます。
列1の値がstructの場合、列2のcname値は、ネストされた構造体を記述する定義済のビューの名前です。この場合、列4のcount値をオプションで指定して、ネストされた構造体の発生数を指定できます。
構造体記述ファイルに記述された構造体がSCA-ATMIアプリケーションで実行時にFML32またはFMLバッファに対して変換される場合、対応するFMLフィールドの名前は、列3に指定したfbname値(存在する場合)で、列3に指定した値がない場合は、列2に指定したcname値です。コンパイル時に、リスト2-25に示すように、構造体記述ファイルはバイナリ構造体記述ファイルを作成します。バイナリ構造体ヘッダー・ファイルは、リスト2-26に示します。
注意:
SCA-SCAアプリケーションでは、FML32フィールド番号は自動的に生成されます。
リスト2-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
 
リスト2-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と同じ引数を受け付けます。詳細は、「SCAコマンド・リファレンス」を参照してください。
注意:
scastructc32およびscastructcでは、UNIXの場合は接尾辞.Vで、Windowsの場合は接尾辞.VVで、バイナリ・ファイルが生成されます。
Oracle Tuxedoビューで使用できないSCA拡張が構造体記述ファイルに含まれていない場合、バイナリ構造体記述ファイルのmagic値は、viewc32で使用されるmagic値と同じになります。SCA固有の拡張が使用されている場合、バイナリ構造体記述ファイルには別のmagic値が使用されます。
tuxscagenを使用した構造体の生成
オプション-Sを指定して呼び出すと、tuxscagen(1)は、関数パラメータの構造体を生成するか、生成しない場合は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→SCAモード - /binding.atmi/service/@name属性に「/」とメソッド名が続きます。
legacyモード(SCA→Tux相互運用モード) - /binding.atmi/service/@name属性
詳細は、「SCAとOracle Tuxedoの相互運用性」を参照してください。
SCAバインディング
Oracle Tuxedoのサポート
ATMIバインディング
Oracle Tuxedo通信は、<binding.atmi>要素を使用してSCDLで構成されます。これによってATMIトランスポートに固有の構成要素、たとえばTUXCONFIGファイルの場所、使用されるネイティブOracle Tuxedoバッファ・タイプ、Oracle Tuxedo固有の認証、または/WS (WorkStation)構成要素などを指定できます。
リスト2-27には、<binding.atmi>要素の要約を示します。
注意:
 
0または1回指定できるパラメータを表します。
0回以上指定できるパラメータを表します。
詳細は、付録A「Oracle Tuxedo SCA ATMIバインディングのリファレンス」を参照してください。
リスト2-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バインディング宣言のコンポジット・ファイルと異なり、外部構成は必要ありません。サービス名、ワークステーション・アドレスおよび認証データは、バインディング宣言内で提供されます。
注意:
SSLはOracle 12c JCA Adapterを介してサポートされます。LLEは現時点ではサポートされていません。
JATMIバインディングは、Oracle Tuxedo CPP ATMIバインディング要素のほとんどでサポートされており、使用方法も同じです。ただし、基礎となるテクノロジの違いおよび実行環境の違いにより、サポートされない要素や、サポートされていても要素名が異なる要素があります。
次のOracle Tuxedo CPP ATMIバインディング要素はサポートされません。
binding.atmi/tuxconfig
binding.atmi/fieldTablesLocation
binding.atmi/fieldTablesLocation32
binding.atmi/viewFilesLocation
binding.atmi/viewFilesLocation32
binding.atmi/transaction
次のOracle Tuxedo CPP ATMIバインディングworkStationParameters要素はサポートされません。
binding.atmi/workStationParameters/secPrincipalName
binding.atmi/workStationParameters/secPrincipalLocation
binding.atmi/workStationParameters/secPrincipalPassId
binding.atmi/workStationParameters/encryptBits
次のOracle Tuxedo CPP ATMIバインディング要素は、制限付きでサポートされます。
binding.atmi/remoteAccess
注意:
指定できる値は「WorkStation」のみです。指定しない場合、「WorkStation」が指定されたものとみなされます。
次に示す要素内のすべてのクラスは、JavaのCLASSPATHに指定する必要があります。
binding.atmi/fieldTables - weblogic.wtc.jatmi.TypedFMLベース・クラスから拡張されたJavaクラスのリストをカンマ区切りで指定します。
binding.atmi/fieldTables32 - weblogic.wtc.jatmi.TypedFML32ベース・クラスから拡張されたJavaクラスのリストをカンマ区切りで指定します。
binding.atmi/viewFiles - weblogic.wtc.jatmi.TypedViewベース・クラスから拡張されたJavaクラスのリストをカンマ区切りで指定します。これらの派生クラスは、通常はweblogic.wtc.jatmi.viewjコンパイラを使用してOracle Tuxedoビュー・ファイルから生成されます。これらには、weblogic.wtc.jatmi.TypedXCTypeおよびweblogic.wtc.jatmi.TypedXCommonからの派生クラスも含まれます。
詳細は、『Oracle Tuxedo WebLogic Tuxedo Connectorプログラマーズ・ガイド』のviewjコンパイラの使用方法に関する項を参照してください。
binding.atmi/viewFiles32 - webogic.wtc.jatmi.TypedView32ベース・クラスから拡張されたJavaクラスのリストをカンマ区切りで指定します。これらの派生クラスも、通常はweblogic.wtc.jatmi.viewj32コンパイラを使用してOracle Tuxedoビュー・ファイルから生成されます。
リスト2-28には、Oracle Tuxedoサービスのバインディング宣言を記述した「ECHO」という名前のコンポジット・ファイルの例を示します。
リスト2-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>
 
リスト2-29には、リスト2-28に記述した例のインタフェースを示します。
リスト2-29 ECHOインタフェース
package com.abc.sca.jclient;

import com.oracle.jatmi.AtmiBindingException;

public interface Echo {
        String echoStr(String requestString) throws AtmiBindingException;
}
 
リスト2-30には、SCAクライアント実装の例を示します。
リスト2-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ソース・ファイルに一致しない場合、Oracle Tuxedoでは例外が発生します。
バインディングが、Python、RubyまたはPHPコンポーネントが処理するために設計されたものと一致しないデータ型で構成されている場合、Python、RubyまたはPHPランタイムによって例外が発生します(たとえば、STRING Oracle Tuxedバッファで構成されたbinding.atmiと、数値データを処理するPython関数)。
バインディングを構成するものと一致しないPython、RubyまたはPHPクライアント・コードの場合、バインディング・コードから生じる例外が発生します。
Python、RubyおよびPHPコードはコンパイルされないため、バインディングとコンポーネント/クライアントの間の構成の不一致のみが、実行時に検出できます。
compositeスコープを持つPython、RubyまたはPHPプログラムは、スクリプトの変更時にOracle Tuxedoサーバーを再ロードする必要があります。statelessスコープによって、変更されたスクリプトを動的に再ロードできます。
Python、RubyまたはPHPスクリプトをWebサービスとして公開するために、初期化時に正しいサービス・バインディングをロードするように、SCAHOSTコマンドでは-wオプションを使用する必要があります。
注意:
SCAHOSTでは、1つのSCAHOSTインスタンスに、ATMIとWebサービスの両方のバインディング・タイプを混在させることはできません。
詳細は、「SCAコマンド・リファレンス」を参照してください。
Python、RubyおよびPHPコンポーネントを公開するために、TMMETADATAサーバーが必要です。
Python、RubyおよびPHPバインディングの制限
Python、RubyおよびPHPバインディングを使用する場合、次の制限があります。
相互運用呼出しのATMIバインディングを使用する場合(つまり、requires="legacy"が設定されている場合)、名前付きパラメータと名前なしパラメータを混在させることはできません(たとえば、Python: def func(a, *b, **c)、Ruby: def func(a, *b, hash))。これは、パラメータ名を復元するメカニズムがないためです。
パラメータの名前は、FML32表で(ATMIバインディングの場合)、またはWSDLによって(Webサービス・バインディングの場合)、構成する必要があります。名前なしパラメータのリストと相互運用することはできません。これは、FML/FML32 Oracle Tuxedoバッファの保証された順序付けがないことにより、このような呼出しをC++またはWSDLインタフェースに正確にマップできないためです。
サポートされているモードは次のとおりです。
複数パラメータ: def func(a, b, c) (Python、RubyおよびPHPで同じ構文)
複数パラメータおよびパラメータのリスト: def func(a, *b)(PythonとRubyで同じ構文)
名前付きパラメータ: PHP - $svc->searchBike(array('COLOR' => 'RED', 'TYPE' => 'MTB'))。詳細は、「PHPデータ型マッピング」を参照してください。
ディクショナリまたはハッシュ: Python: def func(**a)、Ruby: def func(hash)
注意:
**で定義されたPythonパラメータは、名前付きパラメータとみなされます。hashで定義されたRubyパラメータは、名前付きパラメータとみなされます。詳細は、「Pythonパラメータ」および「Rubyパラメータ」を参照してください。
SCA間のモードでは、上述の制限は名前付きパラメータに関するものです、これは、PythonディクショナリやRubyハッシュにおける要素の順序は保証されていないためです。PythonディクショナリやRubyハッシュを送信するには、legacyモードで処理する必要があります。
SCA間のモードでは、Oracle Tuxedoサービス・メタデータ・インタフェースがサービス側のパラメータ/型のリストを記述する(参照側のパラメータ/型は実行時に自己記述される)ため、パラメータ(ディクショナリまたはハッシュを除く)のリストの使用がサポートされています。
Unicode文字列はサポートされません。それに応じて、MBSTRINGバッファやFLD_MBSTRINGフィールドはサポートされません。
Webサービス・バインディング
Webサービス・バインディング(binding.ws)では、WebサービスのトラフィックをGWWSゲートウェイ経由にすることで、以前からのOracle Tuxedo機能を利用します。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サービス呼出しが初期化されます。
リスト2-31には、Webサービスとして公開されるSCAコンポーネント・サービスを示します。
リスト2-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)を作成します。
前述のSCDLからのサービスによって、リスト2-32に示すようなWSDFエントリが作成されます。
リスト2-32 WSDFエントリ
<Definition>
       <WSBinding id="AccountService_binding">
              <ServiceGroup id="AccountService">
                     <Service name="TuxAccountService"/>
              </ServiceGroup>
       </WSBinding>
</Definition>
 
4.
buildscaserver -wでも、SCDLおよびインタフェースの解析に基づいて、サービス・メタデータ・リポジトリ・エントリが作成されます。インタフェースはWSDL形式である必要があり、このリリースでは手動で構成する必要があります。
5.
UBBソースにTMMETADATAおよびGWWSサーバーが構成されていることを確認します。
6.
tmloadreposコマンドを使用して、サービス・メタデータ・リポジトリ・エントリがサービス・メタデータ・リポジトリにロードされます。
7.
wsloadcfを使用して、WSDFファイルをSALTDEPLOYファイルにインポートし、SALTDEPLOYをバイナリに変換する必要があります。
8.
サービス・メタデータ・エントリ・ファイル(.mif)がサービス・メタデータ・リポジトリにロードされます。
9.
WebサービスをホストするOracle Tuxedoサーバーが起動し、使用できる状態になります。
10.
GWWSが再起動され、新しいデプロイメントが有効になります。
Webサービス処理(たとえばGWInstanceやサーバー・レベル・プロパティの構成など)に使用するGWWSゲートウェイを設定するためには、SALTDEPLOYの構成に加えて、これらの手順を実行する必要があります。手順が完了すると、(SCAまたはその他の)Webサービス・クライアントからWebサービスにアクセスできるようになります。
リスト2-33には、Webサービスにアクセスする参照を示します。
リスト2-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タイプ・バッファを使用して行われます。表2-1から表2-10に、ネイティブ・タイプとOracle Tuxedoバッファ/タイプの間の対応(および適用可能な場合はSOAPタイプとの対応)をまとめます。
リスト2-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は、このサービスに関連付けられています。
リスト2-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バッファとみなされるのは、次のバッファです。
STRING
CARRAY (およびX_OCTET)
MBSTRING
XML
表2-1では、SCAバインディングにマップされる単純なOracle Tuxedoバッファ・タイプを示します。
 
表2-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
N/A
MBSTRING
std::wstring
java.lang.String
MBSTRING
SCAクライアントから呼び出されたサービスが正常に返されると、サービスによって返されたデータへのポインタが、buildscaclientによって生成されたプロキシ・スタブに渡されます。プロキシ・スタブは、このポインタを逆参照し、データをアプリケーションに返します。
表2-1は次のように解釈できます。
参照またはサービスのバインディング拡張ランタイムがOracle Tuxedo STRINGバッファを参照するときは、その方向に応じてchar*char arraystd::stringパラメータ、またはreturnタイプを探します。異なるタイプが見つかると、何が起こったかを説明するメッセージとともに例外が発生します。
参照またはサービスのバインディング拡張ランタイムが、たとえばchar*を単一のパラメータまたは戻り値型として参照するときは、binding.atmi要素内のバッファ・タイプとしてのSTRINGを探します。異なるOracle Tuxedoバッファ・タイプが見つかると、何が起こったかを説明するメッセージとともに例外が発生します。
マルチバイト文字列のデータ・マッピング
Oracle Tuxedoでは、マルチバイト文字列を使用してマルチバイト文字データを表現します。使用するエンコーディング名は、Oracle Tuxedoで定義されているiconvに基づきます。C++では、wstringwchar_t*またはwchar_t[]データ型を使用してマルチバイト文字データを表現します。使用するエンコーディング名は、C++ライブラリで定義されています。
特定のマルチバイト・エンコーディングを表すエンコーディング名が、Oracle TuxedoとC++で異なる場合があります。Oracle Tuxedoエンコーディング名とC++エンコーディング名の間のマッピングは、次のとおりです。
マルチバイト文字列バッファを受信する
SCAクライアントまたはサーバーが、MBSTRINGバッファや、FLD_MBSTRINGフィールドを含むFML32バッファを受信した場合は、そのマルチバイト文字列のエンコーディングが次のケースに当てはまる最初のロケールとみなされます。
a.
FLD_MBSTRINGフィールドが存在する場合はそれに関連付けられたロケール。
注意:
詳細は、表2-2を参照してください。
b.
MBSTRINGまたはFML32バッファに関連付けられたロケール。
c.
SCAクライアントまたはサーバーの環境に設定されたロケール。
ケースaまたはbに当てはまる場合、Oracle Tuxedoでは、受信したバッファのロケールで、ロケール・タイプLC_CTYPEsetlocale()関数が呼び出されます。setlocale()が失敗し(そのようなロケールが存在しないことが示され)、省略可能な$TUXDIR/locale/setlocale_aliasファイルでこのロケールに代替名が関連付けられている場合、Oracle Tuxedoでは、LC_CTYPEロケールの代替ロケールへの設定が試行されます。
$TUXDIR/locale/setlocale_aliasファイルは、必要に応じてOracle Tuxedo管理者が作成します。このファイルが存在する場合は、Oracle Tuxedo MBSTRINGコードセット名の、setlocale()関数で受け付けられた同等のオペレーティング・システム・ロケールへのマッピングが記述されています。
Oracle Tuxedo MBSTRINGコードセット名を含む行の後には、空白とOSロケール名が続きます。特定のMBSTRINGコードセット名に対応するファイルの最初の行のみが考慮されます。コメント行は#で始めます。
MBSTRINGデータをC++のwstringまたはwchar_t[]データに変換する場合、SALT SCAソフトウェアによって、$TUXDIR/locale/setlocale_aliasファイルが使用されます。Oracle Tuxedo MBSTRINGコードセット名の使用時にsetlocale()が失敗した場合、SALT SCAソフトウェアでは、存在する場合は別名の使用が試行されます。たとえば、ファイルに「GB2312 zh_CN.GB2312」という行が含まれている場合、setlocale(LC_CTYPE, 'GB2312')が失敗すると、SALT SCAソフトウェアでは、setlocale(LC_CTYPE, 'zh_CN.GB2312')が試行されます。
マルチバイト文字列バッファを送信する
SCAクライアントまたはサーバーがwstringwchar_t[]またはwchar_t*MBSTRINGバッファまたはFLD_MBSTRINGフィールドに変換する際には、C++のワイド文字をマルチバイト文字列に変換する際に設定するロケールとしてTPMBENC環境変数の値が使用されます。このロケールがオペレーティング・システムで認識されない場合、Oracle Tuxedoでは、$TUXDIR/locale/setlocale_aliasファイルが存在すればその代替ロケールが使用されます。
注意:
MBSTRINGバッファ、FML32 FLD_MBSTRINGフィールドまたはVIEW32 mbstringフィールドから取得したマルチバイト・データを転送できます。SDO setString()メソッドを使用して入力したマルチバイト・データを転送することもできます。
ただし、マルチバイト文字をXMLドキュメントに直接入力し、このデータをSALTを経由で転送することはできません。これは、XMLドキュメントに入力されたマルチバイト文字はマルチバイト文字列にトランスコーディングされ、SDOではwchar_t配列を使用してマルチバイト文字を表現するためです。
複雑な戻り値型のマッピング
(戻り値型として使用される)C++の次の組込み型は、複雑な型とみなされ、「複雑なOracle Tuxedoバッファ・データのマッピング」に示す複雑なバッファ・マッピング・ルールに従って、単一の汎用フィールドとしてFML/FML32バッファに自動的にカプセル化されます。このメカニズムによって、対応するOracle Tuxedoバッファを使用できない型を返す必要がある場合に対処できます。
注意:
組込み型を返すインタフェースでは、FML/FML32が出力バッファ・タイプとみなされます。この汎用フィールドの名前は、返されるデータの型に基づいて、TUX_RTNdatatypeになります。TUX_RTNdatatypeフィールドは、Oracle Tuxedoに付属のUsysflds.h/Usysfl32.hおよびUsysflds/Usysfl32で定義されます。
bool: TUX_RTNCHARフィールドにマップします。
char: TUX_RTNCHARフィールドにマップします。
signed char: TUX_RTNCHARフィールドにマップします。
unsigned char: TUX_RTNCHARフィールドにマップします。
short: TUX_RTNSHORTフィールドにマップします。
unsigned short: TUX_RTNSHORTフィールドにマップします。
int: TUX_RTNLONGフィールドにマップします。
unsigned int: TUX_RTNLONGフィールドにマップします。
long: TUX_RTNLONGフィールドにマップします。
unsigned long: TUX_RTNLONGフィールドにマップします。
long long: TUX_RTNLONGフィールドにマップします。
unsigned long long: TUX_RTNLONGフィールドにマップします。
float: TUX_RTNFLOATフィールドにマップします。
double: TUX_RTNDOUBLEフィールドにマップします。
long double: TUX_RTNDOUBLEフィールドにマップします。
複雑なOracle Tuxedoバッファ・データのマッピング
複雑なOracle Tuxedoバッファとみなされるのは、次のバッファです。
FML
FML32
VIEW (および等価のX_*)
VIEW32
表2-2では、SCAバインディングにマップされる複雑なOracle Tuxedoバッファ・タイプを示します。
FMLおよびFML32バッファの場合は、インタフェース内のパラメータ名をフィールド名に対応させ、Oracle Tuxedoフィールドに適用される制限(長さ、使用可能な文字)に従う必要があります。tuxscagen(1)を使用してこれらのインタフェースをメタデータから生成した場合は、生成されたコードに適切なフォーマットのパラメータ名が含まれています。
アプリケーションで、パラメータ名を使用せずに手動でインタフェースを開発したり、手動で誤ったインタフェースを開発したり、SALTによって生成されたインタフェースに互換性のない変更を加えたりすると、誤った結果が発生する可能性があります。
VIEW(および等価のX_*)とVIEW32バッファでは、SDOのDataObjectラッパーを使用する必要があります。
リスト2-35には、インタフェースの例を示します。(インタフェースの後に)関連付けられているフィールド定義は、プロセス環境内に配置する必要があります。
 
表2-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
N/A
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
N/A
FLD_STRING
string
 
std::string
java.lang.String
FLD_STRING
string
 
CARRAY_TまたはX_OCTET_T
クラスCARRAY
FLD_CARRAY
carray
GWWSルールに従って外部的にマップします。これは、(それらをサポートしない)OSOA仕様に反しているため、改善を検討する必要があります。
Bytes
N/A
FLD_CARRAY
Carray
このマッピングは、DataObjectの一部である場合に使用されます。
wchar_t*またはwchar_t array
N/A
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のみ)
N/A
データ変換例外が生成されます。これは、アプリケーションに返される前の次のタイミングでATMIBindingExceptionに変換されます。
FML32以外のOracle Tuxedoバッファでフィールドを追加しようとしたとき
データ・オブジェクトが型付きではないとき(つまり、それを記述した対応スキーマがないとき)
commonj::sdo::DataObjectPtr
TypedView32
FLD_VIEW32 (FML32のみ)
N/A
struct structurename
N/A
FLD_FML32 (FML32のみ)
structurename
リスト2-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)が必要になります。
たとえば、C++のメソッド・プロトタイプは、ヘッダー内に次のように定義されています。
long myMethod(commonj::sdo::DataObjectPtr data);
リスト2-36には、関連付けられるスキーマを示します。
リスト2-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>
 
表2-3には、生成されるフィールド表を示します。
 
表2-3 生成されるフィールド表
名前
番号
フラグ
コメント
bike
20
fml32
-
 
comment
30
string
-
 
serialNO
40
string
-
 
name
50
string
-
 
type
60
string
-
 
price
70
float
-
 
XMLスキーマの次の制限が適用されます。
属性は指定できず、指定しても無視されます。
制限されている値は無視され(それらの意味はアプリケーション関連です)、フィールド名と型のみが生成されます。
XMLスキーマ・タイプを使用する場合は、符号付き整数型のみがサポートされます。
使用できるSDOプリミティブ型のリストは、SDO C++の仕様を参照してください。
SCAユーティリティ・データ型のマッピング
scatuxgenおよびtuxscagenユーティリティは、SCAデータ型のマッピングを手動で生成するのに使用されます。scatuxgenマッピング・ルールは次のようになります。
注意:
tuxscagenのマッピング・ルールは、逆方向で実行されます(Oracle Tuxedoバッファ・タイプ→C++パラメータ型)。
C++パラメータ型/戻り値型とOracle Tuxedoバッファ・タイプのマッピング
表2-4には、パラメータ/戻り値型とOracle Tuxedoバッファ・タイプ間の対応を示します(inbufサービス・レベル・キーワード)。
 
表2-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
表2-5には、パラメータ/戻り値型とOracle Tuxedoバッファ・タイプ間の対応を示します(outbufまたはerr bufサービス・レベル・キーワード)。
 
表2-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パラメータ型のマッピング
表2-7には、メソッド・シグネチャで複数のパラメータが使用されている場合、scatuxgenがインタフェース・パラメータ型を処理し、Oracle Tuxedoサービス・メタデータ・リポジトリのパラメータ・レベルのキーワード値に変換する方法を示します。
 
表2-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)
リスト2-37に示すように、対応するランタイム型がXMLスキーマによって記述され、リスト2-38に示すように、バインディングで参照されます。
リスト2-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>
 
リスト2-38 バインディング
...
  <reference name="UBIK">
    <interface.cpp header="uBikeService.h"/>
    <binding.atmi>
       <inputBufferType>FML32/Bike</inputBufferType>
       <outputBufferType>FML32/BikeInventory</outputBufferType>
    </binding.atmi>
  </reference>
  ...
 
このようなスキーマが存在する場合、scatuxgenはこれを解析し、表2-7に示すように、対応するパラメータ・レベルのマッピング・エントリを生成します。
 
表2-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
count
C構造体のマッピング
メソッドが引数としてC構造体を取得するか、またはC構造体を返す場合(例: リスト2-39)、scatuxgenはこれを解析し、表2-8に示すように、対応するパラメータ・レベルのマッピング・エントリを生成します。
リスト2-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);
 
 
表2-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に必要な内容と一致しています。表2-9および表2-10に示されていない組合せを一致させようとすると、エラー・メッセージが返されます。
 
表2-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
 
 
 
 
 
 
 
表2-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では、クライアントまたはコンポーネントのみがパラメータを使用し、表2-11に示すタイプの値を返します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。
注意:
バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。
 
表2-11 サポートされているPython、C++およびOracle Tuxedoバッファ・タイプ
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)
...
サポートされている個々のタイプは、表2-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)
サポートされている個々のタイプは、表2-11に示すタイプに制限されています。
ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてPython関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。
たとえば、リスト2-40に示すOracle Tuxedoサービス・メタデータ・リポジトリ・エントリを考えてみます
リスト2-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データ型のマッピング
表2-12では、サポートされているRuby、C/C++およびOracle Tuxedoバッファ・タイプを示します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。
バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。
 
表2-12 サポートされているRuby、C++およびOracle Tuxedoバッファ・タイプ
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オブジェクト
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)
サポートされている個々のタイプは、表2-12に示すタイプに制限されています。
ATMIバインディングまたはWebサービス・バインディングを使用したSCAサービスとしてRuby関数を公開するには、インタフェースが必要です。このインタフェースは、「Python、RubyおよびPHPコンポーネント・プログラミング」に示すように、Oracle Tuxedoサービス・メタデータ・リポジトリに格納されます。
たとえば、リスト2-41に示すOracle Tuxedoサービス・メタデータ・リポジトリ・エントリを考えてみます
リスト2-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")
サポートされている個々のタイプは、表2-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データ型のマッピング
表2-13では、サポートされているRuby、C/C++およびOracle Tuxedoバッファ・タイプを示します。FML32 Oracle Tuxedoバッファを使用して、(複数のパラメータがC++でサポートされているのと同じ方法で、)複数のパラメータがサポートされます。
バインディングまたはC++言語拡張子でサポートされていないため、配列はサポートされません。
 
表2-13 サポートされているPHP、C++およびOracle Tuxedoバッファ・タイプ
PHPパラメータまたは戻り値型
C/C++ネイティブ・タイプ
ATMIバインディング・タイプ
バッファ・タイプ/フィールド型
integer
short、unsigned short
FML32/FLD_SHORT
integer
long、unsigned long
FML32/FLD_LONG
boolean
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リファレンスを作成する際、不明なパラメータ数を渡すことができます。例:
テスト(1, 2, 3, 4, 5);
サポートされている個々のタイプは、表2-13に示すタイプに制限されています。commonj::sdo::DataObjectPtr objectsから生じるタイプ、または結果的にこのようになるタイプは例外です。
注意:
この表記法の使用対象は次のとおりです。
ローカル呼出し(バインディングなし)、または
SCAコンポーネント間のATMIバインディングの使用(つまり、requires="legacy"属性がない<binding.atmi>要素)。ローカル呼出し(バインディングを指定しない)、または
参照
インタフェースは必要ありません。
名前付きパラメータ
名前付きパラメータを使用して、PHP SCA拡張子を使用して名前/値のペアを渡すことができます。例:
$svc->searchBike(array('COLOR' => 'RED', 'TYPE' => 'MTB'));
サポートされている個々のタイプは、表2-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には、アプリケーション・データとともに、返された構造体を記述する内部情報を格納する必要があるため、リスト2-42に示すように、<tuxsca.h>は構造体およびtypedefの定義に使用されます。
リスト2-42 <tuxsca.h> SCA構造体およびTypedefの定義
struct scastruct_t {
  void *data;
  void *internalinfo;
};
typedef struct scastruct_t *SCASTRUCT_PTR;
 
アプリケーションが通常、「struct mystruct *」データを返す場合、リスト2-42に示すように、TPFAILデータにアクセスします。
リスト2-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」を指定した場合、次の動作を使用して、呼出しが実行されます。
<reference>または<service>内に<map>要素が存在する場合、その値を使用して、呼び出すまたは通知する特定のメソッド名に、どのOracle Tuxedoサービスが関連付けられているかを特定します。
それ以外の場合:
<reference>要素内: /reference/@name要素に指定されている値を使用して、使用するインタフェース・メソッドに従ったセマンティクスで、Oracle Tuxedo呼出しを実行します。
<service>要素内: /binding.atmi/map要素に指定されているOracle Tuxedoサービスが通知され、/binding.atmi/map/@target属性に指定されているメソッドにマップされます。
また、FML32やFMLのフィールド表が必要ないように、 /binding.atmi/@requires属性を使用して内部的にデータ・マッピングを管理します。
注意:
指定しない場合、実際のOracle Tuxedoサービス名が/service/@nameまたは/reference/@nameと実際のメソッド名から構成されている、SCA→SCAのセマンティクスで通信するとみなされます(リスト2-27に示す擬似スキーマを参照)。
SCAトランザクション
ATMIバインディング・スキーマでは、/binding.atmi/@requires属性と3つのトランザクション値を使用して、SCAトランザクション・ポリシーをサポートします。これらのトランザクション値によって、ATMIバインディングの使用時にバインディング拡張が従うトランザクション動作を指定します(リスト2-27に示す擬似スキーマを参照)。
トランザクション値は次のとおりです。
指定しない(値なし)
すべてのトランザクション動作はOracle Tuxedo構成によって制御されます。Oracle Tuxedo構成でトランザクションがサポートされている場合は、トランザクションが存在していればそのトランザクションを伝播できます。
Oracle Tuxedo構成でトランザクションがサポートされていないのにトランザクションが存在する場合、エラーが発生します。
注意:
トランザクションが存在しない場合、トランザクションは開始されません。
suspendsTransaction
指定すると、トランザクション・コンテキストは呼び出されたサービスには伝播されません。<service>の場合、トランザクションが存在すれば、アプリケーション・コードを呼び出す前に自動的に中断され、呼出しの結果に関係なく後で再開されます。<reference>の場合、TPNOTRANフラグを指定してtpcall()を実行した場合と同じになります。
propagatesTransaction
<reference>要素にのみ適用でき、<service>要素では無視されます。トランザクションが存在しない場合は新しいトランザクションが開始され、存在する場合は既存のトランザクションに追加されます。このような動作は、UBBCONFIGで<service>AUTOTRANに構成することで、コンポーネントまたはコンポジット内で取得できます。Oracle TuxedoサーバーがSCAコンポーネントの実装をホストしており、UBBCONFIGでトランザクション・グループに構成されていない場合は、エラーが生成されます。
SCAセキュリティ
SCA参照は、binding.atmi SCDL要素の<authentication>要素を使用して、資格証明を渡します。
SCAサービスは、内部名を参照することによってACLで保護できます。SCA→SCAモードの場合は/binding.atmi/service/@name属性の後に「/」とメソッド名を付加し、legacyモード(SCA→Tux相互運用モード)の場合は/binding.atmi/service/@name属性を使用します。
詳細は、「SCAとOracle Tuxedoの相互運用性」を参照してください。

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved