<!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 Java Hint Module Tutorial for the NetBeans Platform</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 Java Hint API."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans Java Hint Module Tutorial</h1>

        <p>This tutorial demonstrates how to create a NetBeans module that provides
            one or more Java hints. At the end of the first scenario covered in this tutorial, whenever the user
            types "<tt>JOptionPane.showMessageDialog</tt>", a Java hint will appear, asking the user
            whether the statement is needed (or whether it is there because the user
            needed it for debugging):</p>

        <p><img alt="" src="../images/tutorials/hint/72/result-1.png"/></p>

        <p>At the end of the second scenario, the user will be able to click the hint to delete the superfluous
            statement:</p>

        <p><img alt="" src="../images/tutorials/hint/72/result-7.png"/></p>

        <p>In addition, the user will be able to find and replace multiple instances of the
            superfluous statement, after using the "Inspect & Transform" dialog in the Refactor menu,
            which displays all found instances in the Refactoring window:</p>

        <p><img alt="" src="../images/tutorials/hint/72/result-3.png"/></p>

        <p><b class="notes">Note:</b> This document is applicable to NetBeans IDE 7.2 and
            NetBeans Platform 7.2. If you
            are using an earlier version, see <a href="71/nbm-java-hint.html">the previous version
                of this document</a>.</p>

        <p><b>Contents</b></p>

        <img src="../images/articles/74/netbeans_stamp_74_73_72.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.2" title="Content on this page applies to NetBeans IDE 7.2"/>
        <ul class="toc">
            <li><a href="#learning">Learning About Java Hints</a></li>
            <li><a href="#creatingthemoduleproject">Setting Up the Module Project</a></li>
            <li><a href="#scenario-1">Scenario 1: Identifying Statements of Interest</a></li>
            <li><a href="#scenario-2">Scenario 2: Fixing Identified Statements</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.2 or above</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 7 or above</td>
                </tr>
            </tbody>
        </table>

        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="learning"></a>Learning About Java Hints</h2>
        <p>The best way to learn about the Java hint infrastructure is to read the sources
            of the Java hints that are part of the IDE. Start by identifying a hint that
            does something similar to what you would like to achieve, then check out the NetBeans sources,
            and read the source code of the related hint.</p>
        <div class="indent">
            <ol>
                <li>Use Mercurial to clone the NetBeans sources: <a href="http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial">http://wiki.netbeans.org/DevFaqAccessSourcesUsingMercurial</a></li>
                <li><p>In the NetBeans sources, browse to the "java.hints" folder, expand it, and read the
                        sources relevant to the hint you want to create:</p>
                    <br/>
                    <img src="../images/tutorials/hint/72/hint-list.png" alt="Step 1 of New Hint wizard"/>
                    <p class="tips"> The list of classes you see above is only the tip of the iceberg!</p>
                </li>
                </li>
            </ol>
        </div>
        <p>The remainder of the tutorial shows you how to put a Java hint together generally, from scratch, but
            remember that the best place to look for useful snippets of code is in the sources above,
            if there is anything specific that you don't know how to do.</p>

        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="creatingthemoduleproject"></a>Setting Up the Module Project</h2>
        <p>Before you start writing the module, you have to make sure you
            that your project is set up correctly. The IDE provides a wizard that sets up all the basic files
            needed for a module.</p>
        <div class="indent">
            <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>MyCustomHints</tt> in the Project Name field.
                    Change the Project Location to any directory on your computer. Click Next.</li>
                <li>In the Basic Module Configuration panel, type <tt>org.my.custom.hints</tt>
                    in Code Name Base. Click Finish.</li>
            </ol>
        </div>
        <p> The IDE creates the <tt>MyCustomHints</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="scenario-1"></a>Scenario 1: Identifying Statements of Interest</h2>

        <p>In this section, you provide the Java code for the Java hint.</p>

        <div class="indent">

            <ol>

                <li>Right-click the project node and choose New &gt; Other &gt; Module Development &gt; Java Hint: 
                    <br/><br/>
                    <img src="../images/tutorials/hint/72/new-hint-1.png" alt="Step 1 of New Hint wizard"/>
                    <p>Click Next.</p>
                </li>

                <li>In the New Java Hint Description panel, fill out the fields as follows: 
                    <br/><br/>
                    <img src="../images/tutorials/hint/72/new-hint-2.png" alt="Step 2 of New Hint wizard"/>
                    <p>Click Next.</p>
                </li>

                <li>In the New Java Hint Location panel, fill out the fields as follows: 
                    <br/><br/>
                    <img src="../images/tutorials/hint/72/new-hint-3.png" alt="Step 2 of New Hint wizard"/>
                    <p>Click Finish.</p>
                    <br/>
                    <p>The newly created class has the content below:</p>

                    <pre class="examplecode">package org.my.custom.hints;

import org.netbeans.spi.editor.hints.ErrorDescription;
import org.netbeans.spi.java.hints.ConstraintVariableType;
import org.netbeans.spi.java.hints.ErrorDescriptionFactory;
import org.netbeans.spi.java.hints.Hint;
import org.netbeans.spi.java.hints.HintContext;
import org.netbeans.spi.java.hints.TriggerPattern;
import org.openide.util.NbBundle.Messages;

<a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/Hint.html">@Hint</a>(displayName = "#DN_JOptionPaneHint", 
      description = "#DESC_JOptionPaneHint", 
      category = "general")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>({
    "DN_JOptionPaneHint=JOptionPane.showMessageDialog",
    "DESC_JOptionPaneHint=Checks for JOptionPane.showMessageDialog."
})
public class JOptionPaneHint {

    <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/TriggerPattern.html">@TriggerPattern</a>(
            value = "$str.equals(\"\")", //Specify a pattern as needed
            constraints =
                <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/ConstraintVariableType.html">@ConstraintVariableType</a>(
                    variable = "$str", 
                    type = "java.lang.String"))
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>("ERR_JOptionPaneHint=Is JOptionPane.showMessageDialog needed?")
    public static <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-editor-hints/org/netbeans/spi/editor/hints/ErrorDescription.html">ErrorDescription</a> computeWarning(<a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/HintContext.html">HintContext</a> ctx) {
        return <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/ErrorDescriptionFactory.html">ErrorDescriptionFactory</a>.forName(
                ctx, 
                ctx.getPath(), 
                Bundle.ERR_JOptionPaneHint());
    }
    
}</pre>
                </li>

                <li>Replace the <tt>@TriggerPattern</tt> with the following:

                    <pre class="examplecode">@TriggerPattern(
            value = "$1.showMessageDialog", 
            constraints = 
                @ConstraintVariableType(
                    variable = "$1", 
                    type = "javax.swing.JOptionPane"))</pre>                    
                </li>

                <li><p>Right-click the module and choose Build. Open the Files window (Ctrl-2) and browse
                        to the generated layer file, which is shown below:</p>
                    <br/>
                    <img src="../images/tutorials/hint/72/layer-1.png" alt="Layer 1"/>
                    <br/><br/><p>Open the layer file and you should see that the following has been generated from the
                        annotations in the class:</p>
                    <pre class="examplecode">&lt;folder name="org-netbeans-modules-java-hints"&gt;
    &lt;folder name="code-hints"&gt;
        &lt;folder name="org-my-custom-hints-JOptionPaneHint.class"&gt;
            &lt;folder name="org-netbeans-spi-java-hints-Hint.annotation"&gt;
                &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
                &lt;attr
                    bundlevalue="org.my.custom.hints.Bundle#DN_JOptionPaneHint" name="displayName"/&gt;
                &lt;attr
                    bundlevalue="org.my.custom.hints.Bundle#DESC_JOptionPaneHint" name="description"/&gt;
                &lt;attr name="category" stringvalue="general"/&gt;
            &lt;/folder&gt;
            &lt;folder name="computeWarning.method"&gt;
                &lt;folder name="org-netbeans-spi-java-hints-TriggerPattern.annotation"&gt;
                    &lt;folder name="constraints"&gt;
                        &lt;folder name="item0"&gt;
                            &lt;folder name="org-netbeans-spi-java-hints-ConstraintVariableType.annotation"&gt;
                                &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
                                &lt;attr name="variable" stringvalue="$1"/&gt;
                                &lt;attr name="type" stringvalue="javax.swing.JOptionPane"/&gt;
                            &lt;/folder&gt;
                            &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
                        &lt;/folder&gt;
                        &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
                    &lt;/folder&gt;
                    &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
                    &lt;attr name="value" stringvalue="$1.showMessageDialog"/&gt;
                &lt;/folder&gt;
                &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
            &lt;/folder&gt;
            &lt;!--org.my.custom.hints.JOptionPaneHint--&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/folder&gt;</pre>                    
                </li>

                <li><p>Switch back to the Projects window, right-click the module, and
                        choose Run. A new instance of the IDE starts up. The
                        module is installed automatically. Create a new Java application. Type 
                        <tt>JOptionPane.showMessageDialog</tt> somewhere in your code. You should see the 
                        <tt>showMessageDialog</tt> is underlined and you should also see the hint'
                        displayed:</p>
                    <p><img alt="" src="../images/tutorials/hint/72/result-1.png"/></p>
                    <p>When you click on the icon in the left sidebar, the popup below appears. Press the
                        Right key on the keyboard while the popup is shown
                        to expand it, so that you can configure it if necessary:</p>
                    <p><img alt="" src="../images/tutorials/hint/72/result-2.png"/></p>
                    <p>Go to Source | Inspect, click Single Inspection, and then click the Browse button. Use the
                        Search field to find your new inspection:</p>
                    <p><img alt="" src="../images/tutorials/hint/72/result-4.png"/></p>
                    <p>Set the Scope to "Open Projects", so that all projects will be searched for the statement
                        of interest, and check that your inspection is shown:</p>
                    <p><img alt="" src="../images/tutorials/hint/72/result-5.png"/></p>
                    <p>Click Inspect and notice that all instances of the statement of interest are found:</p>
                    <p><img alt="" src="../images/tutorials/hint/72/result-6.png"/></p>
                    <p>Double-click an item in the list above and the corresponding file opens, with
                        the cursor on the line where the statement of interest has been found.</p>
                </li>

            </ol>

            <p>Though you are able to find statements throughout your projects, you're not able
                to fix them yet. That topic is covered in the next scenario.</p>

        </div>


        <!-- ======================================================================================= -->

        <h2><a name="scenario-2"></a>Scenario 2: Fixing Identified Statements</h2>
        <p>In this section, you learn how to fix statements of interest that have been identified via
            the instructions in the previous section.</p>

        <div class="indent">

            <ol>

                <li><p>Add the Java fix below as an inner class of the class created in the previous
                        section.</p>

                    <pre class="examplecode">private static final class FixImpl extends <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-java-hints/org/netbeans/spi/java/hints/JavaFix.html">JavaFix</a> {

    public FixImpl(CompilationInfo info, TreePath tp) {
        super(info, tp);
    }

    @Override
    @Messages("FIX_ShowMessageDialogChecker=Remove the statement")
    protected String getText() {
        return Bundle.FIX_ShowMessageDialogChecker();
    }

    @Override
    protected void performRewrite(TransformationContext tc) throws Exception {
        WorkingCopy wc = tc.getWorkingCopy();
        TreePath statementPath = tc.getPath();
        TreePath blockPath = tc.getPath().getParentPath();
        while (!(blockPath.getLeaf() instanceof BlockTree)) {
            statementPath = blockPath;
            blockPath = blockPath.getParentPath();
            if (blockPath == null) {
                return;
            }
        }
        BlockTree blockTree = (BlockTree) blockPath.getLeaf();
        List&lt;? extends StatementTree&gt; statements = blockTree.getStatements();
        List&lt;StatementTree&gt; newStatements = new ArrayList&lt;StatementTree&gt;();
        for (Iterator&lt;? extends StatementTree&gt; it = statements.iterator(); it.hasNext();) {
            StatementTree statement = it.next();
            if (statement != statementPath.getLeaf()) {
                newStatements.add(statement);
            }
        }
        BlockTree newBlockTree = wc.getTreeMaker().Block(newStatements, blockTree.isStatic());
        wc.rewrite(blockTree, newBlockTree);
    }

}</pre>            
                    <p class="tips"> The code above comes from the NetBeans sources, where it
                        is used in the SystemOut class, in the "java.hints" module, for removing
                        found instances of <tt>System.out</tt>.</p>

                </li>

                <li><p>Add the fix to the error description you defined in the previous section; you
                        only need to add the code highlighted below:</p>

                    <pre class="examplecode">public static ErrorDescription computeWarning(HintContext ctx) {
    <b><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-editor-hints/org/netbeans/spi/editor/hints/Fix.html?is-external=true">Fix</a> fix = new FixImpl(ctx.getInfo(), ctx.getPath()).toEditorFix();</b>
    return ErrorDescriptionFactory.forName(
            ctx,
            ctx.getPath(),
            Bundle.ERR_JOptionPaneHint(),
            <b>fix</b>);
}</pre>                

                </li>

                <li><p>Check that you have these import statements:</p>

                    <pre class="examplecode">import com.sun.source.tree.BlockTree;
import com.sun.source.tree.StatementTree;
import com.sun.source.util.TreePath;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.netbeans.api.java.source.CompilationInfo;
import org.netbeans.api.java.source.WorkingCopy;
import org.netbeans.spi.editor.hints.ErrorDescription;
import org.netbeans.spi.editor.hints.Fix;
import org.netbeans.spi.java.hints.ConstraintVariableType;
import org.netbeans.spi.java.hints.ErrorDescriptionFactory;
import org.netbeans.spi.java.hints.Hint;
import org.netbeans.spi.java.hints.HintContext;
import org.netbeans.spi.java.hints.JavaFix;
import org.netbeans.spi.java.hints.JavaFix.TransformationContext;
import org.netbeans.spi.java.hints.TriggerPattern;
import org.openide.util.NbBundle.Messages;</pre>                

                </li>

                <li>Install the module again and you will be able to click the hint to delete the superfluous
                    statement:</p>

                    <p><img alt="" src="../images/tutorials/hint/72/result-7.png"/></p>

                    <p>In addition, you should be able to find and replace multiple instances of the
                        superfluous statement, after using the "Inspect & Transform" dialog in the Refactor menu,
                        which displays all found instances in the Refactoring window:</p>

                    <p><img alt="" src="../images/tutorials/hint/72/result-3.png"/></p>

            </ol>
        </div>        
        <p>In this tutorial, you have been introduced to the NetBeans Java hint infrastructure. To obtain a deeper
            understanding, see the sources referred to at the start of this tutorial, as well as the resources
            referred to below.</p>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Java%20Hint%207.2%20Tutorial">Send Us Your Feedback</a></div>

        <h2><a name="nextsteps"></a>See Also</h2>

        <p>For more information about creating and developing NetBeans Module, see the following resources: </p>
        <ul>
            <li><a href="http://wiki.netbeans.org/Java_DevelopersGuide">Java Developer's Guide</a></li>
            <li><a href="https://platform.netbeans.org/tutorials/nbm-copyfqn.html">NetBeans Java Language Infrastructure Tutorial</a></li>
            <li><a href="http://wiki.netbeans.org/RetoucheDeveloperFAQ">Retouche Developer FAQ</a></li>
            <li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
            <li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API Javadoc</a></li>
        </ul>


        <!-- ======================================================================================== -->

        <!-- ======================================================================================== 
        
        <h2><a name="version"></a>Versioning </h2>
          
        <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>Comments</b></div>
              </td>
        </tr>
        <tr>
              <td>
                 1
              </td>
              <td>
                      15 November 2008
              </td>
              <td>
                 Initial version.
              </td>
         </tr>
         <tr>
              <td>
                 2
              </td>
              <td>
                      12 November 2011
              </td>
              <td>
                 Updated for 7.1.
              </td>
        </tr>
        <tr>
              <td>
                 3
              </td>
              <td>
                      8 and 9 July 2012
              </td>
              <td>
                 Completely rewrote the tutorial for 7.2.
              </td>
        </tr>
        
        </tbody>
        
        </table>-->

    </body>

</html>
