Class ImportOrderCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public class ImportOrderCheck
    extends AbstractCheck
    Checks the ordering/grouping of imports. Features are:
    • groups imports: ensures that groups of imports come in a specific order (e.g., java. comes first, javax. comes second, then everything else)
    • adds a separation between groups : ensures that a blank line sit between each group
    • import groups aren't separated internally: ensures that each group aren't separated internally by blank line or comment
    • sorts imports inside each group: ensures that imports within each group are in lexicographic order
    • sorts according to case: ensures that the comparison between import is case sensitive
    • groups static imports: ensures that static imports are at the top (or the bottom) of all the imports, or above (or under) each group, or are treated like non static imports (@see ImportOrderOption
    .
     Properties:
     
    nameDescriptiontypedefault value
    optionpolicy on the relative order between regular imports and static importsImportOrderOptionunder
    groupslist of type import groups (every group identified either by a common prefix string, or by a regular expression enclosed in forward slashes (e.g. /regexp/). All type imports, which does not match any group, falls into an additional group, located at the end. Thus, the empty list of type groups (the default value) means one group for all type imports list of stringsempty list
    orderedwhether type imports within group should be sorted Booleantrue
    separatedwhether type imports groups should be separated by, at least, one blank line or comment and aren't separated internally Booleanfalse
    separatedStaticGroupswhether static imports should be separated by, at least, one blank line or comment and aren't separated internally Booleanfalse
    caseSensitivewhether string comparison should be case sensitive or not. Case sensitive sorting is in ASCII sort orderBooleantrue
    staticGroupslist of static import groups (every group identified either by a common prefix string, or by a regular expression enclosed in forward slashes (e.g. /regexp/). All static imports, which does not match any group, falls into an additional group, located at the end. Thus, the empty list of static groups (the default value) means one group for all static imports list of stringsempty list
    sortStaticImportsAlphabeticallywhether static imports located at top or bottom are sorted within the group.Booleanfalse
    useContainerOrderingForStaticwhether to use container ordering (Eclipse IDE term) for static imports or notBooleanfalse

    Example:

    To configure the check so that it matches default Eclipse formatter configuration (tested on Kepler, Luna and Mars):

    • group of static imports is on the top
    • groups of non-static imports: "java" then "javax" packages first, then "org" and then all other imports
    • imports will be sorted in the groups
    • groups are separated by, at least, one blank line and aren't separated internally
     <module name="ImportOrder">
        <property name="groups" value="/^javax?\./,org"/>
        <property name="ordered" value="true"/>
        <property name="separated" value="true"/>
        <property name="option" value="above"/>
        <property name="sortStaticImportsAlphabetically" value="true"/>
     </module>
     

    To configure the check so that it matches default IntelliJ IDEA formatter configuration (tested on v14):

    • group of static imports is on the bottom
    • groups of non-static imports: all imports except of "javax" and "java", then "javax" and "java"
    • imports will be sorted in the groups
    • groups are separated by, at least, one blank line and aren't separated internally

    Note: "separated" option is disabled because IDEA default has blank line between "java" and static imports, and no blank line between "javax" and "java"

     <module name="ImportOrder">
         <property name="groups" value="*,javax,java"/>
         <property name="ordered" value="true"/>
         <property name="separated" value="false"/>
         <property name="option" value="bottom"/>
         <property name="sortStaticImportsAlphabetically" value="true"/>
     </module>
     

    To configure the check so that it matches default NetBeans formatter configuration (tested on v8):

    • groups of non-static imports are not defined, all imports will be sorted as a one group
    • static imports are not separated, they will be sorted along with other imports
     <module name="ImportOrder">
         <property name="option" value="inflow"/>
     </module>
     

    Group descriptions enclosed in slashes are interpreted as regular expressions. If multiple groups match, the one matching a longer substring of the imported name will take precedence, with ties broken first in favor of earlier matches and finally in favor of the first matching group.

    There is always a wildcard group to which everything not in a named group belongs. If an import does not match a named group, the group belongs to this wildcard group. The wildcard group position can be specified using the * character.

    Check also has on option making it more flexible: sortStaticImportsAlphabetically - sets whether static imports grouped by top or bottom option should be sorted alphabetically or not, default value is false. It is applied to static imports grouped with top or bottom options.
    This option is helping in reconciling of this Check and other tools like Eclipse's Organize Imports feature.

    To configure the Check allows static imports grouped to the top being sorted alphabetically:

     
     import static java.lang.Math.abs;
     import static org.abego.treelayout.Configuration.AlignmentInLevel; // OK, alphabetical order
    
     import org.abego.*;
    
     import java.util.Set;
    
     public class SomeClass { ... }
     
     
    • Field Detail

      • MSG_SEPARATION

        public static final String MSG_SEPARATION
        A key is pointing to the warning message text in "messages.properties" file.
        See Also:
        Constant Field Values
      • MSG_ORDERING

        public static final String MSG_ORDERING
        A key is pointing to the warning message text in "messages.properties" file.
        See Also:
        Constant Field Values
      • MSG_SEPARATED_IN_GROUP

        public static final String MSG_SEPARATED_IN_GROUP
        A key is pointing to the warning message text in "messages.properties" file.
        See Also:
        Constant Field Values
    • Constructor Detail

      • ImportOrderCheck

        public ImportOrderCheck()
    • Method Detail

      • setOption

        public void setOption​(String optionStr)
        Set the option to enforce.
        Parameters:
        optionStr - string to decode option from
        Throws:
        IllegalArgumentException - if unable to decode
      • setGroups

        public void setGroups​(String... packageGroups)
        Sets the list of package groups for type imports and the order they should occur in the file.
        Parameters:
        packageGroups - a comma-separated list of package names/prefixes.
      • setStaticGroups

        public void setStaticGroups​(String... packageGroups)
        Sets the list of package groups for static imports and the order they should occur in the file. This property has effect only when the property option is set to top or bottom.)
        Parameters:
        packageGroups - a comma-separated list of package names/prefixes.
      • setOrdered

        public void setOrdered​(boolean ordered)
        Sets whether or not imports should be ordered within any one group of imports.
        Parameters:
        ordered - whether lexicographic ordering of imports within a group required or not.
      • setSeparated

        public void setSeparated​(boolean separated)
        Sets whether or not groups of type imports must be separated from one another by at least one blank line or comment.
        Parameters:
        separated - whether groups should be separated by one blank line or comment.
      • setSeparatedStaticGroups

        public void setSeparatedStaticGroups​(boolean separatedStaticGroups)
        Sets whether or not groups of static imports must be separated from one another by at least one blank line or comment. This property has effect only when the property option is set to top or bottom.)
        Parameters:
        separatedStaticGroups - whether groups should be separated by one blank line or comment.
      • setCaseSensitive

        public void setCaseSensitive​(boolean caseSensitive)
        Sets whether string comparison should be case sensitive or not.
        Parameters:
        caseSensitive - whether string comparison should be case sensitive.
      • setSortStaticImportsAlphabetically

        public void setSortStaticImportsAlphabetically​(boolean sortAlphabetically)
        Sets whether static imports (when grouped using 'top' and 'bottom' option) are sorted alphabetically or according to the package groupings.
        Parameters:
        sortAlphabetically - true or false.
      • setUseContainerOrderingForStatic

        public void setUseContainerOrderingForStatic​(boolean useContainerOrdering)
        Sets whether to use container ordering (Eclipse IDE term) for static imports or not.
        Parameters:
        useContainerOrdering - whether to use container ordering for static imports or not.
      • getDefaultTokens

        public int[] getDefaultTokens()
        Description copied from class: AbstractCheck
        Returns the default token a check is interested in. Only used if the configuration for a check does not define the tokens.
        Specified by:
        getDefaultTokens in class AbstractCheck
        Returns:
        the default tokens
        See Also:
        TokenTypes
      • getAcceptableTokens

        public int[] getAcceptableTokens()
        Description copied from class: AbstractCheck
        The configurable token set. Used to protect Checks against malicious users who specify an unacceptable token set in the configuration file. The default implementation returns the check's default tokens.
        Specified by:
        getAcceptableTokens in class AbstractCheck
        Returns:
        the token set this check is designed for.
        See Also:
        TokenTypes
      • getRequiredTokens

        public int[] getRequiredTokens()
        Description copied from class: AbstractCheck
        The tokens that this check must be registered for.
        Specified by:
        getRequiredTokens in class AbstractCheck
        Returns:
        the token set this must be registered for.
        See Also:
        TokenTypes
      • beginTree

        public void beginTree​(DetailAST rootAST)
        Description copied from class: AbstractCheck
        Called before the starting to process a tree. Ideal place to initialize information that is to be collected whilst processing a tree.
        Overrides:
        beginTree in class AbstractCheck
        Parameters:
        rootAST - the root of the tree