14.2.4 ネーム解決
クライアントアプリケーションは,NamingContextメソッドresolveを使用して,論理的なNameが与えられたオブジェクトリファレンスを取得します。Nameは一つ以上のNameComponentオブジェクトで構成されているので,解決プロセスは,Nameを構成するすべてのNameComponent構造体を調べなければなりません。
- 〈この項の構成〉
(1) 文字列化された名前
CosNaming::Name識別子は可読性やデータ交換に向かない形式です。この問題を解決するために,文字列化された名前が定義されています。文字列化された名前とは,文字列とCosNaming::Nameとの一対一のマッピングです。二つのCosNaming::Nameオブジェクトが等しければ,その文字列化された表記も等しく,これは逆の場合にも当てはまります。文字列化された名前では,スラント(/)はネームコンポーネントのセパレータとして,ピリオド(.)はid属性とkind属性のセパレータとして,\記号はエスケープ文字としてそれぞれ使用されます。規定によって,空のkind属性を持ったNameComponentはピリオドを使用しません(Orderなど)。
- コードサンプル14-1 文字列化された名前の例
"Borland.Company/Engineering.Department/Printer.Resource"
- 注
-
以降のサンプルでは,NameComponent構造体は文字列化された表記で示されます。
(2) 単純名と複合名
Billingのような単純名はNameComponentを一つしか持たないで,常にターゲットのネーミングコンテキスト上で解決されます。単純名はオブジェクトインプリメンテーションまたはNamingContextにバインドできます。
NorthAmerica/ShippingDepartment/Inventoryのような複合名は三つのNameComponent構造体のシーケンスで構成されます。n個のNameComponentオブジェクトで構成される複合名をオブジェクトインプリメンテーションにバインドすると,シーケンス内の最初の(n-1)個のNameComponentオブジェクトはそれぞれNamingContextへと解決され,最後のNameComponentオブジェクトはオブジェクトインプリメンテーションへと解決されなければなりません。
NameをNamingContextにバインドすると,シーケンス内の各NameComponent構造体はNamingContextを参照しなければなりません。
コードサンプル14-2は,三つのコンポーネントで構成され,CORBAオブジェクトにバインドされた複合名を示します。この名前に相当する文字列化された名前はNorthAmerica/SalesDepartment/Orderです。いちばん上のネーミングコンテキスト内で解決されると,この複合名の最初の二つのコンポーネントはNamingContextオブジェクトへと解決され,最後のコンポーネントは論理名称「Order」を持ったオブジェクトインプリメンテーションへと解決されます。
- コードサンプル14-2 VisiBroker ORBオブジェクトにバインドされた複合名の例(C++)
. . . // Name stringifies to "NorthAmerica/SalesDepartment/Order" CosNaming::Name_var continentName = rootNamingContext->to_name("NorthAmerica"); CosNaming::NamingContext_var continentContext = rootNamingContext->bind_new_context(continentName); CosNaming::Name_var departmentName = continentContext->to_name("SalesDepartment"); CosNaming::NamingContext_var departmentContext = continentContext->bind_new_context(departmentName); CosNaming::Name_var objectName = departmentContext->to_name("Order"); departmentContext->rebind(objectName, myPOA-> servant_to_reference(managerServant)); . . .
- コードサンプル14-3 VisiBroker ORBオブジェクトにバインドされた複合名の例(Java)
. . . // Name stringifies to "NorthAmerica/SalesDepartment/Order " NameComponent[ ] continentName = { new NameComponent("NorthAmerica", "")}; NamingContext continentContext = rootNamingContext.bind_new_context(continentName); NameComponent[ ] departmentName = { new NameComponent("SalesDepartment", "")}; NamingContext departmentContext = continentContext.bind_new_context(departmentName); NameComponent[ ] objectName = { new NameComponent("Order", "")}; departmentContext.rebind( objectName, myPOA.servant_to_reference(managerServant)); . . .