ICEの属性配置

6262 ワード

http://www.cppprog.com/2009/0526/119.htmlから回転
 
前編記事では、Iceの初期化関数initializeの入力パラメータは、主関数の入力パラメータ、すなわちコマンドラインパラメータであることに注目しているかもしれません.
Iceの初期化関数はコマンドラインパラメータを取得した後、Ice特有のパラメータを引き出し、分析後の配置をIceの属性表に保存します.
コマンドの挙動を仮定します.
MyProg.exe --myoption --Ice.Config=config\

     -x a --Ice.Trace.Network=3 -y opt file
その中でMyProg.exeはIceで作成したプログラムです.Ice:initializeが戻ると、Iceの二つの専用パラメータが引かれます.argcは元の9から7になります.argvは次の通りです.
 
MyProgg.exe
  • --myoption
  • -x
  • a
  • -y
  • opt
  • file  
    抜き取った二つのパラメータは属性表に保存されます.属性表の種類はIce:Proptiesで、その一般的な方法は以下の通りです.
     
    std:sting get Property(const) std::string& プロ
  • std:string get PropertyWithDefault(const) std::string& プロ、 コンサート std::string&);
  • Ice:Int get PropertyAspInt(const) std::string& プロ
  • Ice:Int get Property AssInt WithDefault(const) std::string& プロ、 Ice::Int);
  • プロの属性の値を取得します.
    Ice:StringSeq get PropertyAssList(const) ::std::string& プロ
  • Ice:StringSeq get PropertyAstWithDefault(const) ::std::string& プロ、 コンサート ::Ice::String Seq;;
  • prop属性の値を取得し、コンマで区切られた値のセットを返します.ここのIce:StringSeqはstd:vector<std:sting>です.例えば、コマンドラインパラメータがあります.--MyProp.Test=abc、def、aa、sde、sは戻ります.
    abc
    
    def
    
    aaa
    
    sde
    
    s
     
    Ice:PropertyDict get Properties ForProfix ::std::string& prefix)prefixプレフィックスを含むすべての属性を返します.PropertyDictはstdです.
    void set Property(const) ::std::string& プロ、 コンサート ::std::string&);プロのプロパティの値を設定します.
    Ice:StringSeq get Command Linese Options();プロパティテーブルのすべてのデータを文字列リストに変換します.
    Ice:StringSeq parse CommundLine Options()
  •     コンサート std::string& prefix、 コンサート Ice:String Seq& アークス
  • コマンドラインのパラメータを解析し、すべてのプレフィックスのパラメータを抽出し、残りのコマンドラインのパラメータを返します.main関数はargcとargvで入力されているので、Ice:StringSeq ToSteringSeq(int,char*)とvoid string SeqToArgs(const String Seq&int&char*)関数はSterigSeqとargvの間で変換されます.
    Ice:StringSeq parseIceCommundLine Options(const) Ice::String Seq;;Ice独自のコマンドラインパラメータを分析します.
    void ロード std::string& file;fileで指定されたプロファイルを読み込み、設定ファイルについては後述する.
    Ice:ProptiesPtr clone()属性テーブルのコピーを返します.
    属性表を得るための一般的な2つの方法です.
     
    Ice:ProptiesPtr createProperties();新しい属性テーブルを作成します.
    Ice:ProptiesPtr Ice::Communicator:get Propties();現在使用されている属性表をコネクタから取得します.
    属性表を使って私達のプログラムを改善します.
    例えば、前のクライアントの例:
     
    クラス MyApp: public Ice::Application{}
  • public:
  •     virtual 要点 run(int char*[]
  •     {
  • }
            Ice:Communication Ptr ic = communicator();
  •         Ice:Object Prx ベース = 
  •             ic->stingToProxy("SimplePrinter:default" -p 10000");
  •         PrinterPrx printer =  PrinterPrx:checkedCast(base);
  •         if(!printer) throw 「Invalid Proxy!「

  •         printer->printesing("Hello" ワールド!");
  •         return 0;
  •     }
  • ;;
  •  
    ic->stingToProxy(「SimplePrinter:default-p 10000」)は、エージェント名、プロトコル、ポートおよびホスト名をプログラムに固定しています.コマンドラインパラメータまたはプロファイルによって指定されるなど、より大きな柔軟性が必要です.上記のProptiesインターフェースは私達を助けてくれます.
     
    クラス MyApp: public Ice::Application{}
  • public:
  •     virtual 要点 run(int char*[]
  •     {
  • }
            Ice:Communication Ptr ic = communicator();
  •         Ice:ProptiesPtr プロ = ic->get Propties();
  •         ストリングス s = prop->get PropertyWithDefault()
                「Ice.Printer」、「SimplePrinter:default」 -p 10000");
  •         Ice:Object Prx ベース = ic->ストリングスToProxy(s);
  •         PrinterPrx printer =  PrinterPrx:checkedCast(base);
  •         if(!printer) throw 「Invalid Proxy!「

  •         printer->printesing("Hello" ワールド!");
  •         return 0;
  •     }
  • ;;
  •  
    ここでは、プロキシ文字列は、属性テーブル(Ice:Propties、Ice:ProptiesPtrはIce:Proptiesのスマートポインタ)から得られます.コマンドラインパラメータを変更すれば、この文字列を変更できます.
    MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 10000"
    
    MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
    
    ...
    命令行にIce.Printerが指定されていない場合は、デフォルトの「SimplePrinter:default-p 10000」を使用すると推測されているかもしれません.
    また、上の方:
     
    Ice:ProptiesPtr プロ = ic->get Propties();
  • string s = prop->get PropertyWithDefault(
  • )
  •     「Ice.Printer」、「SimplePrinter:default」 -p 10000");
  • Ice:Object Prx ベース = ic->ストリングスToProxy(s); 
    三つの命令は一つの命令で代替できます.
     
    Ice:Object Prx ベース = ic->propertyToProxy(「Ice.Printer」); 
    いくつかの行を多く書くのは時々役に立ちます.私達はそれを利用して私達がカスタマイズしたパラメータを読み取ることができます.
    上の命令行で私達が取ったのは「Ice.Printer」属性です.そのプレフィックスが「Ice.」であることに注意してください.もし他のプレフィックスに変更したら、「MyProp.」のようにIce初期化時にはIce専用パラメータとは考えられません.
    いくつかの属性をカスタマイズして「私用」に使いたいなら、「Ice.」プレフィクスを使うのは不合理です.ここで、属性セットのパースCommundLine Options方法を使ってプレフィクスを指定するパラメータを解析できます.
     
    クラス MyApp: public Ice::Application{}
  • public:
  •     virtual 要点 run(int argc char*argv[]
  •     {
  • }
            Ice:Communication Ptr ic = communicator();
  •         Ice:ProptiesPtr プロ = Ice::createProperties();
  •         prop->parseCommundLine Options(「MyProp」)              Ice:args ToSterigSeq(argc、argv);
  •         ストリングス s = prop->get PropertyWithDefault(
  • )
  •             「MyProp.Printer」、「SimplePrinter:default」 -p 10000");
  •         Ice:Object Prx ベース = ic->ストリングスToProxy(s);
  •         PrinterPrx printer =  PrinterPrx:checkedCast(base);
  •         if(!printer) throw 「Invalid Proxy!「」
  •         printer->printesing("Hello" ワールド!");
  •         return 0;
  •     }
  • >; 
    今、プログラムはMyProp.Printerのプロパティを解析できます.
    設定ファイル
    少数の属性に対しては、コマンドラインパラメータを使うのは確かですが、ユーザー定義の属性が増えれば、コマンドラインパラメータを使うのは不適切です.
    Iceは私達がすべての属性パラメータを一つの文書ファイルに書くことを許可します.各パラメータの一行、例えば、次のようなものがあります.
    MyProg.exe \
    
        --MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5" \
    
        --MyProp.Test="abc,def,aaa,sde,s"
    テキストファイルを作成できます.
    MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
    
    MyProp.Test="abc,def,aaa,sde,s"
    上のコマンドラインのパラメータを変更します.
    MyProg.exe --Ice.Config=   
    またはIce:Propties::load方法でファイルを読み込み、
    あるいはIce::Propties::parseIceCommundLine Options方法を使ってテキストの内容を解析します.