コード生成の詳細を収集する Java コードの作成
レポートを生成するか、そうでない場合は生成時にイベントに応答するための Java™ コードを作成できるようになりました。
この製品は、com.ibm.etools.egl.genresults というパッケージの com.ibm.etools.egl というプラグインで、以下のコードを提供します。
- リスナーを作成するために実装する Java インターフェース。 このインターフェースの名前は GenerationResultsListener です。
- Java インターフェースの 2 番目のセットと、それを実装する製品クラス。
製品クラスは、リスナーで以下のメソッドを呼び出します。
- generationStarted (生成の開始時)。
- phaseStarted (生成フェーズの開始時) および phaseFinished (フェーズの終了時)。
生成フェーズは、一連の出力ファイルが作成される期間です。
- 従来の生成モードが有効である場合、ファイルはメイン・パーツおよびその関連パーツについて生成されます。
- 「パーツ別の生成」モードが有効である場合、ファイルは単一のパーツについて生成されます。
製品クラスは各フェーズで以下のメソッドを呼び出すことができます。- generatingPart。パーツのすべての出力の生成を開始する場合。
- createdArtifact。出力ファイルが生成されている場合。 この製品は、出力ファイルの場所に関する詳細を示します。
- error、warning、および information。製品が特定の種類のメッセージを出す場合。
- generationFinished。生成が終了する場合。
以下に示すのは、生成中に実行される可能性がある呼び出しの順序です。
generationStarted
phaseStarted
warning
generatingPart
createdArtifact
warning
createdArtifact
createdArtifact
generatingPart
warning
generatingPart
createdArtifact
information
phaseFinished
phaseStarted
generatingPart
createdArtifact
generatingPart
generatingPart
createdArtifact
phaseFinished
generationFinished
一般に、以下のとおり実行します。
- GenerationResultsListener インターフェースを実装するクラスを作成します。これについては、『インターフェースの詳細』のセクションで説明しています。
- クラスをインスタンス化してリスナーを作成し、EGL ジェネレーターに対してリスナーを登録します。
以下に例を示します。
MyListenerClass myListenerObject = new MyListenerClass(); com.ibm.etools.egl.genresults.GenerationResultsServer. getInstance().addListener(myListenerObject);2 番目のステートメントには、以下のような効果があります。
- GenerationResultsServer オブジェクトを、そのクラスの静的 getInstance メソッドを呼び出して取得します。
- myListenerObject という名前のリスナーを、GenerationResultsServer オブジェクトの addListener メソッドに渡します。
リスナーは、GenerationResultsServer オブジェクトの removeListener メソッドに渡すことで、登録解除できます。
タスクの詳細については、必要に応じて以下のいずれかのセクションを参照してください。
ワークベンチとの対話
ワークベンチと対話する場合、生成結果リスナーを登録するプラグインを作成する必要があります。 さらに、Eclipse ランタイム・コードのデフォルトの動作をオーバーライドする必要があります。このデフォルトの動作とは通常、プラグインを、以前にロードしたプラグインによって必要とされる場合にのみロードすることを指します。
以下のようにします。
- コードをプラグインに書き込み、MANIFEST.MF ファイルを更新することで、使用するプラグインが以下のプラグインに依存するようにします。
- com.ibm.etools.egl。これは製品インストール・ディレクトリー内にあります。
- org.eclipse.ui。
- org.eclipse.ui.IStartup を実装するクラスを作成します。org.eclipse.ui.IStartup は、earlyStartup 以外のメソッドを持たない
Java インターフェースです。
earlyStartup の実装により、リスナー・オブジェクトは以下の例に示すとおりに登録されます。
package com.ibm.test.egl.genresults.listener; import org.eclipse.ui.IStartup; import com.ibm.etools.egl.genresults.GenerationResultsServer; public class StartupClass implements IStartup { public void earlyStartup() { GenerationResultsServer.getInstance().addListener(new TestListener(true)); } } - 次の項目を plugin.xml ファイルに組み込みます。
<extension point="org.eclipse.ui.startup"> <startup class="com.ibm.test.egl.genresults.listener.StartupClass"/> </extension> - このプラグインを JAR ファイルに以下のようにエクスポートします。
- をクリックします。「エクスポート」ページが開きます。
- 「プラグイン開発 (Plug-in Development)」を展開し、「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」をクリックします。「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」ページが開きます。
- ページの中ほどにある「宛先 (Destination)」タブで、Eclipse dropins フォルダー (例えば、C:¥Program Files¥IBM¥SDP80¥dropins) を指定します。
- 「オプション」タブをクリックして、「プラグインを個別の JAR アーカイブとしてパッケージ (Package plug-ins as individual JAR archives)」が選択されていることを確認します。
- 「終了」をクリックします。JAR ファイルは dropins フォルダーの下の plugins フォルダーに入ります。
- Windows エクスプローラーを開き、plugins フォルダーに移動します。
- 新規 JAR ファイルを移動させて、dropins フォルダーの直下に配置します。
- 空の plugins フォルダーを削除します。
ワークベンチ・バッチ・インターフェース (EGLCMD) の使用
ワークベンチ・バッチ・インターフェース (EGLCMD) を使用する場合は、以下のようにします。
- プラグインを作成します。
- MANIFEST.MF ファイルを更新し、プラグインが com.ibm.etools.egl プラグイン (製品インストール・ディレクトリー内にある) に依存するようにします。
- 以下に示す plugin.xml ファイルのサンプル・コードのように、プラグインが、org.eclipse.core.runtime.applications という拡張ポイントを参照するようにします。
<extension id="TestCMD" point="org.eclipse.core.runtime.applications"> <application> <run class="com.ibm.test.egl.genresults.listener.TestCMD"></run> </application> </extension>id 属性には、任意の値を割り当てられます。
class 属性の値は、Eclipse IApplication インターフェースの実装、GenerationResultsListener オブジェクトの登録、および com.ibm.etools.edt.core.ide.batch.EGLCMD.process メソッドへのコマンド行引数の受け渡しを行うクラスを示します。 以下に示すのは、そのようなクラスの例です。package com.ibm.test.egl.genresults.listener; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import com.ibm.etools.edt.core.ide.batch.EGLCMD; import com.ibm.etools.egl.genresults.GenerationResultsServer; public class TestCMD implements IApplication { @Override public Object start( IApplicationContext appContext ) throws Exception { // Register a GenerationResultsListener. GenerationResultsServer.getInstance().addListener(new TestListener(true)); // Get the command-line arguments. String[] args = (String[])appContext.getArguments(). get( IApplicationContext.APPLICATION_ARGS ); // Pass the command-line arguments to EGLCMD. EGLCMD.process( args ); return null; } @Override public void stop() {} } - このプラグインを JAR ファイルに以下のようにエクスポートします。
- をクリックします。「エクスポート」ページが開きます。
- 「プラグイン開発 (Plug-in Development)」を展開し、「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」をクリックします。「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」ページが開きます。
- ページの中ほどにある「宛先 (Destination)」タブで、Eclipse dropins フォルダー (例えば、C:¥Program Files¥IBM¥SDP80¥dropins) を指定します。
- 「オプション」タブをクリックして、「プラグインを個別の JAR アーカイブとしてパッケージ (Package plug-ins as individual JAR archives)」が選択されていることを確認します。
- 「終了」をクリックします。JAR ファイルは dropins フォルダーの下の plugins フォルダーに入ります。
- Windows エクスプローラーを開き、plugins フォルダーに移動します。
- 新規 JAR ファイルを移動させて、dropins フォルダーの直下に配置します。
- 空の plugins フォルダーを削除します。
- Java クラスパスが次の jar ファイルへのアクセスを提供していることを確認する。
- org.eclipse.equinox.launcher_version.jar。これは、次のディレクトリーにあります。
installationDir¥sdp70¥plugins- installationDir
- 製品のインストール・ディレクトリー。例えば、C:¥Program Files¥IBM など。
ディレクトリーは共有ディレクトリーでないことに注意してください。
- com.ibm.etools.edt.core.ide.version。これは以下のディレクトリー内にあります。
installationDir¥sdp70shared¥plugins- installationDir
- 製品のインストール・ディレクトリー。例えば、C:¥Program Files¥IBM など。
- org.eclipse.equinox.launcher_version.jar。これは、次のディレクトリーにあります。
- アプリケーションを以下のように呼び出します。
java org.eclipse.core.launcher.Main -application test.genresults.listener.TestCMD argument_listargument_list は、『EGLCMD』参照トピックで説明されている引数で置き換えます。
この例では、test.genresults.listener はプラグインの名前であり、TestCMD は、plugin.xml 内の <extension> エレメントの id 属性の値です。
EGL ソフトウェア開発キット (EGLSDK) の使用
EGL ソフトウェア開発キット (EGLSDK) を使用する場合は、独自の Java クラスを作成し、それを EGLSDK コマンドの代わりに実行する必要があります。これは以下のようにします。
- eglbatchgen.jar ファイルが使用可能となるようにクラスパスを設定します。
- コードを開発する場合、eglbatchgen.jar ファイルを Java コンパイラーのクラスパスに置く必要があります。
- コードを実行する場合、eglbatchgen.jar ファイルが CLASSPATH システム変数に存在している必要があります。
eglbatchgen.jar ファイルのロケーションおよび他の前提条件については、『EGL ソフトウェア開発キット (SDK) を使用した生成』を参照してください。
- 以下の例で示すとおり、タイプ GenerationResultsListener のオブジェクトを登録し、EGLSDK オブジェクトを作成します。
package example; import com.ibm.etools.egl.genresults.GenerationResultsServer; import com.ibm.etools.egl.util.EGLSDK; public class EGLSDKWithListener { public static void main( String[] args ) { MyListenerClass myListenerObject = new MyListenerClass(); GenerationResultsServer.getInstance().addListener(myListenerObject); EGLSDK sdk = new EGLSDK(); sdk.process( args ); } } - 使用するクラスを EGLSDK コマンドの代わりに実行します。この場合、EGLSDK コマンドを呼び出す場合と同じ引数を使用します。
以下に示すのは、インスタンス化する EGLSDK クラスの詳細です。
public class EGLSDK { /* Creates an EGLSDK object that does not print messages to System.out. */ public EGLSDK(); /* Creates an EGLSDK object that might print messages to System.out. * * @param printMessages true if messages should be printed to System.out. */ public EGLSDK(boolean printMessages); /* * Generates EGL. * * @param args are the EGLSDK command-line arguments. */ public void process(String[] args); /* * Returns the messages from the most recent call of process(String[]). * * @return the messages. The array may be empty but will not be null. */ public Message[] getMessages(); /* * Indicates if there were any errors during generation. * * @return true if any errors occurred * in the most recent call of process(String[]). */ public boolean generationFailed(); }以下に示すのは、EGLSDK クラスで参照する Message クラスです。package com.ibm.etools.egl.util; public class Message { public static final int ERROR_MESSAGE = 1; public static final int WARNING_MESSAGE = 2; public static final int INFORMATIONAL_MESSAGE = 3; public String getText(); public int getSeverity(); public boolean isError(); }
EGL Ant スクリプトの使用
EGL Ant スクリプトを使用する場合は、以下のようにします。
- フラグメント・プロジェクトを作成します。ホスト・プラグインを com.ibm.etools.edt.ant に設定する必要があります。
- GenerationResultsListener を実装する生成リスナー・クラスを定義します。
- このプラグインを JAR ファイルに以下のようにエクスポートします。
- をクリックします。「エクスポート」ページが開きます。
- 「プラグイン開発 (Plug-in Development)」を展開し、「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」をクリックします。「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」ページが開きます。
- ページの中ほどにある「宛先 (Destination)」タブで、Eclipse dropins フォルダー (例えば、C:¥Program Files¥IBM¥SDP80¥dropins) を指定します。
- 「オプション」タブをクリックして、「プラグインを個別の JAR アーカイブとしてパッケージ (Package plug-ins as individual JAR archives)」が選択されていることを確認します。
- 「終了」をクリックします。JAR ファイルは dropins フォルダーの下の plugins フォルダーに入ります。
- Windows エクスプローラーを開き、plugins フォルダーに移動します。
- 新規 JAR ファイルを移動させて、dropins フォルダーの直下に配置します。
- 空の plugins フォルダーを削除します。
- -clean を指定して RBD を再始動し、フラグメント jar が取り入れられていることを確認します。
- 新規スクリプトを作成するか、既存の Ant スクリプトを開きます。
- 「generationListenerClass」を egl.generate または egl.cmd に追加します。サンプル・スクリプトは次のとおりです。
<egl.generate part="pkg1.*" project="testJava" buildDescriptorFile="testJava/EGLSource/testJava.eglbld" buildDescriptorName="testJavaJavaBuildOptions" generationListenerClass="com.hjiyong.TestListener" verbose="yes" /> - Ant スクリプトを実行します。
インターフェースの詳細
GenerationResultsListener インターフェースの例を以下に示します。
public interface GenerationResultsListener
{
// Called when generation starts
void generationStarted( GenerationStartedEvent gse );
// Called when generation ends
void generationFinished();
// Called when a generation phase starts
void phaseStarted( GenerationPhase gp );
// Called when a generation phase ends
void phaseFinished();
// Called when generation of a part begins
void generatingPart( PartGenerationEvent event );
// Called after one generated output is created for the part
// during the most recent event of type PartGenerationEvent
void createdArtifact( ArtifactCreatedEvent event );
// Called when an error message is issued
void error( MessageEvent event );
// Called when a warning message is issued.
void warning( MessageEvent event );
// Called when an informational message is issued.
void information( MessageEvent event );
}
以下に示すのは、追加の Java インターフェースです。
public interface GenerationStartedEvent
{
/**
* Returns true if generation is running in the workbench or EGLCMD,
* false if generation is running in EGLSDK.
*/
boolean generatingInEclipse();
/**
* Returns the path to the Eclipse workspace if generation is running
* in the workbench or EGLCMD. Returns the eglpath value if generation
* is running in EGLSDK.
*/
String getWorkPath();
}
public interface GenerationPhase
{
/**
* Returns a Part object (explained later)
* that gives details on the build descriptor.
*/
Part getPart();
}
public interface PartGenerationEvent
{
/**
* Returns a Part object that gives details on the part being generated.
*/
Part getPart();
}
public interface ArtifactCreatedEvent
{
/**
* Returns the path to a file generated from the part.
* The path is relative to the Eclipse workspace if generation
* is running in the workbench or EGLCMD and if the artifact was generated
* into a project named by the genProject option in the build descriptor.
*
* In other cases, the path is an absolute path in the file system.
*/
String getFileName();
/**
* Returns the absolute path to a file generated from the part.
* (The method returns the same value as getFileName if generation
* is running in EGLSDK or if the artifact was not generated into a project.)
*/
String getAbsolutePath();
}
public interface Part
{
static final int BUILD_DESCRIPTOR = 1;
static final int DEPLOYMENT_DESCRIPTOR = 2;
static final int PROGRAM = 3;
static final int LIBRARY = 4;
static final int HANDLER = 5;
static final int RECORD = 6;
static final int DATA_TABLE = 7;
static final int FORM_GROUP = 8;
static final int SERVICE = 9;
static final int DELEGATE = 10;
/**
*
* Returns the constant identifying the kind of part
* that has been generated.
*/
int getKind();
/**
* Returns the name of the part.
*/
String getName();
/**
* Returns the package name of the part.
* If the part is in the default package, an empty string is returned.
* If the part represents a build descriptor or deployment descriptor,
* the method returns null.
*/
String getPackageName();
/**
* Returns the path to the EGL file for the part. The path is relative to the
* Eclipse workspace if generation is running in the workbench or EGLCMD. The path
* is an absolute path in the file system if generation is running in EGLSDK.
*/
String getFileName();
/**
* Returns the absolute path to the EGL file for the part.
* (This method returns the same value as getFileName
* if generation is running in EGLSDK.)
*/
String getAbsolutePath();
}
public interface MessageEvent
{
static final int ERROR = 1;
static final int WARNING = 2;
static final int INFORMATION = 3;
/**
* Returns INFORMATION, WARNING, or ERROR.
*/
int getKind();
/**
* Returns the text of the message.
*/
String getText();
/**
* Returns the ID of the message.
*/
String getID();
}