From 41be0aa99fdee8777d967276ae3a03adc428f7cc Mon Sep 17 00:00:00 2001 From: Sven Efftinge Date: Thu, 26 May 2016 09:15:25 +0200 Subject: [PATCH] [lsp] USer JDK service loader to find ISetups --- .../xtext/ide/server/ServerModule.xtend | 4 +- ...ResourceServiceProviderServiceLoader.xtend | 51 +++++++++++++++++++ .../services/org.eclipse.xtext.ISetup | 1 + .../services/org.eclipse.xtext.ISetup | 1 + .../server/AbstractLanguageServerTest.xtend | 7 --- .../tests/server/WorkspaceManagerTest.xtend | 11 +--- 6 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ResourceServiceProviderServiceLoader.xtend create mode 100644 tests/org.eclipse.xtext.ide.tests/META-INF/services/org.eclipse.xtext.ISetup create mode 100644 tests/org.eclipse.xtext.ide.tests/src/META-INF/services/org.eclipse.xtext.ISetup diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ServerModule.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ServerModule.xtend index b4aeb4b50..42b4cb71a 100644 --- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ServerModule.xtend +++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ServerModule.xtend @@ -9,7 +9,7 @@ package org.eclipse.xtext.ide.server import com.google.inject.AbstractModule import org.eclipse.xtext.resource.IResourceServiceProvider -import org.eclipse.xtext.resource.impl.ResourceServiceProviderRegistryImpl +import org.eclipse.xtext.resource.ResourceServiceProviderServiceLoader /** * @author Sven Efftinge - Initial contribution and API @@ -17,7 +17,7 @@ import org.eclipse.xtext.resource.impl.ResourceServiceProviderRegistryImpl class ServerModule extends AbstractModule { override protected configure() { - bind(IResourceServiceProvider.Registry).toInstance(new ResourceServiceProviderRegistryImpl) + bind(IResourceServiceProvider.Registry).toProvider(ResourceServiceProviderServiceLoader) } } \ No newline at end of file diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ResourceServiceProviderServiceLoader.xtend b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ResourceServiceProviderServiceLoader.xtend new file mode 100644 index 000000000..488c293d2 --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ResourceServiceProviderServiceLoader.xtend @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. + * 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 + *******************************************************************************/ +package org.eclipse.xtext.resource + +import com.google.inject.Provider +import java.util.ServiceLoader +import org.eclipse.xtext.ISetup +import org.eclipse.xtext.resource.FileExtensionProvider +import org.eclipse.xtext.resource.IResourceServiceProvider +import org.eclipse.xtext.resource.impl.ResourceServiceProviderRegistryImpl +import com.google.inject.Singleton + +/** + * @author Sven Efftinge - Initial contribution and API + */ +@Singleton +class ResourceServiceProviderServiceLoader implements Provider { + + private static ServiceLoader setupLoader = ServiceLoader.load(ISetup) + + private def static IResourceServiceProvider.Registry loadRegistry() { + val registry = new ResourceServiceProviderRegistryImpl() + for (ISetup cp : setupLoader) { + val injector = cp.createInjectorAndDoEMFRegistration(); + val resourceServiceProvider = injector.getInstance(IResourceServiceProvider) + val extensionProvider = injector.getInstance(FileExtensionProvider) + for (ext : extensionProvider.fileExtensions) { + if (registry.extensionToFactoryMap.containsKey(ext)) { + if (extensionProvider.primaryFileExtension == ext) { + registry.extensionToFactoryMap.put(ext, resourceServiceProvider) + } + } else { + registry.extensionToFactoryMap.put(ext, resourceServiceProvider) + } + } + } + return registry; + } + + private static IResourceServiceProvider.Registry registry = loadRegistry + + override get() { + return registry + } + +} diff --git a/tests/org.eclipse.xtext.ide.tests/META-INF/services/org.eclipse.xtext.ISetup b/tests/org.eclipse.xtext.ide.tests/META-INF/services/org.eclipse.xtext.ISetup new file mode 100644 index 000000000..8a9160246 --- /dev/null +++ b/tests/org.eclipse.xtext.ide.tests/META-INF/services/org.eclipse.xtext.ISetup @@ -0,0 +1 @@ +org.eclipse.xtext.ide.tests.testlanguage.TestLanguageStandaloneSetup \ No newline at end of file diff --git a/tests/org.eclipse.xtext.ide.tests/src/META-INF/services/org.eclipse.xtext.ISetup b/tests/org.eclipse.xtext.ide.tests/src/META-INF/services/org.eclipse.xtext.ISetup new file mode 100644 index 000000000..8a9160246 --- /dev/null +++ b/tests/org.eclipse.xtext.ide.tests/src/META-INF/services/org.eclipse.xtext.ISetup @@ -0,0 +1 @@ +org.eclipse.xtext.ide.tests.testlanguage.TestLanguageStandaloneSetup \ No newline at end of file diff --git a/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/AbstractLanguageServerTest.xtend b/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/AbstractLanguageServerTest.xtend index dcdccf35b..094a4fd70 100644 --- a/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/AbstractLanguageServerTest.xtend +++ b/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/AbstractLanguageServerTest.xtend @@ -18,9 +18,6 @@ import java.util.List import java.util.Map import org.eclipse.xtext.ide.server.LanguageServerImpl import org.eclipse.xtext.ide.server.ServerModule -import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageStandaloneSetup -import org.eclipse.xtext.resource.FileExtensionProvider -import org.eclipse.xtext.resource.IResourceServiceProvider import org.eclipse.xtext.util.Files import org.junit.Before @@ -64,8 +61,4 @@ class AbstractLanguageServerTest implements NotificationCallback