Class PkgImportControl


  • class PkgImportControl
    extends AbstractImportControl
    Represents a tree of import rules for a specific package. Each instance may have zero or more children. A child may be a sub-package, a class, or an allow/disallow rule.
    • Constructor Detail

      • PkgImportControl

        PkgImportControl​(String packageName,
                         boolean regex,
                         MismatchStrategy strategyOnMismatch)
        Construct a root, package node.
        Parameters:
        packageName - the name of the package.
        regex - flags interpretation of name as regex pattern.
        strategyOnMismatch - strategy in a case if matching allow/disallow rule was not found.
      • PkgImportControl

        PkgImportControl​(PkgImportControl parent,
                         String subPackageName,
                         boolean regex,
                         MismatchStrategy strategyOnMismatch)
        Construct a sub-package node. The concatenation of regular expressions needs special care: see ensureSelfContainedRegex(String, boolean) for more details.
        Parameters:
        parent - the parent package.
        subPackageName - the name of the current sub-package.
        regex - flags interpretation of name as regex pattern.
        strategyOnMismatch - strategy in a case if matching allow/disallow rule was not found.
    • Method Detail

      • ensureSelfContainedRegex

        private static String ensureSelfContainedRegex​(String input,
                                                       boolean alreadyRegex)
        Returns a regex that is suitable for concatenation by 1) either converting a plain string into a regular expression (handling special characters) or 2) by enclosing input in a (non-capturing) group if input already is a regular expression.

        1) When concatenating a non-regex package component (like "org.google") with a regex component (like "[^.]+") the other component has to be converted into a regex too, see toRegex(String).

        2) The grouping is strictly necessary if a) input is a regular expression that b) contains the alteration character ('|') and if c) the pattern is not already enclosed in a group - as you see in this example: parent="com|org", child="common|uncommon" will result in the pattern "(?:org|com)\.(?common|uncommon)" what will match "com.common", "com.uncommon", "org.common", and "org.uncommon". Without the grouping it would be "com|org.common|uncommon" which would match "com", "org.common", and "uncommon", which clearly is undesirable. Adding the group fixes this.

        For simplicity the grouping is added to regular expressions unconditionally.

        Parameters:
        input - the input string.
        alreadyRegex - signals if input already is a regular expression.
        Returns:
        a regex string.
      • encloseInGroup

        private static String encloseInGroup​(String expression)
        Enclose expression in a (non-capturing) group.
        Parameters:
        expression - the input regular expression
        Returns:
        a grouped pattern.
      • toRegex

        private static String toRegex​(String input)
        Converts a normal package name into a regex pattern by escaping all special characters that may occur in a java package name.
        Parameters:
        input - the input string.
        Returns:
        a regex string.
      • createPatternForPartialMatch

        private static Pattern createPatternForPartialMatch​(String expression)
        Creates a Pattern from expression that matches exactly and child packages.
        Parameters:
        expression - a self-contained regular expression matching the full package exactly.
        Returns:
        a Pattern.
      • createPatternForExactMatch

        private static Pattern createPatternForExactMatch​(String expression)
        Creates a Pattern from expression.
        Parameters:
        expression - a self-contained regular expression matching the full package exactly.
        Returns:
        a Pattern.
      • addChild

        public void addChild​(AbstractImportControl importControl)
        Adds new child import control.
        Parameters:
        importControl - child import control
      • matchesAtFront

        private boolean matchesAtFront​(String pkg)
        Matches other package name exactly or partially at front.
        Parameters:
        pkg - the package to compare with.
        Returns:
        if it matches.
      • matchesAtFrontNoRegex

        private boolean matchesAtFrontNoRegex​(String pkg)
        Non-regex case. Ensure a trailing dot for subpackages, i.e. "com.puppy" will match "com.puppy.crawl" but not "com.puppycrawl.tools".
        Parameters:
        pkg - the package to compare with.
        Returns:
        if it matches.