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(