<!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>Code Generator Integration Tutorial for NetBeans Platform 7.1</title>
  <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
  <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>Code Generator Integration Tutorial</h1>

<p>This tutorial shows you how to write a module that integrates
 new items into the NetBeans Code Generator feature, which appears
 when you click Alt-Insert in an editor.</p>

   <p><b>Contents</b></p>
   
      <p><img src="../../images/articles/71/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.1" title="Content on this page applies to NetBeans IDE 7.1"/></p>
      <ul class="toc">
  <li><a href="#intro">Introduction to Code Generator Integration</a></li>
  <li><a href="#creating">Creating the Module Project</a></li>
  <li><a href="#use">Using the Code Generator Provider Wizard</a></li>
  <li><a href="#code">Coding the Code Generator Integration</a></li>
  <li><a href="#install">Installing and Trying Out the Functionality</a></li>
  <li><a href="#share">Creating a Shareable Binary</a></li>
       </ul>
         
<p><b>To follow this tutorial, you need the software and resources listed in the following 
table.</b></p>

      <table>
        <tbody>
            <tr>
                <th class="tblheader" scope="col">Software or Resource</th>
                <th class="tblheader" scope="col">Version Required</th>
            </tr> 
           <tr>
                <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                <td class="tbltd1">version 7.1</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 or above</td>
            </tr>
        </tbody>
    </table>
    
<h2 class="tutorial"><a name="intro"></a>Introduction to Code Generator Integration</h2>

<p>The Code Generator feature, consisting of a user interface and an API, introduced in NetBeans IDE 6.5, consists of
 a list of items that appears when you press Alt-Insert.
 Each item generates code into the editor. In this tutorial, you will create a sample generator, as shown below,
 which will generate a method into a Java class:</p>

<p><img style="border: 1px solid black" src="../../images/tutorials/code-generator/71/result-1.png" alt="Deployed result"/></p>

<!-- ===================================================================================== -->

<h2 class="tutorial"><a name="creating"></a>Creating the Module Project</h2>
      
<p>In this section, we use a wizard to create the source structure that every NetBeans module requires. The
source structure consists of certain folders in specific places and a set of files that are
always needed for Ant-based NetBeans modules. For example, every Ant-based NetBeans module 
requires a <tt>nbproject</tt> folder, which holds
the project's metadata.</p>

<ol>
          
	      <li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Modules. Under Projects, 
 select Module. Click Next.</li>
	<li>In the Name and Location panel, type <tt>DemoCodeGenerator</tt> in Project Name.
 Change the
Project Location to any directory on your computer. Click Next.</li>

<li>In the Basic Module Configuration panel, type <tt>org.netbeans.modules.demo</tt>
 as the Code Name Base. Click Finish.</li></ol>

<p> The IDE creates the <tt>DemoCodeGenerator</tt>
project. The project contains all of your sources and
project metadata, such as the project's Ant build script. The project
opens in the IDE. You can view its logical structure in the Projects window (Ctrl-1) and its
file structure in the Files window (Ctrl-2). </p>

<!-- ===================================================================================== -->
<h2><a name="use"></a>Using the Code Generator Provider Wizard</h2>

<p>In this section, we use a wizard to create the stub class and
 registration entries necessary for beginning our integration with the
 Code Generator feature.</p>

  
 <ol>
	
	 <li><p>Right-click the project node and 
	      choose New &gt; Other. In the New File dialog,
              choose Module Development &gt; Code Generator,
              as shown below:</p>
              <p><img src="../../images/tutorials/code-generator/71/new-file-wizard.png" alt="Code generator wizard."/></p>
              </li>
	      <li>In the New Code Generator panel, set the following:
        <ul>
            <li><b>Class Name.</b> Specifies the class 
            name of the stub that the wizard will generate. Type 
            "DemoCodeGenerator"
            in this field.</li>
            <li><b>Package.</b> Specifies the package where the stub class 
                will be generated. Select "org.netbeans.modules.demo" from the drop-down.</li>
            <li><b>MimeType.</b> Specifies 
            the MIME type to which the code generator
            integration will be applied. Type "x-java"
            in this field.</li>
            <li><b>Generate CodeGeneratorContextProvider.</b> 
            Adds additional objects to the code generator's
            lookup. Leave this checkbox unselected.</li>
          </ul>
                  <p>You should now see the following:</p>
                  <p><img src="../../images/tutorials/code-generator/71/new-file-wizard2.png" alt="Quick search template"/></p>
              </li>
<li>Click Finish.

    <p>The Projects window should now show the following:</p>

<p><img src="../../images/tutorials/code-generator/71/new-file-wizard3.png" alt="Final Projects window."/></p></li></ol>

<p>In the <tt>layer.xml</tt> file, you should see the following:</p>
      
<pre class="examplecode">&lt;filesystem&gt;
    &lt;folder name="Editors"&gt;
        &lt;folder name="text"&gt;
            &lt;folder name="x-java"&gt;
                &lt;folder name="CodeGenerators"&gt;
                    &lt;file name="org-netbeans-modules-demo-DemoCodeGenerator$Factory.instance"/&gt;
                &lt;/folder&gt;
            &lt;/folder&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/filesystem&gt;</pre>      

<p>The generated class should look like this:</p>

<pre class="examplecode">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 "Sample Generator";
    }

    /**
     * This will be invoked when user chooses this Generator from Insert Code
     * dialog
     */
    public void invoke() {
    }
    
}</pre>

    <!-- ======================================================================================= -->
      
      <h2><a name="code"></a>Coding the Code Generator Integration</h2>
<p>Next, we will implement the NetBeans Java Editor APIs
     introduced in the <a href="https://platform.netbeans.org/tutorials/nbm-copyfqn.html">NetBeans Java Language Infrastructure Tutorial</a>.</p> 
   <!-- The API's classes are as follows:</p>


      <table>
        <tbody>
            <tr>
                <th class="tblheader" scope="col">Class</th>
                <th class="tblheader" scope="col">Description</th>
            </tr>
            <tr>
                <td class="tbltd1">JavaSource</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">CancellableTask</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">WorkingCopy</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">CompilationUnitTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">TreeMaker</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">ClassTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">ModifiersTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">VariableTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">TypeElement</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">ExpressionTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            <tr>
                <td class="tbltd1">MethodTree</td>
                <td class="tbltd1">To be done...</td>
            </tr>
            
        </tbody>
    </table>-->
    
<p>Below, we set dependencies on the required modules and then implement them in
    our own module.</p>

<div class="indent">
    
    <ol>
        
        <li><p>Right-click the project, choose Properties, and
        add the following dependencies in the Libraries panel:</p>
            <p></p>
            <ul>
                <li>Editor Library 2</li>
                <li>Javac API Wrapper</li>
                <li>Java Source</li>
                <li>Lookup API</li>
                <li>Utilities API</li>
            </ul>
            
        <p><b>Note:</b> You will notice that some of the dependencies listed above
        have already been set automatically by the
        Code Generator wizard. The other dependencies, you will need to set
        yourself to
        be able to generate new Java code snippets via your new
        Code Generator integration, as explained below.</p></li>
        
        <li>Open the generated class and modify the <tt>invoke()</tt> method as follows:
    
<pre class="examplecode">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()), 
                                "arg0", 
                                make.Identifier("Object"), 
                                null);
                        TypeElement element = workingCopy.getElements().getTypeElement("java.io.IOException");
                        ExpressionTree throwsClause = make.QualIdent(element);
                        MethodTree newMethod = 
                                make.Method(methodModifiers, 
                                "writeExternal", 
                                make.PrimitiveType(TypeKind.VOID), 
                                Collections.&lt;TypeParameterTree&gt;emptyList(), 
                                Collections.singletonList(parameter), 
                                Collections.&lt;ExpressionTree&gt;singletonList(throwsClause), 
                                "{ throw new UnsupportedOperationException(\"Not supported yet.\") }", 
                                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>Make sure the following import statements are declared:
 
<pre class="examplecode">import com.sun.source.tree.*;
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.JavaSource.Phase;
import org.netbeans.api.java.source.*;
import org.netbeans.spi.editor.codegen.CodeGenerator;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;</pre> </li>
 
 </ol>
    </div>

      
    <!-- ======================================================================================= -->

<h2><a name="install"></a>Installing and Trying Out the Functionality</h2>
<p>Let's now install the module and then use the code generator feature
 integration.
  The IDE uses an Ant build script to build and install your module. The build 
  script was created for you
when you created the project.</p>
<div class="indent">


      <ol>
	      <li>In the Projects window, right-click the project and choose Run. 
                  A new instance of the IDE starts up
                  and installs the Code Generator integration module. </p></li>
               <li><p>Create a new Java application and open a Java source file.
                    Press Alt-Insert inside the editor and you will see your new item included:</p>
                   <p><img style="border: 1px solid black" src="../../images/tutorials/code-generator/71/result-1.png" alt="Deployed result"/></p></li>
                   <li><p>Click an item and the code will be inserted:</p>
                   <p><img style="border: 1px solid black" src="../../images/tutorials/code-generator/71/result-2.png" alt="Deployed result"/></p></li>
       </ol>          
   </div>
    
<!-- ======================================================================================= -->

<h2><a name="share"></a>Creating a Shareable Module Binary</h2>

<p>Now that the module is complete, you can let others use it. To do so, you
    need to create a binary "NBM" (NetBeans module) file and distribute it. </p>

<div class="indent">
  
      <ol>
	      <li>In the Projects window, right-click the project and choose Create NBM.

                  <p>The NBM file is created and you can view it in the Files window (Ctrl-2).</p></li>
	      <li>Make it available to others via, for example, the
              <a href="http://plugins.netbeans.org/PluginPortal/">NetBeans Plugin Portal</a>.
              The recipient should
	      use the Plugin Manager (Tools &gt; Plugins) to install it.</li>
       </ol>
 
    </div>


<!-- ======================================================================================== -->


<p><br/></p>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Code%20Generator%20Integration%20Tutorial%207.1">Send Us Your Feedback</a></div>
<p><br style="clear:both;" /></p>
  
  
<!-- ======================================================================================== -->

<h2><a name="nextsteps"></a>Next Steps</h2>

<p>For more information about creating and developing NetBeans modules, see the following resources: </p>
  <ul>
	  <li><a href="https://platform.netbeans.org/index.html">NetBeans Platform Homepage</a></li>
	  <li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a></li>
  <li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</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>
  <tr>
      <td>
         2
      </td>
      <td>
         11 November 2011
      </td>
      <td>
      Worked through the whole thing and tweaked for 7.1.
      </td>
  </tr>
 </tbody>
</table>
-->
</body>
</html>
