目次


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

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

Comments

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 に関する要件を満たすコードを作成し、インスタンスを作成する独自のメソッドを開発できることを祈っています。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

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