All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jetbrains.pluginverifier.plugin.AbstractPluginDetailsProvider.kt Maven / Gradle / Ivy

/*
 * Copyright 2000-2024 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 */

package com.jetbrains.pluginverifier.plugin

import com.jetbrains.plugin.structure.base.plugin.PluginCreationFail
import com.jetbrains.plugin.structure.base.plugin.PluginCreationSuccess
import com.jetbrains.plugin.structure.base.problems.PluginProblem
import com.jetbrains.plugin.structure.base.utils.closeLogged
import com.jetbrains.plugin.structure.base.utils.closeOnException
import com.jetbrains.plugin.structure.base.utils.rethrowIfInterrupted
import com.jetbrains.plugin.structure.intellij.classes.plugin.IdePluginClassesLocations
import com.jetbrains.plugin.structure.intellij.plugin.IdePlugin
import com.jetbrains.plugin.structure.intellij.plugin.IdePluginManager
import com.jetbrains.plugin.structure.intellij.plugin.StructurallyValidated
import com.jetbrains.plugin.structure.intellij.problems.UnableToReadPluginFile
import com.jetbrains.pluginverifier.repository.PluginInfo
import com.jetbrains.pluginverifier.repository.files.FileLock
import java.nio.file.Path

/**
 * Baseline implementation of the [PluginDetailsProvider] that
 * uses the [extractDirectory] for extracting `.zip`-ped plugins.
 */
abstract class AbstractPluginDetailsProvider(private val extractDirectory: Path) : PluginDetailsProvider {
  protected val idePluginManager = IdePluginManager.createManager(extractDirectory)

  private val IdePlugin.problems: List
    get() = if (this is StructurallyValidated) this.problems else emptyList()

  abstract fun readPluginClasses(pluginInfo: PluginInfo, idePlugin: IdePlugin): IdePluginClassesLocations

  override fun providePluginDetails(pluginInfo: PluginInfo, pluginFileLock: FileLock) =
    pluginFileLock.closeOnException {
      with(createPlugin(pluginInfo, pluginFileLock)) {
        when (this) {
          is PluginCreationSuccess -> {
            readPluginClasses(
              pluginInfo,
              plugin,
              plugin.problems,
              pluginFileLock
            )
          }

          is PluginCreationFail -> {
            pluginFileLock.closeLogged()
            PluginDetailsProvider.Result.InvalidPlugin(pluginInfo, errorsAndWarnings)
          }
        }
      }
    }

  override fun providePluginDetails(
    pluginInfo: PluginInfo,
    idePlugin: IdePlugin
  ): PluginDetailsProvider.Result {
    return readPluginClasses(pluginInfo, idePlugin, idePlugin.problems, null)
  }

  private fun readPluginClasses(
    pluginInfo: PluginInfo,
    idePlugin: IdePlugin,
    warnings: List,
    pluginFileLock: FileLock?
  ): PluginDetailsProvider.Result {
    return try {
      readPluginClasses(pluginInfo, idePlugin)
        .let { pluginClassesLocations ->
          PluginDetailsProvider.Result.Provided(
            PluginDetails(
              pluginInfo,
              idePlugin,
              warnings,
              pluginClassesLocations,
              pluginFileLock
            )
          )
        }
    } catch (e: Exception) {
      e.rethrowIfInterrupted()
      val message = e.message ?: e.javaClass.simpleName
      PluginDetailsProvider.Result.InvalidPlugin(pluginInfo, listOf(UnableToReadPluginFile(message)))
    }
  }

  protected open fun createPlugin(pluginInfo: PluginInfo, pluginFileLock: FileLock) =
    idePluginManager.createPlugin(pluginFileLock.file)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy