jenkinsci/hpe-application-automation-tools-plugin

View on GitHub
src/main/java/com/microfocus/application/automation/tools/octane/executor/UFTTestDetectionService.java

Summary

Maintainability
A
45 mins
Test Coverage

Avoid deeply nested control flow statements.
Open

                        if (parentName.contains(testPath)) {
                            falsePositive.add(item);
                            break;
                        }

    Method has 9 parameters, which is greater than 7 authorized.
    Open

        public static UftTestDiscoveryResult startScanning(File rootDir, BuildListener buildListener, String configurationId, String workspaceId, String scmRepositoryId,

    A long parameter list can indicate that a new structure should be created to wrap the numerous parameters or that the function is doing too many things.

    Noncompliant Code Example

    With a maximum number of 4 parameters:

    public void doSomething(int param1, int param2, int param3, String param4, long param5) {
    ...
    }
    

    Compliant Solution

    public void doSomething(int param1, int param2, int param3, String param4) {
    ...
    }
    

    Exceptions

    Methods annotated with :

    • Spring's @RequestMapping (and related shortcut annotations, like @GetRequest)
    • JAX-RS API annotations (like @javax.ws.rs.GET)
    • Bean constructor injection with @org.springframework.beans.factory.annotation.Autowired
    • CDI constructor injection with @javax.inject.Inject
    • @com.fasterxml.jackson.annotation.JsonCreator

    may have a lot of parameters, encapsulation being possible. Such methods are therefore ignored.

    Refactor this method to reduce its Cognitive Complexity from 21 to the 15 allowed.
    Open

        private static void removeFalsePositiveDataTables(UftTestDiscoveryResult result, List<AutomatedTest> tests, List<ScmResourceFile> scmResourceFiles) {

    Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain.

    See

    Merge this if statement with the enclosing one.
    Open

                if (!affectedFile.exists()) {

    Merging collapsible if statements increases the code's readability.

    Noncompliant Code Example

    if (file != null) {
      if (file.isFile() || file.isDirectory()) {
        /* ... */
      }
    }
    

    Compliant Solution

    if (file != null && isFileOrDirectory(file)) {
      /* ... */
    }
    
    private static boolean isFileOrDirectory(File file) {
      return file.isFile() || file.isDirectory();
    }
    

    Merge this if statement with the enclosing one.
    Open

                if (fileExist) {

    Merging collapsible if statements increases the code's readability.

    Noncompliant Code Example

    if (file != null) {
      if (file.isFile() || file.isDirectory()) {
        /* ... */
      }
    }
    

    Compliant Solution

    if (file != null && isFileOrDirectory(file)) {
      /* ... */
    }
    
    private static boolean isFileOrDirectory(File file) {
      return file.isFile() || file.isDirectory();
    }
    

    Add a private constructor to hide the implicit public one.
    Open

    public class UFTTestDetectionService {

    Utility classes, which are collections of static members, are not meant to be instantiated. Even abstract utility classes, which can be extended, should not have public constructors.

    Java adds an implicit public constructor to every class which does not define at least one explicitly. Hence, at least one non-public constructor should be defined.

    Noncompliant Code Example

    class StringUtils { // Noncompliant
    
      public static String concatenate(String s1, String s2) {
        return s1 + s2;
      }
    
    }
    

    Compliant Solution

    class StringUtils { // Compliant
    
      private StringUtils() {
        throw new IllegalStateException("Utility class");
      }
    
      public static String concatenate(String s1, String s2) {
        return s1 + s2;
      }
    
    }
    

    Exceptions

    When class contains public static void main(String[] args) method it is not considered as utility class and will be ignored by this rule.

    Remove these unused method parameters.
    Open

        private static void handleUftActionChanges(File workspace, UftTestDiscoveryResult result, UFTTestDetectionCallable.ScmChangeAffectedFileWrapper affectedFileWrapper, String affectedFileFullPath) {

    Unused parameters are misleading. Whatever the values passed to such parameters, the behavior will be the same.

    Noncompliant Code Example

    void doSomething(int a, int b) {     // "b" is unused
      compute(a);
    }
    

    Compliant Solution

    void doSomething(int a) {
      compute(a);
    }
    

    Exceptions

    The rule will not raise issues for unused parameters:

    • that are annotated with @javax.enterprise.event.Observes
    • in overrides and implementation methods
    • in interface default methods
    • in non-private methods that only throw or that have empty bodies
    • in annotated methods, unless the annotation is @SuppressWarning("unchecked") or @SuppressWarning("rawtypes"), in which case the annotation will be ignored
    • in overridable methods (non-final, or not member of a final class, non-static, non-private), if the parameter is documented with a proper javadoc.
    @Override
    void doSomething(int a, int b) {     // no issue reported on b
      compute(a);
    }
    
    public void foo(String s) {
      // designed to be extended but noop in standard case
    }
    
    protected void bar(String s) {
      //open-closed principle
    }
    
    public void qix(String s) {
      throw new UnsupportedOperationException("This method should be implemented in subclasses");
    }
    
    /**
     * @param s This string may be use for further computation in overriding classes
     */
    protected void foobar(int a, String s) { // no issue, method is overridable and unused parameter has proper javadoc
      compute(a);
    }
    

    See

    • CERT, MSC12-C. - Detect and remove code that has no effect or is never executed

    Merge this if statement with the enclosing one.
    Open

                    if (affectedFile.exists()) {

    Merging collapsible if statements increases the code's readability.

    Noncompliant Code Example

    if (file != null) {
      if (file.isFile() || file.isDirectory()) {
        /* ... */
      }
    }
    

    Compliant Solution

    if (file != null && isFileOrDirectory(file)) {
      /* ... */
    }
    
    private static boolean isFileOrDirectory(File file) {
      return file.isFile() || file.isDirectory();
    }
    

    These nested if statements could be combined
    Open

                if (fileExist) {
                    test.setOctaneStatus(OctaneStatus.MODIFIED);
                    result.getAllTests().add(test);
                }

    CollapsibleIfStatements

    Since: PMD 3.1

    Priority: Medium

    Categories: Style

    Remediation Points: 50000

    Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

    Example:

    void bar() {
     if (x) { // original implementation
     if (y) {
     // do stuff
     }
     }
    }
    
    void bar() {
     if (x && y) { // optimized implementation
     // do stuff
     }
    }

    These nested if statements could be combined
    Open

                if (!affectedFile.exists()) {
                    resourceFile.setOctaneStatus(OctaneStatus.DELETED);
                    result.getAllScmResourceFiles().add(resourceFile);
                }

    CollapsibleIfStatements

    Since: PMD 3.1

    Priority: Medium

    Categories: Style

    Remediation Points: 50000

    Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

    Example:

    void bar() {
     if (x) { // original implementation
     if (y) {
     // do stuff
     }
     }
    }
    
    void bar() {
     if (x && y) { // optimized implementation
     // do stuff
     }
    }

    These nested if statements could be combined
    Open

                    if (affectedFile.exists()) {
                        result.getAllScmResourceFiles().add(resourceFile);
                    }

    CollapsibleIfStatements

    Since: PMD 3.1

    Priority: Medium

    Categories: Style

    Remediation Points: 50000

    Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

    Example:

    void bar() {
     if (x) { // original implementation
     if (y) {
     // do stuff
     }
     }
    }
    
    void bar() {
     if (x && y) { // optimized implementation
     // do stuff
     }
    }

    There are no issues that match your filters.

    Category
    Status