");
+ super.render(context, object, sb);
+ }
+ };
+
+ // Creates handler on button clicked
+ deletePreferenceColumn.setFieldUpdater(
+ new FieldUpdater
() {
+ @Override
+ public void update(int index, YamlPreference object, String value) {
+ delegate.onDeleteClicked(object);
+ }
+ });
+
+ YamlPreferenceCellTable.addColumn(urlColumn, local.urlColumnHeader());
+ YamlPreferenceCellTable.addColumn(globColumn, local.globColumnHeader());
+ YamlPreferenceCellTable.addColumn(deletePreferenceColumn, local.deleteColumnHeader());
+ YamlPreferenceCellTable.setWidth("100%", true);
+ YamlPreferenceCellTable.setColumnWidth(urlColumn, 45, Style.Unit.PCT);
+ YamlPreferenceCellTable.setColumnWidth(globColumn, 30, Style.Unit.PCT);
+ YamlPreferenceCellTable.setColumnWidth(deletePreferenceColumn, 25, Style.Unit.PCT);
+
+ // don't show loading indicator
+ YamlPreferenceCellTable.setLoadingIndicator(null);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void setPairs(@NotNull List pairs) {
+ this.YamlPreferenceCellTable.setRowData(pairs);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void setDelegate(ActionDelegate delegate) {
+ this.delegate = delegate;
+ }
+
+ @UiHandler("addUrl")
+ public void onAddUrlClicked(ClickEvent event) {
+ delegate.onAddUrlClicked();
+ }
+}
diff --git a/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/java/org/eclipse/che/plugin/yaml/ide/preferences/YamlExtensionManagerViewImpl.ui.xml b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/java/org/eclipse/che/plugin/yaml/ide/preferences/YamlExtensionManagerViewImpl.ui.xml
new file mode 100644
index 0000000000..096c698fff
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/java/org/eclipse/che/plugin/yaml/ide/preferences/YamlExtensionManagerViewImpl.ui.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ .alignRight {
+ float: right;
+ }
+
+ .alignLeft {
+ float: left;
+ }
+
+ .emptyBorder {
+ margin: 6px;
+ }
+
+ .space {
+ margin-left: 5px;
+ }
+
+ .button-layout {
+ min-width: 20px;
+ height: 20px;
+ padding: 0 3px;
+ }
+
+ .button-layout svg {
+ width: 14px;
+ height: 20px;
+ text-align: center;
+ padding-left: 3px;
+ fill: buttonFontColor;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/Yaml.gwt.xml b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/Yaml.gwt.xml
new file mode 100644
index 0000000000..aad7573529
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/Yaml.gwt.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/ide/YamlLocalizationConstant.properties b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/ide/YamlLocalizationConstant.properties
new file mode 100644
index 0000000000..215bc31386
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-ide/src/main/resources/org/eclipse/che/plugin/yaml/ide/YamlLocalizationConstant.properties
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2012-2017 Red Hat, Inc.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Red Hat, Inc. - initial API and implementation
+#
+
+addUrlText=Add Schema Url
+deleteUrlText=Delete Url
+headerUiMessage=Enter a schema which can be either the url, kedge, or kubernetes. If you specify kedge or kubernetes the languageserver will specify the schema url for you.
+addUrlLabel=Add Schema url
+addSchemaButtonText=Add
+deleteUrlLabel=Delete url
+urlColumnHeader=Schema Url
+globColumnHeader=Apply To
+deleteColumnHeader=Delete
diff --git a/plugins/plugin-yaml/che-plugin-yaml-server/pom.xml b/plugins/plugin-yaml/che-plugin-yaml-server/pom.xml
new file mode 100644
index 0000000000..663df27903
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-server/pom.xml
@@ -0,0 +1,90 @@
+
+
+
+ 4.0.0
+
+ che-plugin-yaml-parent
+ org.eclipse.che.plugin
+ 5.19.0-SNAPSHOT
+
+ che-plugin-yaml-server
+ Che Plugin :: Yaml :: Server
+
+ false
+
+
+
+ com.google.code.gson
+ gson
+
+
+ com.google.inject
+ guice
+
+
+ com.google.inject.extensions
+ guice-multibindings
+
+
+ javax.inject
+ javax.inject
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+
+
+ org.eclipse.che.core
+ che-core-api-core
+
+
+ org.eclipse.che.core
+ che-core-api-languageserver
+
+
+ org.eclipse.che.core
+ che-core-api-languageserver-shared
+
+
+ org.eclipse.che.core
+ che-core-commons-inject
+
+
+ org.eclipse.che.plugin
+ che-plugin-yaml-shared
+
+
+ org.eclipse.lsp4j
+ org.eclipse.lsp4j
+
+
+ org.eclipse.lsp4j
+ org.eclipse.lsp4j.jsonrpc
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+
+ src/main/java
+
+
+ src/main/resources
+
+
+
+
diff --git a/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/inject/YamlModule.java b/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/inject/YamlModule.java
new file mode 100644
index 0000000000..5e28adf894
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/inject/YamlModule.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2012-2017 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.plugin.yaml.server.inject;
+
+import static java.util.Arrays.asList;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncher;
+import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;
+import org.eclipse.che.inject.DynaModule;
+import org.eclipse.che.plugin.yaml.server.languageserver.YamlLanguageServerLauncher;
+import org.eclipse.che.plugin.yaml.server.languageserver.YamlService;
+
+/**
+ * Yaml module for server side of Yaml Language Server
+ *
+ * @author Joshua Pinkney
+ */
+@DynaModule
+public class YamlModule extends AbstractModule {
+ public static final String LANGUAGE_ID = "yaml";
+ private static final String[] EXTENSIONS = new String[] {"yaml", "yml"};
+ private static final String MIME_TYPE = "text/yaml";
+
+ @Override
+ protected void configure() {
+ Multibinder.newSetBinder(binder(), LanguageServerLauncher.class)
+ .addBinding()
+ .to(YamlLanguageServerLauncher.class);
+ LanguageDescription description = new LanguageDescription();
+ description.setFileExtensions(asList(EXTENSIONS));
+ description.setLanguageId(LANGUAGE_ID);
+ description.setMimeType(MIME_TYPE);
+ Multibinder.newSetBinder(binder(), LanguageDescription.class)
+ .addBinding()
+ .toInstance(description);
+
+ bind(YamlService.class);
+ }
+}
diff --git a/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/languageserver/YamlLanguageServerLauncher.java b/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/languageserver/YamlLanguageServerLauncher.java
new file mode 100644
index 0000000000..cdbaf8499a
--- /dev/null
+++ b/plugins/plugin-yaml/che-plugin-yaml-server/src/main/java/org/eclipse/che/plugin/yaml/server/languageserver/YamlLanguageServerLauncher.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2012-2017 Red Hat, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.plugin.yaml.server.languageserver;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import javax.inject.Named;
+import org.eclipse.che.api.core.ApiException;
+import org.eclipse.che.api.core.rest.HttpJsonRequestFactory;
+import org.eclipse.che.api.languageserver.exception.LanguageServerException;
+import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncher;
+import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncherTemplate;
+import org.eclipse.che.api.languageserver.registry.DocumentFilter;
+import org.eclipse.che.api.languageserver.registry.LanguageServerDescription;
+import org.eclipse.che.api.languageserver.registry.ServerInitializerObserver;
+import org.eclipse.che.plugin.yaml.server.inject.YamlModule;
+import org.eclipse.che.plugin.yaml.shared.PreferenceHelper;
+import org.eclipse.che.plugin.yaml.shared.YamlPreference;
+import org.eclipse.lsp4j.ServerCapabilities;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.services.LanguageClient;
+import org.eclipse.lsp4j.services.LanguageServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Launcher for Yaml Language Server
+ *
+ * @author Joshua Pinkney
+ */
+@Singleton
+public class YamlLanguageServerLauncher extends LanguageServerLauncherTemplate
+ implements ServerInitializerObserver {
+
+ private static final Logger LOG = LoggerFactory.getLogger(YamlLanguageServerLauncher.class);
+
+ private static final String REGEX = ".*\\.(yaml|yml)";
+ private static final LanguageServerDescription DESCRIPTION = createServerDescription();
+ private static LanguageServer yamlLanguageServer;
+ private final Path launchScript;
+ private HttpJsonRequestFactory requestFactory;
+ private String apiUrl;
+
+ @Inject
+ public YamlLanguageServerLauncher(
+ @Named("che.api") String apiUrl, HttpJsonRequestFactory requestFactory) {
+ this.apiUrl = apiUrl;
+ this.requestFactory = requestFactory;
+ launchScript = Paths.get(System.getenv("HOME"), "che/ls-yaml/launch.sh");
+ }
+
+ @Override
+ public boolean isAbleToLaunch() {
+ return Files.exists(launchScript);
+ }
+
+ protected LanguageServer connectToLanguageServer(
+ final Process languageServerProcess, LanguageClient client) {
+ Launcher launcher =
+ Launcher.createLauncher(
+ client,
+ LanguageServer.class,
+ languageServerProcess.getInputStream(),
+ languageServerProcess.getOutputStream());
+ launcher.startListening();
+ setYamlLanguageServer(launcher.getRemoteProxy());
+ return launcher.getRemoteProxy();
+ }
+
+ protected Process startLanguageServerProcess(String projectPath) throws LanguageServerException {
+ ProcessBuilder processBuilder = new ProcessBuilder(launchScript.toString());
+ processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE);
+ processBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE);
+ try {
+ return processBuilder.start();
+ } catch (IOException e) {
+ throw new LanguageServerException("Can't start YAML language server", e);
+ }
+ }
+
+ protected static LanguageServer getYamlLanguageServer() {
+ return yamlLanguageServer;
+ }
+
+ protected static void setYamlLanguageServer(LanguageServer yamlLanguageServer) {
+ YamlLanguageServerLauncher.yamlLanguageServer = yamlLanguageServer;
+ }
+
+ @Override
+ public void onServerInitialized(
+ LanguageServerLauncher launcher,
+ LanguageServer server,
+ ServerCapabilities capabilities,
+ String projectPath) {
+
+ try {
+ Map preferences =
+ requestFactory.fromUrl(apiUrl + "/preferences").useGetMethod().request().asProperties();
+
+ Endpoint endpoint = ServiceEndpoints.toEndpoint(server);
+ YamlSchemaAssociations serviceObject =
+ ServiceEndpoints.toServiceObject(endpoint, YamlSchemaAssociations.class);
+ Map associations =
+ jsonToSchemaAssociations(preferences.get("yaml.preferences"));
+ serviceObject.yamlSchemaAssociation(associations);
+
+ } catch (ApiException | IOException e) {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ }
+
+ /**
+ * Converts json string to map of schema associations
+ *
+ * @param jsonStr The json string you would like to change to schema association
+ * @return Map of schema associations
+ */
+ private Map jsonToSchemaAssociations(String jsonStr) {
+ List preferenceList = jsonToYamlPreference(jsonStr);
+
+ if (preferenceList == null) {
+ return null;
+ }
+
+ Map> preferenceSchemaMap =
+ PreferenceHelper.yamlPreferenceToMap(preferenceList);
+ Map jsonSchemaMap = new HashMap();
+ for (Map.Entry> preferenceEntry : preferenceSchemaMap.entrySet()) {
+ jsonSchemaMap.put(
+ preferenceEntry.getKey(), preferenceEntry.getValue().toArray(new String[0]));
+ }
+ return jsonSchemaMap;
+ }
+
+ /**
+ * Converts json string to yaml preference
+ *
+ * @param jsonStr The json string you would like to change into Yaml Preferences
+ * @return List of Yaml Preferences
+ */
+ private List jsonToYamlPreference(String jsonStr) {
+
+ List preferences = new ArrayList();
+
+ Type type = new TypeToken