diff --git a/.ci/set_tag_version_images.sh b/.ci/set_tag_version_images.sh
index f4cd0d024e..21be56560c 100755
--- a/.ci/set_tag_version_images.sh
+++ b/.ci/set_tag_version_images.sh
@@ -17,9 +17,7 @@ sed_in_place() {
# only use /latest plugins so updates are smoother (old plugins are deleted from registries with each new release)
plugin_version="latest"
sed_in_place -r -e "s#che.factory.default_editor=eclipse/che-theia/.*#che.factory.default_editor=eclipse/che-theia/$plugin_version#g" ../assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
-sed_in_place -r -e "s#che.factory.default_plugins=eclipse/che-machine-exec-plugin/.*#che.factory.default_plugins=eclipse/che-machine-exec-plugin/$plugin_version#g" ../assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
sed_in_place -r -e "s#che.workspace.devfile.default_editor=eclipse/che-theia/.*#che.workspace.devfile.default_editor=eclipse/che-theia/$plugin_version#g" ../assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
-sed_in_place -r -e "s#che.workspace.devfile.default_editor.plugins=eclipse/che-machine-exec-plugin/.*#che.workspace.devfile.default_editor.plugins=eclipse/che-machine-exec-plugin/$plugin_version#g" ../assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
# use actual image tags, so a new container is used after each update
image_version="$1"
diff --git a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
index 035d750e2f..0d9178029d 100644
--- a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
+++ b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/che.properties
@@ -743,7 +743,7 @@ che.factory.default_editor=eclipse/che-theia/next
# which doesn't contain any Che-specific workspace descriptor.
# Multiple plugins must be comma-separated, for example:
# pluginFooPublisher/pluginFooName/pluginFooVersion,pluginBarPublisher/pluginBarName/pluginBarVersion
-che.factory.default_plugins=eclipse/che-machine-exec-plugin/nightly
+che.factory.default_plugins=NULL
# Devfile filenames to look on repository-based factories (like GitHub etc).
# Factory will try to locate those files in the order they enumerated in the property.
@@ -763,7 +763,7 @@ che.workspace.devfile.default_editor=eclipse/che-theia/next
# Format is comma-separated `pluginPublisher/pluginName/pluginVersion` values, and URLs. For example:
# eclipse/che-theia-exec-plugin/0.0.1,eclipse/che-theia-terminal-plugin/0.0.1,https://cdn.pluginregistry.com/vi-mode/meta.yaml
# If the plugin is a URL, the plugin's meta.yaml is retrieved from that URL.
-che.workspace.devfile.default_editor.plugins=eclipse/che-machine-exec-plugin/nightly
+che.workspace.devfile.default_editor.plugins=NULL
# Defines comma-separated list of labels for selecting secrets from a user namespace,
# which will be mount into workspace containers as a files or env variables.
diff --git a/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java b/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
index 92a5a356f8..26c6df0420 100644
--- a/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
+++ b/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
@@ -302,9 +302,9 @@ public class JpaEntitiesCascadeRemovalTest {
bindConstant()
.annotatedWith(Names.named("che.websocket.endpoint"))
.to("che.websocket.endpoint");
- bind(String[].class)
+ bind(String.class)
.annotatedWith(Names.named("che.workspace.devfile.default_editor.plugins"))
- .toInstance(new String[] {"default/plugin/0.0.1"});
+ .toInstance("default/plugin/0.0.1");
bind(String.class)
.annotatedWith(Names.named("che.workspace.devfile.async.storage.plugin"))
.toInstance("");
diff --git a/wsmaster/che-core-api-factory/pom.xml b/wsmaster/che-core-api-factory/pom.xml
index 458774597d..0a65f9fa66 100644
--- a/wsmaster/che-core-api-factory/pom.xml
+++ b/wsmaster/che-core-api-factory/pom.xml
@@ -90,6 +90,10 @@
org.eclipse.che.core
che-core-api-workspace-shared
+
+ org.eclipse.che.core
+ che-core-commons-annotations
+
org.eclipse.che.core
che-core-commons-lang
diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilder.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilder.java
index cd8bfa7176..b0a322272e 100644
--- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilder.java
+++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/urlfactory/URLFactoryBuilder.java
@@ -48,6 +48,7 @@ import org.eclipse.che.api.workspace.server.model.impl.devfile.MetadataImpl;
import org.eclipse.che.api.workspace.shared.dto.WorkspaceConfigDto;
import org.eclipse.che.api.workspace.shared.dto.devfile.DevfileDto;
import org.eclipse.che.api.workspace.shared.dto.devfile.MetadataDto;
+import org.eclipse.che.commons.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,7 +72,7 @@ public class URLFactoryBuilder {
@Inject
public URLFactoryBuilder(
@Named("che.factory.default_editor") String defaultCheEditor,
- @Named("che.factory.default_plugins") String defaultChePlugins,
+ @Nullable @Named("che.factory.default_plugins") String defaultChePlugins,
DevfileParser devfileParser,
DevfileVersionDetector devfileVersionDetector) {
this.defaultCheEditor = defaultCheEditor;
@@ -221,7 +222,9 @@ public class URLFactoryBuilder {
Map attributes = new HashMap<>();
attributes.put(WORKSPACE_TOOLING_EDITOR_ATTRIBUTE, defaultCheEditor);
- attributes.put(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE, defaultChePlugins);
+ if (!isNullOrEmpty(defaultChePlugins)) {
+ attributes.put(WORKSPACE_TOOLING_PLUGINS_ATTRIBUTE, defaultChePlugins);
+ }
// workspace configuration using the environment
return newDto(WorkspaceConfigDto.class).withName(name).withAttributes(attributes);
diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceService.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceService.java
index f537fd47de..6d4d998988 100644
--- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceService.java
+++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceService.java
@@ -137,7 +137,7 @@ public class WorkspaceService extends Service {
@Named(CHE_WORKSPACE_STORAGE_AVAILABLE_TYPES) String availableStorageTypes,
@Named(CHE_WORKSPACE_STORAGE_PREFERRED_TYPE) String preferredStorageType,
@Named(CHE_FACTORY_DEFAULT_EDITOR_PROPERTY) String defaultEditor,
- @Named(CHE_FACTORY_DEFAULT_PLUGINS_PROPERTY) String defaultPlugins,
+ @Named(CHE_FACTORY_DEFAULT_PLUGINS_PROPERTY) @Nullable String defaultPlugins,
@Named(CHE_DEVWORKSPACES_ENABLED_PROPERTY) boolean cheDevWorkspacesEnabled) {
this.apiEndpoint = apiEndpoint;
this.cheWorkspaceAutoStart = cheWorkspaceAutoStart;
@@ -464,7 +464,9 @@ public class WorkspaceService extends Service {
settings.put("cheWorkspaceDevfileRegistryInternalUrl", devfileRegistryInternalUrl);
}
- settings.put(CHE_FACTORY_DEFAULT_PLUGINS_PROPERTY, defaultPlugins);
+ if (defaultPlugins != null) {
+ settings.put(CHE_FACTORY_DEFAULT_PLUGINS_PROPERTY, defaultPlugins);
+ }
settings.put(CHE_FACTORY_DEFAULT_EDITOR_PROPERTY, defaultEditor);
settings.put(CHE_WORKSPACE_STORAGE_AVAILABLE_TYPES, availableStorageTypes);
settings.put(CHE_WORKSPACE_STORAGE_PREFERRED_TYPE, preferredStorageType);
diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisioner.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisioner.java
index 5490f4b248..a7aaeda1e6 100644
--- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisioner.java
+++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisioner.java
@@ -34,6 +34,7 @@ import org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;
import org.eclipse.che.api.workspace.server.spi.InfrastructureException;
import org.eclipse.che.api.workspace.server.wsplugins.PluginFQNParser;
import org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN;
+import org.eclipse.che.commons.annotation.Nullable;
/**
* Provision default editor if there is no any another editor and default plugins for it.
@@ -52,7 +53,7 @@ public class DefaultEditorProvisioner {
@Inject
public DefaultEditorProvisioner(
@Named("che.workspace.devfile.default_editor") String defaultEditorRef,
- @Named("che.workspace.devfile.default_editor.plugins") String[] defaultPluginsRefs,
+ @Named("che.workspace.devfile.default_editor.plugins") @Nullable String defaultPluginsRefs,
@Named("che.workspace.devfile.async.storage.plugin") String asyncStoragePluginRef,
ComponentFQNParser componentFQNParser,
PluginFQNParser pluginFQNParser)
@@ -66,8 +67,10 @@ public class DefaultEditorProvisioner {
? null
: componentFQNParser.getPluginPublisherAndName(this.defaultEditorRef);
Map map = new HashMap<>();
- for (String defaultPluginsRef : defaultPluginsRefs) {
- map.put(componentFQNParser.getPluginPublisherAndName(defaultPluginsRef), defaultPluginsRef);
+ if (!isNullOrEmpty(defaultPluginsRefs)) {
+ for (String defaultPluginsRef : defaultPluginsRefs.split(",")) {
+ map.put(componentFQNParser.getPluginPublisherAndName(defaultPluginsRef), defaultPluginsRef);
+ }
}
this.defaultPluginsToRefs = map;
}
diff --git a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisionerTest.java b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisionerTest.java
index 2a0e4500e3..fe19f99c83 100644
--- a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisionerTest.java
+++ b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/devfile/convert/DefaultEditorProvisionerTest.java
@@ -71,7 +71,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- null, new String[] {}, ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);
+ null, "", ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
// when
@@ -87,7 +87,7 @@ public class DefaultEditorProvisionerTest {
provisioner =
new DefaultEditorProvisioner(
EDITOR_REF,
- new String[] {TERMINAL_PLUGIN_REF, COMMAND_PLUGIN_REF},
+ TERMINAL_PLUGIN_REF + "," + COMMAND_PLUGIN_REF,
"",
fqnParser,
pluginFQNParser);
@@ -110,7 +110,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl defaultEditorWithDifferentVersion =
@@ -136,7 +136,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl defaultEditorWithDifferentVersion =
@@ -163,7 +163,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl editorWithNameSimilarToDefault =
@@ -187,7 +187,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
devfile.getAttributes().put(EDITOR_FREE_DEVFILE_ATTRIBUTE, "true");
@@ -207,7 +207,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl pluginWithNameSimilarToDefault =
@@ -230,8 +230,7 @@ public class DefaultEditorProvisionerTest {
public void shouldNotProvisionDefaultEditorOrDefaultPluginsIfDevfileAlreadyHasNonDefaultEditor()
throws Exception {
// given
- provisioner =
- new DefaultEditorProvisioner(EDITOR_REF, new String[] {}, "", fqnParser, pluginFQNParser);
+ provisioner = new DefaultEditorProvisioner(EDITOR_REF, "", "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl nonDefaultEditor =
new ComponentImpl(EDITOR_COMPONENT_TYPE, "anypublisher/anyname/v" + EDITOR_VERSION);
@@ -250,8 +249,7 @@ public class DefaultEditorProvisionerTest {
public void shouldNotProvisionDefaultEditorIfDevfileAlreadyContainsSuchButWithDifferentVersion()
throws Exception {
// given
- provisioner =
- new DefaultEditorProvisioner(EDITOR_REF, new String[] {}, "", fqnParser, pluginFQNParser);
+ provisioner = new DefaultEditorProvisioner(EDITOR_REF, "", "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl myTheiaEditor =
new ComponentImpl(
@@ -271,8 +269,7 @@ public class DefaultEditorProvisionerTest {
public void shouldNotProvisionDefaultEditorIfDevfileAlreadyContainsSuchByReference()
throws Exception {
// given
- provisioner =
- new DefaultEditorProvisioner(EDITOR_REF, new String[] {}, "", fqnParser, pluginFQNParser);
+ provisioner = new DefaultEditorProvisioner(EDITOR_REF, "", "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl myTheiaEditor =
new ComponentImpl(
@@ -307,7 +304,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl myTerminal =
new ComponentImpl(
@@ -330,7 +327,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF, new String[] {TERMINAL_PLUGIN_REF}, "", fqnParser, pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
String meta =
"apiVersion: v2\n"
@@ -365,11 +362,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF,
- new String[] {EDITOR_PUBLISHER + "/" + "my-plugin/v2.0"},
- "",
- fqnParser,
- pluginFQNParser);
+ EDITOR_REF, EDITOR_PUBLISHER + "/" + "my-plugin/v2.0", "", fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
ComponentImpl myPlugin =
new ComponentImpl(
@@ -396,7 +389,7 @@ public class DefaultEditorProvisionerTest {
provisioner =
new DefaultEditorProvisioner(
EDITOR_REF,
- new String[] {EDITOR_PUBLISHER + "/" + "my-plugin/v2.0", referencePluginRef},
+ EDITOR_PUBLISHER + "/" + "my-plugin/v2.0" + "," + referencePluginRef,
"",
fqnParser,
pluginFQNParser);
@@ -430,11 +423,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF,
- new String[] {TERMINAL_PLUGIN_REF},
- ASYNC_STORAGE_PLUGIN_REF,
- fqnParser,
- pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
devfile.setAttributes(ImmutableMap.of(Constants.ASYNC_PERSIST_ATTRIBUTE, "true"));
@@ -454,11 +443,7 @@ public class DefaultEditorProvisionerTest {
// given
provisioner =
new DefaultEditorProvisioner(
- EDITOR_REF,
- new String[] {TERMINAL_PLUGIN_REF},
- ASYNC_STORAGE_PLUGIN_REF,
- fqnParser,
- pluginFQNParser);
+ EDITOR_REF, TERMINAL_PLUGIN_REF, ASYNC_STORAGE_PLUGIN_REF, fqnParser, pluginFQNParser);
DevfileImpl devfile = new DevfileImpl();
devfile.setAttributes(