Unify NXJ

Make 処理のカ ス タ マ イ ズ
こ の機能は、 Release10.0 以降で利用可能です。
J2EE に精通 し た開発者に と っ ては、 NXJ に よ っ て生成 さ れた ア プ リ ケーシ ョ ン
アー カ イ ブに変更を行な う 必要があ る場合 も あ り ます。 その場合、 ejb と Web ア
プ リ ケーシ ョ ン フ ァ イル構造に フ ァ イルの追加や再配置を行な っ て、 生成 さ れた
構成 フ ァ イル (例 : ejb-jar.xml, web.xml, その他) を変更 し ます。
こ の ド キ ュ メ ン ト では、 必要な変更を作成す る ために Make Hook を記述 し て、
Make 処理を カ ス タ マ イ ズする方法を説明 し ます。 こ の Java ク ラ スは、 実行 コ マ
ン ド の Make フ ェ ーズ中に NXJ に よ っ て呼び出 さ れます。
警告 – NXJ は、 こ の フ ァ イルに行 う 変更に対 し て検証を行わないので、
ア プ リ ケーシ ョ ンサーバや、 NXJ コ ン ト ロ ールセ ン タ と 互換性のない
アー カ イ ブに変更する こ と が可能です。
Make Hook の作成方法
Make Hook を作成する場合は、 com.unify.nxj.ide.make.NXJMakeHook イ ン タ
フ ェ ース を実装す る Java ク ラ ス を記述 し ます。 こ の イ ン タ フ ェ ースは、 以下の 1
つの メ ソ ッ ド を宣言 し ます。
public void makeHook(
java.io.File earContentsDir,
java.util.Properties properties,
com.unify.nxj.ide.make.NXJMakeHookCallback callback
) throws Exception;
1
NXJ が Make Hook を使用する構成では、 ク ラ ス ( ク ラ スは 0 引数構造を持つ必要
があ り ます) の イ ン ス タ ン ス を作成 し ます。 その後、 makeHook メ ソ ッ ド が呼び出
さ れます。 makeHook メ ソ ッ ド がエ ラ ー無 し で終了 し た場合、 NXJ は適切な アー カ
イ ブ中に フ ァ イルをパ ッ ケージ し て、 ア プ リ ケーシ ョ ン を配備 し ます (ア プ リ
ケーシ ョ ン を配備ま たは実行 し てい る場合)。
makeHook メ ソ ッ ド は、 3 つの引数を渡 さ れます。
• java.io.File オ ブ ジ ェ ク ト
最初の引数は、 NXJ がパ ッ ケージ さ れる フ ァ イルを ア セ ン ブル し たデ ィ レ ク
ト リ を示す java.io.File オ ブ ジ ェ ク ト です。 こ のデ ィ レ ク ト リ は、 3 つのその
他のデ ィ レ ク ト リ があ り ます。 META-INF デ ィ レ ク ト リ には、 J2EE ア プ リ
ケーシ ョ ン用のデ ィ ス ク リ プ タ であ る application.xml フ ァ イルがあ り ます。
jar-contents デ ィ レ ク ト リ には、 ア プ リ ケーシ ョ ンの EJB 部分の フ ァ イルがあ
り ます。 EJB デ ィ ス ク リ プ タ は、 jar-contents/META-INF/ejb-jar.xml です。
war-contents デ ィ レ ク ト リ には、 ア プ リ ケーシ ョ ンの Web ア プ リ ケーシ ョ ン
部分の フ ァ イルがあ り ます。 Web ア プ リ ケーシ ョ ン デ ィ ス ク リ プ タ は、 warcontents/META-INF/web.xml です。
注 – ear-contents デ ィ レ ク ト リ 構造は、 NXJ の今後の リ リ ース では変更の予定があ
り ます。
• java.util.Properties オ ブ ジ ェ ク ト
makeHook メ ソ ッ ド に渡 さ れる 2 つ目の引数は、 java.util.Properties オ ブ ジ ェ
ク ト です。 こ のオ ブ ジ ェ ク ト は、 Make Hook を構成する と き に定義 さ れた プ
ロパテ ィ を含みます。 (下の Make Hook の構成を参照 し て く だ さ い。)
• com.unify.ide.nxj.make.NXJMakeHookCallback オ ブ ジ ェ ク ト
makeHook に渡 さ れる最後の引数は、
com.unify.ide.nxj.make.NXJMakeHookCallback オ ブ ジ ェ ク ト です。 こ のオ ブ
ジ ェ ク ト では、 ア プ リ ケーシ ョ ン デザ イ ナの コ ンパ イ ラ ウ ィ ン ド ウで メ ッ
セージ を表示可能な 3 つの メ ソ ッ ド があ り ます。
public void displayMessage(String msg);
public void displayWarning(String msg);
public void displayError(String msg);
Make 処理のカ ス タ マ イ ズ
2
最初の 2 つの メ ソ ッ ド は、 コ ンパ イ ラ ウ ィ ン ド ウに メ ッ セージ を表示 し て処理を
続けます。 表示エ ラ ーに よ り 表示 さ れる メ ッ セージは、 コ ンパ イ ラ ウ ィ ン ド ウに
赤で表示 さ れます。 makeHook メ ソ ッ ド に よ っ て エ ラ ーが表示 さ れる と 、 NXJ は
makeHook メ ソ ッ ド の処理を中止 し て戻 り ます。
サン プル Make Hook
下記の コ ー ド は、 EJB デ ィ ス ク リ プ タ フ ァ イルに環境エ ン ト リ を追加する Make
Hook の例です。 こ の例では、 一行ずつ フ ァ イルを読み込んで、 フ ァ イルの新 し い
バージ ョ ン に書き込む作業を し ます。 フ ァ イルの適切な位置に達する と 、 プ ロパ
テ ィ オ ブ ジ ェ ク ト で渡 さ れる各プ ロパテ ィ の <env-entry> 宣言を すべて書 き出 し ま
す。
プ ロパテ ィ 名は、 エ ン ト リ の名前 と し て使用 さ れます。 プ ロパテ ィ 値は、 エ ン ト
リ に割 り 当て る値を含む文字列 と な り ます。 ま た、 値の後にセ ミ コ ロ ン を加え る
こ と で、 エ ン ト リ の タ イ プ と エ ン ト リ (デ フ ォ ル ト は、 java.lang.String) の ク ラ ス
タ イ プ を宣言する こ と がで き ます。 最後に、 2 つ目のセ ミ コ ロ ン と 説明を追加す る
こ と がで き ます。 タ イ プ と 説明はオ プ シ ョ ン です。
その後、 Make Hook は、 フ ァ イルの残 り の書き出 し を継続 し て終了 し ます。
import java.io.*;
import java.util.*;
import com.unify.nxj.ide.make.*;
public class EJBEnvHook implements NXJMakeHook
{
public void makeHook ( File earContentsDir,
Properties props, NXJMakeHookCallback callback)
{
File orig = new File( earContentsDir.getPath() +
"/jar-contents/META-INF/ejb-jar.xml");
if ( orig.exists() )
{
File backup = new File( orig.getPath() + ".bu" );
if ( !orig.renameTo( backup ) )
{
callback.displayWarning("Cannot rename the xml file. Make will
continue with the unmodified file.");
}
BufferedReader in = null;
Make 処理のカ ス タ マ イ ズ
3
BufferedWriter out = null;
try
{
in = new BufferedReader( new FileReader( backup ) );
out = new BufferedWriter( new FileWriter( orig ) );
String nextLine = null;
boolean inBean = false;
while ( (nextLine = in.readLine()) != null )
{
if ( inBean )
{
// Add our entries at the end of the declaration
// for the bean
if ( nextLine.indexOf("</session>") > 0 )
{
Enumeration propNames = props.propertyNames();
while ( propNames.hasMoreElements() )
{
String propName = (String)propNames.nextElement();
callback.displayMessage("Adding Env Entry: " + propName);
if ( propName.equals("test") )
throw new Exception("this is a test");
out.write("<env-entry>¥n");
out.write("<env-entry-name>" + propName +
"</env-entry-name>¥n");
String property = (String)props.getProperty(propName);
StringTokenizer prop = new StringTokenizer(property, ";");
out.write("<env-entry-value>" + prop.nextToken() +
"</env-entry-value>¥n");
if ( prop.hasMoreTokens() )
out.write("<env-entry-type>" + prop.nextToken() +
"</env-entry-type>¥n");
else
out.write("<env-entry-type>java.lang.String</env-entrytype>¥n");
if ( prop.hasMoreTokens() )
out.write("<description>" + prop.nextToken() +
"</description>¥n" );
out.write("</env-entry>¥n");
}
inBean = false;
}
} else {
// This line indicates the start of the <session> bean
Make 処理のカ ス タ マ イ ズ
4
// we want to modify
if ( nextLine.indexOf("nxjFieldManager_ID") > 0 )
inBean = true;
}
out.write(nextLine);
out.newLine();
} // end while
} catch ( Exception e ) {
callback.displayError(
"An error occurred while executing the make hook: " +
e.getMessage());
callback.displayError("Make process will now stop.");
} finally {
try {
out.flush();
out.close();
in.close();
backup.delete();
} catch ( Exception e2 ) {}
}
}
}// end makeHook
}
Make Hook の構成
Make Hook を作成 し た場合、 プ ロ ジ ェ ク ト の ク ラ スパスにそれを追加 し なければ
な り ません。 Java フ ァ イルがプ ロ ジ ェ ク ト の一部であ る場合、 デ フ ォ ル ト で ク ラ
スは ク ラ スパス上にあ り ますが、 ア プ リ ケーシ ョ ン を構築する と き、 ク ラ スはア
プ リ ケーシ ョ ン アー カ イ ブ に も 含め ら れます。 そのため、 Make Hook の作成が終
わ っ た ら 、 Jar フ ァ イル中に Make Hook をパ ッ ケージ し て、 プ ロ ジ ェ ク ト > プ ロ
パテ ィ > ク ラ スパスパネル で ク ラ スパス エ ン ト リ と し て追加す る こ と を推奨 し ま
す。
ク ラ スがアー カ イ ブ に含め ら れない よ う に、 ‘EAR に含める ’ チ ェ ッ ク ボ ッ ク ス を
ク リ アに し ます。
Make Hook は、 プ ロ ジ ェ ク ト > プ ロパテ ィ > Make Hook パネルで構成 し ます。
Make Hook ク ラ ス名は、 Make Hook Class 固有の名前です。 こ の例では、
‘EJBEnvHook’ です。
Make 処理のカ ス タ マ イ ズ
5
新 し いエ ン ト リ を追加す る には 追加 ボ タ ン を ク リ ッ ク し て、 ダ イ ア ロ グで必要数
のプ ロパテ ィ を追加 し ます。 サン プル Make Hook が こ れ ら のプ ロパテ ィ を使用す
る方法については、 上記の説明を参照 し て く だ さ い。
実行する場合は OK ボ タ ン を ク リ ッ ク し ます。
Make Hook によ る動作
サン プル Make Hook を試行す る場合は、 EJB 環境エ ン ト リ を取得す る ために標準
の J2EE メ ソ ッ ド を使用す る フ ォ ーム を作成 し ます。 プ ロ ジ ェ ク ト に フ ォ ームを追
加 し て、 フ ォ ームに テキス ト フ ィ ール ド を配置 し ます。 テキス ト フ ィ ール ド 名を
‘envEntry’ に変更 し ます。 フ ォ ームにエ ン ト リ ポ イ ン ト を追加 し ます。 フ ォ ームの
BEFORE FORM セ ク シ ョ ン で コ ー ド を追加 し ます。 ‘Test’ と い う String プ ロパテ ィ
でサン プル Make Hook を構成する場合、 以下の コ ー ド で取得する こ と がで き ます。
BEFORE FORM
{
Context jndiCtx = new InitialContext();
Object obj = jndiCtx.lookup("java:comp/env/Test");
String value = (String)PortableRemoteObject(obj,
java.lang.String.class);
envEntry = value;
}
Make 処理のカ ス タ マ イ ズ
6
ア プ リ ケーシ ョ ン を実行 し ます。 NXJ がア プ リ ケーシ ョ ン を構築中に、 各プ ロパ
テ ィ のために コ ンパ イ ラ ウ ィ ン ド ウに表示 さ れる ‘Adding Env Entry: Test’ と い う
メ ッ セージ を確認する必要があ り ます。 ア プ リ ケーシ ョ ンの実行時、 フ ォ ームは
表示 さ れ、 そのテキス ト フ ィ ール ド は、 Make Hook を構成 し た と き に設定 し た値
を含んでいます。
Make 処理のカ ス タ マ イ ズ
7