package org.jetbrains.plugins.cucumber.java.config; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Max Medvedev */ public class CucumberConfigUtil { @NonNls private static final Pattern CUCUMBER_PATTERN = Pattern.compile("cucumber-core-(.*)\\.jar"); @NonNls private static final String CUCUMBER_CLI_MAIN_1_0 = "cucumber.cli.Main"; @NonNls private static final String CUCUMBER_API_CLI_MAIN_1_1 = "cucumber.api.cli.Main"; @NonNls public static final String CUCUMBER_VERSION_1_0 = "1.0"; @NonNls public static final String CUCUMBER_VERSION_1_1 = "1.1"; @Nullable public static String getCucumberCoreVersion(@NotNull PsiElement place) { final Module module = ModuleUtilCore.findModuleForPsiElement(place); if (module == null) return null; return CachedValuesManager.getManager(module.getProject()).getCachedValue(module, () -> CachedValueProvider.Result .create(getCucumberCoreVersionImpl(module), ProjectRootManager.getInstance(module.getProject()))); } @Nullable private static String getCucumberCoreVersionImpl(Module module) { for (OrderEntry orderEntry : ModuleRootManager.getInstance(module).getOrderEntries()) { if (orderEntry instanceof LibraryOrderEntry) { final String libraryName = ((LibraryOrderEntry)orderEntry).getLibraryName(); final Library library = ((LibraryOrderEntry)orderEntry).getLibrary(); //libraryName is null for simple jar entries if ((libraryName == null || libraryName.toLowerCase().contains("cucumber")) && library != null) { final VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); for (VirtualFile file : files) { final String version = getVersionByFile(file); if (version != null) return version; } } } } return getSimpleVersionFromMainClass(module); } private static String getSimpleVersionFromMainClass(Module module) { final JavaPsiFacade facade = JavaPsiFacade.getInstance(module.getProject()); final PsiClass oldMain = facade.findClass(CUCUMBER_CLI_MAIN_1_0, module.getModuleWithLibrariesScope()); if (oldMain != null) return CUCUMBER_VERSION_1_0; final PsiClass newMain = facade.findClass(CUCUMBER_API_CLI_MAIN_1_1, module.getModuleWithLibrariesScope()); if (newMain != null) return CUCUMBER_VERSION_1_1; return null; } @Nullable private static String getVersionByFile(VirtualFile file) { final String name = file.getName(); final Matcher matcher = CUCUMBER_PATTERN.matcher(name); if (matcher.matches() && matcher.groupCount() == 1) { return matcher.group(1); } return null; } }