コード生成の詳細を収集する Java コードの作成

レポートを生成するか、そうでない場合は生成時にイベントに応答するための Java™ コードを作成できるようになりました。

この製品は、com.ibm.etools.egl.genresults というパッケージの com.ibm.etools.egl というプラグインで、以下のコードを提供します。
製品クラスは、リスナーで以下のメソッドを呼び出します。
以下に示すのは、生成中に実行される可能性がある呼び出しの順序です。
generationStarted
   phaseStarted
      warning
      generatingPart
         createdArtifact
         warning
         createdArtifact
         createdArtifact
      generatingPart
         warning
      generatingPart
         createdArtifact
         information
   phaseFinished
   phaseStarted
      generatingPart
         createdArtifact
      generatingPart
      generatingPart
         createdArtifact
   phaseFinished
generationFinished
一般に、以下のとおり実行します。
  1. GenerationResultsListener インターフェースを実装するクラスを作成します。これについては、『インターフェースの詳細』のセクションで説明しています。
  2. クラスをインスタンス化してリスナーを作成し、EGL ジェネレーターに対してリスナーを登録します。 以下に例を示します。
    MyListenerClass myListenerObject = new MyListenerClass();
    com.ibm.etools.egl.genresults.GenerationResultsServer.
       getInstance().addListener(myListenerObject);

    2 番目のステートメントには、以下のような効果があります。

    1. GenerationResultsServer オブジェクトを、そのクラスの静的 getInstance メソッドを呼び出して取得します。
    2. myListenerObject という名前のリスナーを、GenerationResultsServer オブジェクトの addListener メソッドに渡します。

    リスナーは、GenerationResultsServer オブジェクトの removeListener メソッドに渡すことで、登録解除できます。

タスクの詳細については、必要に応じて以下のいずれかのセクションを参照してください。

ワークベンチとの対話

ワークベンチと対話する場合、生成結果リスナーを登録するプラグインを作成する必要があります。 さらに、Eclipse ランタイム・コードのデフォルトの動作をオーバーライドする必要があります。このデフォルトの動作とは通常、プラグインを、以前にロードしたプラグインによって必要とされる場合にのみロードすることを指します。

以下のようにします。
  1. コードをプラグインに書き込み、MANIFEST.MF ファイルを更新することで、使用するプラグインが以下のプラグインに依存するようにします。
    • com.ibm.etools.egl。これは製品インストール・ディレクトリー内にあります。
    • org.eclipse.ui。
  2. 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));
       }
    }
  3. 次の項目を plugin.xml ファイルに組み込みます。
    <extension point="org.eclipse.ui.startup">
       <startup class="com.ibm.test.egl.genresults.listener.StartupClass"/>
    </extension>
  4. このプラグインを JAR ファイルに以下のようにエクスポートします。
    1. 「ファイル」 > 「エクスポート」をクリックします。「エクスポート」ページが開きます。
    2. 「エクスポート宛先の選択」で、「プラグイン開発 (Plug-in Development)」を展開し、「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」をクリックします。 「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」ページが開きます。
    3. ページの中ほどにある「宛先 (Destinations)」タブで、Eclipse dropins フォルダー (例えば、C:¥Program Files¥IBM¥SDP80¥dropins) を指定します。
    4. 「オプション」タブをクリックして、「プラグインを個別の JAR アーカイブとしてパッケージ (Package plug-ins as individual JAR archives)」が選択されていることを確認します。
    5. 「終了」をクリックします。JAR ファイルが、plugins フォルダー内の dropins フォルダーに入ります。
    6. Windows エクスプローラーを開き、plugins フォルダーに移動します。
    7. 新規 JAR ファイルを、dropins フォルダーの直下に移動させます。
    8. 空の plugins フォルダーを削除します。

ワークベンチ・バッチ・インターフェース (EGLCMD) の使用

ワークベンチ・バッチ・インターフェース (EGLCMD) を使用する場合は、以下のようにします。
  1. プラグインを作成します。
  2. MANIFEST.MF ファイルを更新し、プラグインが com.ibm.etools.egl プラグイン (製品インストール・ディレクトリー内にある) に依存するようにします。
  3. 以下に示す 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()
       {}
    }
  4. このプラグインを JAR ファイルに以下のようにエクスポートします。
    1. 「ファイル」 > 「エクスポート」をクリックします。「エクスポート」ページが開きます。
    2. 「エクスポート宛先の選択」で、「プラグイン開発 (Plug-in Development)」を展開し、「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」をクリックします。 「デプロイ可能なプラグインおよびフラグメント (Deployable plug-ins and fragments)」ページが開きます。
    3. ページの中ほどにある「宛先 (Destinations)」タブで、Eclipse dropins フォルダー (例えば、C:¥Program Files¥IBM¥SDP80¥dropins) を指定します。
    4. 「オプション」タブをクリックして、「プラグインを個別の JAR アーカイブとしてパッケージ (Package plug-ins as individual JAR archives)」が選択されていることを確認します。
    5. 「終了」をクリックします。JAR ファイルが、plugins フォルダー内の dropins フォルダーに入ります。
    6. Windows エクスプローラーを開き、plugins フォルダーに移動します。
    7. 新規 JAR ファイルを、dropins フォルダーの直下に移動させます。
    8. 空の plugins フォルダーを削除します。
  5. 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 など。
  6. アプリケーションを以下のように呼び出します。
    java org.eclipse.core.launcher.Main -application 
       test.genresults.listener.TestCMD argument_list

    argument_list は、『EGLCMD』参照トピックで説明されている引数で置き換えます。

    この例では、test.genresults.listener はプラグインの名前であり、TestCMD は、plugin.xml 内の <extension> エレメントの id 属性の値です。

EGL ソフトウェア開発キット (EGLSDK) の使用

EGL ソフトウェア開発キット (EGLSDK) を使用する場合は、独自の Java クラスを作成し、それを EGLSDK コマンドの代わりに実行する必要があります。これは以下のようにします。
  1. eglbatchgen.jar ファイルが使用可能となるようにクラスパスを設定します。
    • コードを開発する場合、eglbatchgen.jar ファイルを Java コンパイラーのクラスパスに置く必要があります。
    • コードを実行する場合、eglbatchgen.jar ファイルが CLASSPATH システム変数に存在している必要があります。

    eglbatchgen.jar ファイルのロケーションおよび他の前提条件については、『EGL ソフトウェア開発キット (SDK) を使用した生成』を参照してください。

  2. 以下の例で示すとおり、タイプ 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 );
       }
    }
  3. 使用するクラスを 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();
    }

インターフェースの詳細

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();
}

フィードバック