Hello Xウィザードについて

拡張機能のサンプルであるHello Xは、ユーザーが指定する文字列によってカスタマイズされる、Javaクラスを作成するウィザードです。たとえば、文字列がWorldの場合、次のクラスが作成されます。


public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }

Hello Xサンプルは、samples/oracle/addin/helloxにあります。

Hello Xウィザードは、1つのJavaクラス、HelloXで構成されており、これがWizardインタフェースおよびAddinインタフェースを実装します。アドインとしてのHelloXは、JDeveloperの起動時にロードされ、メニューから起動できます。ウィザードとしてのHelloXは、「新規」ギャラリから必要に応じてロードされ、起動できます。

ここに示したコード例は、HelloXサンプル・プロジェクトのものです。この例と他の拡張機能の例は、Oracle Technology Network(OTN)のWebサイト(http://otn.oracle.com/products/jdev/htdocs/partners/addins/exchange/docsamples/content.html)で入手できます。

ウィザードとしてのHelloXのロード

ウィザードの特長は、必要になるまでロードされないことです。「新規」ギャラリから起動されるウィザードは、カテゴリを開くとロードされます。

「新規」ギャラリに拡張機能として作成されたウィザードを表示する方法は、拡張機能の記述ファイルで定義します。Hello Xを「新規」ギャラリ・オブジェクトとしてインストールするには、jdev-ext.xmlに次のようなエントリを追加します。


<gallery> <name>samples.oracle.addin.hellox.HelloX</name> <description>Project Hello X</description> <help>Project Hello X</help> <category>General</category> <folder>Samples</folder> </gallery>

このエントリにより、「新規」ギャラリに表示される名前を指定し、Wizardインタフェースを実装するクラスを指定します。「新規」ギャラリを開くと、ギャラリ・マネージャがgallery.xmlを解析します。項目を表示する際には、マネージャがその項目をロードします。クラスが存在し、Wizardを実装する場合、マネージャはクラスをロードしてそのデフォルトのコンストラクタをコールし、インスタンスを作成および初期化します。インスタンスはJDeveloperを終了するまで存在し、すべてのコール要求を処理します。

アドインとしてのHelloXのロード

アドインは、JDeveloperの起動時にロードされます。メニューまたはツールバーから起動される拡張機能は、アドインとしてインストールする必要があります。インストールしないと、アドインのメニュー項目またはアイコンは表示されません。

ユーザーがインストールしたアドインは、拡張機能の記述ファイル(jdev-ext.xml)に次のように指定されている場合にロードされます。


<group name="Hello X"> <description>Extension samples</description> <extension> <addin>samples.oracle.addin.hellox.HelloX</addin> </extension> </group>

JDeveloperが起動すると、jdev-ext.xmlが読み込まれ、指定されたアドインがすべてロードされ、インスタンス化および初期化されます。インスタンスは、JDeveloperが終了するまで存在します。

ウィザードの起動

ウィザードが実際に選択される前に、ウィザードの「新規」ギャラリ・ページまたはメニューを開くと、ウィザード・マネージャでは、ウィザードのgetIconメソッドをコールしてそのグラフィックを取得し、isAvailableをコールして、アイコンおよび名前を表示して選択できるようにするかどうかを指定します。Hello Xの場合、生成されたクラス・ファイルは、現行コンテキスト(現在選択されているオブジェクト)がプロジェクト・ノードになるよう、既存のプロジェクトに追加する必要があります。



public boolean isAvailable(oracle.ide.addin.Context context) { Project p = context.getProject(); if ( (p != null) && (p instanceof JProject) ) return true; return false; }

ユーザーがウィザードの項目を選択すると、ウィザード・マネージャではそのinvokeメソッドをコールします。典型的なウィザードであるHello Xでは、ユーザーの入力(String greetee)を取得するモーダル・ダイアログが開かれ、入力された文字列をクラスおよびそのノードを作成するメソッドに渡します。



public boolean invoke(oracle.ide.addin.Context context, java.lang.String[] params) { if ( !this.isAvailable(context) ) return false; String greetee = null; JProject project = (JProject) context.getProject(); // Get the parameter from the user. greetee = JOptionPane.showInputDialog (new JDialog(), prompt, wizName, JOptionPane.OK_CANCEL_OPTION); if ( greetee == null ) return false; // Create the document and the node that represents it. if ( !createNode(project, greetee) ) return false; return true; }

Javaクラスの生成

Hello Xはコード生成ウィザードです。ファイル、ファイルの内容、およびJDeveloperでそのファイルを表すノードを作成します。

ノードを作成するために、クラス名からURLが作成されます。クラス名は、Hello、ユーザーが指定したgreeteeパラメータ、およびプロジェクトのURLを連結したものです。クラス・ファイルは、プロジェクトのディレクトリに作成されます。



protected boolean createNode ( JProject project, String greetee ) { String className = "Hello" + greetee; JavaSourceNode node = null; // Construct a URL for the class URL dirURL = getProjectSourceDirectory(project); if ( dirURL == null ) return false; URL classURL = URLFactory.newURL(dirURL, className + ".java"); if ( classURL == null ) return false; // Make sure the node doesn't already exist if ( NodeFactory.find(classURL) != null ) return false; // Create the node try { node = (JavaSourceNode) NodeFactory.findOrCreate(JavaSourceNode.class, classURL); project.add(node, true); node.open(); } catch (Throwable t) { return false; } // Create the content boolean success = createContent(node, project, className, greetee); if ( !success ) return false; // Open the document for editing. Ide.getEditorManager().openDefaultEditorInFrame(node); return true; }

クラス・ファイルの内容はJavaコードで、Java Object Tool(JOT)を使用して作成されます。JOTクラスは、クラス、メソッド、パラメータおよび式など、Javaの構文要素を表します。



protected boolean createContent ( JavaSourceNode node, JProject project, String className, String greetee ) { JotManager mgr = JotManager.getJotManager(project); JotFile jotFile = mgr.getFile(node.getURL()); String greeting = "\"Hello, " + greetee + "!\""; if ( jotFile == null ) return false; // Describe the class JotClass helloxClass = jotFile.addClass(className); helloxClass.setModifiers(Modifier.PUBLIC); helloxClass.setIsInterface(false); // Create the main method JotMethod mainMethod = helloxClass.addMethod(null, true, "void", "main"); mainMethod.setModifiers(Modifier.PUBLIC + Modifier.STATIC); mainMethod.addParameter("String[]", "args"); JotCodeBlock mainCodeBlock = mainMethod.getCodeBlock(); JotMethodCall printlnCall = mainCodeBlock.createMethodCall("System.out", "println"); printlnCall.addArgument(greeting); mainCodeBlock.addExpressionStatement((JotStatementExpression)printlnCall); // Write the JOT representation to the file jotFile.commitFile(false); return true; }

例: Hello Xウィザード
Hello Xウィザードのビルド

oracle.ide.addin.Addin
oracle.ide.addin.Wizard