/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.languageserver.ide;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.JsArrayString;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.ide.api.component.WsAgentComponent;
import org.eclipse.che.ide.api.editor.EditorRegistry;
import org.eclipse.che.ide.api.filetypes.FileType;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.editor.orion.client.OrionContentTypeRegistrant;
import org.eclipse.che.ide.editor.orion.client.OrionHoverRegistrant;
import org.eclipse.che.ide.editor.orion.client.OrionOccurrencesRegistrant;
import org.eclipse.che.ide.editor.orion.client.jso.OrionContentTypeOverlay;
import org.eclipse.che.ide.editor.orion.client.jso.OrionHighlightingConfigurationOverlay;
import org.eclipse.che.plugin.languageserver.ide.editor.LanguageServerEditorProvider;
import org.eclipse.che.plugin.languageserver.ide.highlighting.OccurrencesProvider;
import org.eclipse.che.plugin.languageserver.ide.hover.HoverProvider;
import org.eclipse.che.plugin.languageserver.ide.service.LanguageServerRegistryServiceClient;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import static com.google.common.collect.Lists.newArrayList;
/**
* @author Evgen Vidolob
*/
@Singleton
public class LanguageServerFileTypeRegister implements WsAgentComponent {
private final LanguageServerRegistryServiceClient serverLanguageRegistry;
private final FileTypeRegistry fileTypeRegistry;
private final LanguageServerResources resources;
private final EditorRegistry editorRegistry;
private final OrionContentTypeRegistrant contentTypeRegistrant;
private final OrionHoverRegistrant orionHoverRegistrant;
private final OrionOccurrencesRegistrant orionOccurrencesRegistrant;
private final LanguageServerEditorProvider editorProvider;
private final HoverProvider hoverProvider;
private final OccurrencesProvider occurrencesProvider;
private final Map<String, String> ext2langId = new HashMap<>();
@Inject
public LanguageServerFileTypeRegister(LanguageServerRegistryServiceClient serverLanguageRegistry,
FileTypeRegistry fileTypeRegistry,
LanguageServerResources resources,
EditorRegistry editorRegistry,
OrionContentTypeRegistrant contentTypeRegistrant,
OrionHoverRegistrant orionHoverRegistrant,
OrionOccurrencesRegistrant orionOccurrencesRegistrant,
LanguageServerEditorProvider editorProvider,
HoverProvider hoverProvider,
OccurrencesProvider occurrencesProvider) {
this.serverLanguageRegistry = serverLanguageRegistry;
this.fileTypeRegistry = fileTypeRegistry;
this.resources = resources;
this.editorRegistry = editorRegistry;
this.contentTypeRegistrant = contentTypeRegistrant;
this.orionHoverRegistrant = orionHoverRegistrant;
this.orionOccurrencesRegistrant = orionOccurrencesRegistrant;
this.editorProvider = editorProvider;
this.hoverProvider = hoverProvider;
this.occurrencesProvider = occurrencesProvider;
}
@Override
public void start(final Callback<WsAgentComponent, Exception> callback) {
Promise<List<LanguageDescription>> registeredLanguages = serverLanguageRegistry.getSupportedLanguages();
registeredLanguages.then(new Operation<List<LanguageDescription>>() {
@Override
public void apply(List<LanguageDescription> langs) throws OperationException {
if (!langs.isEmpty()) {
JsArrayString contentTypes = JsArrayString.createArray().cast();
for (LanguageDescription lang : langs) {
String primaryExtension = lang.getFileExtensions().get(0);
for (String ext : lang.getFileExtensions()) {
final FileType fileType = new FileType(resources.file(), ext);
fileTypeRegistry.registerFileType(fileType);
editorRegistry.registerDefaultEditor(fileType, editorProvider);
ext2langId.put(ext, lang.getLanguageId());
}
List<String> mimeTypes = lang.getMimeTypes();
if (mimeTypes.isEmpty()) {
mimeTypes = newArrayList("text/x-" + lang.getLanguageId());
}
for (String contentTypeId : mimeTypes) {
contentTypes.push(contentTypeId);
OrionContentTypeOverlay contentType = OrionContentTypeOverlay.create();
contentType.setId(contentTypeId);
contentType.setName(lang.getLanguageId());
contentType.setExtension(primaryExtension);
contentType.setExtends("text/plain");
// highlighting
OrionHighlightingConfigurationOverlay config = OrionHighlightingConfigurationOverlay
.create();
config.setId(lang.getLanguageId() + ".highlighting");
config.setContentTypes(contentTypeId);
config.setPatterns(lang.getHighlightingConfiguration());
Logger logger = Logger.getLogger(LanguageServerFileTypeRegister.class.getName());
contentTypeRegistrant.registerFileType(contentType, config);
}
}
orionHoverRegistrant.registerHover(contentTypes, hoverProvider);
orionOccurrencesRegistrant.registerOccurrencesHandler(contentTypes, occurrencesProvider);
}
callback.onSuccess(LanguageServerFileTypeRegister.this);
}
}).catchError(new Operation<PromiseError>() {
@Override
public void apply(PromiseError arg) throws OperationException {
callback.onFailure(new Exception(arg.getMessage(), arg.getCause()));
}
});
}
boolean hasLSForExtension(String ext) {
return ext2langId.containsKey(ext);
}
String findLangId(String ext) {
return ext2langId.get(ext);
}
}