JAXB を使用して IBM Cloud イメージのパラメーターを Java に変換する

JAXB と Plain Old Java Object を使用し、XML によるクラウド・イメージのパラメーターを使いやすい Java コードに変換する

IBM® Cloud (IBM Smart Business Development and Test on the IBM Cloud) イメージのイメージ・パラメーターを取得するには、イメージの記述に含まれているマニフェストと呼ばれる URL を使用します。この URL からは、XML レスポンスが返されます。この記事では、POJO (Plain Old Java Object) を作成して JAXB の unmarshal メソッドを呼び出すことで、この返された XML レスポンスを Java™ で扱うのに適した形に変換する方法を説明します。この方法では、一旦このレスポンスが得られると、パラメーターを必要とするイメージをベースに新しいインスタンスを作成するためのリクエストを Java クラスから容易に送信できるようになります。

Dominique Vernier, IT Architect, IBM

Dominique Vernier photoここ数年、Dominique Vernier は Java 技術とクラウド・アーキテクチャーを中心とした業務を行っています。また彼は非常に長く情報技術に従事しており、メッセージング、データベース、SOA、EAI、クライアント/サーバー、C/C++、既存フレームワークなどに関して幅広い知識を得ています。また彼は、通信、CRM、ロジスティクス、保険などの業界にも幅広い知識を持っています。彼はステート・エンジンとリソース管理に関する 4 件の特許と共同特許を持っています。現在は South-West Europe Cloud Center of Excellence で、プライベートおよびパブリック・ソリューションのための Smart Business Development and Test Cloud に従事しています。


developerWorks 貢献著者レベル

2011年 2月 14日

IBM Cloud (IBM Smart Business Development and Test on the IBM Cloud) のパラメーターは、parameters.xml という XML ファイルを使ってイメージからインスタンスへと渡されます。このファイルはイメージの RAM (Rational® Asset Manager) の中に置かれており、/etc/cloud ディレクトリー (Linux® の場合) 配下にある、実際のパラメーターが含まれるインスタンスの中にコピーされます。

ここで、この parameters.xml の中でカスタムのパラメーターを定義し、インスタンスを作成してみましょう。例えば、インスタンス作成時に VNC (Virtual Network Computing) をセットアップするカスタム・イメージを作成することができます。このイメージはパラメーターとして、ユーザー ID、パスワード、VNC パスワードを要求します (図 1)。

図 1. パラメーターを定義してインスタンスを作成する
パラメーターを定義してインスタンスを作成する

ここで、イメージまたはインスタンスのいずれかの XML ファイルからパラメーターを抽出する Java プログラムを作成する場合、このパラメーター・ファイルを Java プログラムで読み取る必要があります。例えば、インスタンスを要求する機能を持つ独自のポータルをイメージから作成したいとします。画面上のリクエストを動的に作成するためには、イメージがどのパラメーターを要求しているのかを知る必要があります。そしてその情報を、静的な結果としてではなく、動的に取得する必要があります。動的に取得することで、各イメージのタイプから特定の画面を作成した後に再度パラメーター・ファイルの値を送信する必要がなくなります。

parameters.xml を取得するために、IBM Cloud の Java API と Image.getManifest() メソッドを使用することができます。この記事では、parameters.xml へのアクセスに必要なすべてのメソッドを提供する API について説明します。XML ファイルを構文解析する方法はいくつもありますが、この記事では JAXB を使って XML ファイルをマーシャリング、アンマーシャリングする例を紹介します。

基本概念

JAXB は XSD ファイルをベースに Java パッケージを作成することができます。「Creating and customizing images」という文書 (「参考文献」を参照) の中には parameters.xsd ファイルがあります。

この XSD ファイルから、Java に用意された xjc ツールを使用することで、パラメーター・モデルとファクトリー・クラスを表現するクラスを含む Java パッケージを生成します。これらの生成されたクラスを使って parameters.xml にアクセスします。

これだけの概念を理解できれば十分です。ではその Java パッケージを作成しましょう。


Java パッケージを作成する

上で説明したように、Java に用意された xjc ツールを使いますが、まず parameters.xsd ファイルが必要です。とりあえず、parameters.xsd ファイルを作成する最善の方法は、IBM Cloud の「Support (サポート)」タブからリンクされている「Creating and customizing images」という文書 (「参考文献」を参照) から parameters.xsd ファイルをコピーして貼り付ける方法です。

parameters.xsd ファイルを入手したら、単純に以下のコマンドを入力してパッケージを生成します。

xjc -p <packageName> parameters.xsd

以下のようなパッケージがカレント・ディレクトリーに作成されます。

C:\Documents and Settings\Dominique\workspaceCloud\com.ibm.cloud.parameters\src>xjc 
   -p com.ibm.cloud.parameters ../resource/parameters.xsd
parsing a schema...
compiling a schema...
com\ibm\cloud\parameters\DataType.java
com\ibm\cloud\parameters\Field.java
com\ibm\cloud\parameters\ObjectFactory.java
com\ibm\cloud\parameters\OptionType.java
com\ibm\cloud\parameters\Options.java
com\ibm\cloud\parameters\Parameters.java
com\ibm\cloud\parameters\Values.java

このパッケージを Java プロジェクトにインポートします (図 2)。

図 2. パラメーター・パッケージを Java プロジェクトにインポートする
パラメーター・パッケージを Java プロジェクトにインポートする

このパッケージを見ると、XSD ファイルに定義された各オブジェクトを表現する POJO (Plain Old Java Object)、そしてファクトリー・クラスがあることがわかります。


パラメーター・パッケージをテストする

以下のように、Java パラメーター・パッケージをテストする簡単なプログラムを実行します。

String cloudPasswordFile = args[0];
cloudUserId = args[1];
String cloudPassPhrase = args[2];

// Retrieve cloud access information.
cloudPassword = PasswordFileProcessor.getRealPassword(
        cloudPassPhrase, cloudPasswordFile, cloudUserId);
Properties props = new Properties();
props.load(new FileInputStream("cloud.properties"));
address = props.getProperty("address",
        "https://www-147.ibm.com/cloud/enterprise/");

// Set Credential and address.
client.setRemoteCredentials(cloudUserId, cloudPassword);
client.setEndpointAddress(address);

//Search for an image description
Image image = client.describeImage("20004761");

Security.setProperty("ssl.SocketFactory.provider", 
  "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", 
  "com.ibm.jsse2.SSLServerSocketFactoryImpl");

//Create an http client
HttpClient httpclient = new HttpClient();
Credentials defaultcreds = 
   new UsernamePasswordCredentials(cloudUserId, cloudPassword);
httpclient.getState().setCredentials(AuthScope.ANY, defaultcreds);

//Create the method, it is important to use the escape 
//because the url contains '{' and '}'.
GetMethod httpget = new GetMethod(new HttpsURL(image.getManifest()).getEscapedURI());

//Execute the request
httpclient.executeMethod(httpget);

//Get the result
String result = httpget.getResponseBodyAsString();

//Prepare JAXB
JAXBContext jc;
jc = JAXBContext.newInstance("com.ibm.cloud.parameters");
Unmarshaller u = jc.createUnmarshaller();

//Unmarshal the result
Parameters parameters = (Parameters) u.unmarshal(new StringReader(result));

//Display the parameters
for (Field field : parameters.getField()) {
     System.out.println("Field Name=" + field.getName());
}

この例では、imageID=20004761 である、カスタマイズされたイメージを使いました。アセット・カタログをブラウズすると、イメージの ID を見つけることができます。(「Control panel (コントロール・パネル)」 > 「View asset catalog (アセット・カタログを表示)」の順に選択し、「My Dashboard (マイ・ダッシュボード)」または「Assets (アセット)」からイメージを選択すると、イメージ ID フィールドに ID が表示されています。)

この parameters.xml ファイルは以下のようなものです。

<parameters xsi:noNamespaceSchemaLocation=
  "platform:/resource/com.ibm.ccl.devcloud.client/schema/parameters.xsd">
  <field name="userID" label="User ID" type="string"/>
  <field name="userPassword" label="User Password" type="password" 
               pattern="^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$" 
               patternErrorMessage="Invalid Password. Must contain at least 1 number, 
               at least 1 lower case letter, and at least 1 upper case letter.">
  </field>
  <field name="vncPassword" label="VNC Password" type="password" 
               pattern="^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$" 
               patternErrorMessage="Invalid Password. Must contain at least 1 number, 
               at least 1 lower case letter, and at least 1 upper case letter.">
  </field>
</parameters>

そして結果は以下のようになります。

Field Name=userID
Field Name=userPassword
Field Name=vncPassword

まとめ

XML を Java モデルに変換するためには、XMLBeans や XStreams のような技術を使う方法など、いくつかの方法がありますが、JAXB を使う方法は最も簡単な方法の 1 つです。この記事をきっかけに、皆さんが IBM Cloud の Java API を使用して IBM Cloud に関する要件を満たすコードを作成し、インスタンスを作成する独自のメソッドを開発できることを祈っています。

参考文献

学ぶために

製品や技術を入手するために

  • 「IBM Smart Business Development and Test on the IBM Cloud」で利用可能な製品イメージを調べてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Java technology, XML
ArticleID=632022
ArticleTitle=JAXB を使用して IBM Cloud イメージのパラメーターを Java に変換する
publish-date=02142011