// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Refactoring with Inspect and Transform in the NetBeans IDE Java Editor
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:syntax: true
:icons: font
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Refactoring with Inspect and Transform in the NetBeans IDE Java Editor - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Refactoring with Inspect and Transform in the NetBeans IDE Java Editor
:experimental:

The NetBeans IDE Java Editor features an Inspect and Transform feature, which is a refactoring tool for running various inspections and transformations on the selected scope of files at once. It also enables a user to define a custom inspection.

In this tutorial, you will learn to perform a code review using inspections with refactoring and predefined set of inspections, manage configurations, and create custom inspections.

== Setting Up the Tutorial Environment

In addition to the required software listed above you should have the link:https://netbeans.org/projects/samples/downloads/download/Samples/Java/inspecttransform.zip[+InspectTransform.zip+] file unzipped into your NetBeans project folder and opened in the NetBeans IDE as follows:

image::images/proj.png[]


== Running Inspections

The *Single Inspection* option in the *Inspect and Transform* dialog box (*Refactor > Inspect and Transform*) offers a big variety of inspections related to particular refactoring transformations. The complete list of such operations is available in the *Manage Inspections* dialog box after clicking the *Browse* button to the right of the *Single Inspection* option.

[.feature]
--
image::images/manage-inspections-small.png[role="left", link="images/manage-inspections.png"]
--

The Search field enables you to check if a required inspection is available using a keyword lookup. For example, there are several inspections found when  ``operator``  is searched for.

[.feature]
--
image::images/search-small.png[role="left", link="images/search.png"]
--

Every inspection is provided with a description available either in the Description field or in the *Manage Inspection dialog* box.

==== To run an inspection and apply an existing Inspection:

. In the *Projects* window, select the  `InspectTransform.java`  file.
. Choose *Refactor > Inspect and Transform* from the IDE's menu.
. In the *Inspect and Transform* dialog box, select the *Single Inspection* option and click *Browse.*
. In the *Manage Inspections* dialog box, choose the  `Assignment replaceable with operator-assignment`  inspection in the Assignment Issues node.
. Click *OK* to close the *Manage Inspections* dialog box.
. Click *Inspect* in the *Inspect and Transform* dialog box.
The suggested refactoring changes display in the preview panel.
+
[.feature]
--
image::images/single-inspection-small.png[role="left", link="images/single-inspection.png"]
--
+
. Click *Do Refactoring* to apply the changes if required.

== Using Configurations

A set of refactorings grouped together constitute a configuration that can be run on your scope of interest, for example, a class or several classes, packages, or projects. The IDE offers the following predefined configurations:

* <<migrate5,Migrate to JDK 5>>
* <<convert,Migrate to JDK 7>>
* <<migrate8,Migrate to JDK 8>>
* <<organize,Organize Imports>>

NOTE: Not all releases of the JDK introduce new language features. 

=== Migrate to JDK 5

The  ``Migrate to JDK 5``  configuration available in the IDE by default incorporates such refactoring operations as static imports, JDK 5 for-loop usage, unnecessary boxing and unboxing, and switch over Strings application.

[.feature]
--
image::images/jdk5-conf-small.png[role="left", link="images/jdk5-conf.png"]
--

NOTE: The list of refactorings in the configuration can be modified in the Inspections list of the *Manage Inspections* dialog box by selecting and deselecting the items under the  `JDK Migration Support`  node.

=== Migrate to JDK 7

The  ``Migrate to JDK 7``  configuration available in the IDE by default incorporates such refactoring operations as diamond operator usage, try-with-resources conversion, multicatch usage, switch over Strings application, and others.

[.feature]
--
image::images/jdk7-conf-small.png[role="left", link="images/jdk7-conf.png"]
--

NOTE: The list of refactorings in the configuration can be modified in the Inspections list of the *Manage Inspections* dialog box by selecting and deselecting the items under the  `JDK Migration Support`  node.

==== To run and apply the default  ``Migrate to JDK 7``  configuration:

. In the *Projects* window, select the  `PredefinedSet.java` file.
. Choose *Refactor > Inspect* and *Transform* from the IDE's menu.
. In the *Inspect and Transform* dialog box, select the *Configuration* option and choose the  `Migrate to JDK 7`  set of inspections from the drop-down list.
. Click *Inspect*.
Changes that convert the code to JDK 7 syntax display in the preview panel.
+
[.feature]
--
image::images/jdk7-ref-small.png[role="left", link="images/jdk7-ref.png"]
--
+
. Click *Do Refactoring* to apply the changes if required.

=== Migrate to JDK 8

The  ``Migrate to JDK 8``  configuration available in the IDE by default incorporates such refactoring operations as Lambda or Member Reference conversion, static imports, multicatch usage, switch over Strings application, and others.

[.feature]
--
image::images/jdk8-conf-small.png[role="left", link="images/jdk8-conf.png"]
--

NOTE: The list of refactorings in the configuration can be modified in the Inspections list of the *Manage Inspections* dialog box by selecting and deselecting the items under the  `JDK Migration Support`  node.

=== Organize Imports

The  ``Organize Imports``  configuration enables you to inspect the way import statements are organized in the code and refactor your code if desired. By default it includes a single inspection that checks whether import statements correspond to the specified code style rules.

NOTE: To configure the code style rules for import statements:

. Choose *Tools > Options > Editor > Formatting* in the main IDE toolbar.
. Select *Java* in the Language drop-down list.
. Select *Imports* in the *Category* drop-down list.
. Specify the available options as required.
+
[.feature]
--
image::images/org-imports-small.png[role="left", link="images/org-imports.png"]
--
+
. Click *OK* to save your edits.

==== To run and apply the default  ``Organize Imports `` configuration:

. In the *Projects* window, select the  `Imports.java`  file.
. Choose *Refactor > Inspect and Transform* from the IDE's menu.
. In the *Inspect and Transform* dialog box, select the Configuration option and choose the  `Organize Imports`  item.
. Click *Inspect*.
The preview panel displays one occurrence proposed for the Import section of the  `Imports.java`  file to make it aligned with the specified code style rules.
+
[.feature]
--
image::images/imports-ref-small.png[role="left", link="images/imports-ref.png"]
--
+
. Click *Do Refactoring* to apply the changes if necessary.

== Managing Custom Inspections

A custom inspection can be created to instruct the IDE what code structures are to be found and how to transform them.

NOTE: To avoid adding a duplicate inspection to the IDE, choose *Refactor > Inspect and Transform* from the main menu, click either *Manage* or *Browse*, and, in the *Manage Inspections* dialog box, use the *Search* field to look for the required inspection prior to creating a new inspection.

*To create a custom inspection:*

. Choose *Refactor > Inspect* and *Transform* from the IDE's menu.
. In the *Inspect and Transform* dialog box, click either *Manage* or *Browse*.
. In the *Manage Inspections* dialog box, click *New*.
A  `Custom > Inspection`  node is created in the Inspections list.
+
[.feature]
--
image::images/custom-hint-small.png[role="left", link="images/custom-hint.png"]
--
+
. (Optional) Right-click  ``Inspection`` , choose Rename from the popup menu, specify the name required for your custom inspection (for example,  ``MyCustomInspection`` ), and press Enter.
. Click Edit Script. The Script text area displays.
+
[.feature]
--
image::images/script-small.png[role="left", link="images/script.png"]
--
+
. Type the inspection description and code in the Script text area or click Open in Editor and specify the same in the  ``MyCustomInspection.hint``  file.
+
[.feature]
--
image::images/hint-file-small.png[role="left", link="images/hint-file.png"]
--
+
. Click *Save* below the Script text area or press kbd:[Ctrl] + kbd:[S] in the Editor to save your edits.
. Click *OK* to close the *Manage Inspections* dialog box or close the  ``MyCustomInspection.hint``  file in the Editor.
Your custom inspection is done and ready to be applied.

*To run the custom inspection you created:*

1. Choose *Refactor > Inspect and Transform* from the IDE's menu.
2. In the Inspect list of the *Inspect and Transform* dialog box, specify a file, package, or project(s) to be inspected. Alternatively, click the button to the right to open the *Custom Scope* dialog box and specify the custom code to be inspected.
3. Select the *Single Inspection* option and choose the  `MyCustomInspection`  inspection.
+
[.feature]
--
image::images/mycustomhint-small.png[role="left", link="images/mycustomhint.png"]
--
+
4. Click *Inspect*.
The suggested refactoring changes display in the preview panel.
5. Click *Do Refactoring* to apply the changes if required.

== Summary

This tutorial covers most frequent usages of the Inspect and Transform feature. Please note that with the Inspect and Transform functionality you can also perform custom refactoring at project scope, or apply particular refactoring configurations to several projects open in the IDE, etc.
