blob: f9a95ffd992ce8101f034dfb13354b3f1253665c [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- -*- xhtml -*- -->
<title>NetBeans プラットフォーム 6.0、6.1、6.5: コードジェネレータの統合のチュートリアル</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="AUDIENCE" content="NBUSER"/>
<meta name="TYPE" content="ARTICLE"/>
<meta name="EXPIRES" content="N"/>
<meta name="developer" content="gwielenga@netbeans.org"/>
<meta name="indexed" content="y"/>
<meta name="description"
content="A short guide to using the Code Generator API."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>コードジェネレータの統合のチュートリアル</h1>
<p>このチュートリアルでは、新しい項目を NetBeans コード生成機能に統合するモジュールの記述方法について説明します。これは、エディタで Alt-Insert キーを押すと表示されます。</p>
<p><b>目次</b></p>
<p><img src="../images/articles/69/netbeans-stamp7-8-9.png" class="stamp" width="114" height="114" alt="このページの内容は NetBeans IDE 6.5、6.7、および 6.8 が対象です" title="このページの内容は NetBeans IDE 6.5、6.7、および 6.8 が対象です" /></p>
<ul class="toc">
<li><a href="#intro">コードジェネレータの統合入門</a></li>
<li><a href="#creating">モジュールプロジェクトの作成</a></li>
<li><a href="#use">「コードジェネレータ」ウィザードの使用</a></li>
<li><a href="#code">コードジェネレータの統合のコーディング</a></li>
<li><a href="#install">インストールおよび機能の動作確認</a></li>
<li><a href="#share">共有可能バイナリの作成</a></li>
</ul>
<p><b>このチュートリアルを行うには、次の表に示すソフトウェアおよびリソースが必要です。</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">ソフトウェアまたはリソース</th>
<th class="tblheader" scope="col">必須バージョン</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">version 6.7 以上</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
<td class="tbltd1">version 6 または<br/>version 5</td>
</tr>
</tbody>
</table>
<p class="tips">トラブルシューティングのために、<a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=11179">完了したサンプルをダウンロード</a>してソースを調べることもできます (任意)。</p>
<h2 class="tutorial"><a name="intro"></a>コードジェネレータの統合入門</h2>
<p>NetBeans IDE 6.5 で導入されたコードジェネレータ機能は、Alt-Insert キーを押すと表示される項目のリストで構成されます。各項目は、エディタ内にコードを生成します。</p>
<p><img src="../images/tutorials/code-generator/code-generator-5.png" alt="配備結果" /></p>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="creating"></a> モジュールプロジェクトの作成</h2>
<p>この節では、ウィザードを使用して、各 NetBeans モジュールが必要とするソースの構造を作成します。ソースの構造は、特定の場所にある特定のフォルダと、常に必要なファイルのセットで構成されます。たとえば、すべての NetBeans モジュールには、プロジェクトのメタデータを保存する <tt>nbproject</tt> フォルダと、ツールバーボタンやウィンドウなどの項目を宣言登録するための <tt>layer.xml</tt> ファイルが必要です。</p>
<ol>
<li>「ファイル」&gt;「新規プロジェクト」(Ctrl-Shift-N) を選択します。「カテゴリ」で「NetBeans モジュール」を選択します。「プロジェクト」で「モジュール」を選択し、「次へ」をクリックします。</li>
<li>「名前と場所」パネルで、「プロジェクト名」に「<tt>DemoCodeGenerator</tt>」と入力します。「プロジェクトの場所」を、<tt>c:\mymodules</tt> などのコンピュータ上の任意のディレクトリに変更します。「スタンドアロンモジュール」ラジオボタンは選択したままにしておきます。パネルは次のようになります。
<p><img src="../images/tutorials/code-generator/code-generator-1.png" alt="新規プロジェクトウィザードの手順 1。" /></p>
<p>「次へ」をクリックします。</p></li>
<li>「基本モジュール構成」パネルで、コード名ベースに「<tt>org.netbeans.modules.demo</tt>」と入力します。「XML レイヤーを生成」チェックボックスを選択し、「ローカライズ版バンドル」と「XML レイヤー」の場所はそのままにしておきます。これらは <tt>org/netbeans/modules/demo</tt> という名前のパッケージに格納されます。パネルは次のようになります。
<p><img src="../images/tutorials/code-generator/code-generator-2.png" alt="新規プロジェクトウィザードの手順 2。" /></p></li>
<li>「完了」をクリックします。</li></ol>
<p> IDE によって <tt>DemoCodeGenerator</tt> プロジェクトが作成されます。このプロジェクトには、ソースや、プロジェクトの Ant 構築スクリプトなどのプロジェクトメタデータがすべて含まれます。IDE でプロジェクトが開きます。「プロジェクト」ウィンドウ (Ctrl-1) で、プロジェクトの論理構造を表示できます。また、「ファイル」ウィンドウ (Ctrl-2) で、プロジェクトのファイル構造を表示できます。 </p>
<!-- ===================================================================================== -->
<h2><a name="use"></a>「コードジェネレータ」ウィザードの使用</h2>
<p>この節では、ウィザードを使用して、コードジェネレータ機能との統合を開始するために必要となるスタブクラスとレイヤーのエントリを作成します。</p>
<ol>
<li>プロジェクトノードを右クリックし、「新規」&gt;「その他」を選択します。次に示すように、「新規ファイル」ダイアログで、「モジュールの開発」&gt;「コードジェネレータ」を選択します。
<p><img src="../images/tutorials/code-generator/code-generator-3.png" alt="「コードジェネレータ」ウィザード" /></p>
</li>
<li>「新規コードジェネレータ」パネルで、次のとおりに設定します。
<ul>
<li><b>クラス名。</b>ウィザードで生成するスタブのクラス名を指定します。このフィールドには、「DemoCodeGenerator」と入力します。</li>
<li><b>パッケージ。</b>スタブクラスが生成されるパッケージを指定します。ドロップダウンから「org.netbeans.modules.demo」を選択します。</li>
<li><b>MIME タイプ。</b>コードジェネレータの統合が適用される MIME タイプを指定します。このフィールドには、「x-java」と入力します。</li>
<li><b>CodeGeneratorContextProvider を生成。</b>コードジェネレータのルックアップにほかのオブジェクトを追加します。このチェックボックスは、選択解除したままにします。</li>
</ul>
<p>画面は次のようになります。</p>
<p><img src="../images/tutorials/code-generator/code-generator-4.png" alt="高速検索テンプレート" /></p>
</li>
<li>「完了」をクリックします。
<p>「プロジェクト」ウィンドウは次のようになります。</p>
<p><img src="../images/tutorials/code-generator/code-generator-6.png" alt="プロジェクトの最終ウィンドウ。" /></p></li></ol>
<p><tt>layer.xml</tt> ファイルは、次のように表示されます。</p>
<pre>&lt;filesystem&gt;
&lt;folder name=&quot;Editors&quot;&gt;
&lt;folder name=&quot;text&quot;&gt;
&lt;folder name=&quot;x-java&quot;&gt;
&lt;folder name=&quot;CodeGenerators&quot;&gt;
&lt;file name=&quot;org-netbeans-modules-demo-DemoCodeGenerator$Factory.instance&quot;/&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/filesystem&gt;</pre>
<p>生成されたクラスは、次のようになります。</p>
<pre>public class DemoCodeGenerator implements CodeGenerator {
JTextComponent textComp;
/**
*
* @param context containing JTextComponent and possibly other items
* registered by {@link CodeGeneratorContextProvider}
*/
private DemoCodeGenerator(Lookup context) {
// Good practice is not to save Lookup outside ctor
textComp = context.lookup(JTextComponent.class);
}
public static class Factory implements CodeGenerator.Factory {
public List<? extends CodeGenerator> create(Lookup context) {
return Collections.singletonList(new DemoCodeGenerator(context));
}
}
/**
* The name which will be inserted inside Insert Code dialog
*/
public String getDisplayName() {
return &quot;Sample Generator&quot;;
}
/**
* This will be invoked when user chooses this Generator from Insert Code
* dialog
*/
public void invoke() {
}
}</pre>
<!-- ======================================================================================= -->
<h2><a name="code"></a>コードジェネレータの統合のコーディング</h2>
<p>次に、API を実装します。API のクラスは、次のとおりです。</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">クラス</th>
<th class="tblheader" scope="col">説明</th>
</tr>
<tr>
<td class="tbltd1">JavaSource</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">CancellableTask</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">WorkingCopy</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">CompilationUnitTree</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">TreeMaker</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">ClassTree</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">ModifiersTree</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">VariableTree</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">TypeElement</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">ExpressionTree</td>
<td class="tbltd1">後日記載</td>
</tr>
<tr>
<td class="tbltd1">MethodTree</td>
<td class="tbltd1">後日記載</td>
</tr>
</tbody>
</table>
<p>次では、必要なモジュールとの依存関係を設定し、その依存関係を独自のモジュールに実装します。</p>
<div class="indent">
<ol>
<li>プロジェクトを右クリックし、「プロパティー」を選択して「ライブラリ」パネルに次の 4 つの依存関係を設定します。
<p><img src="../images/tutorials/code-generator/code-generator-7.png" alt="依存関係の設定" /></p>
<p><b>注:</b> 「コードジェネレータ」ウィザードによって、「エディタライブラリ 2」と「ユーティリティー API」がすでに自動的に設定されていることがわかります。ほかの 2 つの依存関係は、「Javac API ラッパー」と「Java ソース」です。新しいコードジェネレータの統合を使用して、新しい Java コードスニペットを生成できる必要があります。</p></li>
<li>生成されたクラスを開いて、<tt>invoke()</tt> メソッドを次のように変更します。
<pre>public void invoke() {
try {
Document doc = textComp.getDocument();
JavaSource javaSource = JavaSource.forDocument(doc);
CancellableTask task = new CancellableTask&lt;WorkingCopy&gt;() {
public void run(WorkingCopy workingCopy) throws IOException {
workingCopy.toPhase(Phase.RESOLVED);
CompilationUnitTree cut = workingCopy.getCompilationUnit();
TreeMaker make = workingCopy.getTreeMaker();
for (Tree typeDecl : cut.getTypeDecls()) {
if (Tree.Kind.CLASS == typeDecl.getKind()) {
ClassTree clazz = (ClassTree) typeDecl;
ModifiersTree methodModifiers =
make.Modifiers(Collections.&lt;Modifier&gt;singleton(Modifier.PUBLIC),
Collections.&lt;AnnotationTree&gt;emptyList());
VariableTree parameter =
make.Variable(make.Modifiers(Collections.&lt;Modifier&gt;singleton(Modifier.FINAL),
Collections.&lt;AnnotationTree&gt;emptyList()),
&quot;arg0&quot;,
make.Identifier(&quot;Object&quot;),
null);
TypeElement element = workingCopy.getElements().getTypeElement(&quot;java.io.IOException&quot;);
ExpressionTree throwsClause = make.QualIdent(element);
MethodTree newMethod =
make.Method(methodModifiers,
&quot;writeExternal&quot;,
make.PrimitiveType(TypeKind.VOID),
Collections.&lt;TypeParameterTree&gt;emptyList(),
Collections.singletonList(parameter),
Collections.&lt;ExpressionTree&gt;singletonList(throwsClause),
&quot;{ throw new UnsupportedOperationException(\&quot;Not supported yet.\&quot;) }&quot;,
null);
ClassTree modifiedClazz = make.addClassMember(clazz, newMethod);
workingCopy.rewrite(clazz, modifiedClazz);
}
}
}
public void cancel() {
}
};
ModificationResult result = javaSource.runModificationTask(task);
result.commit();
} catch (Exception ex) {
Exceptions.printStackTrace(ex);
}
}</pre></li>
<li>次のインポート文が宣言されていることを確認します。
<pre>import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.ModifiersTree;
import com.sun.source.tree.Tree;
import com.sun.source.tree.TypeParameterTree;
import com.sun.source.tree.VariableTree;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeKind;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import org.netbeans.api.java.source.CancellableTask;
import org.netbeans.api.java.source.JavaSource;
import org.netbeans.api.java.source.JavaSource.Phase;
import org.netbeans.api.java.source.ModificationResult;
import org.netbeans.api.java.source.TreeMaker;
import org.netbeans.api.java.source.WorkingCopy;
import org.netbeans.spi.editor.codegen.CodeGenerator;
import org.netbeans.spi.editor.codegen.CodeGeneratorContextProvider;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;</pre> </li>
</ol>
</div>
<!-- ======================================================================================= -->
<h2><a name="install"></a>インストールおよび機能の動作確認</h2>
<p>次に、モジュールをインストールし、コードジェネレータ機能の統合を使用します。IDE は、Ant 構築スクリプトを使用してモジュールを構築およびインストールします。構築スクリプトは、プロジェクトを作成するときに作成されます。</p>
<div class="indent">
<ol>
<li>「プロジェクト」ウィンドウでプロジェクトを右クリックし、「実行」を選択します。
<p>IDE の新しいインスタンスが開始され、コードジェネレータの統合モジュールがインストールされます。 </p></li>
<li>Alt-Insert キーを押すと、新しい項目が含まれていることがわかります。
<p><img src="../images/tutorials/code-generator/code-generator-5.png" alt="配備結果" /></p></li>
<li>項目をクリックすると、コードが挿入されます。</li>
</ol>
</div>
<!-- ======================================================================================= -->
<h2><a name="share"></a>共有可能なモジュールバイナリの作成</h2>
<p>モジュールが完了したので、ほかの人にそのモジュールを使用させることができます。そのためには、バイナリの「NBM (NetBeans モジュール) ファイルを作成し、それを配布する必要があります。 </p>
<div class="indent">
<ol>
<li>「プロジェクト」ウィンドウでプロジェクトを右クリックし、「NBM を作成」を選択します。
<p>NBM ファイルが作成されます。これは「ファイル」ウィンドウ (Ctrl-2) で確認できます。</p></li>
<li>たとえば、<a href="http://plugins.netbeans.org/PluginPortal/">NetBeans プラグインポータル</a>を通じて、ほかの人がそのファイルを使用できるようにします。受信者は「プラグインマネージャー」(「ツール」&gt;「プラグイン」) を使用して、それをインストールします。</li>
</ol>
</div>
<!-- ======================================================================================== -->
<p><br/></p>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Quick%20Search%20Integration%20Tutorial">ご意見をお寄せください</a></div>
<p><br style="clear:both;" /></p>
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>次の手順</h2>
<p>NetBeans モジュールの作成と開発の詳細については、次のリソースを参照してください。 </p>
<ul>
<li><a href="https://platform.netbeans.org/index.html">NetBeans プラットフォームのホームページ</a></li>
<li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API の一覧 (現行の開発バージョン)</a></li>
<li><a href="https://netbeans.org/kb/trails/platform_ja.html">その他の関連チュートリアル</a></li></ul>
<!-- ======================================================================================== -->
<!--
<h2><a name="version"></a>Versioning </h2>
<p>
<table width="76%" border="1">
<tbody>
<tr>
<td>
<div align="left"><b>Version</b></div>
</td>
<td>
<div align="left"><b>Date</b></div>
</td>
<td>
<div align="left"><b>Changes</b></div>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
19 July 2008
</td>
<td>
Initial version.
</td>
</tr>
</tbody>
</table>
-->
</body>
</html>