Package org.jetbrains.plugins.cucumber.java.config

Source Code of org.jetbrains.plugins.cucumber.java.config.CucumberConfigUtil

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, new CachedValueProvider<String>() {
      @Nullable
      @Override
      public Result<String> compute() {
        return 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;
  }
}
TOP

Related Classes of org.jetbrains.plugins.cucumber.java.config.CucumberConfigUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.