1   ////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code for adherence to a set of rules.
3   // Copyright (C) 2001-2019 the original author or authors.
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ////////////////////////////////////////////////////////////////////////////////
19  
20  package com.puppycrawl.tools.checkstyle;
21  
22  import java.io.IOException;
23  import java.lang.reflect.Constructor;
24  import java.util.Collections;
25  import java.util.HashMap;
26  import java.util.LinkedHashSet;
27  import java.util.List;
28  import java.util.Map;
29  import java.util.Map.Entry;
30  import java.util.Set;
31  import java.util.stream.Collectors;
32  import java.util.stream.Stream;
33  
34  import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
35  import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
36  import com.puppycrawl.tools.checkstyle.utils.ModuleReflectionUtil;
37  
38  /**
39   * A factory for creating objects from package names and names.
40   * Consider the below example for better understanding.
41   * <ul>
42   *     <li>module name - name of java class that represents module;</li>
43   *     <li>module full name - fully qualifies name of java class that represents module;</li>
44   *     <li>check module short name - name of Check without 'Check' suffix;</li>
45   *     <li>check module name - name of java class that represents Check (with 'Check' suffix);</li>
46   *     <li>
47   *         check module full name - fully qualifies name of java class
48   *         that represents Check (with 'Check' suffix).
49   *     </li>
50   * </ul>
51   */
52  public class PackageObjectFactory implements ModuleFactory {
53  
54      /**
55       * Enum class to define loading options.
56       */
57      public enum ModuleLoadOption {
58  
59          /**
60           * Searching from registered checkstyle modules and from packages given in constructor.
61           **/
62          SEARCH_REGISTERED_PACKAGES,
63          /**
64           * As SEARCH_REGISTERED_PACKAGES and also try to load class from all of packages given in
65           * constructor.
66           * Required for eclipse-cs plugin.
67           **/
68          TRY_IN_ALL_REGISTERED_PACKAGES,
69  
70      }
71  
72      /** Base package of checkstyle modules checks. */
73      public static final String BASE_PACKAGE = "com.puppycrawl.tools.checkstyle";
74  
75      /** Exception message when it is unable to create a class instance. */
76      public static final String UNABLE_TO_INSTANTIATE_EXCEPTION_MESSAGE =
77              "PackageObjectFactory.unableToInstantiateExceptionMessage";
78  
79      /** Exception message when there is ambiguous module name in config file. */
80      public static final String AMBIGUOUS_MODULE_NAME_EXCEPTION_MESSAGE =
81              "PackageObjectFactory.ambiguousModuleNameExceptionMessage";
82  
83      /** Suffix of checks. */
84      public static final String CHECK_SUFFIX = "Check";
85  
86      /** Character separate package names in qualified name of java class. */
87      public static final String PACKAGE_SEPARATOR = ".";
88  
89      /** Exception message when null class loader is given. */
90      public static final String NULL_LOADER_MESSAGE = "moduleClassLoader must not be null";
91  
92      /** Exception message when null package name is given. */
93      public static final String NULL_PACKAGE_MESSAGE = "package name must not be null";
94  
95      /** Separator to use in strings. */
96      public static final String STRING_SEPARATOR = ", ";
97  
98      /** Map of Checkstyle module names to their fully qualified names. */
99      private static final Map<String, String> NAME_TO_FULL_MODULE_NAME = new HashMap<>();
100 
101     /** A list of package names to prepend to class names. */
102     private final Set<String> packages;
103 
104     /** The class loader used to load Checkstyle core and custom modules. */
105     private final ClassLoader moduleClassLoader;
106 
107     /** Map of third party Checkstyle module names to the set of their fully qualified names. */
108     private Map<String, Set<String>> thirdPartyNameToFullModuleNames;
109 
110     /** Module load option which defines class search type. */
111     private ModuleLoadOption moduleLoadOption;
112 
113     static {
114         fillShortToFullModuleNamesMap();
115     }
116 
117     /**
118      * Creates a new {@code PackageObjectFactory} instance.
119      * @param packageNames the list of package names to use
120      * @param moduleClassLoader class loader used to load Checkstyle
121      *          core and custom modules
122      */
123     public PackageObjectFactory(Set<String> packageNames, ClassLoader moduleClassLoader) {
124         this(packageNames, moduleClassLoader, ModuleLoadOption.SEARCH_REGISTERED_PACKAGES);
125     }
126 
127     /**
128      * Creates a new {@code PackageObjectFactory} instance.
129      * @param packageNames the list of package names to use
130      * @param moduleClassLoader class loader used to load Checkstyle
131      *          core and custom modules
132      * @param moduleLoadOption loading option
133      */
134     public PackageObjectFactory(Set<String> packageNames, ClassLoader moduleClassLoader,
135             ModuleLoadOption moduleLoadOption) {
136         if (moduleClassLoader == null) {
137             throw new IllegalArgumentException(NULL_LOADER_MESSAGE);
138         }
139         if (packageNames.contains(null)) {
140             throw new IllegalArgumentException(NULL_PACKAGE_MESSAGE);
141         }
142 
143         //create a copy of the given set, but retain ordering
144         packages = new LinkedHashSet<>(packageNames);
145         this.moduleClassLoader = moduleClassLoader;
146         this.moduleLoadOption = moduleLoadOption;
147     }
148 
149     /**
150      * Creates a new {@code PackageObjectFactory} instance.
151      * @param packageName The package name to use
152      * @param moduleClassLoader class loader used to load Checkstyle
153      *          core and custom modules
154      */
155     public PackageObjectFactory(String packageName, ClassLoader moduleClassLoader) {
156         if (moduleClassLoader == null) {
157             throw new IllegalArgumentException(NULL_LOADER_MESSAGE);
158         }
159         if (packageName == null) {
160             throw new IllegalArgumentException(NULL_PACKAGE_MESSAGE);
161         }
162 
163         packages = Collections.singleton(packageName);
164         this.moduleClassLoader = moduleClassLoader;
165     }
166 
167     /**
168      * Creates a new instance of a class from a given name, or that name
169      * concatenated with &quot;Check&quot;. If the name is
170      * a class name, creates an instance of the named class. Otherwise, creates
171      * an instance of a class name obtained by concatenating the given name
172      * to a package name from a given list of package names.
173      * @param name the name of a class.
174      * @return the {@code Object} created by loader.
175      * @throws CheckstyleException if an error occurs.
176      */
177     @Override
178     public Object createModule(String name) throws CheckstyleException {
179         Object instance = null;
180         // if the name is a simple class name, try to find it in maps at first
181         if (!name.contains(PACKAGE_SEPARATOR)) {
182             instance = createFromStandardCheckSet(name);
183             // find the name in third party map
184             if (instance == null) {
185                 if (thirdPartyNameToFullModuleNames == null) {
186                     thirdPartyNameToFullModuleNames =
187                             generateThirdPartyNameToFullModuleName(moduleClassLoader);
188                 }
189                 instance = createObjectFromMap(name, thirdPartyNameToFullModuleNames);
190             }
191         }
192         if (instance == null) {
193             instance = createObject(name);
194         }
195         if (instance == null
196                 && moduleLoadOption == ModuleLoadOption.TRY_IN_ALL_REGISTERED_PACKAGES) {
197             instance = createModuleByTryInEachPackage(name);
198         }
199         if (instance == null) {
200             String attemptedNames = null;
201             if (!name.contains(PACKAGE_SEPARATOR)) {
202                 final String nameCheck = name + CHECK_SUFFIX;
203                 attemptedNames = joinPackageNamesWithClassName(name, packages)
204                         + STRING_SEPARATOR + nameCheck + STRING_SEPARATOR
205                         + joinPackageNamesWithClassName(nameCheck, packages);
206             }
207             final LocalizedMessage exceptionMessage = new LocalizedMessage(1,
208                 Definitions.CHECKSTYLE_BUNDLE, UNABLE_TO_INSTANTIATE_EXCEPTION_MESSAGE,
209                 new String[] {name, attemptedNames}, null, getClass(), null);
210             throw new CheckstyleException(exceptionMessage.getMessage());
211         }
212         return instance;
213     }
214 
215     /**
216      * Create object from one of Checkstyle module names.
217      * @param name name of module.
218      * @return instance of module.
219      * @throws CheckstyleException if the class fails to instantiate or there are ambiguous classes.
220      */
221     private Object createFromStandardCheckSet(String name) throws CheckstyleException {
222         final String fullModuleName = NAME_TO_FULL_MODULE_NAME.get(name);
223         Object instance = null;
224         if (fullModuleName == null) {
225             final String fullCheckModuleName =
226                     NAME_TO_FULL_MODULE_NAME.get(name + CHECK_SUFFIX);
227             if (fullCheckModuleName != null) {
228                 instance = createObject(fullCheckModuleName);
229             }
230         }
231         else {
232             instance = createObject(fullModuleName);
233         }
234         return instance;
235     }
236 
237     /**
238      * Create object with the help of the supplied map.
239      * @param name name of module.
240      * @param map the supplied map.
241      * @return instance of module if it is found in modules map and no ambiguous classes exist.
242      * @throws CheckstyleException if the class fails to instantiate or there are ambiguous classes.
243      */
244     private Object createObjectFromMap(String name, Map<String, Set<String>> map)
245             throws CheckstyleException {
246         final Set<String> fullModuleNames = map.get(name);
247         Object instance = null;
248         if (fullModuleNames == null) {
249             final Set<String> fullCheckModuleNames = map.get(name + CHECK_SUFFIX);
250             if (fullCheckModuleNames != null) {
251                 instance = createObjectFromFullModuleNames(name, fullCheckModuleNames);
252             }
253         }
254         else {
255             instance = createObjectFromFullModuleNames(name, fullModuleNames);
256         }
257         return instance;
258     }
259 
260     /**
261      * Create Object from optional full module names.
262      * In most case, there should be only one element in {@code fullModuleName}, otherwise
263      * an exception would be thrown.
264      * @param name name of module
265      * @param fullModuleNames the supplied full module names set
266      * @return instance of module if there is only one element in {@code fullModuleName}
267      * @throws CheckstyleException if the class fails to instantiate or there are more than one
268      *      element in {@code fullModuleName}
269      */
270     private Object createObjectFromFullModuleNames(String name, Set<String> fullModuleNames)
271             throws CheckstyleException {
272         final Object returnValue;
273         if (fullModuleNames.size() == 1) {
274             returnValue = createObject(fullModuleNames.iterator().next());
275         }
276         else {
277             final String optionalNames = fullModuleNames.stream()
278                     .sorted()
279                     .collect(Collectors.joining(STRING_SEPARATOR));
280             final LocalizedMessage exceptionMessage = new LocalizedMessage(1,
281                     Definitions.CHECKSTYLE_BUNDLE, AMBIGUOUS_MODULE_NAME_EXCEPTION_MESSAGE,
282                     new String[] {name, optionalNames}, null, getClass(), null);
283             throw new CheckstyleException(exceptionMessage.getMessage());
284         }
285         return returnValue;
286     }
287 
288     /**
289      * Generate the map of third party Checkstyle module names to the set of their fully qualified
290      * names.
291      * @param loader the class loader used to load Checkstyle package names
292      * @return the map of third party Checkstyle module names to the set of their fully qualified
293      *      names
294      */
295     private Map<String, Set<String>> generateThirdPartyNameToFullModuleName(ClassLoader loader) {
296         Map<String, Set<String>> returnValue;
297         try {
298             returnValue = ModuleReflectionUtil.getCheckstyleModules(packages, loader).stream()
299                 .collect(Collectors.groupingBy(Class::getSimpleName,
300                     Collectors.mapping(Class::getCanonicalName, Collectors.toSet())));
301         }
302         catch (IOException ignore) {
303             returnValue = Collections.emptyMap();
304         }
305         return returnValue;
306     }
307 
308     /**
309      * Returns simple check name from full modules names map.
310      * @param fullName name of the class for joining.
311      * @return simple check name.
312      */
313     public static String getShortFromFullModuleNames(String fullName) {
314         return NAME_TO_FULL_MODULE_NAME
315                 .entrySet()
316                 .stream()
317                 .filter(entry -> entry.getValue().equals(fullName))
318                 .map(Entry::getKey)
319                 .findFirst()
320                 .orElse(fullName);
321     }
322 
323     /**
324      * Creates a string by joining package names with a class name.
325      * @param className name of the class for joining.
326      * @param packages packages names.
327      * @return a string which is obtained by joining package names with a class name.
328      */
329     private static String joinPackageNamesWithClassName(String className, Set<String> packages) {
330         return packages.stream().collect(
331             Collectors.joining(PACKAGE_SEPARATOR + className + STRING_SEPARATOR, "",
332                     PACKAGE_SEPARATOR + className));
333     }
334 
335     /**
336      * Creates a new instance of a named class.
337      * @param className the name of the class to instantiate.
338      * @return the {@code Object} created by loader or null.
339      * @throws CheckstyleException if the class fails to instantiate.
340      */
341     private Object createObject(String className) throws CheckstyleException {
342         Class<?> clazz = null;
343 
344         try {
345             clazz = Class.forName(className, true, moduleClassLoader);
346         }
347         catch (final ReflectiveOperationException | NoClassDefFoundError ignored) {
348             // ignore the exception
349         }
350 
351         Object instance = null;
352 
353         if (clazz != null) {
354             try {
355                 final Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
356                 declaredConstructor.setAccessible(true);
357                 instance = declaredConstructor.newInstance();
358             }
359             catch (final ReflectiveOperationException ex) {
360                 throw new CheckstyleException("Unable to instantiate " + className, ex);
361             }
362         }
363 
364         return instance;
365     }
366 
367     /**
368      * Searching to class with given name (or name concatenated with &quot;Check&quot;) in existing
369      * packages. Returns instance if class found or, otherwise, null.
370      * @param name the name of a class.
371      * @return the {@code Object} created by loader.
372      * @throws CheckstyleException if an error occurs.
373      */
374     private Object createModuleByTryInEachPackage(String name) throws CheckstyleException {
375         final List<String> possibleNames = packages.stream()
376             .map(packageName -> packageName + PACKAGE_SEPARATOR + name)
377             .flatMap(className -> Stream.of(className, className + CHECK_SUFFIX))
378             .collect(Collectors.toList());
379         Object instance = null;
380         for (String possibleName : possibleNames) {
381             instance = createObject(possibleName);
382             if (instance != null) {
383                 break;
384             }
385         }
386         return instance;
387     }
388 
389     /**
390      * Fill short-to-full module names map.
391      */
392     private static void fillShortToFullModuleNamesMap() {
393         fillChecksFromAnnotationPackage();
394         fillChecksFromBlocksPackage();
395         fillChecksFromCodingPackage();
396         fillChecksFromDesignPackage();
397         fillChecksFromHeaderPackage();
398         fillChecksFromImportsPackage();
399         fillChecksFromIndentationPackage();
400         fillChecksFromJavadocPackage();
401         fillChecksFromMetricsPackage();
402         fillChecksFromModifierPackage();
403         fillChecksFromNamingPackage();
404         fillChecksFromRegexpPackage();
405         fillChecksFromSizesPackage();
406         fillChecksFromWhitespacePackage();
407         fillModulesFromChecksPackage();
408         fillModulesFromFilefiltersPackage();
409         fillModulesFromFiltersPackage();
410         fillModulesFromCheckstylePackage();
411     }
412 
413     /**
414      * Fill short-to-full module names map with Checks from annotation package.
415      */
416     private static void fillChecksFromAnnotationPackage() {
417         NAME_TO_FULL_MODULE_NAME.put("AnnotationLocationCheck",
418                 BASE_PACKAGE + ".checks.annotation.AnnotationLocationCheck");
419         NAME_TO_FULL_MODULE_NAME.put("AnnotationOnSameLineCheck",
420                 BASE_PACKAGE + ".checks.annotation.AnnotationOnSameLineCheck");
421         NAME_TO_FULL_MODULE_NAME.put("AnnotationUseStyleCheck",
422                 BASE_PACKAGE + ".checks.annotation.AnnotationUseStyleCheck");
423         NAME_TO_FULL_MODULE_NAME.put("MissingDeprecatedCheck",
424                 BASE_PACKAGE + ".checks.annotation.MissingDeprecatedCheck");
425         NAME_TO_FULL_MODULE_NAME.put("MissingOverrideCheck",
426                 BASE_PACKAGE + ".checks.annotation.MissingOverrideCheck");
427         NAME_TO_FULL_MODULE_NAME.put("PackageAnnotationCheck",
428                 BASE_PACKAGE + ".checks.annotation.PackageAnnotationCheck");
429         NAME_TO_FULL_MODULE_NAME.put("SuppressWarningsCheck",
430                 BASE_PACKAGE + ".checks.annotation.SuppressWarningsCheck");
431     }
432 
433     /**
434      * Fill short-to-full module names map with Checks from blocks package.
435      */
436     private static void fillChecksFromBlocksPackage() {
437         NAME_TO_FULL_MODULE_NAME.put("AvoidNestedBlocksCheck",
438                 BASE_PACKAGE + ".checks.blocks.AvoidNestedBlocksCheck");
439         NAME_TO_FULL_MODULE_NAME.put("EmptyBlockCheck",
440                 BASE_PACKAGE + ".checks.blocks.EmptyBlockCheck");
441         NAME_TO_FULL_MODULE_NAME.put("EmptyCatchBlockCheck",
442                 BASE_PACKAGE + ".checks.blocks.EmptyCatchBlockCheck");
443         NAME_TO_FULL_MODULE_NAME.put("LeftCurlyCheck",
444                 BASE_PACKAGE + ".checks.blocks.LeftCurlyCheck");
445         NAME_TO_FULL_MODULE_NAME.put("NeedBracesCheck",
446                 BASE_PACKAGE + ".checks.blocks.NeedBracesCheck");
447         NAME_TO_FULL_MODULE_NAME.put("RightCurlyCheck",
448                 BASE_PACKAGE + ".checks.blocks.RightCurlyCheck");
449     }
450 
451     /**
452      * Fill short-to-full module names map with Checks from coding package.
453      */
454     // -@cs[ExecutableStatementCount] splitting this method is not reasonable.
455     private static void fillChecksFromCodingPackage() {
456         NAME_TO_FULL_MODULE_NAME.put("ArrayTrailingCommaCheck",
457                 BASE_PACKAGE + ".checks.coding.ArrayTrailingCommaCheck");
458         NAME_TO_FULL_MODULE_NAME.put("AvoidInlineConditionalsCheck",
459                 BASE_PACKAGE + ".checks.coding.AvoidInlineConditionalsCheck");
460         NAME_TO_FULL_MODULE_NAME.put("CovariantEqualsCheck",
461                 BASE_PACKAGE + ".checks.coding.CovariantEqualsCheck");
462         NAME_TO_FULL_MODULE_NAME.put("DeclarationOrderCheck",
463                 BASE_PACKAGE + ".checks.coding.DeclarationOrderCheck");
464         NAME_TO_FULL_MODULE_NAME.put("DefaultComesLastCheck",
465                 BASE_PACKAGE + ".checks.coding.DefaultComesLastCheck");
466         NAME_TO_FULL_MODULE_NAME.put("EmptyStatementCheck",
467                 BASE_PACKAGE + ".checks.coding.EmptyStatementCheck");
468         NAME_TO_FULL_MODULE_NAME.put("EqualsAvoidNullCheck",
469                 BASE_PACKAGE + ".checks.coding.EqualsAvoidNullCheck");
470         NAME_TO_FULL_MODULE_NAME.put("EqualsHashCodeCheck",
471                 BASE_PACKAGE + ".checks.coding.EqualsHashCodeCheck");
472         NAME_TO_FULL_MODULE_NAME.put("ExplicitInitializationCheck",
473                 BASE_PACKAGE + ".checks.coding.ExplicitInitializationCheck");
474         NAME_TO_FULL_MODULE_NAME.put("FallThroughCheck",
475                 BASE_PACKAGE + ".checks.coding.FallThroughCheck");
476         NAME_TO_FULL_MODULE_NAME.put("FinalLocalVariableCheck",
477                 BASE_PACKAGE + ".checks.coding.FinalLocalVariableCheck");
478         NAME_TO_FULL_MODULE_NAME.put("HiddenFieldCheck",
479                 BASE_PACKAGE + ".checks.coding.HiddenFieldCheck");
480         NAME_TO_FULL_MODULE_NAME.put("IllegalCatchCheck",
481                 BASE_PACKAGE + ".checks.coding.IllegalCatchCheck");
482         NAME_TO_FULL_MODULE_NAME.put("IllegalInstantiationCheck",
483                 BASE_PACKAGE + ".checks.coding.IllegalInstantiationCheck");
484         NAME_TO_FULL_MODULE_NAME.put("IllegalThrowsCheck",
485                 BASE_PACKAGE + ".checks.coding.IllegalThrowsCheck");
486         NAME_TO_FULL_MODULE_NAME.put("IllegalTokenCheck",
487                 BASE_PACKAGE + ".checks.coding.IllegalTokenCheck");
488         NAME_TO_FULL_MODULE_NAME.put("IllegalTokenTextCheck",
489                 BASE_PACKAGE + ".checks.coding.IllegalTokenTextCheck");
490         NAME_TO_FULL_MODULE_NAME.put("IllegalTypeCheck",
491                 BASE_PACKAGE + ".checks.coding.IllegalTypeCheck");
492         NAME_TO_FULL_MODULE_NAME.put("InnerAssignmentCheck",
493                 BASE_PACKAGE + ".checks.coding.InnerAssignmentCheck");
494         NAME_TO_FULL_MODULE_NAME.put("MagicNumberCheck",
495                 BASE_PACKAGE + ".checks.coding.MagicNumberCheck");
496         NAME_TO_FULL_MODULE_NAME.put("MissingCtorCheck",
497                 BASE_PACKAGE + ".checks.coding.MissingCtorCheck");
498         NAME_TO_FULL_MODULE_NAME.put("MissingSwitchDefaultCheck",
499                 BASE_PACKAGE + ".checks.coding.MissingSwitchDefaultCheck");
500         NAME_TO_FULL_MODULE_NAME.put("ModifiedControlVariableCheck",
501                 BASE_PACKAGE + ".checks.coding.ModifiedControlVariableCheck");
502         NAME_TO_FULL_MODULE_NAME.put("MultipleStringLiteralsCheck",
503                 BASE_PACKAGE + ".checks.coding.MultipleStringLiteralsCheck");
504         NAME_TO_FULL_MODULE_NAME.put("MultipleVariableDeclarationsCheck",
505                 BASE_PACKAGE + ".checks.coding.MultipleVariableDeclarationsCheck");
506         NAME_TO_FULL_MODULE_NAME.put("NestedForDepthCheck",
507                 BASE_PACKAGE + ".checks.coding.NestedForDepthCheck");
508         NAME_TO_FULL_MODULE_NAME.put("NestedIfDepthCheck",
509                 BASE_PACKAGE + ".checks.coding.NestedIfDepthCheck");
510         NAME_TO_FULL_MODULE_NAME.put("NestedTryDepthCheck",
511                 BASE_PACKAGE + ".checks.coding.NestedTryDepthCheck");
512         NAME_TO_FULL_MODULE_NAME.put("NoCloneCheck",
513                 BASE_PACKAGE + ".checks.coding.NoCloneCheck");
514         NAME_TO_FULL_MODULE_NAME.put("NoFinalizerCheck",
515                 BASE_PACKAGE + ".checks.coding.NoFinalizerCheck");
516         NAME_TO_FULL_MODULE_NAME.put("OneStatementPerLineCheck",
517                 BASE_PACKAGE + ".checks.coding.OneStatementPerLineCheck");
518         NAME_TO_FULL_MODULE_NAME.put("OverloadMethodsDeclarationOrderCheck",
519                 BASE_PACKAGE + ".checks.coding.OverloadMethodsDeclarationOrderCheck");
520         NAME_TO_FULL_MODULE_NAME.put("PackageDeclarationCheck",
521                 BASE_PACKAGE + ".checks.coding.PackageDeclarationCheck");
522         NAME_TO_FULL_MODULE_NAME.put("ParameterAssignmentCheck",
523                 BASE_PACKAGE + ".checks.coding.ParameterAssignmentCheck");
524         NAME_TO_FULL_MODULE_NAME.put("RequireThisCheck",
525                 BASE_PACKAGE + ".checks.coding.RequireThisCheck");
526         NAME_TO_FULL_MODULE_NAME.put("ReturnCountCheck",
527                 BASE_PACKAGE + ".checks.coding.ReturnCountCheck");
528         NAME_TO_FULL_MODULE_NAME.put("SimplifyBooleanExpressionCheck",
529                 BASE_PACKAGE + ".checks.coding.SimplifyBooleanExpressionCheck");
530         NAME_TO_FULL_MODULE_NAME.put("SimplifyBooleanReturnCheck",
531                 BASE_PACKAGE + ".checks.coding.SimplifyBooleanReturnCheck");
532         NAME_TO_FULL_MODULE_NAME.put("StringLiteralEqualityCheck",
533                 BASE_PACKAGE + ".checks.coding.StringLiteralEqualityCheck");
534         NAME_TO_FULL_MODULE_NAME.put("SuperCloneCheck",
535                 BASE_PACKAGE + ".checks.coding.SuperCloneCheck");
536         NAME_TO_FULL_MODULE_NAME.put("SuperFinalizeCheck",
537                 BASE_PACKAGE + ".checks.coding.SuperFinalizeCheck");
538         NAME_TO_FULL_MODULE_NAME.put("UnnecessaryParenthesesCheck",
539                 BASE_PACKAGE + ".checks.coding.UnnecessaryParenthesesCheck");
540         NAME_TO_FULL_MODULE_NAME.put("VariableDeclarationUsageDistanceCheck",
541                 BASE_PACKAGE + ".checks.coding.VariableDeclarationUsageDistanceCheck");
542     }
543 
544     /**
545      * Fill short-to-full module names map with Checks from design package.
546      */
547     private static void fillChecksFromDesignPackage() {
548         NAME_TO_FULL_MODULE_NAME.put("DesignForExtensionCheck",
549                 BASE_PACKAGE + ".checks.design.DesignForExtensionCheck");
550         NAME_TO_FULL_MODULE_NAME.put("FinalClassCheck",
551                 BASE_PACKAGE + ".checks.design.FinalClassCheck");
552         NAME_TO_FULL_MODULE_NAME.put("HideUtilityClassConstructorCheck",
553                 BASE_PACKAGE + ".checks.design.HideUtilityClassConstructorCheck");
554         NAME_TO_FULL_MODULE_NAME.put("InnerTypeLastCheck",
555                 BASE_PACKAGE + ".checks.design.InnerTypeLastCheck");
556         NAME_TO_FULL_MODULE_NAME.put("InterfaceIsTypeCheck",
557                 BASE_PACKAGE + ".checks.design.InterfaceIsTypeCheck");
558         NAME_TO_FULL_MODULE_NAME.put("MutableExceptionCheck",
559                 BASE_PACKAGE + ".checks.design.MutableExceptionCheck");
560         NAME_TO_FULL_MODULE_NAME.put("OneTopLevelClassCheck",
561                 BASE_PACKAGE + ".checks.design.OneTopLevelClassCheck");
562         NAME_TO_FULL_MODULE_NAME.put("ThrowsCountCheck",
563                 BASE_PACKAGE + ".checks.design.ThrowsCountCheck");
564         NAME_TO_FULL_MODULE_NAME.put("VisibilityModifierCheck",
565                 BASE_PACKAGE + ".checks.design.VisibilityModifierCheck");
566     }
567 
568     /**
569      * Fill short-to-full module names map with Checks from header package.
570      */
571     private static void fillChecksFromHeaderPackage() {
572         NAME_TO_FULL_MODULE_NAME.put("HeaderCheck",
573                 BASE_PACKAGE + ".checks.header.HeaderCheck");
574         NAME_TO_FULL_MODULE_NAME.put("RegexpHeaderCheck",
575                 BASE_PACKAGE + ".checks.header.RegexpHeaderCheck");
576     }
577 
578     /**
579      * Fill short-to-full module names map with Checks from imports package.
580      */
581     private static void fillChecksFromImportsPackage() {
582         NAME_TO_FULL_MODULE_NAME.put("AvoidStarImportCheck",
583                 BASE_PACKAGE + ".checks.imports.AvoidStarImportCheck");
584         NAME_TO_FULL_MODULE_NAME.put("AvoidStaticImportCheck",
585                 BASE_PACKAGE + ".checks.imports.AvoidStaticImportCheck");
586         NAME_TO_FULL_MODULE_NAME.put("CustomImportOrderCheck",
587                 BASE_PACKAGE + ".checks.imports.CustomImportOrderCheck");
588         NAME_TO_FULL_MODULE_NAME.put("IllegalImportCheck",
589                 BASE_PACKAGE + ".checks.imports.IllegalImportCheck");
590         NAME_TO_FULL_MODULE_NAME.put("ImportControlCheck",
591                 BASE_PACKAGE + ".checks.imports.ImportControlCheck");
592         NAME_TO_FULL_MODULE_NAME.put("ImportOrderCheck",
593                 BASE_PACKAGE + ".checks.imports.ImportOrderCheck");
594         NAME_TO_FULL_MODULE_NAME.put("RedundantImportCheck",
595                 BASE_PACKAGE + ".checks.imports.RedundantImportCheck");
596         NAME_TO_FULL_MODULE_NAME.put("UnusedImportsCheck",
597                 BASE_PACKAGE + ".checks.imports.UnusedImportsCheck");
598     }
599 
600     /**
601      * Fill short-to-full module names map with Checks from indentation package.
602      */
603     private static void fillChecksFromIndentationPackage() {
604         NAME_TO_FULL_MODULE_NAME.put("CommentsIndentationCheck",
605                 BASE_PACKAGE + ".checks.indentation.CommentsIndentationCheck");
606         NAME_TO_FULL_MODULE_NAME.put("IndentationCheck",
607                 BASE_PACKAGE + ".checks.indentation.IndentationCheck");
608     }
609 
610     /**
611      * Fill short-to-full module names map with Checks from javadoc package.
612      */
613     private static void fillChecksFromJavadocPackage() {
614         NAME_TO_FULL_MODULE_NAME.put("AtclauseOrderCheck",
615                 BASE_PACKAGE + ".checks.javadoc.AtclauseOrderCheck");
616         NAME_TO_FULL_MODULE_NAME.put("JavadocMethodCheck",
617                 BASE_PACKAGE + ".checks.javadoc.JavadocMethodCheck");
618         NAME_TO_FULL_MODULE_NAME.put("JavadocPackageCheck",
619                 BASE_PACKAGE + ".checks.javadoc.JavadocPackageCheck");
620         NAME_TO_FULL_MODULE_NAME.put("JavadocParagraphCheck",
621                 BASE_PACKAGE + ".checks.javadoc.JavadocParagraphCheck");
622         NAME_TO_FULL_MODULE_NAME.put("JavadocStyleCheck",
623                 BASE_PACKAGE + ".checks.javadoc.JavadocStyleCheck");
624         NAME_TO_FULL_MODULE_NAME.put("JavadocTagContinuationIndentationCheck",
625                 BASE_PACKAGE + ".checks.javadoc.JavadocTagContinuationIndentationCheck");
626         NAME_TO_FULL_MODULE_NAME.put("JavadocTypeCheck",
627                 BASE_PACKAGE + ".checks.javadoc.JavadocTypeCheck");
628         NAME_TO_FULL_MODULE_NAME.put("JavadocVariableCheck",
629                 BASE_PACKAGE + ".checks.javadoc.JavadocVariableCheck");
630         NAME_TO_FULL_MODULE_NAME.put("MissingJavadocTypeCheck",
631                 BASE_PACKAGE + ".checks.javadoc.MissingJavadocTypeCheck");
632         NAME_TO_FULL_MODULE_NAME.put("NonEmptyAtclauseDescriptionCheck",
633                 BASE_PACKAGE + ".checks.javadoc.NonEmptyAtclauseDescriptionCheck");
634         NAME_TO_FULL_MODULE_NAME.put("SingleLineJavadocCheck",
635                 BASE_PACKAGE + ".checks.javadoc.SingleLineJavadocCheck");
636         NAME_TO_FULL_MODULE_NAME.put("SummaryJavadocCheck",
637                 BASE_PACKAGE + ".checks.javadoc.SummaryJavadocCheck");
638         NAME_TO_FULL_MODULE_NAME.put("WriteTagCheck",
639                 BASE_PACKAGE + ".checks.javadoc.WriteTagCheck");
640     }
641 
642     /**
643      * Fill short-to-full module names map with Checks from metrics package.
644      */
645     private static void fillChecksFromMetricsPackage() {
646         NAME_TO_FULL_MODULE_NAME.put("BooleanExpressionComplexityCheck",
647                 BASE_PACKAGE + ".checks.metrics.BooleanExpressionComplexityCheck");
648         NAME_TO_FULL_MODULE_NAME.put("ClassDataAbstractionCouplingCheck",
649                 BASE_PACKAGE + ".checks.metrics.ClassDataAbstractionCouplingCheck");
650         NAME_TO_FULL_MODULE_NAME.put("ClassFanOutComplexityCheck",
651                 BASE_PACKAGE + ".checks.metrics.ClassFanOutComplexityCheck");
652         NAME_TO_FULL_MODULE_NAME.put("CyclomaticComplexityCheck",
653                 BASE_PACKAGE + ".checks.metrics.CyclomaticComplexityCheck");
654         NAME_TO_FULL_MODULE_NAME.put("JavaNCSSCheck",
655                 BASE_PACKAGE + ".checks.metrics.JavaNCSSCheck");
656         NAME_TO_FULL_MODULE_NAME.put("NPathComplexityCheck",
657                 BASE_PACKAGE + ".checks.metrics.NPathComplexityCheck");
658     }
659 
660     /**
661      * Fill short-to-full module names map with Checks from modifier package.
662      */
663     private static void fillChecksFromModifierPackage() {
664         NAME_TO_FULL_MODULE_NAME.put("ClassMemberImpliedModifierCheck",
665             BASE_PACKAGE + ".checks.modifier.ClassMemberImpliedModifierCheck");
666         NAME_TO_FULL_MODULE_NAME.put("InterfaceMemberImpliedModifierCheck",
667             BASE_PACKAGE + ".checks.modifier.InterfaceMemberImpliedModifierCheck");
668         NAME_TO_FULL_MODULE_NAME.put("ModifierOrderCheck",
669                 BASE_PACKAGE + ".checks.modifier.ModifierOrderCheck");
670         NAME_TO_FULL_MODULE_NAME.put("RedundantModifierCheck",
671                 BASE_PACKAGE + ".checks.modifier.RedundantModifierCheck");
672     }
673 
674     /**
675      * Fill short-to-full module names map with Checks from naming package.
676      */
677     private static void fillChecksFromNamingPackage() {
678         NAME_TO_FULL_MODULE_NAME.put("AbbreviationAsWordInNameCheck",
679                 BASE_PACKAGE + ".checks.naming.AbbreviationAsWordInNameCheck");
680         NAME_TO_FULL_MODULE_NAME.put("AbstractClassNameCheck",
681                 BASE_PACKAGE + ".checks.naming.AbstractClassNameCheck");
682         NAME_TO_FULL_MODULE_NAME.put("CatchParameterNameCheck",
683                 BASE_PACKAGE + ".checks.naming.CatchParameterNameCheck");
684         NAME_TO_FULL_MODULE_NAME.put("ClassTypeParameterNameCheck",
685                 BASE_PACKAGE + ".checks.naming.ClassTypeParameterNameCheck");
686         NAME_TO_FULL_MODULE_NAME.put("ConstantNameCheck",
687                 BASE_PACKAGE + ".checks.naming.ConstantNameCheck");
688         NAME_TO_FULL_MODULE_NAME.put("InterfaceTypeParameterNameCheck",
689                 BASE_PACKAGE + ".checks.naming.InterfaceTypeParameterNameCheck");
690         NAME_TO_FULL_MODULE_NAME.put("LambdaParameterNameCheck",
691                 BASE_PACKAGE + ".checks.naming.LambdaParameterNameCheck");
692         NAME_TO_FULL_MODULE_NAME.put("LocalFinalVariableNameCheck",
693                 BASE_PACKAGE + ".checks.naming.LocalFinalVariableNameCheck");
694         NAME_TO_FULL_MODULE_NAME.put("LocalVariableNameCheck",
695                 BASE_PACKAGE + ".checks.naming.LocalVariableNameCheck");
696         NAME_TO_FULL_MODULE_NAME.put("MemberNameCheck",
697                 BASE_PACKAGE + ".checks.naming.MemberNameCheck");
698         NAME_TO_FULL_MODULE_NAME.put("MethodNameCheck",
699                 BASE_PACKAGE + ".checks.naming.MethodNameCheck");
700         NAME_TO_FULL_MODULE_NAME.put("MethodTypeParameterNameCheck",
701                 BASE_PACKAGE + ".checks.naming.MethodTypeParameterNameCheck");
702         NAME_TO_FULL_MODULE_NAME.put("PackageNameCheck",
703                 BASE_PACKAGE + ".checks.naming.PackageNameCheck");
704         NAME_TO_FULL_MODULE_NAME.put("ParameterNameCheck",
705                 BASE_PACKAGE + ".checks.naming.ParameterNameCheck");
706         NAME_TO_FULL_MODULE_NAME.put("StaticVariableNameCheck",
707                 BASE_PACKAGE + ".checks.naming.StaticVariableNameCheck");
708         NAME_TO_FULL_MODULE_NAME.put("TypeNameCheck",
709                 BASE_PACKAGE + ".checks.naming.TypeNameCheck");
710     }
711 
712     /**
713      * Fill short-to-full module names map with Checks from regexp package.
714      */
715     private static void fillChecksFromRegexpPackage() {
716         NAME_TO_FULL_MODULE_NAME.put("RegexpCheck",
717                 BASE_PACKAGE + ".checks.regexp.RegexpCheck");
718         NAME_TO_FULL_MODULE_NAME.put("RegexpMultilineCheck",
719                 BASE_PACKAGE + ".checks.regexp.RegexpMultilineCheck");
720         NAME_TO_FULL_MODULE_NAME.put("RegexpOnFilenameCheck",
721                 BASE_PACKAGE + ".checks.regexp.RegexpOnFilenameCheck");
722         NAME_TO_FULL_MODULE_NAME.put("RegexpSinglelineCheck",
723                 BASE_PACKAGE + ".checks.regexp.RegexpSinglelineCheck");
724         NAME_TO_FULL_MODULE_NAME.put("RegexpSinglelineJavaCheck",
725                 BASE_PACKAGE + ".checks.regexp.RegexpSinglelineJavaCheck");
726     }
727 
728     /**
729      * Fill short-to-full module names map with Checks from sizes package.
730      */
731     private static void fillChecksFromSizesPackage() {
732         NAME_TO_FULL_MODULE_NAME.put("AnonInnerLengthCheck",
733                 BASE_PACKAGE + ".checks.sizes.AnonInnerLengthCheck");
734         NAME_TO_FULL_MODULE_NAME.put("ExecutableStatementCountCheck",
735                 BASE_PACKAGE + ".checks.sizes.ExecutableStatementCountCheck");
736         NAME_TO_FULL_MODULE_NAME.put("FileLengthCheck",
737                 BASE_PACKAGE + ".checks.sizes.FileLengthCheck");
738         NAME_TO_FULL_MODULE_NAME.put("LineLengthCheck",
739                 BASE_PACKAGE + ".checks.sizes.LineLengthCheck");
740         NAME_TO_FULL_MODULE_NAME.put("MethodCountCheck",
741                 BASE_PACKAGE + ".checks.sizes.MethodCountCheck");
742         NAME_TO_FULL_MODULE_NAME.put("MethodLengthCheck",
743                 BASE_PACKAGE + ".checks.sizes.MethodLengthCheck");
744         NAME_TO_FULL_MODULE_NAME.put("OuterTypeNumberCheck",
745                 BASE_PACKAGE + ".checks.sizes.OuterTypeNumberCheck");
746         NAME_TO_FULL_MODULE_NAME.put("ParameterNumberCheck",
747                 BASE_PACKAGE + ".checks.sizes.ParameterNumberCheck");
748     }
749 
750     /**
751      * Fill short-to-full module names map with Checks from whitespace package.
752      */
753     private static void fillChecksFromWhitespacePackage() {
754         NAME_TO_FULL_MODULE_NAME.put("EmptyForInitializerPadCheck",
755                 BASE_PACKAGE + ".checks.whitespace.EmptyForInitializerPadCheck");
756         NAME_TO_FULL_MODULE_NAME.put("EmptyForIteratorPadCheck",
757                 BASE_PACKAGE + ".checks.whitespace.EmptyForIteratorPadCheck");
758         NAME_TO_FULL_MODULE_NAME.put("EmptyLineSeparatorCheck",
759                 BASE_PACKAGE + ".checks.whitespace.EmptyLineSeparatorCheck");
760         NAME_TO_FULL_MODULE_NAME.put("FileTabCharacterCheck",
761                 BASE_PACKAGE + ".checks.whitespace.FileTabCharacterCheck");
762         NAME_TO_FULL_MODULE_NAME.put("GenericWhitespaceCheck",
763                 BASE_PACKAGE + ".checks.whitespace.GenericWhitespaceCheck");
764         NAME_TO_FULL_MODULE_NAME.put("MethodParamPadCheck",
765                 BASE_PACKAGE + ".checks.whitespace.MethodParamPadCheck");
766         NAME_TO_FULL_MODULE_NAME.put("NoLineWrapCheck",
767                 BASE_PACKAGE + ".checks.whitespace.NoLineWrapCheck");
768         NAME_TO_FULL_MODULE_NAME.put("NoWhitespaceAfterCheck",
769                 BASE_PACKAGE + ".checks.whitespace.NoWhitespaceAfterCheck");
770         NAME_TO_FULL_MODULE_NAME.put("NoWhitespaceBeforeCheck",
771                 BASE_PACKAGE + ".checks.whitespace.NoWhitespaceBeforeCheck");
772         NAME_TO_FULL_MODULE_NAME.put("OperatorWrapCheck",
773                 BASE_PACKAGE + ".checks.whitespace.OperatorWrapCheck");
774         NAME_TO_FULL_MODULE_NAME.put("ParenPadCheck",
775                 BASE_PACKAGE + ".checks.whitespace.ParenPadCheck");
776         NAME_TO_FULL_MODULE_NAME.put("SeparatorWrapCheck",
777                 BASE_PACKAGE + ".checks.whitespace.SeparatorWrapCheck");
778         NAME_TO_FULL_MODULE_NAME.put("SingleSpaceSeparatorCheck",
779                 BASE_PACKAGE + ".checks.whitespace.SingleSpaceSeparatorCheck");
780         NAME_TO_FULL_MODULE_NAME.put("TypecastParenPadCheck",
781                 BASE_PACKAGE + ".checks.whitespace.TypecastParenPadCheck");
782         NAME_TO_FULL_MODULE_NAME.put("WhitespaceAfterCheck",
783                 BASE_PACKAGE + ".checks.whitespace.WhitespaceAfterCheck");
784         NAME_TO_FULL_MODULE_NAME.put("WhitespaceAroundCheck",
785                 BASE_PACKAGE + ".checks.whitespace.WhitespaceAroundCheck");
786     }
787 
788     /**
789      * Fill short-to-full module names map with modules from checks package.
790      */
791     private static void fillModulesFromChecksPackage() {
792         NAME_TO_FULL_MODULE_NAME.put("ArrayTypeStyleCheck",
793                 BASE_PACKAGE + ".checks.ArrayTypeStyleCheck");
794         NAME_TO_FULL_MODULE_NAME.put("AvoidEscapedUnicodeCharactersCheck",
795                 BASE_PACKAGE + ".checks.AvoidEscapedUnicodeCharactersCheck");
796         NAME_TO_FULL_MODULE_NAME.put("DescendantTokenCheck",
797                 BASE_PACKAGE + ".checks.DescendantTokenCheck");
798         NAME_TO_FULL_MODULE_NAME.put("FinalParametersCheck",
799                 BASE_PACKAGE + ".checks.FinalParametersCheck");
800         NAME_TO_FULL_MODULE_NAME.put("NewlineAtEndOfFileCheck",
801                 BASE_PACKAGE + ".checks.NewlineAtEndOfFileCheck");
802         NAME_TO_FULL_MODULE_NAME.put("OuterTypeFilenameCheck",
803                 BASE_PACKAGE + ".checks.OuterTypeFilenameCheck");
804         NAME_TO_FULL_MODULE_NAME.put("SuppressWarningsHolder",
805                 BASE_PACKAGE + ".checks.SuppressWarningsHolder");
806         NAME_TO_FULL_MODULE_NAME.put("TodoCommentCheck",
807                 BASE_PACKAGE + ".checks.TodoCommentCheck");
808         NAME_TO_FULL_MODULE_NAME.put("TrailingCommentCheck",
809                 BASE_PACKAGE + ".checks.TrailingCommentCheck");
810         NAME_TO_FULL_MODULE_NAME.put("TranslationCheck",
811                 BASE_PACKAGE + ".checks.TranslationCheck");
812         NAME_TO_FULL_MODULE_NAME.put("UncommentedMainCheck",
813                 BASE_PACKAGE + ".checks.UncommentedMainCheck");
814         NAME_TO_FULL_MODULE_NAME.put("UniquePropertiesCheck",
815                 BASE_PACKAGE + ".checks.UniquePropertiesCheck");
816         NAME_TO_FULL_MODULE_NAME.put("UpperEllCheck",
817                 BASE_PACKAGE + ".checks.UpperEllCheck");
818     }
819 
820     /**
821      * Fill short-to-full module names map with modules from filefilters package.
822      */
823     private static void fillModulesFromFilefiltersPackage() {
824         NAME_TO_FULL_MODULE_NAME.put("BeforeExecutionExclusionFileFilter",
825                 BASE_PACKAGE + ".filefilters.BeforeExecutionExclusionFileFilter");
826     }
827 
828     /**
829      * Fill short-to-full module names map with modules from filters package.
830      */
831     private static void fillModulesFromFiltersPackage() {
832         NAME_TO_FULL_MODULE_NAME.put("SeverityMatchFilter",
833                 BASE_PACKAGE + ".filters.SeverityMatchFilter");
834         NAME_TO_FULL_MODULE_NAME.put("SuppressWithPlainTextCommentFilter",
835             BASE_PACKAGE + ".filters.SuppressWithPlainTextCommentFilter");
836         NAME_TO_FULL_MODULE_NAME.put("SuppressionCommentFilter",
837                 BASE_PACKAGE + ".filters.SuppressionCommentFilter");
838         NAME_TO_FULL_MODULE_NAME.put("SuppressionFilter",
839                 BASE_PACKAGE + ".filters.SuppressionFilter");
840         NAME_TO_FULL_MODULE_NAME.put("SuppressionXpathFilter",
841                 BASE_PACKAGE + ".filters.SuppressionXpathFilter");
842         NAME_TO_FULL_MODULE_NAME.put("SuppressionXpathSingleFilter",
843                 BASE_PACKAGE + ".filters.SuppressionXpathSingleFilter");
844         NAME_TO_FULL_MODULE_NAME.put("SuppressWarningsFilter",
845                 BASE_PACKAGE + ".filters.SuppressWarningsFilter");
846         NAME_TO_FULL_MODULE_NAME.put("SuppressWithNearbyCommentFilter",
847                 BASE_PACKAGE + ".filters.SuppressWithNearbyCommentFilter");
848     }
849 
850     /**
851      * Fill short-to-full module names map with modules from checkstyle package.
852      */
853     private static void fillModulesFromCheckstylePackage() {
854         NAME_TO_FULL_MODULE_NAME.put("Checker", BASE_PACKAGE + ".Checker");
855         NAME_TO_FULL_MODULE_NAME.put("TreeWalker", BASE_PACKAGE + ".TreeWalker");
856     }
857 
858 }