package org.intellij.sonar.util; import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces; import com.intellij.openapi.util.Trinity; public class SonarComponentToFileMatcher { /** @param componentFromSonar like sonar:project:src/main/java/org/sonar/batch/DefaultSensorContext.java @param resourceKeyFromConfiguration like sonar:project @param fullFilePathFromLocalFileSystem like /path/to/a.file @return true if the sonar component corresponds to the file, false if not */ public static boolean match( String componentFromSonar, String resourceKeyFromConfiguration, String fullFilePathFromLocalFileSystem ) { final Trinity<String,String,String> args = new Trinity<String,String,String>( componentFromSonar, resourceKeyFromConfiguration, fullFilePathFromLocalFileSystem ); final boolean matchResult = doMatch( componentFromSonar, resourceKeyFromConfiguration, fullFilePathFromLocalFileSystem ); return matchResult; } @SuppressWarnings("RedundantIfStatement") private static boolean doMatch( String componentFromSonar, String resourceKeyFromConfiguration, String fullFilePathFromLocalFileSystem ) { if ( isEmptyOrSpaces(componentFromSonar) || isEmptyOrSpaces(fullFilePathFromLocalFileSystem) ) { return false; } // component = "sonar:project:src/main/java/org/sonar/batch/DefaultSensorContext.java"; // resourceKey = "sonar:project" if (!isEmptyOrSpaces(resourceKeyFromConfiguration) && !componentFromSonar.startsWith (resourceKeyFromConfiguration)) { return false; } // "sonar:project:src/main/java/org/sonar/batch/DefaultSensorContext.java" // -> "src/main/java/org/sonar/batch/DefaultSensorContext.java" final String fileKeyFromComponent; if (!isEmptyOrSpaces(resourceKeyFromConfiguration)) { fileKeyFromComponent = componentFromSonar.replace(resourceKeyFromConfiguration+":",""); } else { fileKeyFromComponent = componentFromSonar.replaceAll("(?i)(.+:)(.+)","$2"); } if (fullFilePathFromLocalFileSystem.endsWith(fileKeyFromComponent)) { return true; } // [root]/VeryBadClassRoot.groovy // -> /VeryBadClassRoot.groovy final String normalizedFileKey; normalizedFileKey = fileKeyFromComponent.replaceAll("\\[.+\\]",""); if (fullFilePathFromLocalFileSystem.endsWith(normalizedFileKey)) { return true; } // .OtherClass // -> /OtherClass.java final String normalizedFileKeyForJava; normalizedFileKeyForJava = normalizedFileKey.replaceAll("\\.","/")+".java"; if (fullFilePathFromLocalFileSystem.endsWith(normalizedFileKeyForJava)) { return true; } return false; } }