<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>イージーネット Tech Blog &#187; Java</title>
	<atom:link href="http://blog.eni.co.jp/tech/category/program/java/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.eni.co.jp/tech</link>
	<description>株式会社イージーネットのスタッフによる技術系ブログです</description>
	<lastBuildDate>Tue, 12 Jan 2010 01:46:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/category/program/java/feed" />
		<item>
		<title>Wicket小話その3. Wicketで確認メッセージを出すにはどうすればよいのか？(その2)</title>
		<link>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html#comments</comments>
		<pubDate>Tue, 29 Sep 2009 08:20:46 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1812</guid>
		<description><![CDATA[ども、武輪です。
前回のWicket小話で、Confirmメッセージを出すにはどうすればよいのか？と言った話をしたのですが、今回も引き続きConfirmメッセージの話をしたいと思います。
前回、AjaxボタンでConfirmメッセージを表示する方法として、Wicket-extensionのコンポーネントであるModalWindowを使い、独自のポップアップメッセージを表示する方法をとりました。
しかしながら、これってぶっちゃけConfirmメッセージじゃないよね…！
というわけで今回はAjaxボタンで正真正銘(?)のConfirmメッセージを表示する方法をご紹介します。

AjaxボタンでConfirmメッセージ
&#62;Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので&#8230;
と前回書いたのですが、
「confirmで確認後、OKだったら既存AjaxのJavaScriptを実行してあげて、キャンセルだったらfalseを返す」
ようなJavaScriptを書けば問題ないんじゃ…？と思いまして。
そんなわけでさらっとサンプルを書いてみました。
サンプルは前回同様、ボタンを押した時に確認メッセージを表示し、OKだったらカウントする、キャンセルだったら何もしない、といった仕様です。
Confirm2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Confirm2 extends WebPage&#123;
&#160;
	private int count = 0;
	private Label result;
&#160;
	/**
	 * コンストラクタ
	 */
	public Confirm2&#40;&#41; &#123;
		add&#40;result = new Label&#40;&#34;result&#34;, new PropertyModel&#60;Integer&#62;&#40;this, &#34;count&#34;&#41;&#41;&#41;;
		result.setOutputMarkupId&#40;true&#41;;
		Form&#60;?&#62; form = new Form&#60;Confirm2&#62;&#40;&#34;form&#34;&#41;;
&#160;
		form.add&#40;new AjaxButton&#40;&#34;count&#34;, new Model&#60;String&#62;&#40;&#34;カウントしますか？&#34;&#41;&#41;&#123;
&#160;
			private static final long serialVersionUID = 1L;
&#160;
			@Override
			protected void onSubmit&#40;AjaxRequestTarget target, Form&#60;?&#62; form&#41; &#123;
				count++;
				target.addComponent&#40;result&#41;;
			&#125;
&#160;
			@Override
			protected IAjaxCallDecorator getAjaxCallDecorator&#40;&#41; &#123;
				return new AjaxPreprocessingCallDecorator&#40;super.getAjaxCallDecorator&#40;&#41;&#41; &#123;
					private static final long serialVersionUID = 1L;
&#160;
					@Override
					public CharSequence preDecorateScript&#40;CharSequence [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html">前回のWicket小話</a>で、Confirmメッセージを出すにはどうすればよいのか？と言った話をしたのですが、今回も引き続きConfirmメッセージの話をしたいと思います。</p>
<p>前回、AjaxボタンでConfirmメッセージを表示する方法として、Wicket-extensionのコンポーネントであるModalWindowを使い、独自のポップアップメッセージを表示する方法をとりました。<br />
しかしながら、これってぶっちゃけConfirmメッセージじゃないよね…！</p>
<p>というわけで今回はAjaxボタンで正真正銘(?)のConfirmメッセージを表示する方法をご紹介します。</p>
<p><!-- more --></p>
<h3>AjaxボタンでConfirmメッセージ</h3>
<p><em>&gt;Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので&#8230;</em></p>
<p>と前回書いたのですが、<br />
「confirmで確認後、OKだったら既存AjaxのJavaScriptを実行してあげて、キャンセルだったらfalseを返す」<br />
ようなJavaScriptを書けば問題ないんじゃ…？と思いまして。</p>
<p>そんなわけでさらっとサンプルを書いてみました。<br />
サンプルは前回同様、ボタンを押した時に確認メッセージを表示し、OKだったらカウントする、キャンセルだったら何もしない、といった仕様です。</p>
<p><span class="strong">Confirm2.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p18122"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p1812code2"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm2 <span style="color: #000000; font-weight: bold;">extends</span> WebPage<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm2<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> Model<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;カウントしますか？&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				count<span style="color: #339933;">++;</span>
				target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> IAjaxCallDecorator getAjaxCallDecorator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxPreprocessingCallDecorator<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getAjaxCallDecorator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
					@Override
					<span style="color: #000000; font-weight: bold;">public</span> CharSequence preDecorateScript<span style="color: #009900;">&#40;</span>CharSequence script<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;if(!confirm('&quot;</span> <span style="color: #339933;">+</span> getModelObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;')) return false;&quot;</span> <span style="color: #339933;">+</span> script<span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">25～34行目付近</span>:<br />
AjaxButtonのgetAjaxCallDecoratorをオーバライドしてあげることで、出力されるAjax用JavaScriptに手を加えています。</p>
<p>実際に出力されるhtmlは以下のようになります。</p>
<pre lang="Html" line="none">
onclick="if(!confirm('カウントしますか？')) return false;var wcall=wicketSubmitFormById('form2', ';[長いので略]"
</pre>
<h4>まとめ</h4>
<p>というわけで、AjaxButtonでも前回みたいな似非確認ダイアログではなくちゃんとした(?)Confirmメッセージを出すことができました。<br />
AjaxButtonを記述する度にgetAjaxCallDecorator()をオーバライドするのも面倒なので、AjaxButtonを継承したサブクラスを作っておくのが便利そうです。</p>
<h3>動作環境</h3>
<p>今回のサンプルソースは以下の環境で動作させています。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html">Wicket小話その1. とりあえずWicketを始めよう</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_02_confirm.html">Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html" />
	</item>
		<item>
		<title>Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</title>
		<link>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html#comments</comments>
		<pubDate>Fri, 04 Sep 2009 02:35:23 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1365</guid>
		<description><![CDATA[ども、武輪です。
Webアプリケーションでは、データを登録したり編集したり削除したりといった操作が日常茶飯事です。
そして「削除ボタンを押した時にいきなり削除するのではなく、confirmメッセージを出す」というのはよくあるパターンですね。
さてWicket小話その2では、「Wicketで確認メッセージを出すにはどうすればよいのか？」について、実際のコードを踏まえて試してみようと思います。

非Ajaxボタンの場合
例えばこんなボタンがあるとします。

これはcountボタンを押すと画面上に何回クリックしたのかを表示する簡単なサンプルです。
Confirm.html

1
2
3
4
5
6
7
8
9
10
11
12
&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&#62;
&#60;head&#62;
	&#60;title&#62;Wicket Examples - confirm&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
	&#60;span wicket:id=&#34;result&#34; /&#62; 回目
	&#60;form wicket:id=&#34;form&#34;&#62;
		&#60;input wicket:id=&#34;count&#34; type=&#34;submit&#34; value=&#34;count&#34; /&#62;
	&#60;/form&#62;
&#60;/body&#62;
&#60;/html&#62;

Confirm.java(非AjaxButton編)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Confirm extends WebPage &#123;
&#160;
	private int count = 0;
&#160;
	/**
	 * コンストラクタ
	 */
	public Confirm&#40;&#41; &#123;
		add&#40;new Label&#40;&#34;result&#34;, new PropertyModel&#60;Integer&#62;&#40;this, &#34;count&#34;&#41;&#41;&#41;;
		Form&#60;?&#62; form = new Form&#60;Confirm&#62;&#40;&#34;form&#34;&#41;;
		Button countButton;
		form.add&#40;countButton = new Button&#40;&#34;count&#34;&#41; &#123;
			private static final long serialVersionUID = 1L;
&#160;
			@Override
			public void onSubmit&#40;&#41; &#123;
				super.onSubmit&#40;&#41;;
				count++;
			&#125;
&#160;
		&#125;&#41;;
		add&#40;form&#41;;
	&#125;
&#160;
	/**
	 * countを取得します。
	 * @return [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p>Webアプリケーションでは、データを登録したり編集したり削除したりといった操作が日常茶飯事です。<br />
そして「削除ボタンを押した時にいきなり削除するのではなく、confirmメッセージを出す」というのはよくあるパターンですね。</p>
<p>さてWicket小話その2では、「Wicketで確認メッセージを出すにはどうすればよいのか？」について、実際のコードを踏まえて試してみようと思います。</p>
<p><span id="more-1365"></span></p>
<h3>非Ajaxボタンの場合</h3>
<p>例えばこんなボタンがあるとします。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample011-300x214.png" alt="confirmサンプル" title="confirmサンプル" width="300" height="214" class="alignleft size-medium wp-image-1728" /><br clear="all"/><br />
これはcountボタンを押すと画面上に何回クリックしたのかを表示する簡単なサンプルです。</p>
<p><span class="strong">Confirm.html</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136515"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1365code15"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot; /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><span class="strong">Confirm.java(非AjaxButton編)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136516"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code" id="p1365code16"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a> countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onSubmit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				count<span style="color: #339933;">++;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4>html側で対応</h4>
<p>html側に直接JavaScriptを埋め込むことで対応。<br />
Javaのコードには一切変更点はありません。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136517"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1365code17"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot; onclick=&quot;return confirm('カウントしますか？')&quot; /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">9行目</span>:<br />
onclickイベントを追加しただけです。</p>
<h4>Java側で対応</h4>
<p>SimpleAttributeModifierを使うことで、任意のアトリビュートを付加することができます。<br />
htmlには一切変更点はありません。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136518"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p1365code18"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a> countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onSubmit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				count<span style="color: #339933;">++;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		countButton.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> SimpleAttributeModifier<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;onclick&quot;</span>, <span style="color: #0000ff;">&quot;return confirm('カウントしますか？')&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">22行目</span>:<br />
countButtonにSimpleAttributeModifierをadd。</p>
<p>html側で対応した場合も、Java側で対応した場合も、動作的には下図のように、countボタンをクリックすると確認ダイアログが表示されます。<br />
確認ダイアログのOKをクリックすれば、数字がインクリメントされ、キャンセルをクリックすれば数字は元のままです。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample02-300x215.png" alt="Confirmサンプル" title="Confirmサンプル" width="300" height="215" class="alignleft size-medium wp-image-1733" /><br clear="all"/></p>
<p><br clear="all"/></p>
<h3>Ajaxボタンの場合</h3>
<p>続きましてAjaxボタンの場合。<br />
動作的には変わらないのですが、先ほどのサンプルコードを下記のように、ButtonではなくAjaxButtonを使用するように変更します。<br />
html側には変更はありません。(Wicketってこういうとこ便利ですよね)</p>
<p><span class="strong">Confirm.java(AjaxButton編)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136519"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p1365code19"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		AjaxButton countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				count<span style="color: #339933;">++;</span>
				target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">11行目</span>:<br />
Ajaxを用いてコンポーネントを更新する場合は、setOutputMarkupIdをtrueにすることを忘れずに！</p>
<h4>こんな失敗</h4>
<p>非Ajaxボタンの時と同じように、onclickアトリビュート追加してやればいいんじゃないの？<br />
　↓<br />
html側に「onclick=&#8221;return confirm(&#8217;カウントしますか？&#8217;)&#8221;」をつけたしてみる。<br />
　↓<br />
カウントはされるが、確認ダイアログは出てこない。あれ？<br />
　↓<br />
生成されたhtmlソースを見てみる<br />
　↓</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136520"><td class="code" id="p1365code20"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;submit&quot; value=&quot;count&quot; onclick=&quot;var wcall=wicketSubmitFormById('ida', '?wicket:interface=:5:form:count::IActivePageBehaviorListener:0:&amp;amp;wicket:ignoreIfNotActive=true', 'count' ,null,null, function() {return Wicket.$$(this)&amp;amp;&amp;amp;Wicket.$$('ida')}.bind(this));;; return false;&quot; name=&quot;count&quot; id=&quot;idb&quot;/&gt;</pre></td></tr></table></div>

<p>　↓<br />
Ajax用のonclickになってるよーorz<br />
　↓<br />
じゃあ、SimpleAttributeModifierを使うパターンは？<br />
　↓<br />
確認ダイアログは出るけど、OKクリックしてもカウントアップされない<br />
　↓<br />
生成されたhtmlソースを見てみる<br />
　↓</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136521"><td class="code" id="p1365code21"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;submit&quot; value=&quot;count&quot; name=&quot;count&quot; id=&quot;id3&quot; onclick=&quot;return confirm('カウントしますか？')&quot;/&gt;</pre></td></tr></table></div>

<p>　↓<br />
見事Ajax用のonclickイベントはconfirmに置き換わってる<br />
　↓<br />
そりゃそうだorz</p>
<h4>力技で解決</h4>
<p>Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので、とっても強引に解決してみました。</p>
<p>もう独自にConfirmウィンドウ実装しちゃえばいいんじゃね？<br />
というわけで、できたのがこんな画面。</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample03-300x205.png" alt="Confirmサンプル" title="Confirmサンプル" width="300" height="205" class="alignleft size-medium wp-image-1746" /><br clear="all"/></p>
<p>Wicket-extensionにはいくつかの便利なAjaxコンポーネントが備わっています。<br />
そのうちの一つであるModalWindowを使って、強引に確認ダイアログのようなものを表示させてみました。</p>
<p>追加したのは下記3ファイル(ConfirmModalWindowPage.html、ConfirmModalWindowPage.java、IConfirmPage.java)。</p>
<p><span class="strong">ConfirmModalWondowPage.html</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136522"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p1365code22"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;content-type&quot; content=&quot;application/xhtml+xml;charset=UTF-8&quot; /&gt;
	&lt;title&gt;ModalWindow&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div wicket:id=&quot;info&quot;&gt;メッセージ&lt;/div&gt;
	&lt;form wicket:id=&quot;confirmForm&quot;&gt;
		&lt;div style=&quot;padding:1em; text-align:center&quot;&gt;
			&lt;input type=&quot;submit&quot; wicket:id=&quot;ok&quot; value=&quot;OK&quot; /&gt;
			&lt;input type=&quot;submit&quot; wicket:id=&quot;cancel&quot; value=&quot;キャンセル&quot; /&gt;
		&lt;/div&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><span class="strong">ConfirmModalWondowPage.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136523"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code" id="p1365code23"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConfirmModalWindowPage <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> ConfirmModalWindowPage<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> IConfirmPage page, <span style="color: #000000; font-weight: bold;">final</span> ModalWindow confirmModalWindow, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> info<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;info&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> Model<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span>info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		Form confirmForm<span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>confirmForm <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirmForm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// OKボタン</span>
		confirmForm.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ok&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">boolean</span> result <span style="color: #339933;">=</span> page.<span style="color: #006633;">ok</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// 処理に成功した時の動作</span>
					confirmModalWindow.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// 処理に失敗した時の動作</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// キャンセルボタン</span>
		confirmForm.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;cancel&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// キャンセルボタンが押されたときの処理</span>
				confirmModalWindow.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 確認用ModalWindowを取得する.
	 * @param id
	 * @param page
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> ModalWindow getConfirmModalWindow<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> id, <span style="color: #000000; font-weight: bold;">final</span> IConfirmPage page, <span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> ModalWindow modal <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ModalWindow<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setCssClassName</span><span style="color: #009900;">&#40;</span>ModalWindow.<span style="color: #006633;">CSS_CLASS_GRAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setInitialHeight</span><span style="color: #009900;">&#40;</span>150<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setInitialWidth</span><span style="color: #009900;">&#40;</span>350<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setResizable</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setTitle</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;確認メッセージ&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setCookieName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirm_window&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setPageCreator</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">PageCreator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> Page createPage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ConfirmModalWindowPage<span style="color: #009900;">&#40;</span>page, modal, info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		modal.<span style="color: #006633;">setWindowClosedCallback</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">WindowClosedCallback</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onClose<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				page.<span style="color: #006633;">refleshComponent</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		modal.<span style="color: #006633;">setCloseButtonCallback</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">CloseButtonCallback</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> onCloseButtonClicked<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> modal<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">11～23行目</span>:<br />
ConfirmウィンドウのOKボタンの定義です。実際の処理は、元のPageのokメソッドに記述しています。<br />
処理の成功/失敗を返すようにしておくと、処理に失敗した場合はConfirmウィンドウ内にエラーメッセージを表示するなんて使い方もできそうです。</p>
<p><span class="blue">26～33行目</span>:<br />
Confirmウィンドウのキャンセルボタンの定義です。Confirmウィンドウを閉じているだけです。</p>
<p><span class="blue">43～73行目</span>:<br />
Confirmウィンドウ用のModalWindowを取得するメソッドです。元のPageから取得するためstaticメソッドにしています。</p>
<p><span class="blue">45～51行目</span>:<br />
ModalWindowの設定です。<br />
　setCssClassName　→　CSS_CLASS_GRAYかCSS_CLASS_BLUEを選択。デフォルトでは青色。<br />
　setInitialHeight、setInitialWidth　→　ModalWindowのサイズ指定。確認ダイアログなので小さめにしておきます。<br />
　setResizable　→　ModalWindowのリサイズを可能にするかしないか。<br />
　setTitle　→　ModalWindowのタイトル文字列。<br />
　setCookieName　→　クッキーの名前。このクッキーはModalWindowの位置などを記憶しています。</p>
<p><span class="blue">58～63行目</span>:<br />
ModalWindowが閉じられたときの処理を記述します。<br />
ここでは元画面のコンポーネントの更新を行っています。</p>
<p><span class="blue">65～70行目</span>:<br />
ModalWindowの×ボタンで閉じられたときの処理を記述します。<br />
ここでは特に何も行っていません。</p>
<p><span class="strong">IConfirmPage.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136524"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1365code24"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IConfirmPage <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 画面の更新
	 * @param target
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> refleshComponent<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * OKボタンを押した時の処理
	 * @param target
	 * @return 処理が成功したかどうか true:成功 false:失敗
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> ok<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * キャンセルボタンを押した時の処理
	 * @param target
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> cancel<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
Confirmウィンドウを表示するPageでこのインターフェースを実装します。</p>
<p>このインターフェースを実装するようにConfirm.javaを以下のように修正しました。<br />
<span class="strong">Confirm.java(修正後)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136525"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="code" id="p1365code25"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #000000; font-weight: bold;">implements</span> IConfirmPage<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">final</span> ModalWindow confirmModalWindow <span style="color: #339933;">=</span> ConfirmModalWindowPage.<span style="color: #006633;">getConfirmModalWindow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirmModalWindow&quot;</span>,
				Confirm.<span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;カウントしますか？&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>confirmModalWindow<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		AjaxButton countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				confirmModalWindow.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Confirmウィンドウでキャンセルが押されたときの処理
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> cancel<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// キャンセル時の処理</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * ConfirmウィンドウでOKが押されたときの処理
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> ok<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		count<span style="color: #339933;">++;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 画面上のコンポーネントの更新
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> refleshComponent<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">14～16行目</span>:<br />
Confirmウィンドウ用のModalWindowを取得します。</p>
<p><span class="blue">23～25行目</span>:<br />
countボタンがクリックされたときの処理。ModalWindowを表示します。</p>
<p><span class="blue">40～45行目</span>:<br />
Confirmウィンドウでキャンセルボタンを押されたときの実処理を記述します。ここでは特に何もしていません。</p>
<p><span class="blue">50～53行目</span>:<br />
ConfirmウィンドでOKボタンが押されたときの実処理を記述します。ここではcountをインクリメントしています。</p>
<p><span class="blue">58～60行目</span>:<br />
Ajaxで画面の更新を行います。ここではresultラベルの表示を更新しています。</p>
<p><span class="strong">Confirm.html(変更後)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136526"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p1365code26"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot;/&gt;
		&lt;div wicket:id=&quot;confirmModalWindow&quot;&gt;削除ConfirmModalWindow&lt;/div&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">10行目</span>:<br />
Confirmウィンドウ表示領域の確保。</p>
<h4>まとめ</h4>
<p>とりあえずこんな感じの実装で、AjaxButtonの場合でも確認ダイアログっぽいものは出すことができました。</p>
<p>もっともこのままだと、1つの画面でOK、キャンセルが押されたときの処理が1つしか記述できないので、実際汎用的に使おうと思えば、さらなる改造が必要ですけどね:）</p>
<h3>動作環境</h3>
<p>今回のサンプルソースは以下の環境で動作させています。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html">Wicket小話その1. とりあえずWicketを始めよう</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html">Wicket小話その3. Wicketで確認メッセージを出すにはどうすればよいのか？(その2) </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html" />
	</item>
		<item>
		<title>Wicket小話その1. とりあえずWicketを始めよう</title>
		<link>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html#comments</comments>
		<pubDate>Mon, 31 Aug 2009 08:35:02 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>
		<category><![CDATA[フレームワーク]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1108</guid>
		<description><![CDATA[ども、武輪です。
Wicket小話と題しまして、Wicket初心者の私がWicketを使ってみて、

これちょっと便利な機能だなー
こんなコンポーネントを使ってみたよ！
こんな実装やってみたよ！

などなど。
そんなちょっとしたメモ書きを徒然と残していこうと思います。
基本的に情報はWebと書籍「オープンソース徹底活用 WicketによるWebアプリケーション開発」(矢野勉さん著)から得ています。
あとはWicketのソースとか。
さてWicket小話その1として、「とりあえずWicketを始めよう」という副題で徒然と書いていきます。

はじめに
そもそもWicketって何よって方に簡単に。
Wicketとは、Webアプリケーションフレームワークの1つです。
HtmlとJavaでWebアプリケーションが作れちゃいます。
設定ファイルはほとんど必要ありません。(そりゃweb.xmlは必須ですけども)
2009年8月現在Wicketは1.4がリリースされています。
Wicket小話では特に注意書きがない限り、この最新リリースのWicket1.4で試したことを書いていこうと思います。
開発環境などは以下の通り。



バージョン


JDK
1.6.0_13


Apache Tomcat
6.0.16


Apache Wicket
1.4.0


さてここまで書いたところで、ショックな出来事が1つ。
ちょ…、Wicket1.4.1もう出てるじゃんorz
ま、まぁいっか。
準備
Apache Maven2 のインストール手順
Maven2を使うことで簡単にWicketプロジェクトを開始することができます。
(事前に1.5以上のJDKがインストールされている前提で話を進めていきます。)

1. ダウンロード
Apache Maven Projectより、アーカイブをダウンロードします。
私は2.1.0を使用していますが、2.2.1が既に出ているようです。


2. 環境変数の設定
適当なディレクトリ(MAVEN_HOME)にダウンロードしてきたアーカイブを展開してください。
環境変数PATHに%MAVEN_HOME%binを追加。
(環境変数はシステムのプロパティ→詳細設定→環境変数から変更できます。既存のPATHの値を消してしまわないように気を付けてください。)
※JAVA_HOMEを設定していないとMaven2は動かないので注意。


3. インストール確認
コマンドプロンプトでmvn &#8211;versionを実行することでインストールを確認することができます。

C:>mvn --version
Apache Maven 2.1.0 (r755702; 2009-03-19 04:10:27+0900)
Java version: 1.6.0_06
Java home: C:javajdk1.6.0_06jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"


早速Wicketを始めよう
Moven2のインストールが完了したら、早速Wicketを開始してみましょう。
サンプルアプリケーションを動かしてみよう！

1. ダウンロード
http://wicket.apache.org/ から1.4系のアーカイブをダウンロードしてきます。
適当なディレクトリでアーカイブを展開します。
libディレクトリにはwicketの各種ライブラリーの他に、サンプルアプリケーションのwar(wicket-examples-1.4.x.war)も入っています。
このwarファイルをローカルのTomcatのwebappディレクトリに放り込んでTomcatを再起動してあげれば、とりあえずサンプルを動かすことができるんですが、このwarにはソースが含まれていないので動作を見るだけになってしまいます。
折角なのでEclipseで作業できるようにしましょう。


2. Eclipseにインポート
コマンドプロンプト上で、srcディレクトリ以下のwicket-examplesに移動します。
mvn eclipse:eclipse -DdownloadSources=true を実行することでEclipse用の設定ファイルが生成されます。

%展開先のディレクトリ%apache-wicket-1.4.xsrcwicket-examples>mvn eclipse:eclipse -DdownloadSources=true

あとはEclipseで「インポート」→「既存プロジェクトをワークスペースへ」からインポートすればOK。


3. サンプルを動かしてみよう
wicket-examplesパッケージにはJettyというJAVAのWebサーバが同梱されているので、簡単にサンプルを動作させることができます。
org.apache.wicket.examples.StartExamplesクラスを実行すればJettyサーバが起動します。
そしたらあとは http://localhost:8080/wicket-examples/ にアクセスするだけでWicketのサンプルの数々を試すことができます。
勿論Tomcatで動かしても全然問題ありません。

新規プロジェクトのスタート

サンプルアプリケーションは、既に1つの完成されたアプリケーションです。
新規プロジェクトをスタートさせる時には、ブランクのプロジェクトがあれば便利だなーって思いませんか？
というわけでブランクプロジェクトの作り方です。

Maven2の使い方なんかわかんないよーって人にも簡単！
WicketのQuickStartのページからコマンドラインを作成することができます。
上記サイトにアクセスすると、こんな入力欄があります。
各入力欄の意味は、
　GroupId:　パッケージとして使用される
　ArtifactId:　プロジェクト名として使用される
　Version:　Wicketのバージョン
こんな感じです。
これらを入力していくと、勝手にCommand Line欄にコマンドが組み立てられていくって寸法です。なんて便利！
次にコマンドプロンプト上でプロジェクトを作成したいディレクトリに移動し、先ほど生成したコマンドラインをコピペして実行します。
(※Proxyの設定などはこちらを参考に。→Maven2のTipsを集めるwiki#固有の環境設定)

C:test>mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.1 -DgroupId=jp.co.eni.wicket -DartifactId=sample
[INFO] Scanning [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p>Wicket小話と題しまして、Wicket初心者の私がWicketを使ってみて、</p>
<ul>
<li>これちょっと便利な機能だなー</li>
<li>こんなコンポーネントを使ってみたよ！</li>
<li>こんな実装やってみたよ！</li>
</ul>
<p>などなど。<br />
そんなちょっとしたメモ書きを徒然と残していこうと思います。</p>
<p>基本的に情報はWebと書籍「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798022217/enieni-22/ref=nosim/" name="amazletlink" target="_blank">オープンソース徹底活用 WicketによるWebアプリケーション開発</a>」(矢野勉さん著)から得ています。<br />
あとはWicketのソースとか。</p>
<p>さてWicket小話その1として、「とりあえずWicketを始めよう」という副題で徒然と書いていきます。</p>
<p><span id="more-1108"></span></p>
<h3>はじめに</h3>
<p>そもそもWicketって何よって方に簡単に。<br />
<b>Wicketとは、Webアプリケーションフレームワークの1つです。</b><br />
HtmlとJavaでWebアプリケーションが作れちゃいます。<br />
設定ファイルはほとんど必要ありません。(そりゃweb.xmlは必須ですけども)</p>
<p>2009年8月現在Wicketは1.4がリリースされています。<br />
Wicket小話では特に注意書きがない限り、この最新リリースのWicket1.4で試したことを書いていこうと思います。</p>
<p>開発環境などは以下の通り。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<p>さてここまで書いたところで、ショックな出来事が1つ。<br />
ちょ…、Wicket1.4.1もう出てるじゃんorz</p>
<p>ま、まぁいっか。</p>
<h3>準備</h3>
<h4>Apache Maven2 のインストール手順</h4>
<p>Maven2を使うことで簡単にWicketプロジェクトを開始することができます。<br />
(事前に1.5以上のJDKがインストールされている前提で話を進めていきます。)</p>
<p>
<span class="entry">1. ダウンロード</span><br />
<a href="http://maven.apache.org/download.html">Apache Maven Project</a>より、アーカイブをダウンロードします。<br />
私は2.1.0を使用していますが、2.2.1が既に出ているようです。
</p>
<p>
<span class="entry">2. 環境変数の設定</span><br />
適当なディレクトリ(MAVEN_HOME)にダウンロードしてきたアーカイブを展開してください。<br />
環境変数PATHに%MAVEN_HOME%binを追加。<br />
(環境変数はシステムのプロパティ→詳細設定→環境変数から変更できます。既存のPATHの値を消してしまわないように気を付けてください。)</p>
<p>※JAVA_HOMEを設定していないとMaven2は動かないので注意。
</p>
<p>
<span class="entry">3. インストール確認</span><br />
コマンドプロンプトでmvn &#8211;versionを実行することでインストールを確認することができます。</p>
<pre style="background-color:black; color:white">
C:>mvn --version
Apache Maven 2.1.0 (r755702; 2009-03-19 04:10:27+0900)
Java version: 1.6.0_06
Java home: C:javajdk1.6.0_06jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
</pre>
</p>
<h3>早速Wicketを始めよう</h3>
<p>Moven2のインストールが完了したら、早速Wicketを開始してみましょう。</p>
<h4>サンプルアプリケーションを動かしてみよう！</h4>
<p>
<span class="entry">1. ダウンロード</span><br />
<a href="http://wicket.apache.org/">http://wicket.apache.org/</a> から1.4系のアーカイブをダウンロードしてきます。</p>
<p>適当なディレクトリでアーカイブを展開します。<br />
libディレクトリにはwicketの各種ライブラリーの他に、サンプルアプリケーションのwar(wicket-examples-1.4.x.war)も入っています。<br />
このwarファイルをローカルのTomcatのwebappディレクトリに放り込んでTomcatを再起動してあげれば、とりあえずサンプルを動かすことができるんですが、このwarにはソースが含まれていないので動作を見るだけになってしまいます。<br />
折角なのでEclipseで作業できるようにしましょう。
</p>
<p>
<span class="entry">2. Eclipseにインポート</span><br />
コマンドプロンプト上で、srcディレクトリ以下のwicket-examplesに移動します。<br />
mvn eclipse:eclipse -DdownloadSources=true を実行することでEclipse用の設定ファイルが生成されます。</p>
<pre style="background-color:black; color:white">
%展開先のディレクトリ%apache-wicket-1.4.xsrcwicket-examples>mvn eclipse:eclipse -DdownloadSources=true
</pre>
<p>あとはEclipseで「インポート」→「既存プロジェクトをワークスペースへ」からインポートすればOK。
</p>
<p>
<span class="entry">3. サンプルを動かしてみよう</span><br />
wicket-examplesパッケージにはJettyというJAVAのWebサーバが同梱されているので、簡単にサンプルを動作させることができます。<br />
org.apache.wicket.examples.StartExamplesクラスを実行すればJettyサーバが起動します。<br />
そしたらあとは <a href="http://localhost:8080/wicket-examples/">http://localhost:8080/wicket-examples/</a> にアクセスするだけでWicketのサンプルの数々を試すことができます。<br />
勿論Tomcatで動かしても全然問題ありません。
</p>
<h4>新規プロジェクトのスタート</h4>
<p>
サンプルアプリケーションは、既に1つの完成されたアプリケーションです。<br />
新規プロジェクトをスタートさせる時には、ブランクのプロジェクトがあれば便利だなーって思いませんか？<br />
というわけでブランクプロジェクトの作り方です。
</p>
<p>Maven2の使い方なんかわかんないよーって人にも簡単！<br />
<a href="http://wicket.apache.org/quickstart.html">WicketのQuickStartのページ</a>からコマンドラインを作成することができます。</p>
<p>上記サイトにアクセスすると、こんな入力欄があります。<br />
<div id="attachment_1323" class="wp-caption aligncenter" style="width: 645px"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/quickstart.png" alt="quickstart" title="quickstart" width="635" height="283" class="aligncenter size-full wp-image-1323" /><p class="wp-caption-text">QuickStartページ</p></div></p>
<p>各入力欄の意味は、<br />
　GroupId:　パッケージとして使用される<br />
　ArtifactId:　プロジェクト名として使用される<br />
　Version:　Wicketのバージョン<br />
こんな感じです。<br />
これらを入力していくと、勝手にCommand Line欄にコマンドが組み立てられていくって寸法です。なんて便利！</p>
<p>次にコマンドプロンプト上でプロジェクトを作成したいディレクトリに移動し、先ほど生成したコマンドラインをコピペして実行します。<br />
(※Proxyの設定などはこちらを参考に。→<a href="http://wiki.fdiary.net/maven2/?CookBook#l41">Maven2のTipsを集めるwiki#固有の環境設定</a>)</p>
<pre class="wp_codebox" style="background-color:black; color:white">
C:test>mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.1 -DgroupId=jp.co.eni.wicket -DartifactId=sample
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create]
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: jp.co.eni.wicket
Downloading: http://repo1.maven.org/maven2/org/apache/wicket/wicket-archetype-quickstart/1.4.1/wicket-archetype-quickstart-1.4.1.jar
13K downloaded  (wicket-archetype-quickstart-1.4.1.jar)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: wicket-archetype-quickstart:1.4.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: jp.co.eni.wicket
[INFO] Parameter: packageName, Value: jp.co.eni.wicket
[INFO] Parameter: package, Value: jp.co.eni.wicket
[INFO] Parameter: artifactId, Value: sample
[INFO] Parameter: basedir, Value: C:test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: C:testsample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9 seconds
[INFO] Finished at: Wed Aug 26 11:11:43 JST 2009
[INFO] Final Memory: 7M/14M
[INFO] ------------------------------------------------------------------------
</pre>
<p>最後に「<b>[INFO] BUILD SUCCESSFUL</b>」が出てればOK。</p>
<p>
さて、実はもうこれだけで実行可能な状態なんです。<br />
上記例では、C:testにsampleというディレクトリが作成されています。<br />
コマンドプロンプト上でこのsampleディレクトリに移動し、以下のコマンドを実行します。</p>
<pre style="background-color:black; color:white">
C:testsample>mvn jetty:run
</pre>
<p>http://localhost:8080/sample にアクセスしてみてください。</p>
<pre>
Wicket Quickstart Archetype Homepage 

If you see this message wicket is properly configured and running
</pre>
<p>と表示されていれば成功です。
</p>
<p>
さらにEclipseで開発するには、sampleディレクトリ上で</p>
<pre style="background-color:black; color:white">
C:testsample>mvn eclipse:eclipse -DdownloadSources=true
</pre>
<p>を実行してEclipse用の設定ファイルが生成して、Eclipseで既存プロジェクトのインポートをすればOKです。
</p>
<h3>リンク集</h3>
<p><a href="http://wicket.apache.org/">Apache Wicket</a><br />
Apache Wicketの本家サイト</p>
<p><a href="http://www.wicket-ja.org/">Wicket-ja</a><br />
日本Wicketユーザーグループ(wicket-ja)の公式サイト。<br />
過去のメーリングリストの内容などが参照できます。<br />
ちなみに「うぃけっと　じぇーえー」ではなく「うぃけっとじゃ」と読むらしいです。</p>
<p><a href="http://d.hatena.ne.jp/t_yano/">矢野勉のはてな日記</a><br />
Wicket-ja創設者のブログ。<br />
著書の「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798022217/enieni-22/ref=nosim/" name="amazletlink" target="_blank">オープンソース徹底活用 WicketによるWebアプリケーション開発</a>」には大変お世話になっております。</p>
<p><a href="http://wicket-study.seesaa.net/">Wicket学習帳</a><br />
最終更新が2008年08月19日で止まっていて、Ｗｉｃｋｅｔ1.3ベースまでの話が多いですが、参考になります。</p>
<h3>最後に</h3>
<p>さて、「とりあえずWicketを始めよう」という目的は達成できたでしょうか。<br />
次回以降のWicket小話では、具体的なコンポーネントの使い方とかを載せていければ、と思っております。</p>
<p>それでは、また。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html">Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html" />
	</item>
		<item>
		<title>コマンドを便利に切り替える update-alternatives 使いこなし講座</title>
		<link>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html#comments</comments>
		<pubDate>Tue, 04 Aug 2009 04:00:39 +0000</pubDate>
		<dc:creator>白石 将</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[alternatives]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[update-alternatives]]></category>
		<category><![CDATA[コマンド]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=968</guid>
		<description><![CDATA[こんにちは、プロダクト&#38;サービス事業部の白石です。
唐突ですが、日本はよく豊かな国だと言われることがあります。
それは、ただ単に日本人の所得が高いというわけではなく選択の幅があるからです。
いざ美味しいものを食べたいなと思った時、
日本の料理はもちろんのこと、中華料理、韓国料理、イタリア料理などすぐに見つかります。
さらにちょっと手間を掛けて、大きな街中に足を運んだりするともっと多彩な国のグルメを楽しむことが出来ます。
また、こだわりのあるバーなんかに行くと世界中のお酒が並んでたりしますよね。
こういった選択の幅がある国って他にはなかなか無いそうですよ。
このように何かしようと思った時に、
色々あるものの中から好きなものを選べるのことはとても恵まれていることだと思いませんか?
そんな選択肢を文字通りLinuxに与えてくれるのが update-alternatives というコマンドです。
今回はCentOSでの検証を基に話をしますが、
CentOSの他に、Debian、RedHat系(RHEL、Fedora)にも
この update-alternatives という
シンボリックリンクを管理してデフォルトのコマンドを決定(man参照)するコマンド
があります。
簡単に言うと、複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンドです。
CentOSにSUNの Java を入れたことがある方は、一度は使ったことがあるのではないかと思います。
今回はこの update-alternatives コマンドについて解説したいと思います。

目次

update-alternatives とは
update-alternatives の使い方

グループのプログラムを切り替える
グループにプログラムを追加する
グループの状態を表示する
グループからプログラムを削除する
RedHat系ディストリビューションでは使えないオプション

スレーブとは
update-alternatives の簡単なファイル構成

alternatives ディレクトリ ( /etc/alternatives )
管理ディレクトリ ( /var/lib/alternatives )

共通オプション
まとめ
参考ドキュメント
おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする

使用したソフトウェアのバージョン
今回、使用したソフトウェアのバージョンは下記のようになります。



バージョン


CentOS
5.3 x86_64(インストール直後のもの)


update-alternatives
1.3.30.1


update-alternatives とは
長いので使い方のみを知りたい方はこの節は飛ばして、update-alternatives の使い方へどうぞ。
update-alternatives コマンドとは冒頭の通り、
複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド
です。

# which update-alternatives
/usr/sbin/update-alternatives
# ls -l /usr/sbin/update-alternatives
lrwxrwxrwx 1 root root 12  4月 25 02:02 /usr/sbin/update-alternatives -&#62; alternatives

どうやら、update-alternatives は /usr/sbin/alternatives へのシンボリックリンクのようです。
では、/usr/sbin/alternatives を見てみましょう。

# ls -l /usr/sbin/alternatives
-rwxr-xr-x 1 root root 26384  5月 [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、プロダクト&amp;サービス事業部の白石です。</p>
<p>唐突ですが、日本はよく豊かな国だと言われることがあります。<br />
それは、ただ単に日本人の所得が高いというわけではなく選択の幅があるからです。</p>
<p>いざ美味しいものを食べたいなと思った時、<br />
日本の料理はもちろんのこと、中華料理、韓国料理、イタリア料理などすぐに見つかります。<br />
さらにちょっと手間を掛けて、大きな街中に足を運んだりするともっと多彩な国のグルメを楽しむことが出来ます。<br />
また、こだわりのあるバーなんかに行くと世界中のお酒が並んでたりしますよね。<br />
こういった選択の幅がある国って他にはなかなか無いそうですよ。</p>
<p>このように何かしようと思った時に、<br />
色々あるものの中から好きなものを選べるのことはとても恵まれていることだと思いませんか?</p>
<p>そんな選択肢を文字通りLinuxに与えてくれるのが <a href="http://linux.die.net/man/8/update-alternatives"><span class="strong">update-alternatives</span></a> というコマンドです。</p>
<p>今回は<a href="http://www.centos.org/">CentOS</a>での検証を基に話をしますが、<br />
CentOSの他に、<a href="http://www.debian.or.jp/">Debian</a>、RedHat系(<a href="http://www.jp.redhat.com/">RHEL</a>、<a href="http://fedoraproject.org/ja/">Fedora</a>)にも<br />
この update-alternatives という</p>
<p><span class="strong">シンボリックリンクを管理してデフォルトのコマンドを決定(man参照)するコマンド</span></p>
<p>があります。<br />
簡単に言うと、<span class="strong">複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド</span>です。</p>
<p>CentOSに<a href="http://java.sun.com/javase/ja/6/download.html">SUNの Java </a>を入れたことがある方は、一度は使ったことがあるのではないかと思います。</p>
<p>今回はこの update-alternatives コマンドについて解説したいと思います。</p>
<p><span id="more-968"></span></p>
<h3 id="contents">目次</h3>
<ol>
<li><a href="#about_alternatives">update-alternatives とは</a></li>
<li><a href="#usage_alternatives">update-alternatives の使い方</a></li>
<ul>
<li><a href="#alternatives_config">グループのプログラムを切り替える</a></li>
<li><a href="#alternatives_install">グループにプログラムを追加する</a></li>
<li><a href="#alternatives_display">グループの状態を表示する</a></li>
<li><a href="#alternatives_remove">グループからプログラムを削除する</a></li>
<li><a href="#unusable_options">RedHat系ディストリビューションでは使えないオプション</a></li>
</ul>
<li><a href="#about_slave">スレーブとは</a></li>
<li><a href="#file_alternatives">update-alternatives の簡単なファイル構成</a></li>
<ul>
<li><a href="#alternatives_directory">alternatives ディレクトリ ( /etc/alternatives )</a></li>
<li><a href="#administration_directory">管理ディレクトリ ( /var/lib/alternatives )</a></li>
</ul>
<li><a href="#common_options">共通オプション</a></li>
<li><a href="#end">まとめ</a></li>
<li><a href="#documents">参考ドキュメント</a></li>
<li><a href="#bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</a></li>
</ol>
<h3 id="software_version">使用したソフトウェアのバージョン</h3>
<p>今回、使用したソフトウェアのバージョンは下記のようになります。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th><a href="http://www.centos.org/">CentOS</a></th>
<td>5.3 x86_64(インストール直後のもの)</td>
</tr>
<tr>
<th><a href="http://linux.die.net/man/8/update-alternatives">update-alternatives</a></th>
<td>1.3.30.1</td>
</tr>
</table>
<h3 id="about_alternatives">update-alternatives とは</h3>
<p>長いので使い方のみを知りたい方はこの節は飛ばして、<a href="#usage_alternatives">update-alternatives の使い方</a>へどうぞ。</p>
<p>update-alternatives コマンドとは冒頭の通り、</p>
<p><span class="strong">複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド</span></p>
<p>です。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96857"><td class="code" id="p968code57"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which update-alternatives</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>update-alternatives
<span style="color: #666666; font-style: italic;"># ls -l /usr/sbin/update-alternatives</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">12</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:02 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>update-alternatives -<span style="color: #000000; font-weight: bold;">&gt;</span> alternatives</pre></td></tr></table></div>

<p>どうやら、update-alternatives は /usr/sbin/alternatives へのシンボリックリンクのようです。<br />
では、/usr/sbin/alternatives を見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96858"><td class="code" id="p968code58"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /usr/sbin/alternatives</span>
<span style="color: #660033;">-rwxr-xr-x</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">26384</span>  <span style="color: #000000;">5</span>月 <span style="color: #000000;">24</span>  <span style="color: #000000;">2008</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>alternatives</pre></td></tr></table></div>

<p>/usr/sbin/alternatives が本体みたいですね。<br />
ということは、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96859"><td class="code" id="p968code59"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives</span></pre></td></tr></table></div>

<p>とコマンドを実行するよりも、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96860"><td class="code" id="p968code60"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives</span></pre></td></tr></table></div>

<p>と実行した方が入力の手間が省けますが、<br />
CentOSの『man alternatives』では&#8221;UPDATE-ALTERNATIVES&#8221;となっているので、<br />
本エントリでは基本的に update-alternatives として話を進めることにします。</p>
<p>さて、この update-alternatives ですが、<br />
元はDebianの機能だったのが、現在ではRedHat系のディストリビューションにも移植されています。</p>
<p>今回、update-alternatives の機能を説明をするには、<br />
Java が適しているので Java をもとに簡単にどんな機能なのか見ていきたいと思います。</p>
<p>まずは Java の確認</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96861"><td class="code" id="p968code61"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which java</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.6.0&quot;</span>
OpenJDK  Runtime Environment <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.6.0-b09<span style="color: #7a0874; font-weight: bold;">&#41;</span>
OpenJDK <span style="color: #000000;">64</span>-Bit Server VM <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.6.0-b09, mixed mode<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>このことからCentOS 5.3には標準で <a href="http://openjdk.java.net/">OpenJDK</a> が入っていることが分かります。</p>
<p>けれど、実はCentOS 5.3にはデフォルトで Java が2種類入っており、<br />
update-alternatives の機能を利用して管理されています。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96862"><td class="code" id="p968code62"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>本来はステータスを参照する場合には <code>--display</code> オプションを使用するのですが、<br />
見やすさのため <code>--config</code> オプションを指定しました。</p>
<p>上記の結果から、</p>
<ol>
<li>update-alternatives で管理されている Java グループには OpenJDK と GCJ の2種類がある</li>
<li>プログラムは OpenJDK の方が選択されているっぽい</li>
</ol>
<p>ということが何となく分かると思います。</p>
<p>それでは update-alternatives の機能を使って Java グループのプログラムを切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96863"><td class="code" id="p968code63"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します: <span style="color: #000000;">2</span>    <span style="color: #000000; font-weight: bold;">&lt;</span>---- 入力<span style="color: #000000; font-weight: bold;">!!</span></pre></td></tr></table></div>

<p>では、もう一度 Java の確認を行ってみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96864"><td class="code" id="p968code64"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which java</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.4.2&quot;</span>
gij <span style="color: #7a0874; font-weight: bold;">&#40;</span>GNU libgcj<span style="color: #7a0874; font-weight: bold;">&#41;</span> version 4.1.2 20080704 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Red Hat 4.1.2-44<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> 2006 Free Software Foundation, Inc.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software; see the <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">for</span> copying conditions.  There is NO
warranty; not even <span style="color: #000000; font-weight: bold;">for</span> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</pre></td></tr></table></div>

<p><span class="strong">同じ /usr/bin/java を実行している</span>はずなのにさっきと結果が変わりました!!</p>
<p>これは操作上では同じプログラムを実行しているようでも、<br />
実は update-alternatives が裏で頑張ってプログラムを切り替えてくれているからなんです。</p>
<p>このように</p>
<ul>
<li>複数のバージョンの同一のプログラム</li>
<li>同じジャンルに分類される複数のプログラム</li>
</ul>
<p>などを手軽に切り替えて使えるようにするのが update-alternatives の機能となります。</p>
<h3 id="usage_alternatives">update-alternatives の使い方</h3>
<p>update-alternatives の機能が何となく分かったところで使い方を見ていきましょう。</p>
<p>その前に動作モードと用語の説明をしておきます。</p>
<table class="content">
<caption>動作モード</caption>
<tr>
<th></th>
<th>解説</th>
</tr>
<tr>
<th>自動</th>
<td>update-alternatives が優先度で判断して選択肢を変更する状態。</td>
</tr>
<tr>
<th>手動</th>
<td>rootが行った設定を保持している状態</td>
</tr>
</table>
<table class="content">
<caption>用語</caption>
<tr>
<th></th>
<th>説明</th>
<th>記述例</th>
<tr>
<th>グループ名</th>
<td>update-alternatives で管理されるプログラムのグループ名</td>
<td>java</td>
</tr>
<tr>
<th>実行リンク</th>
<td>update-alternatives の機能を使ってプログラムを実行するためのパス</td>
<td>/usr/bin/java</td>
</tr>
<tr>
<th>プログラムパス</th>
<td>update-alternatives で管理するプログラム(ファイル)のパス</td>
<td>/usr/java/jdk1.6.0_14/bin/java</td>
</tr>
<tr>
<th>優先度</th>
<td>&#8220;自動モード&#8221;の場合、優先度が高いものが選択される</td>
<td>16014</td>
</tr>
</table>
<h4 id="alternatives_config">グループのプログラムを切り替える</h4>
<p>update-alternatives のグループで管理されているプログラムを切り替えます。</p>
<pre><code>update-alternatives --config グループ名
update-alternatives --auto グループ名
update-alternatives --set グループ名 プログラムパス</code></pre>
<p><a href="#about_alternatives">update-alternatives とは</a>での Java グループのプログラム切り替えと同様の手順となります。</p>
<p>では、 Java グループの選択プログラムを OpenJDK から GCJ に切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96865"><td class="code" id="p968code65"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します: <span style="color: #000000;">2</span>    <span style="color: #000000; font-weight: bold;">&lt;</span>---- 入力<span style="color: #000000; font-weight: bold;">!!</span></pre></td></tr></table></div>

<p>もしくは、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96866"><td class="code" id="p968code66"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --set java /usr/lib/jvm/jre-1.4.2-gcj/bin/java</span></pre></td></tr></table></div>

<p>とすることでも切り替わります。<br />
こちらは非対話形式なので、<br />
シェルスクリプトの中でグループの選択プログラムを切り替える際に重宝しそうです。</p>
<p>ちなみに上記の2通りの方法で選択プログラムを切り替えた場合、<br />
グループの動作モードは<span class="strong">&#8220;手動&#8221;</span>に変更されます。</p>
<p>逆に次の方法では、<br />
自動モードに変更することで<span class="strong">&#8220;優先度が最も高いプログラムを選択&#8221;</span>します。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96867"><td class="code" id="p968code67"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --auto java</span></pre></td></tr></table></div>

<p>&#8220;自動&#8221;モードに設定されることにより、<br />
選択されるプログラムが自動で update-alternatives によって決められることになり<span class="strong">優先度の最も高いものが選択</span>されます。</p>
<h4 id="alternatives_install">グループにプログラムを追加する</h4>
<p>指定したプログラムを update-alternatives のグループに追加します。</p>
<pre><code>update-alternatives --install 実行リンク グループ名 プログラムパス 優先度</code></pre>
<p><a href="http://java.sun.com/javase/ja/6/download.html">SUNの JDK1.6.0_update14</a>(以下jdk1.6.0_14) が /usr/java にインストール済みである状態とします。　</p>
<p><a href="#bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</a></p>

<div class="wp_codebox"><table width="100%" ><tr id="p96868"><td class="code" id="p968code68"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_14/bin/java 16014</span></pre></td></tr></table></div>

<p>何も表示されなかった場合にはグループにプログラムが追加されているはずです。</p>
<p>では早速、update-alternatives で管理されている Java グループのリストを見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96869"><td class="code" id="p968code69"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">3</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
   <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
 + <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #000000; font-weight: bold;">*</span>  <span style="color: #000000;">3</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>Java グループの中に jdk1.6.0_14 が追加されているのが確認出来ました。</p>
<h4 id="alternatives_display">グループの状態を表示する</h4>
<p>update-alternatives で管理されているプログラムの状態を表示します。</p>
<pre><code>update-alternatives --display グループ名</code></pre>
<p>Java グループの詳細を見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96870"><td class="code" id="p968code70"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --display java</span>
java - ステータスは手動です。
リンクは現在 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java を指しています。
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">16000</span>
 スレーブ keytool: <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>keytool
    ～中略～
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">1420</span>
 スレーブ keytool: <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>keytool
    ～中略～
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">16014</span>
 スレーブ keytool: <span style="color: #7a0874; font-weight: bold;">&#40;</span>null<span style="color: #7a0874; font-weight: bold;">&#41;</span>
    ～中略～
現在の「最適」バージョンは <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java です。</pre></td></tr></table></div>

<p>以上のような詳細な状態の確認をすることができます。</p>
<p><code>--display</code> オプションで確認できる内容は、</p>
<ul>
<li>現在の動作モード</li>
<li>現在グループで選択されているプログラム</li>
<li>グループに登録されているプログラムとその優先度</li>
<li>プログラムに関連付けられているスレーブ(後述)</li>
<li>自動モード時に選択されるプログラム</li>
</ul>
<p>となります。</p>
<p>上記の実行結果から、</p>
<ul>
<li>OpenJDK と GCJ と jdk1.6.0_14 の計3種類の Java が update-alternatives で管理されている</li>
<li>OpenJDK の優先度は&#8221;16000&#8243;</li>
<li>GCJ の優先度は&#8221;1420&#8243;</li>
<li>jdk1.6.0_14 の優先度は&#8221;16014&#8243;</li>
<li>現在の動作モードは&#8221;手動&#8221;</li>
<li>現在、jdk1.6.0_14が選択されている</li>
<li>各スレーブの状態</li>
<li>自動モードにした場合、jdk1.6.0_14 が選択される(最適バージョン)</li>
</ul>
<p>ということが読み取れます。</p>
<h4 id="alternatives_remove">グループからプログラムを削除する</h4>
<p>グループに追加済みのプログラムをグループから削除します。</p>
<pre><code>update-alternatives --remove グループ名 プログラムパス</code></pre>
<p>それでは、jdk1.6.0_14 を削除してみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96871"><td class="code" id="p968code71"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --remove java /usr/java/jdk1.6.0_14/bin/java</span></pre></td></tr></table></div>

<p>きちんと削除されたか確認してみます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96872"><td class="code" id="p968code72"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>  <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
 + <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>きちんとプログラムパスで指定したものが消えていますね。</p>
<p>グループからプログラムを削除する際に、<br />
&#8220;自動&#8221;モードの場合、選択中のプログラムを削除した場合には、update-alternatives が優先度の大きいものに自動で変更します。<br />
&#8220;手動&#8221;モードの場合には、プログラム情報を削除するだけで選択情報は変更されないみたいです。<br />
また削除後に選択すべきプログラムが無い場合にはグループが削除されます。</p>
<p>ちなみに、プログラムパスを間違えると次のように怒られちゃいます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96873"><td class="code" id="p968code73"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --remove java /usr/java/jdk1.6.0_14/</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span> は java の為の互換用として設定されていません。</pre></td></tr></table></div>

<h4 id="unusable_options">RedHat系ディストリビューションでは使えないオプション</h4>
<p>Debianにはあっても、<br />
残念ながらRedHat系ディストリビューションでは使えないオプションがあるようです。</p>
<table class="content">
<caption>RedHat系ディストリビューションでは使えないオプション</caption>
<tr>
<th><code>--list</code></th>
<td>グループ内の管理プログラムを一覧表示する</td>
</tr>
<tr>
<th><code>--remove-all</code></th>
<td>グループごと削除する</td>
</tr>
<tr>
<th><code>--all</code></th>
<td>すべてのグループにたいして <code>--config</code> オプションを呼び出す</td>
</tr>
</table>
<p>使い道の思い浮かばない <code>--all</code> オプションはともかく、<br />
個人的に <code>--list</code> オプションは欲しかったように思います。<br />
<code>--display</code> オプションがありますが、<br />
グループ内のプログラムを参照するだけであれば <code>--config</code> オプションで見た方が視認性が高いかと思います。</p>
<h3 id="about_slave">スレーブとは</h3>
<p>簡単に言ってしまうと、</p>
<p><span class="strong">グループの選択プログラムが変更されると、スレーブとして登録されたプログラムも同時に変更する</span></p>
<p>機能です。</p>
<pre><code>update-alternatives --install 実行リンク グループ名 プログラムパス --slave 実行リンク グループ名 プログラムパス</code></pre>
<p>では今までの流れから、<br />
既に jdk1.6.0_14 が入ってる状態に、<br />
更に <a href="http://java.sun.com/j2se/1.5.0/ja/download.html">JDK1.5.0_update19</a>(以下jdk1.5.0_19) を入れてスレーブ機能を使ってみましょう。</p>
<p>jdk1.5.0_19 をインストールする際に、<br />
既に jdk1.6.0_14 をRPMパッケージでインストールしている場合、<br />
古いバージョンをRPMパッケージでインストール出来ないので、<br />
RPMパッケージを使わずに jdk-1_5_0_19-linux-amd64.bin を展開し /usr/java に配置します。</p>
<p>配置出来たら、jdk1.5.0_19 も update-alternatives で管理させます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96874"><td class="code" id="p968code74"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019</span></pre></td></tr></table></div>

<p>では、早速 jdk1.5.0_19 に切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96875"><td class="code" id="p968code75"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --config java</span>
&nbsp;
<span style="color: #000000;">4</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
   <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">3</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">4</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:<span style="color: #000000;">4</span></pre></td></tr></table></div>

<p>早速 Java のバージョンを確認。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96876"><td class="code" id="p968code76"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.5.0_19&quot;</span>
Java<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2</span> Runtime Environment, Standard Edition <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.5.0_19-b02<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Java HotSpot<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">64</span>-Bit Server VM <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.5.0_19-b02, mixed mode<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>うまく切り替わっているのが確認出来ますね。</p>
<p>しかし、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96877"><td class="code" id="p968code77"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># javac -version</span>
javac 1.6.0_14</pre></td></tr></table></div>

<p>Java はうまく切り替わっていても、<br />
javac は jdk1.6.0_14 のものを使ってしまっています。</p>
<p>javac をはじめ、jar や javadoc など Java の変更に伴って同時に変更したいプログラムがいくつかあります。<br />
一つ一つを丁寧に update-alternatives に登録 &#8211;> 変更と繰り返すことで解決はしますが、<br />
Java を切り替える度にいくつものその他プログラムを切り替えるのは少々骨が折れる作業となります。</p>
<p>そんな時に活用したいのがスレーブ機能です。</p>
<p>スレーブ機能とは最初に紹介した通り、</p>
<p><span class="strong">グループの選択プログラムが変更されると、スレーブとして登録されたプログラムを同時に変更する</span></p>
<p>です。</p>
<p>なんだか今回の事例にピッタリな機能ですよね。</p>
<p>では、早速スレーブ機能を使ってみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96878"><td class="code" id="p968code78"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019\</span>
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac javac <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac</pre></td></tr></table></div>

<p><code>--install</code> オプションでの追加時に <code>--slave</code> オプションを設定するだけです。<br />
(既にグループにプログラムが登録済みでも上書き出来ます。)</p>
<p>これでスレーブを保持する jdk1.5.0_19 の追加が出来ました。</p>
<p>では、早速 update-alternatives で jdk1.5.0_19 に切り替えて、<br />
javac がどうなっているか確認してみましょう。<br />
(既に jdk1.5.0_19 の場合は、他に変更後、再度 jdk1.5.0_19 に変更してください)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96879"><td class="code" id="p968code79"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># javac -version</span>
javac 1.5.0_19</pre></td></tr></table></div>

<p>javac も Java と一緒に更新されていることが確認できました。</p>
<p>このスレーブは <code>--install</code> オプションの設定時に何個でも登録することが出来ます。<br />
複数個の登録の場合には、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96880"><td class="code" id="p968code80"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019\</span>
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>jar jar <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>jar\
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac javac <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac\
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javadoc javadoc <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javadoc</pre></td></tr></table></div>

<p>のように実行してください。</p>
<p>自分で必要なだけスレーブを追加出来るので、<br />
記述は冗長になってしまいますが毎回1つ1つを変更していくよりもはるかに効率的ですね。</p>
<p>ちなみに、<br />
上記の javac の設定だけだと jdk1.6.0_14 に戻した際に、<br />
javac は変更されないので、<br />
jdk1.6.0_14 にも同様に javac などスレーブを設定する必要があります。</p>
<h3 id="file_alternatives">update-alternatives の簡単なファイル構成</h3>
<p>ここでは簡単な update-alternatives のファイル構成を解説したいと思います。</p>
<h4 id="alternatives_directory">alternatives ディレクトリ ( /etc/alternatives )</h4>
<p>update-alternatives の Java グループでどのJavaが選択されていても、<br />
一様に /usr/bin/java を操作すれば問題無く任意の Java を実行することが出来ました。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96881"><td class="code" id="p968code81"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /usr/bin/java</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">22</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:04 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>alternatives<span style="color: #000000; font-weight: bold;">/</span>java</pre></td></tr></table></div>

<p>この /usr/bin/java が /etc/alternatives/java のシンボリックリンクであることが分かります。</p>
<p>では /etc/alternatives/java も見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96882"><td class="code" id="p968code82"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /etc/alternatives/java</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">30</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>alternatives<span style="color: #000000; font-weight: bold;">/</span>java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java</pre></td></tr></table></div>

<p>この /etc/alternatives/java が、<br />
グループで選択されたプログラムの実体のシンボリックリンクになっていることが分かります。</p>
<p>つまり、update-alternatives は、<br />
選択したプログラムのシンボリックリンクを作り替えてプログラムを切り替えているみたいですね。</p>
<p>プログラムを実行すると、</p>
<p><span class="strong">実行リンク &#8212;-> /etc/alternatives/グループ名 &#8212;-> プログラムパス</span></p>
<p>のようにプログラム本体を参照しているということになります。</p>
<p>ちなみに /etc/alternatives 以下を参照してみると、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96883"><td class="code" id="p968code83"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /etc/alternatives/</span>
合計 <span style="color: #000000;">80</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">19</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:06 antlr -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>antlr-java
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">30</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">31</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> javac -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac
    ～後略～</pre></td></tr></table></div>

<p>スレーブで設定した javac もこちらで切り替えるためにシンボリックリンクになっているのが分かります。</p>
<p>この alternatives ディレクトリは、<br />
<code>--altdir</code> オプションにより /etc/alternatives から別のディレクトリに変更することが出来ます。</p>
<h4 id="administration_directory">管理ディレクトリ ( /var/lib/alternatives )</h4>
<p>プログラムを切り替える仕組みは alternatives ディレクトリで確認出来ますが、<br />
グループのモードやスレーブの関係などの情報は管理ディレクトリを見ることで確認することが出来ます。</p>
<p>例えば、Java グループの各情報は /var/lib/alternatives/java にテキストで格納されています。</p>
<p>この管理ファイルの細かいフォーマット形式はよく分かりませんが、<br />
中身はテキストでそのままのことが書いてあるので何となくの情報は読み取れます。</p>
<p>この管理ディレクトリをよく見ると、<br />
スレーブで設定されたグループ(本エントリでは javac)の情報ファイルは作成されていないようですね。</p>
<p>ちなみにこの 管理ディレクトリは、<br />
<code>--admindir</code> オプションにより /var/lib/alternatives から別のディレクトリに変更することが出来ます。</p>
<h3 id="common_options">共通オプション</h3>
<p>管理プログラムの操作(アクション)について一通り説明しましたが、<br />
ここでは全アクションに対応する共通オプションについて解説します。</p>
<table class="content">
<tr>
<th><code>--verbose</code></th>
<td>詳細な情報を表示します。</td>
</tr>
<tr>
<th><code>--quiet</code></th>
<td>エラー以外の情報を表示しません。<span class="red">未実装</span></td>
</tr>
<tr>
<th><code>--test</code></th>
<td>指定した操作をテストします。実際には何も更新されません。<span class="red">未実装</span></td>
</tr>
<tr>
<th><code>--help</code></th>
<td>update-alternatives に関する簡単な使用方法を表示します。</td>
</tr>
<tr>
<th><code>--altdir</code> directory</th>
<td>alternativesディレクトリ(デフォルト : /etc/alternatives(alternatives)を指定したディレクトリに変更します。</td>
</tr>
<tr>
<th><code>--admindir</code> directory</th>
<td>管理ディレクトリ(デフォルト : /var/lib/alternatives)を指定したディレクトリに変更します。</td>
</tr>
</table>
<h3 id="end">まとめ</h3>
<p>さて、ひたすら update-alternatives について説明してみましたがいかがだったでしょうか?</p>
<p>意外と簡単だけど案外知らない人も多い update-alternatives コマンド。<br />
上手に使いこなせれば良い武器になると思います。</p>
<p>ここで、僕のもっぱらの使い方を紹介しましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96884"><td class="code" id="p968code84"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config 彼女</span>
&nbsp;
致命的なエラー : 何も登録されていません<span style="color: #000000; font-weight: bold;">!!!</span></pre></td></tr></table></div>

<p><span class="strong">･･･････････orz</span></p>
<h3 id="documents">参考文献</h3>
<ul>
<li><a href="http://linux.die.net/man/8/update-alternatives">update-alternatives(8) &#8211; Linux man page</a></li>
<li><a href="http://www.pinkdragon.net/DocumentsLibrary/contents/ja/Linux_man/update-alternatives.8.html">Linux man &#8211; update-alternatives</a>(Debianのmanですが日本語に翻訳されています)</li>
</ul>
<h3 id="bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</h3>
<p>簡単に僕がSUNのJDKをインストールする手順を紹介します。</p>
<p>jdk1.6.0_14 のファイルのURIを<a href="http://java.sun.com/javase/ja/6/download.html">SUNのサイト</a>から拾ってきます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96885"><td class="code" id="p968code85"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># cd /usr/local/src</span>
<span style="color: #666666; font-style: italic;"># wget http://cds.sun.com/ ～中略～ /FileName=/jdk-6u14-linux-x64-rpm.bin</span>
名前が長いのでリネーム
<span style="color: #666666; font-style: italic;"># mv jdk-6u14-linux-x64-rpm.bin\ ～中略～ \jdk-6u14-linux-x64-rpm.bin jdk-6u14-linux-x64-rpm.bin</span>
<span style="color: #666666; font-style: italic;"># chmod u+x jdk-6u14-linux-x64-rpm.bin</span>
<span style="color: #666666; font-style: italic;"># ./jdk-6u14-linux-x64-rpm.bin</span></pre></td></tr></table></div>

<p>これで /usr/java に jdk1.6.0_14 がインストールされます。</p>
<p>環境変数を設定する場合は ~/.bash_profile に</p>

<div class="wp_codebox"><table width="100%" ><tr id="p96886"><td class="code" id="p968code86"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">JAVA_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>default
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CLASSPATH</span>=.:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>jre<span style="color: #000000; font-weight: bold;">/</span>lib:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>lib:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>tools.jar</pre></td></tr></table></div>

<p>とでも記述しておくと良い感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/update-alternatives.html" />
	</item>
		<item>
		<title>SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法</title>
		<link>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html#comments</comments>
		<pubDate>Thu, 23 Jul 2009 01:33:58 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Profile]]></category>
		<category><![CDATA[自動テスト]]></category>
		<category><![CDATA[自己署名証明書]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=901</guid>
		<description><![CDATA[こんにちは。プロダクト&#38;サービス事業部の笹山です。
前回のブログ(Seleniumの自動テストを止めることなく、Flexを手動操作する方法)で「FlashSeleniumについて調査をして、このブログに公開できたら・・・」などと書きましたが、全く調査できておりません。お詫び申し上げます。
前回のブログ執筆時後、SeleniumRCのバージョンも1.0.1に上がっていますし、FlashSeleniumもSeleniumRC1.0互換のものが出ているようです。
ですから、現時点では「あっさり動いてしまう？」のかもしれません。
今回もSeleniumRCネタではありますが「SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、Firefoxからのセキュリティ警告を表示させない方法」について書きたいと思います。

自己署名証明書使用のWEBアプリケーションをテストする際の問題
SSL対応のWEBアプリケーションのテストを行う際に、自己署名証明書を作成してテストすることは多いと思います。
SeleniumRCで自己署名証明書使用のWEBアプリケーションのテストを行うことはもちろん可能です。
しかし、面倒くさい操作が発生してしまうのです。
サーバに接続する際に、「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます。
例外として追加しても毎回警告が表示され、そのたびに例外に追加する操作を行わなければいけません。
これでは、SeleniumRCを用いての自動テストの意味がありません。
問題の解決方法
これを解決する方法が分かりました。ただしFirefoxでのみです。
FirefoxでSeleniumServer用のProfileを作成し、SeleniumServer起動時にそのProfileを指定させれば良いのです。
それでは、まず最初にFirefoxでSeleniumServer用のProfileを作成する手順について説明します。
SeleniumServer用のProfile作成手順

アクセサリ-ファイル名を指定して実行でFirefoxのProfileManagerを起動します
firefox.exe -ProfileManager

「新しいプロファイルを作成」でSelenium用のプロファイルを作成します

プロファイル作成ウィザードで順番に作成していきます
※安全のため保存先は、Selenium用のフォルダを作成し、そのフォルダを指定することをお勧めします

Selenium用のプロファイル作成後、作成したプロファイルを指定して自己署名証明書使用のサイトにアクセスします
「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます

自己署名証明書使用のサイトを例外として追加し、セキュリティ例外を承認します


後にも先にも、Firefoxで自己署名証明書使用のサイトを例外として追加する操作はこの1回だけです。
次に、SeleniumServerへProfileを指定する方法を説明します。
JUnitテストソースでSeleniumServer起動時にProfileを指定させるコード
使用するProfileを指定して、SeleniumServerを起動するコードです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 自己署名証明書使用のURL
testUrl = &#34;https://localhost:8443&#34;;
&#160;
// テストを行うブラウザ
testBrowser = &#34;*firefox&#34;;
&#160;
// SeleniumServerのインスタンス化
seleniumServer = new SeleniumServer&#40;&#41;;
&#160;
// Selenium用プロファイルの指定 --------- ここから -------------
RemoteControlConfiguration config = seleniumServer.getConfiguration&#40;&#41;;
config.setFirefoxProfileTemplate&#40;new File&#40;&#34;D:\\firefox_selenium&#34;&#41;&#41;;
// Selenium用プロファイルの指定 --------- ここまで -------------
&#160;
// SeleniumServerの起動
seleniumServer.start&#40;&#41;;
&#160;
// seleniumClientを起動
selenium = new DefaultSelenium&#40;&#34;localhost&#34;, 4444, testBrowser, testUrl&#41;;
selenium.start&#40;&#41;;

selenium-server.jarファイル実行時にProfileを指定させる方法
上記のJUnitのテストケースではなく、別途SeleniumServerを起動してテストを行う場合は、以下のコマンドを実行してください。
java -jar selenium-server.jar -firefoxProfileTemplate d:\\selenium-firefox
最後に
これで通常通りSeleniumRCで自動テストを実行すると、わずらわしい警告は出なくなるはずです。
Firefoxのみの対処方法でしたが、IEやその他ブラウザでの解決方法はまだ分かっていません。
調査を続行していこうと思っています。（FlashSeleniumの調査も忘れずに！）
あわせて読みたい
Seleniumの自動テストを止めることなく、Flexを手動操作する方法
]]></description>
			<content:encoded><![CDATA[<p>こんにちは。プロダクト&amp;サービス事業部の笹山です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">前回のブログ</a>(<a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">Seleniumの自動テストを止めることなく、Flexを手動操作する方法</a>)で「FlashSeleniumについて調査をして、このブログに公開できたら・・・」などと書きましたが、全く調査できておりません。お詫び申し上げます。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">前回のブログ</a>執筆時後、<a title="Selenium" href="http://seleniumhq.org/" target="_blank">SeleniumRC</a>のバージョンも1.0.1に上がっていますし、<a title="FlashSelenium" href="http://code.google.com/p/flash-selenium/downloads/list" target="_blank">FlashSelenium</a>もSeleniumRC1.0互換のものが出ているようです。<br />
ですから、現時点では「あっさり動いてしまう？」のかもしれません。</p>
<p>今回もSeleniumRCネタではありますが「SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、Firefoxからのセキュリティ警告を表示させない方法」について書きたいと思います。<br />
<span id="more-901"></span></p>
<h3>自己署名証明書使用のWEBアプリケーションをテストする際の問題</h3>
<p>SSL対応のWEBアプリケーションのテストを行う際に、自己署名証明書を作成してテストすることは多いと思います。</p>
<p>SeleniumRCで自己署名証明書使用のWEBアプリケーションのテストを行うことはもちろん可能です。<br />
しかし、面倒くさい操作が発生してしまうのです。</p>
<p>サーバに接続する際に、「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます。<br />
<div id="attachment_895" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl-300x183.png" alt="警告 - 信頼できない接続" title="警告 - 信頼できない接続" width="300" height="183" class="size-medium wp-image-895" /></a><p class="wp-caption-text">警告 - 信頼できない接続</p></div></p>
<p>例外として追加しても毎回警告が表示され、そのたびに例外に追加する操作を行わなければいけません。<br />
これでは、SeleniumRCを用いての自動テストの意味がありません。</p>
<h3 class="caption">問題の解決方法</h3>
<p>これを解決する方法が分かりました。ただしFirefoxでのみです。<br />
FirefoxでSeleniumServer用のProfileを作成し、SeleniumServer起動時にそのProfileを指定させれば良いのです。</p>
<p>それでは、まず最初にFirefoxでSeleniumServer用のProfileを作成する手順について説明します。</p>
<h3>SeleniumServer用のProfile作成手順</h3>
<ol>
<li>アクセサリ-ファイル名を指定して実行でFirefoxのProfileManagerを起動します<br />
<div id="attachment_896" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/exec_firefox_profilemanger.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/exec_firefox_profilemanger-300x178.png" alt="ファイル名を指定して実行 - ProfileManager" title="ファイル名を指定して実行 - ProfileManager" width="300" height="178" class="size-medium wp-image-896" /></a><p class="wp-caption-text">ファイル名を指定して実行 - ProfileManager</p></div></p>
<pre>firefox.exe -ProfileManager</pre>
</li>
<li>「新しいプロファイルを作成」でSelenium用のプロファイルを作成します<br />
<div id="attachment_897" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_add_profile.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_add_profile-300x173.png" alt="新しいプロファイルを作成" title="新しいプロファイルを作成" width="300" height="173" class="size-medium wp-image-897" /></a><p class="wp-caption-text">新しいプロファイルを作成</p></div>
</li>
<li>プロファイル作成ウィザードで順番に作成していきます<br />
<span style="color: #ff0000;">※安全のため保存先は、Selenium用のフォルダを作成し、そのフォルダを指定することをお勧めします</span><br />
<div id="attachment_898" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_wizard.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_wizard-300x226.png" alt="プロファイル作成ウィザード" title="プロファイル作成ウィザード" width="300" height="226" class="size-medium wp-image-898" /></a><p class="wp-caption-text">プロファイル作成ウィザード</p></div>
</li>
<li>Selenium用のプロファイル作成後、作成したプロファイルを指定して自己署名証明書使用のサイトにアクセスします<br />
「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます<br />
<div id="attachment_895" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl-300x183.png" alt="警告 - 信頼できない接続" title="警告 - 信頼できない接続" width="300" height="183" class="size-medium wp-image-895" /></a><p class="wp-caption-text">警告 - 信頼できない接続</p></div>
</li>
<li>自己署名証明書使用のサイトを例外として追加し、セキュリティ例外を承認します<br />
<div id="attachment_900" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_exception_site.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_exception_site-300x253.png" alt="例外として追加" title="例外として追加" width="300" height="253" class="size-medium wp-image-900" /></a><p class="wp-caption-text">例外として追加</p></div></p>
<p><div id="attachment_899" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_add_exception_site.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_add_exception_site-300x300.png" alt="セキュリティ例外を承認" title="セキュリティ例外を承認" width="300" height="300" class="size-medium wp-image-899" /></a><p class="wp-caption-text">セキュリティ例外を承認</p></div>
</li>
</ol>
<p>後にも先にも、Firefoxで自己署名証明書使用のサイトを例外として追加する操作はこの1回だけです。</p>
<p>次に、SeleniumServerへProfileを指定する方法を説明します。</p>
<h3>JUnitテストソースでSeleniumServer起動時にProfileを指定させるコード</h3>
<p>使用するProfileを指定して、SeleniumServerを起動するコードです。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p90188"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p901code88"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 自己署名証明書使用のURL</span>
testUrl <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;https://localhost:8443&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// テストを行うブラウザ</span>
testBrowser <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;*firefox&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// SeleniumServerのインスタンス化</span>
seleniumServer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SeleniumServer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Selenium用プロファイルの指定 --------- ここから -------------</span>
RemoteControlConfiguration config <span style="color: #339933;">=</span> seleniumServer.<span style="color: #006633;">getConfiguration</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
config.<span style="color: #006633;">setFirefoxProfileTemplate</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">File</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;D:<span style="color: #000099; font-weight: bold;">\\</span>firefox_selenium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Selenium用プロファイルの指定 --------- ここまで -------------</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// SeleniumServerの起動</span>
seleniumServer.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// seleniumClientを起動</span>
selenium <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DefaultSelenium<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, 4444, testBrowser, testUrl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
selenium.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>selenium-server.jarファイル実行時にProfileを指定させる方法</h3>
<p>上記のJUnitのテストケースではなく、別途SeleniumServerを起動してテストを行う場合は、以下のコマンドを実行してください。</p>
<pre>java -jar selenium-server.jar -firefoxProfileTemplate d:\\selenium-firefox</pre>
<h3>最後に</h3>
<p>これで通常通りSeleniumRCで自動テストを実行すると、わずらわしい警告は出なくなるはずです。</p>
<p>Firefoxのみの対処方法でしたが、IEやその他ブラウザでの解決方法はまだ分かっていません。<br />
調査を続行していこうと思っています。（FlashSeleniumの調査も忘れずに！）</p>
<h3>あわせて読みたい</h3>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">Seleniumの自動テストを止めることなく、Flexを手動操作する方法</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html" />
	</item>
		<item>
		<title>Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法)</title>
		<link>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 06:38:05 +0000</pubDate>
		<dc:creator>kubo@eni.co.jp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[全文検索]]></category>
		<category><![CDATA[CoreAdmin]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[SolrJ]]></category>
		<category><![CDATA[マルチコア]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=863</guid>
		<description><![CDATA[こんにちは。
株式会社イージーネット プロダクト&#038;サービス事業部 の久保です。
前回書いたSolrの記事 全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集 はおかげさまで沢山のアクセス/ブックマークをいただきました。
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: 関口宏司のLuceneブログ)などが参加されるSolr勉強会も開催されるようですので、Solr人気は高まっているのかもしれません。
今回は前回から変わって小さなネタになりますが、
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。

Solr1.3のマルチコア機能とは
単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。
詳しくは前回の記事の「マルチコア構成」をご覧ください。
Coreを追加するためのURL(Query String)
Coreを追加するのに必要なURL(Query String)は次のようになります。
(参考URL: Solr Wiki &#8211; CoreAdmin)

http://server/solr/admin/cores?action=CREATE&#38;name=[name]&#38;instanceDir=[dir]&#38;config=[solrconfig]&#38;schema=[schema]

(例)

http://testserver:8080/solr/admin/cores?action=CREATE&#38;name=test&#38;instanceDir=test&#38;config=/solr/conf/solrconfig.xml&#38;schema=/solr/conf/schema.xml



[name]
coreに付ける名前(例: test)


[dir]
coreのディレクトリ名(例: test)


[solrconfig]
solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)


[schema]
schema.xmlファイル(例: /solr/conf/schema.xml)


SolrJを使った場合の問題
SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package jp.co.eni.solr.test;
&#160;
import java.io.IOException;
import java.net.MalformedURLException;
&#160;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
&#160;
//失敗する
public class FailedCoreCreateTest &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		try &#123;
			// SolrのURL
			String url = &#34;http://server/solr/&#34;;
			// coreの名前
			String coreName = &#34;failed&#34;;
			// coreのディレクトリ名
			String instanceDir = &#34;failed&#34;;
&#160;
			SolrServer server = new CommonsHttpSolrServer&#40;url&#41;;
			CoreAdminResponse response = CoreAdminRequest.createCore&#40;coreName, instanceDir, [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
<a href="http://www.eni.co.jp/">株式会社イージーネット</a> プロダクト&#038;サービス事業部 の久保です。</p>
<p>前回書いたSolrの記事 <a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html">全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集</a> はおかげさまで沢山のアクセス/ブックマークをいただきました。<br />
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: <a href="http://lucene.jugem.jp/">関口宏司のLuceneブログ</a>)などが参加される<a href="http://atnd.org/events/937">Solr勉強会</a>も開催されるようですので、Solr人気は高まっているのかもしれません。</p>
<p>今回は前回から変わって小さなネタになりますが、<br />
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。</p>
<p><span id="more-863"></span></p>
<h3>Solr1.3のマルチコア機能とは</h3>
<p>単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。<br />
詳しくは<a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html#multicore">前回の記事の「マルチコア構成」</a>をご覧ください。</p>
<h3>Coreを追加するためのURL(Query String)</h3>
<p>Coreを追加するのに必要なURL(Query String)は次のようになります。<br />
(参考URL: <a href="http://wiki.apache.org/solr/CoreAdmin">Solr Wiki &#8211; CoreAdmin</a>)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86397"><td class="code" id="p863code97"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;name=[name]&amp;instanceDir=[dir]&amp;config=[solrconfig]&amp;schema=[schema]</span></pre></td></tr></table></div>

<p>(例)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86398"><td class="code" id="p863code98"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//testserver:8080/solr/admin/cores?action=CREATE&amp;name=test&amp;instanceDir=test&amp;config=/solr/conf/solrconfig.xml&amp;schema=/solr/conf/schema.xml</span></pre></td></tr></table></div>

<table class="content">
<tr>
<th>[name]</th>
<td>coreに付ける名前(例: test)</td>
</tr>
<tr>
<th>[dir]</th>
<td>coreのディレクトリ名(例: test)</td>
</tr>
<tr>
<th>[solrconfig]</th>
<td>solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)</td>
</tr>
<tr>
<th>[schema]</th>
<td>schema.xmlファイル(例: /solr/conf/schema.xml)</td>
</tr>
</table>
<h3>SolrJを使った場合の問題</h3>
<p>SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86399"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p863code99"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.MalformedURLException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServerException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.impl.CommonsHttpSolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.request.CoreAdminRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.response.CoreAdminResponse</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//失敗する</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FailedCoreCreateTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// SolrのURL</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://server/solr/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreの名前</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
&nbsp;
			SolrServer server <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommonsHttpSolrServer<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			CoreAdminResponse response <span style="color: #339933;">=</span> CoreAdminRequest.<span style="color: #006633;">createCore</span><span style="color: #009900;">&#40;</span>coreName, instanceDir, server<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;qtime: &quot;</span> <span style="color: #339933;">+</span> response.<span style="color: #006633;">getQTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amalformedurlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">MalformedURLException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SolrServerException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>失敗の原因は、上記コードにより生成されるHTTP RequestのQuery Stringにあります。<br />
エラーのログを見ると、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863100"><td class="code" id="p863code100"><pre class="java" style="font-family:monospace;"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a> in thread <span style="color: #0000ff;">&quot;main&quot;</span> org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">common</span>.<span style="color: #006633;">SolrException</span><span style="color: #339933;">:</span> Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
request<span style="color: #339933;">:</span> http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;core=failed&amp;instanceDir=failed&amp;wt=javabin&amp;version=2.2</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">impl</span>.<span style="color: #006633;">CommonsHttpSolrServer</span>.<span style="color: #006633;">request</span><span style="color: #009900;">&#40;</span>CommonsHttpSolrServer.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">343</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">impl</span>.<span style="color: #006633;">CommonsHttpSolrServer</span>.<span style="color: #006633;">request</span><span style="color: #009900;">&#40;</span>CommonsHttpSolrServer.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">183</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">request</span>.<span style="color: #006633;">CoreAdminRequest</span>.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>CoreAdminRequest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">170</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">request</span>.<span style="color: #006633;">CoreAdminRequest</span>.<span style="color: #006633;">createCore</span><span style="color: #009900;">&#40;</span>CoreAdminRequest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">226</span><span style="color: #009900;">&#41;</span>
	at jp.<span style="color: #006633;">co</span>.<span style="color: #006633;">eni</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">test</span>.<span style="color: #006633;">FailedCoreCreateTest</span>.<span style="color: #006633;">main</span><span style="color: #009900;">&#40;</span>FailedCoreCreateTest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">23</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>とあるように、
<pre>name=failed</pre>
<p>ではなく
<pre>core=failed</pre>
<p>となっていることが分かります。<br />
これは、SolrJ1.3のorg.apache.solr.client.solrj.request.CoreAdminRequest.Create#getParames(rev:688188)が以下のような実装になっているためです。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863101"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p863code101"><pre class="java" style="font-family:monospace;">    @Override
    <span style="color: #000000; font-weight: bold;">public</span> SolrParams getParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> action <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aruntimeexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">RuntimeException</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;no action specified!&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      ModifiableSolrParams params <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ModifiableSolrParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">ACTION</span>, action.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">CORE</span>, core <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #666666; font-style: italic;">//←※ここがおかしい</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">INSTANCE_DIR</span>, instanceDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>configName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">CONFIG</span>, configName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>schemaName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">SCHEMA</span>, schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> params<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>簡単な解決策</h3>
<p>以下のようなCoreAdminRequest.Createの拡張クラスを用意することで、上記の問題を解決することができます。</p>
<h4>用意するクラス</h4>

<div class="wp_codebox"><table width="100%" ><tr id="p863102"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p863code102"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.request.CoreAdminRequest.Create</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.CoreAdminParams</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.ModifiableSolrParams</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.SolrParams</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SolvedCreate <span style="color: #000000; font-weight: bold;">extends</span> Create <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 *
	 * @param coreName
	 * @param instanceDir
	 * @param configName
	 * @param schemaName
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> SolvedCreate<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> configName, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> schemaName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreの名前</span>
		setCoreName<span style="color: #009900;">&#40;</span>coreName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
		setInstanceDir<span style="color: #009900;">&#40;</span>instanceDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// solrconfig.xmlのパス</span>
		setConfigName<span style="color: #009900;">&#40;</span>configName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// schema.xmlのパス</span>
		setSchemaName<span style="color: #009900;">&#40;</span>schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> SolrParams getParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		ModifiableSolrParams params <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ModifiableSolrParams<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getParams</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreではなくnameを使う</span>
		params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>CoreAdminParams.<span style="color: #006633;">CORE</span>, <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>CoreAdminParams.<span style="color: #006633;">NAME</span>, core<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> params<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>getParamsメソッドは、org.apache.solr.client.solrj.impl.CommonsHttpSolrServer#requestの中で呼ばれます。</p>
<p>CoreAdminParams.COREやCoreAdminParams.NAMEを持つorg.apache.solr.common.params.CoreAdminParamsというのは以下のようなインタフェースになっており、<br />
COREではなくNAMEを用いるのが正しそうだということになります。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863103"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p863code103"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> CoreAdminParams 
<span style="color: #009900;">&#123;</span>
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** What Core are we talking about **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> CORE <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;core&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** Persistent -- should it save the cores state? **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> PERSISTENT <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;persistent&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** If you rename something, what is the new name **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> NAME <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// 後略</span></pre></td></tr></table></div>

<h4>SolvedCreate利用コード</h4>
<p>上記のSolvedCreateクラスを利用したコードは次のようになります。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863104"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code" id="p863code104"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.MalformedURLException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServerException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.impl.CommonsHttpSolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.response.CoreAdminResponse</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 成功する</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SuccessCoreCreateTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// SolrのURL</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://server/solr/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreの名前</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;name2&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;dir2&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// solrconfig.xmlのパス</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> configName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/solr/conf/solrconfig.xml&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// schema.xmlのパス</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> schemaName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/solr/conf/schema.xml&quot;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// Createクラスのバグ対応のため、SolvedCreateクラスを作成して使っている</span>
			SolvedCreate createRequest <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SolvedCreate<span style="color: #009900;">&#40;</span>coreName, instanceDir, configName, schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			SolrServer server <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommonsHttpSolrServer<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			CoreAdminResponse response <span style="color: #339933;">=</span> createRequest.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>server<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;qtime: &quot;</span> <span style="color: #339933;">+</span> response.<span style="color: #006633;">getQTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amalformedurlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">MalformedURLException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SolrServerException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>1.4では修正される模様</h3>
<p>この問題は、Apacheプロジェクトのバグトラックにも登録されています。<br />
<a href="http://issues.apache.org/jira/browse/SOLR-803">SOLR-803: CoreAdminRequest.createCore fails because name parameter isn&#8217;t set</a>を見ると、StatusはResolveとなっています。<br />
<a href="http://svn.apache.org/repos/asf/lucene/solr/">Solrのレポジトリ</a>を直接確認してみたところ、上記の問題はrev.708266の修正で解決されているようです。</p>
<blockquote><p>
    SOLR-803: fix CoreAdminRequest.createCore error
</p></blockquote>
<p>コードは確認していませんが、ちゃんとした？修正がされていそうです。</p>
<p>また<a href="http://svn.apache.org/repos/asf/lucene/solr/trunk/CHANGES.txt">pache Solr Version 1.4-dev Release Notes</a>を見ると、SOLR-803も含まれていますので、1.4のリリース時にはこのエントリで取り上げた問題は発生しなくなるはずです。</p>
<h3>参考URL</h3>
<ul>
<li><a href="http://wiki.apache.org/solr/CoreAdmin">Solr Wiki &#8211; CoreAdmin</a></li>
</ul>
<h3>使用したソフトウェア</h3>
<table class="content">
<tr>
<th>ソフトウェア</th>
<th>バージョン</th>
</tr>
<tr>
<th>Solr</th>
<td>1.3</td>
</tr>
<tr>
<th>SolrJ</th>
<td>1.3</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html">全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html" />
	</item>
		<item>
		<title>CentOS5.2でWEBアプリケーション開発環境を作るまでの注意点</title>
		<link>http://blog.eni.co.jp/tech/2009/06/centos_webapplication_using.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/06/centos_webapplication_using.html#comments</comments>
		<pubDate>Mon, 15 Jun 2009 12:00:27 +0000</pubDate>
		<dc:creator>中村 浩也</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=634</guid>
		<description><![CDATA[初めまして。プロダクト＆サービス事業部新人の中村です。
私はイージーネットに入社して半年程でまだまだ新人なのですが、
そのせいもありLinux上でWEBアプリケーションを開発する環境を整えるまでに意外と時間がかかりました。
私の場合OSはCentOS5.2を使用していたのですが、CentOS5.2は特にEclipseを起動し動的WEBプロジェクトを動作させるまでで、注意すべき点が多いような気がします。
そこで今回は同じように悩んでる方がいるのではないのかと思い、
CentOS5.2上でEclipseを用いてWEBアプリケーション開発環境を構築するまでの手順についてお伝えしたいと思います。
使用したimageは&#8221;CentOS-5.2-i386-bin-DVD.iso&#8221;で、デスクトップはGNOMEを採択しています。
なお今回の記事ではOS自体のインストール方法は割愛させて頂きます。

手順
手順一覧
手順は大きく以下の流れになります。

Firefoxパッケージをアップデートする
java1.5以上を導入する
Eclipseをインストールする
tomcatをインストールする
動作を確認する

1. Firefoxパッケージをアップデートする

CentOSではpackage updaterというものがあり、アップデートが可能なパッケージについて知らせてくれます。
あまり知られていない問題かも知れませんが、Firefoxのバージョンが原因でEclipseが正しく起動しない場合があります。
package updaterからFirefoxのアップデートを行うことで正しく起動するようになることを確認していますので、まずはFirefoxのアップデートを行いましょう。
以下、詳細解説を行います。
&#8220;CentOS-5.2-i386-bin-DVD.iso&#8221;のイメージには&#8221;firefox-3.0-0.beta5.6.el5.centos.i386.rpm&#8221;が含まれているのですが、
そのバージョンでEclipseを起動しようとした際以下のようなメッセージが出力されました。
(使用したEclipseは、eclipse-jee-ganymede-SR2-linux-gtk.tar.gzになります。)

  org.eclipse.swt.SWTError: XPCOM error -2147467262
          at org.eclipse.swt.browser.Mozilla.error(Mozilla.java:1638)
          (以下略)

&#8220;XPCOM error&#8221;といったキーワードで検索してみると、3.0b5以外のFirefoxのバージョンによっても同じエラーが起きている人がいることがわかります。
（Eclipse bugレポート記事）
https://bugs.eclipse.org/bugs/show_bug.cgi?id=103620

2. java1.5以上を導入する
Eclipseの動作条件はjavaのバージョンが1.5以上です。
CentOS5.2ではデフォルトでインストールされているjavaの種類とバージョンはそれぞれgij(GNU libgcj) の1.4.2でした。
従って、CentOS5.2を使用する際は、1.5以上のjavaをインストールすることを忘れないようにしなければなりません。
javaのバージョンを確かめる方法は以下になります。

[root@hiroyapc /]# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-44)

Copyright (C) 2006 Free Software Foundation, Inc.
This is [...]]]></description>
			<content:encoded><![CDATA[<p>初めまして。プロダクト＆サービス事業部新人の中村です。</p>
<p>私はイージーネットに入社して半年程でまだまだ新人なのですが、<br />
そのせいもありLinux上でWEBアプリケーションを開発する環境を整えるまでに意外と時間がかかりました。<br />
私の場合OSはCentOS5.2を使用していたのですが、CentOS5.2は特にEclipseを起動し動的WEBプロジェクトを動作させるまでで、注意すべき点が多いような気がします。</p>
<p>そこで今回は同じように悩んでる方がいるのではないのかと思い、<br />
CentOS5.2上でEclipseを用いてWEBアプリケーション開発環境を構築するまでの手順についてお伝えしたいと思います。</p>
<p>使用したimageは&#8221;CentOS-5.2-i386-bin-DVD.iso&#8221;で、デスクトップはGNOMEを採択しています。<br />
なお今回の記事ではOS自体のインストール方法は割愛させて頂きます。</p>
<p><span id="more-634"></span></p>
<h3>手順</h3>
<h4>手順一覧</h4>
<p>手順は大きく以下の流れになります。</p>
<ol>
<li>Firefoxパッケージをアップデートする</li>
<li>java1.5以上を導入する</li>
<li>Eclipseをインストールする</li>
<li>tomcatをインストールする</li>
<li>動作を確認する</li>
</ol>
<h4>1. Firefoxパッケージをアップデートする</h4>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/package.jpg" alt="package" title="package" width="795" height="163" class="alignnone size-full wp-image-716" /></p>
<p>CentOSではpackage updaterというものがあり、アップデートが可能なパッケージについて知らせてくれます。<br />
あまり知られていない問題かも知れませんが、Firefoxのバージョンが原因でEclipseが正しく起動しない場合があります。<br />
package updaterからFirefoxのアップデートを行うことで正しく起動するようになることを確認していますので、まずはFirefoxのアップデートを行いましょう。</p>
<p>以下、詳細解説を行います。<br />
&#8220;CentOS-5.2-i386-bin-DVD.iso&#8221;のイメージには&#8221;firefox-3.0-0.beta5.6.el5.centos.i386.rpm&#8221;が含まれているのですが、<br />
そのバージョンでEclipseを起動しようとした際以下のようなメッセージが出力されました。<br />
(使用したEclipseは、eclipse-jee-ganymede-SR2-linux-gtk.tar.gzになります。)</p>
<pre lang="Bash:nogutter">
  org.eclipse.swt.SWTError: XPCOM error -2147467262
          at org.eclipse.swt.browser.Mozilla.error(Mozilla.java:1638)
          (以下略)
</pre>
<p>&#8220;XPCOM error&#8221;といったキーワードで検索してみると、3.0b5以外のFirefoxのバージョンによっても同じエラーが起きている人がいることがわかります。</p>
<p>（Eclipse bugレポート記事）<br />
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103620">https://bugs.eclipse.org/bugs/show_bug.cgi?id=103620<br />
</a></p>
<h4>2. java1.5以上を導入する</h4>
<p>Eclipseの動作条件はjavaのバージョンが1.5以上です。<br />
CentOS5.2ではデフォルトでインストールされているjavaの種類とバージョンはそれぞれgij(GNU libgcj) の1.4.2でした。<br />
従って、CentOS5.2を使用する際は、1.5以上のjavaをインストールすることを忘れないようにしなければなりません。</p>
<p>javaのバージョンを確かめる方法は以下になります。</p>
<pre lang="Bash:nogutter">
[root@hiroyapc /]# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-44)

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
<p>1.5以上のjavaのインストール方法ですが、yumでインストールする方法と、<a href="http://java.sun.com/javase/ja/6/download.html">sunのダウンロードページ</a>からダウンロードしてくる方法があります。<br />
yumでインストールする場合ですが、2009/06/15現在Openjdkがインストールされることになります。</p>
<pre lang="Bash:nogutter">
[root@hiroyapc /]# yum install java-1.6.0 java-1.6.0-devel
</pre>
<p>OpenJDKは、少し前までは目にすることはなかったのですが、最近多くのディストリビューションで標準で取りいれられているらしく目にすることが多くなってきました。<br />
何でもSunがリリースしている純正のJDK6が派生したものだそうです。<br />
それぞれの違いについて詳しく言及している記事が以下にありますので、参考にして下さい。</p>
<p><a href="http://www.infoq.com/jp/news/2009/01/jdk-openjdk-icedtea" target="_blank">http://www.infoq.com/jp/news/2009/01/jdk-openjdk-icedtea</a></p>
<p>javaをyumでインストールした際も直接ダウンロードした場合も、&#8221;/etc/alternatives/java&#8221;が新しいバージョンのjavaを向いていることを確認します。</p>
<pre lang="Bash:nogutter">
[root@hiroyapc /]# update-alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択　　　　コマンド
------------------------------------------------
 + 1        /usr/lib/jvm/jre-1.4.2-gcj/bin/java
*  2        /usr/lib/jvm/jre-1.6.0-openjdk/bin/java

Enter を押して現在の選択[+]を保持するか、選択番号を入力します:
</pre>
<p>上記のように表示されていた場合、1.4.2が選択されています。<br />
2番を選択し、1.6.0が選択されるようにします。</p>
<p>バージョンを確認するコマンドを叩き、上記のようになっていれば1.6.0を向いていることがわかります。</p>
<pre lang="Bash:nogutter">
[root@hiroyapc /]# java -version
java version "1.6.0"
OpenJDK  Runtime Environment (build 1.6.0-b09)
OpenJDK Client VM (build 1.6.0-b09, mixed mode)
</pre>
<h4>3. Eclipseをインストールする</h4>
<p>次に、Eclipse本体をダウンロードします。<br />
Eclipseは統合開発環境ツールの1つであり、webアプリケーション等の開発を行うにあたって大変便利なツールです。<br />
Eclipseのサイトの<a href="http://www.eclipse.org/downloads/">ダウンロードページ</a>からtar.gzファイルをダウンロードして使用します。</p>
<p>Java向けのEclipseを使用しようとした際、Eclipse IDE for Java EE Developers とEclipse IDE for Java Developersがダウンロード出来ることがわかるかと思いますが、それぞれの違いについては<a href="http://www.eclipse.org/downloads/packages/compare-packages">Compare Packages</a>に分かりやすい表が記載してあります。</p>
<p>表を見ての通りなのですが、Java EE DevelopersはJava Developersに加えてWeb ToolsやJEE Tools等のパッケージが同梱されています。<br />
パッケージ内容については詳しい内容の説明は省略いたしますが、今回はWebアプリケーション開発環境構築を目的としているのでEclipse IDE for Java EE Developers をダウンロードします。</p>
<p>ちなみに私がダウンロードしたファイルはeclipse-jee-ganymede-SR2-linux-gtk.tar.gzです。<br />
ダウンロードしたらファイルを任意の場所(/usr/local/bin等)に展開します。</p>
<h4>4. tomcatをインストールする</h4>
<p>tomcatをインストールする方法について、CentOSでは主に2種類があります。</p>
<p>1つはyumを使用してインストールする方法。</p>
<pre lang="Bash:nogutter">
[root@hiroyapc /]# yum install tomcat5
</pre>
<p>もう1つは<a title="Apache Tomcat" href="http://tomcat.apache.org/" target="_blank">Apache Tomcat</a>のサイトよりtar.gzファイルを直接ダウンロードし、インストールする方法です。<br />
どちらもメリット・デメリットがあるのですが、今回はtar.gzファイルをダウンロードして使用することにします。</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/tomcat.jpg" alt="tomcat" title="tomcat" width="1007" height="639" class="alignnone size-full wp-image-718" /></p>
<p>sourceとbinaryどちらをダウンロードすれば良いのかについて簡単に補足します。プログラムはsourceで書かれ、binaryに変換されて最終的に実行されます。<br />
ここではtomcatを実行することが目的であることから、binaryをダウンロードします。</p>
<p>次にCoreとDeployerについてですが、DeployerはCoreに加えて、<br />
作成したweb アプリケーションの検証、コンパイル、WARファイルへの圧縮、Tomcatサーバに配備をするためのパッケージです。<br />
作成したデータを公開サーバに配備する必要がある場合等はDeployerが必要になりますが、今回はまずは環境を構築するところまでを目的としているのでCoreファイルをダウンロードすることにします。</p>
<p>ダウンロードしたらファイルを任意の場所(/usr/share/等)に展開します。</p>
<h4>5. 動作を確認する</h4>
<p>正しく起動したならば、Eclipseを立ち上げて動作をすることを確認して下さい。<br />
Tomcatが起動するところまでを確認したいので、動的webページを作成し、JSPまたはServletを作成します。<br />
なお、EclipseでのTomcatの設定や詳しい動的webページ作成方法については既に多くのwebページや書籍で詳しく紹介されていることから割愛します。<br />
Target Runtimeで指定するtomcatのバージョンやtomcatを展開した場所の指定を間違わないこと等に注意して設定して下さい。<br />
tomcatが正しく動作して、実行結果が返ってきたでしょうか。</p>
<h3>Eclipse起動エラーが起こってしまったら？</h3>
<p>上記の手順を参考にしてもEclipseを起動する際にエラーが起こった際、どうすれば良いのでしょうか。<br />
Eclipseは起動時にログを吐き出してくれています。出力されるログの場所は、例えばプロジェクトを&#8221;/root/workspace&#8221;に作成しようとした際以下になります。</p>
<pre lang="Bash:nogutter">
  /root/workspace/.metadata/.log
</pre>
<p>焦らずエラーメッセージの内容を検索サイトで検索してみることで、対処法が見つかるかもしれません。</p>
<h3>最後に</h3>
<p>2009年06月15日現在ではCentOS5.3が既にリリースされており、本記事で取り上げた問題は既に解決されています。<br />
ですのでCentOS5.3でWEBアプリケーションを開発する環境を整えるまでに手間はあまりかからないかと思います。</p>
<p>CentOS5.2を今から使用しようとする方は少ないかもしれませんが、この記事の内容が読んで下さった皆さんの参考になれば幸いです。</p>
<p>それではまた！</p>
<h3>リンク集</h3>
<h4>OpenJDK</h4>
<p>・サン、Javaをオープンソース化&#8211;Java SE向けJDKをOpenJDKで公開<br />
<a href="http://japan.cnet.com/news/ent/story/0,2000056022,20348500,00.htm" target="_blank">http://japan.cnet.com/news/ent/story/0,2000056022,20348500,00.htm</a><br />
・Sun社のJDK7、OpenJDK、そしてIcedTea：曖昧さの回避<br />
<a href="http://www.infoq.com/jp/news/2009/01/jdk-openjdk-icedtea" target="_blank">http://www.infoq.com/jp/news/2009/01/jdk-openjdk-icedtea</a></p>
<h4> Apache Tomcat</h4>
<p>・Apache Tomcat 本家サイト<br />
<a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a></p>
<h4> Eclipse</h4>
<p>・Eclipse.org 本家サイト<br />
<a href="http://www.eclipse.org/">http://www.eclipse.org/</a><br />
・エクリプス<br />
<a href="http://eclipsewiki.net/eclipse/index.php?FrontPage">http://eclipsewiki.net/eclipse/index.php?FrontPage</a><br />
・Eclipse XPCOM errorについて<br />
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103620">https://bugs.eclipse.org/bugs/show_bug.cgi?id=103620<br />
</a></p>
<h4> CentOS</h4>
<p>・CentOS 本家サイト<br />
<a href="http://www.centos.org/">http://www.centos.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/06/centos_webapplication_using.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/06/centos_webapplication_using.html" />
	</item>
		<item>
		<title>JSFでAjaxを使いたい &#8211; OpenFacesの紹介 -</title>
		<link>http://blog.eni.co.jp/tech/2009/06/jsf_ajax_openfaces.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/06/jsf_ajax_openfaces.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 06:41:50 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[OpenFaces]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=631</guid>
		<description><![CDATA[はじめまして。
プロダクト&#38;サービス事業部の武輪です。
Ajaxと言えば、JavaScriptをごりごり書かないと！ってイメージがあるのですが、JavaScriptを少し書くだけ、もしくはまったく書かずに、コンポーネント側で勝手にやってくれれば簡単ですよね。
Ajaxを用いたJSFコンポーネントやフレームワークって他にも、RichFacesやらajax4jsfやらICEfacesやらがあるのですけども、今回私は、OpenFacesというJSFコンポーネントを紹介したいと思います。
OpenFacesは2009年5月末に出てきたばかりのAjaxを用いたJSFコンポーネントです。
サイトからはfaceletsで実装されたサンプルとJSPで実装されたサンプルをダウンロードすることができます。
早速、faceletsで実装されたサンプルを動かしてみました。

どんな機能があるの？
サンプルにはたくさんの魅力的なデモが含まれていたのですが、そのうちのいくつかを紹介したいと思います。
カレンダー

よくこんなカレンダーありますよね。

1
&#60;o:calendar/&#62;

xhtmlファイルにはたったこれだけで画面にカレンダーがぽんと表示されちゃいます。
また、下のようにスタイルを細かく指定することもできます。

1
2
3
4
5
6
7
8
9
10
11
&#60;o:calendar style=&#34;border: 1px solid white;&#34;
            headerStyle=&#34;background: #fff;&#34;
            rolloverDayStyle=&#34;background: #fff; border: 1px solid #8eb5d4; color: black;&#34;
            rolloverWeekendDayStyle=&#34;background: #f9f6f1; border: 1px solid #f3922b; color: [...]]]></description>
			<content:encoded><![CDATA[<p>はじめまして。<br />
プロダクト&amp;サービス事業部の武輪です。</p>
<p>Ajaxと言えば、JavaScriptをごりごり書かないと！ってイメージがあるのですが、JavaScriptを少し書くだけ、もしくはまったく書かずに、コンポーネント側で勝手にやってくれれば簡単ですよね。<br />
Ajaxを用いたJSFコンポーネントやフレームワークって他にも、<a href="http://www.jboss.org/jbossrichfaces/">RichFaces</a>やら<a href="http://www.jboss.org/jbossajax4jsf/">ajax4jsf</a>やら<a href="http://www.icefaces.org/">ICEfaces</a>やらがあるのですけども、今回私は、<a href="http://openfaces.org/">OpenFaces</a>というJSFコンポーネントを紹介したいと思います。</p>
<p>OpenFacesは2009年5月末に出てきたばかりのAjaxを用いたJSFコンポーネントです。<br />
サイトからはfaceletsで実装されたサンプルとJSPで実装されたサンプルをダウンロードすることができます。</p>
<p>早速、faceletsで実装されたサンプルを動かしてみました。</p>
<p><span id="more-631"></span></p>
<h3>どんな機能があるの？</h3>
<p>サンプルにはたくさんの魅力的なデモが含まれていたのですが、そのうちのいくつかを紹介したいと思います。</p>
<h4>カレンダー</h4>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/calender1.png" alt="デフォルトのカレンダー" title="デフォルトカレンダー" width="207" height="186" class="size-full wp-image-646" /></p>
<p>よくこんなカレンダーありますよね。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p631108"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p631code108"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;o:calendar</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>xhtmlファイルにはたったこれだけで画面にカレンダーがぽんと表示されちゃいます。<br />
また、下のようにスタイルを細かく指定することもできます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p631109"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p631code109"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;o:calendar</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;border: 1px solid white;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">headerStyle</span>=<span style="color: #ff0000;">&quot;background: #fff;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">rolloverDayStyle</span>=<span style="color: #ff0000;">&quot;background: #fff; border: 1px solid #8eb5d4; color: black;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">rolloverWeekendDayStyle</span>=<span style="color: #ff0000;">&quot;background: #f9f6f1; border: 1px solid #f3922b; color: black;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">selectedDayStyle</span>=<span style="color: #ff0000;">&quot;background: #8eb5d4;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">todayStyle</span>=<span style="color: #ff0000;">&quot;color: #ff8a01; font-weight: bold; background: #fff;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">footerStyle</span>=<span style="color: #ff0000;">&quot;border-top: 1px solid #505050; background: #fff;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">daysHeaderStyle</span>=<span style="color: #ff0000;">&quot;background: #505050; color: white;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">inactiveMonthDayStyle</span>=<span style="color: #ff0000;">&quot;color: #b4b4b4; background: #fff;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">dayStyle</span>=<span style="color: #ff0000;">&quot;color: #505050;  background: #fff; border: 1px solid #f9f9f9;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">weekendDayStyle</span>=<span style="color: #ff0000;">&quot;color: #000000;  background: #fff;&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>これが画面に表示されるとこんな感じ。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/calender2.png" alt="カレンダー" title="カレンダー" width="211" height="195" class="alignnone size-medium wp-image-650" /></p>
<p>ちなみにデモではすべて～～Styleでcssを直接指定していましたが、～～Classというアトリビュートでcssのクラスを指定することもできます。<br />
JAVA側の実装もシンプルな感じ。<br />
CalendarBean.javaとLocaleItem.javaの2クラスだけでした。</p>
<h4>グラフ</h4>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/chart-300x260.png" alt="グラフ" title="グラフ" width="300" height="260" class="alignleft size-medium wp-image-654" /><br />
OpenFacesでは、JFreeChartというライブラリーを利用してグラフを生成できます。<br />
円グラフ、横棒グラフ、縦棒グラフ、折れ線グラフの4種類が用意されています。<br />
<br clear="all"/></p>
<p>円グラフの記述例は↓こんな感じ。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p631110"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p631code110"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;o:chart</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;yearPrecipitationChart&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">model</span>=<span style="color: #ff0000;">&quot;#{CityPrecipitation}&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;320&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;275&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">legendVisible</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;o:pieChartView</span> <span style="color: #000066;">colors</span>=<span style="color: #ff0000;">&quot;#5a87be, #94c237, #fff555, #da6a28&quot;</span> <span style="color: #000066;">labelsVisible</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;o:chartTitle</span> <span style="color: #000066;">text</span>=<span style="color: #ff0000;">&quot;Amount of Precipitation During the Year&quot;</span></span>
<span style="color: #009900;">                <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;font-size: 14px;&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/o:chart<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>BackingBeanは、それぞれのグラフ用にChartModelというインターフェースを実装したmodelをもっています。<br />
そのmodelを元にグラフが描画されるみたい。</p>
<h4>データテーブル</h4>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/data_tablle-300x225.png" alt="Data Table" title="Data Table" width="300" height="225" class="alignleft size-medium wp-image-663" /><br />
データリストの一覧表示には以下の機能が備わっています。<br clear="all"/></p>
<ul>
<li><strong>検索</strong></li>
<li><strong>ソート</strong></li>
<li><strong>ページング</strong></li>
<li><strong>選択</strong>・・・1行選択したり複数行選択したり。</li>
<li><strong>カラムのリサイズ</strong></li>
<li><strong>キーボード操作</strong>・・・方向キーで選択行を変更したり、Shiftキー＋方向キーで複数行選択したり。</li>
</ul>
<h4>他にもいろいろ面白そうな機能があります</h4>
<p>ウィンドウの表示とか。<br />
ポップアップメニュー(右クリックでメニュー表示)とか。<br />
ツリー状メニューの表示とか。<br />
カレンダーからの日付選択とか。</p>
<p>たくさんの面白そうな機能がついているので、ぜひ実際に動く様子を見てみてください。(→<a href="http://openfaces.org/demo/">OpenFaces Live Demo</a>)</p>
<h3>ところでライセンスは？</h3>
<p>OpenFacesが採用しているライセンスは、dual license modelです。</p>
<p>dual licenseって何よ？って話なんですけども、簡単に言うと、開発したアプリケーションのライセンスをLGPLにするなら無償、そうでないならOpenFacesの商用ライセンスを購入してねってことみたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/06/jsf_ajax_openfaces.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/06/jsf_ajax_openfaces.html" />
	</item>
		<item>
		<title>Seleniumの自動テストを止めることなく、Flexを手動操作する方法</title>
		<link>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html#comments</comments>
		<pubDate>Fri, 29 May 2009 08:17:50 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Wait]]></category>
		<category><![CDATA[自動テスト]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=478</guid>
		<description><![CDATA[はじめまして。
プロダクト&#38;サービス事業部の笹山です。
今回は、SeleniumRCを用いてWebアプリケーションのテスト中に、Flex部分のみを手動操作し、
その後再び自動テストを継続させる方法について書きたいと思います。
有名なツールなのでみなさんご存知と思いますが、まずSeleniumRCとは、
「Webブラウザの操作を自動化させ、Webアプリケーションの画面表示や画面遷移のテストを行うツール」で
Webアプリケーションのテストには欠かせないツールです。
今回弊社では、easyFiLEXのテストをSeleniumRCを用いて行うことになりました。

easyFiLEXテストでSeleniumRCを使用する際の問題
弊社Tech Blog(05/18)記事にもあるように、easyFiLEXではFlexを採用しています。
easyFiLEXには、Wizard形式の画面があり、その一部画面にFlexが採用されています。
しかし、SeleniumRCは一般的なWebアプリケーションのテストを行うツールで、Flexには対応していません。
そのため、Flexが採用されているWizard形式の１画面がクリアできず、次の画面のテストができないのです。
ここをどう解決するか非常に悩みました。
FlashSelenium発見と挫折
まずは、Google先生に聞いてみました。
すると以下のサイトが検索に引っ掛かりました。

「Selenium RCによるFlash用の機能テストの作成と実行」

FlashSeleniumというSeleniumRCとFlexを連携させるツールです。
「これで解決！（Flex部分のテストも自動化できる！）」と思いました。
意気揚揚と公開されているサンプルを動かしはじめましたが、サンプルすら動きませんでした。（動いた方は教えてください。）

FlashSeleniumのサンプルFlash
FlashSeleniumのサンプルテストコード

解決方法の発見
途方に暮れselenium-client-driverのJavaDocを眺めていた時、ふと目に入った文字が・・・。
com.thoughtworks.selenium.Wait
便利なクラスがselenium-client-driverに用意されていました。
「条件がtrueになるまで、指定時間待つ」というものです。
easyFiLEXのテストでは以下の手順で使用しました。
手順内の画面は、
Flexが採用されているWizard形式の１画面で、「ファイルのアップロード後、送信先を指定する画面」です。
送信先を指定しない限り、次の画面へ進むことができないようになっています。

Flexが採用されている画面までは、SeleniumRCを用いてWizard形式画面の自動テストを行います。
Flexが採用されている画面に遷移後、SeleniumRCで送信先を指定せずに「次へ」ボタンを押下させ、バリデーションエラーを発生させます。
バリデーションエラー：「送信先が選択されていません。1つ以上選択してください。」
/li>
バリデーションエラーが画面上に表示されている間は、指定時間待機させます。（以下コード参照）
待機中にFlex操作を手動で行い、バリデーションエラーが画面上から消えると、再び自動テストが始まります。

Selenium実行途中でWaitをかけるコード

1
2
3
4
5
6
7
8
9
new Wait&#40;&#41; &#123;
    public boolean until&#40;&#41; &#123;
        if&#40;!selenium.isTextPresent&#40;&#34;送信先が選択されていません。1つ以上選択してください。&#34;&#41;&#41; &#123;
            return true;
        &#125; else &#123;
            [...]]]></description>
			<content:encoded><![CDATA[<p>はじめまして。</p>
<p>プロダクト&amp;サービス事業部の笹山です。</p>
<p>今回は、SeleniumRCを用いてWebアプリケーションのテスト中に、Flex部分のみを手動操作し、<br />
その後再び自動テストを継続させる方法について書きたいと思います。</p>
<p>有名なツールなのでみなさんご存知と思いますが、まずSeleniumRCとは、<br />
「Webブラウザの操作を自動化させ、Webアプリケーションの画面表示や画面遷移のテストを行うツール」で<br />
Webアプリケーションのテストには欠かせないツールです。</p>
<p>今回弊社では、<a title="easyFiLEX" href="http://www.eni.co.jp/products/easyfilex/index.html" target="_blank">easyFiLEX</a>のテストをSeleniumRCを用いて行うことになりました。<br />
<span id="more-478"></span></p>
<h3>easyFiLEXテストでSeleniumRCを使用する際の問題</h3>
<p><a title="Tech Blog（05/18）記事" href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html" target="_blank">弊社Tech Blog(05/18)記事</a>にもあるように、easyFiLEXではFlexを採用しています。<br />
easyFiLEXには、Wizard形式の画面があり、その一部画面にFlexが採用されています。</p>
<p>しかし、SeleniumRCは一般的なWebアプリケーションのテストを行うツールで、Flexには対応していません。<br />
そのため、Flexが採用されているWizard形式の１画面がクリアできず、次の画面のテストができないのです。</p>
<p>ここをどう解決するか非常に悩みました。</p>
<h3>FlashSelenium発見と挫折</h3>
<p>まずは、Google先生に聞いてみました。</p>
<p>すると以下のサイトが検索に引っ掛かりました。</p>
<ul>
<li><a title="http://www.adobe.com/jp/devnet/flash/articles/flash_selenium.html" href="「Selenium RCによるFlash用の機能テストの作成と実行」" target="_blank">「Selenium RCによるFlash用の機能テストの作成と実行」</a></li>
</ul>
<p>FlashSeleniumというSeleniumRCとFlexを連携させるツールです。</p>
<p>「これで解決！（Flex部分のテストも自動化できる！）」と思いました。<br />
意気揚揚と公開されているサンプルを動かしはじめましたが、サンプルすら動きませんでした。（動いた方は教えてください。）</p>
<ul>
<li><a title="FlashSeleniumのサンプルFlash" href="http://www.geocities.com/paulocaroli/flash/colors.html" target="_blank">FlashSeleniumのサンプルFlash</a></li>
<li><a title="FlashSeleniumのサンプルテストコード" href="http://code.google.com/p/flash-selenium/" target="_blank">FlashSeleniumのサンプルテストコード</a></li>
</ul>
<h3>解決方法の発見</h3>
<p>途方に暮れselenium-client-driverのJavaDocを眺めていた時、ふと目に入った文字が・・・。</p>
<pre><strong>com.thoughtworks.selenium.Wait</strong></pre>
<p>便利なクラスがselenium-client-driverに用意されていました。</p>
<p><strong>「条件がtrueになるまで、指定時間待つ」</strong>というものです。<br />
easyFiLEXのテストでは以下の手順で使用しました。</p>
<p>手順内の画面は、</p>
<pre>Flexが採用されているWizard形式の１画面で、「ファイルのアップロード後、送信先を指定する画面」です。
送信先を指定しない限り、次の画面へ進むことができないようになっています。</pre>
<ol>
<li>Flexが採用されている画面までは、SeleniumRCを用いてWizard形式画面の自動テストを行います。</li>
<li>Flexが採用されている画面に遷移後、SeleniumRCで送信先を指定せずに「次へ」ボタンを押下させ、バリデーションエラーを発生させます。<br />
バリデーションエラー：<span style="color: #ff0000;">「送信先が選択されていません。1つ以上選択してください。」</span></p>
<p><div id="attachment_505" class="wp-caption aligncenter" style="width: 291px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/05/selenium_wait.png"><img class="size-medium wp-image-505" title="selenium_wait" src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/05/selenium_wait-281x300.png" alt="easyFiLEX送信先設定画面におけるバリデーションエラー" width="281" height="300" /></a><p class="wp-caption-text">easyFiLEX送信先設定画面におけるバリデーションエラー発生時の画面</p></div></li>
<li>バリデーションエラーが画面上に表示されている間は、指定時間待機させます。（<a href="#wait_code">以下コード参照</a>）</li>
<li>待機中にFlex操作を手動で行い、バリデーションエラーが画面上から消えると、再び自動テストが始まります。</li>
</ol>
<h3 id="wait_code">Selenium実行途中でWaitをかけるコード</h3>

<div class="wp_codebox"><table width="100%" ><tr id="p478112"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p478code112"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> Wait<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> until<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>selenium.<span style="color: #006633;">isTextPresent</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;送信先が選択されていません。1つ以上選択してください。&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>.<span style="color: #006633;">wait</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;タイムアウト&quot;</span>, 60000<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>最後に</h3>
<p>Flex部分だけは手動操作になってしまいますが、それ以降はスムーズに自動テストできるので現時点ではこの方法でテストを行っています。</p>
<p>時間の都合上、FlashSeleniumについて深く調査はしていませんが、調査をして「このブログに公開できたら・・・」と思っています。</p>
<h3>公式サイト</h3>
<ul>
<li><a title="Selenium公式サイト" href="http://seleniumhq.org/" target="_blank">Selenium公式サイト</a></li>
</ul>
<div id="FluJE_quick_lookup" style="opacity: 0;"><span>Quick Lookup:</span></p>
<input id="FluJE_quick_lookup_input" /></div>
<h3>あわせて読みたい</h3>
<p><a href="http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html">SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html" />
	</item>
	</channel>
</rss>
