diff --git a/.idea/modules.xml b/.idea/modules.xml
index 6f8c88351927..39bf8b7c5fe4 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -1269,6 +1269,7 @@
+
\ No newline at end of file
diff --git a/build/intellij.idea.community.build.iml b/build/intellij.idea.community.build.iml
index c8e0d3c3a29e..4447c346da9c 100644
--- a/build/intellij.idea.community.build.iml
+++ b/build/intellij.idea.community.build.iml
@@ -26,5 +26,6 @@
+
\ No newline at end of file
diff --git a/build/src/OpenSourceCommunityInstallersBuildTarget.kt b/build/src/OpenSourceCommunityInstallersBuildTarget.kt
index c22f1f855255..41daa0d92845 100644
--- a/build/src/OpenSourceCommunityInstallersBuildTarget.kt
+++ b/build/src/OpenSourceCommunityInstallersBuildTarget.kt
@@ -8,6 +8,7 @@ import org.jetbrains.intellij.build.createCommunityBuildContext
import org.jetbrains.intellij.build.impl.buildDistributions
import org.jetbrains.intellij.build.telemetry.TraceManager.spanBuilder
import org.jetbrains.intellij.build.telemetry.use
+import ru.openide.OpenIdePluginBundler
internal object OpenSourceCommunityInstallersBuildTarget {
@JvmStatic
@@ -22,6 +23,7 @@ internal object OpenSourceCommunityInstallersBuildTarget {
runBlocking(Dispatchers.Default) {
val context = createCommunityBuildContext(options)
+ OpenIdePluginBundler.bundleAmplicodePlugin(context)
CompilationTasks.create(context).compileModules(moduleNames = null, includingTestsInModules = listOf("intellij.platform.jps.build.tests"))
buildDistributions(context)
spanBuilder("build standalone JPS").use {
diff --git a/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt b/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt
index e2b128c41287..1db2081ed9e3 100644
--- a/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt
+++ b/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt
@@ -3,6 +3,7 @@
package org.jetbrains.intellij.build
import org.jetbrains.intellij.build.kotlin.KotlinBinaries
+import ru.openide.OpenIdePluginBundler
import java.nio.file.Path
open class OpenIdeProperties(val communityHomeDir: Path): IdeaCommunityProperties(communityHomeDir) {
@@ -79,4 +80,8 @@ open class OpenIdeProperties(val communityHomeDir: Path): IdeaCommunityPropertie
override fun getBaseArtifactName(appInfo: ApplicationInfoProperties, buildNumber: String) = "openIDE-$buildNumber"
override fun getOutputDirectoryName(appInfo: ApplicationInfoProperties) = "open-ide"
+
+ override fun getAdditionalPluginPaths(context: BuildContext): List {
+ return OpenIdePluginBundler.getBundlePluginPaths(context)
+ }
}
\ No newline at end of file
diff --git a/openide/openide.iml b/openide/openide.iml
new file mode 100644
index 000000000000..ad4d55e61a39
--- /dev/null
+++ b/openide/openide.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/openide/src/ru/openide/OpenIdePluginBundler.kt b/openide/src/ru/openide/OpenIdePluginBundler.kt
new file mode 100644
index 000000000000..8b3b35f7064a
--- /dev/null
+++ b/openide/src/ru/openide/OpenIdePluginBundler.kt
@@ -0,0 +1,57 @@
+// Copyright (c) Haulmont 2024. All Rights Reserved.
+// Use is subject to license terms.
+package ru.openide
+
+import com.intellij.openapi.util.JDOMUtil
+import com.intellij.util.io.HttpRequests
+import org.jdom.Element
+import org.jetbrains.intellij.build.BuildContext
+import org.jetbrains.intellij.build.dependencies.BuildDependenciesDownloader
+import org.jetbrains.intellij.build.dependencies.BuildDependenciesExtractOptions
+import org.jetbrains.intellij.build.BuildPaths.Companion.COMMUNITY_ROOT
+import java.net.URI
+import java.nio.file.Path
+
+object OpenIdePluginBundler {
+
+ private const val PLUGINS_DIR = "build/download/plugins"
+ private const val AMPLICODE_URL = "https://amplicode.ru"
+ private const val AMPLICODE_MARKETPLACE_URL = "https://amplicode.ru/jetbrains-marketplace"
+
+ fun getBundlePluginPaths(context: BuildContext): List {
+ val communityHomeDir = context.paths.communityHomeDir
+ return listOf(Path.of("${communityHomeDir}/$PLUGINS_DIR/amplicode"))
+ }
+
+ fun bundleAmplicodePlugin(context: BuildContext) {
+ val majorVersion = context.buildNumber.substringBefore('.')
+ val uri = resolveAmplicodeUri(majorVersion)
+ val archivePath = BuildDependenciesDownloader.downloadFileToCacheLocation(COMMUNITY_ROOT, uri)
+ val targetDir = context.paths.communityHomeDir.resolve("$PLUGINS_DIR/amplicode")
+ BuildDependenciesDownloader.extractFile(archivePath, targetDir, COMMUNITY_ROOT, BuildDependenciesExtractOptions.STRIP_ROOT)
+ }
+
+ private fun resolveAmplicodeUri(majorVersion: String): URI {
+ val result = runCatching {
+ HttpRequests.request(AMPLICODE_MARKETPLACE_URL)
+ .connect { JDOMUtil.load(it.getReader()) }
+ .let { findFragmentUrl(it, majorVersion) }
+ }
+
+ val specificUrl = result.getOrThrow().substring(1)
+ return URI.create("$AMPLICODE_URL$specificUrl")
+ }
+
+ private fun findFragmentUrl(element: Element?, majorVersion: String): String {
+ return element?.getChildren("plugin")
+ ?.firstOrNull { it.getAttributeValue("version").extractMajorVersion() == majorVersion }
+ ?.getAttributeValue("url")
+ ?: throw RuntimeException("Amlicode plugin url not found for $majorVersion version")
+ }
+
+ private fun String.extractMajorVersion(): String? {
+ val regex = Regex("""-(\d+?)-""")
+ val match = regex.find(this)
+ return match?.groupValues?.get(1)
+ }
+}
\ No newline at end of file
diff --git a/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt b/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt
index fa744c4d782b..2e1c55d83467 100644
--- a/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt
+++ b/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt
@@ -21,6 +21,7 @@ object WhiteListUrls {
"https://plugins.jetbrains.com", // TODO [OpenIDE]: replace url
"https://downloads.marketplace.jetbrains.com/files", // TODO [OpenIDE]: replace url
"https://repo1.maven.org/maven2/net/sourceforge/plantuml/plantuml/1.2023.10/plantuml-1.2023.10.jar",
+ "https://amplicode.ru"
)
@JvmStatic