From 221fd0cf7163227def2db72b06d3a3d06dda0690 Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Sat, 11 Feb 2023 02:50:33 +0100
Subject: [PATCH] Towards classpath-based dl loading.

---
 .../DataDescriptionLanguageRuntimeModule.java |  4 +-
 ...nLanguageClasspathGlobalScopeProvider.java | 10 +++
 ...escriptionLanguageGlobalScopeProvider.java | 69 -------------------
 ...onLanguageResourceDescriptionStrategy.java | 48 -------------
 .../DataDescriptionLanguageScopeProvider.java |  8 ---
 .../dsl/GeneratorDSLRuntimeModule.java        |  6 +-
 ...GeneratorClasspathGlobalScopeProvider.java | 49 ++-----------
 .../MachineLearningLanguageRuntimeModule.java |  4 +-
 ...eLearningClasspathGlobalScopeProvider.java | 10 +++
 .../OptimisationLanguageRuntimeModule.java    |  4 +-
 ...nLanguageClasspathGlobalScopeProvider.java | 10 +++
 .../model/ol/dsl/utils/BuiltinDSLInfo.java    | 27 --------
 .../ol/dsl/utils/BuiltinMapProvider.java      | 11 ---
 .../ClasspathDefaultGlobalScopeProvider.java  | 40 -----------
 .../utils/EvoalReleaseBuiltinDSLProvider.java | 68 ------------------
 .../ol/dsl/utils/OLGlobalScopeProvider.java   | 10 ---
 .../META-INF/MANIFEST.MF                      |  3 +-
 .../model/utils/builtin/BuiltinProvider.java  | 12 +++-
 .../utils/builtin/BuiltinProviderFactory.java |  1 -
 .../utils/builtin/ExtensionPointLookup.java   | 10 +--
 .../model/utils/builtin/package-info.java     | 12 ++++
 .../scoping/ClasspathGlobalScopeProvider.java | 58 ++++++++++++++++
 .../core/builtin/ReleaseBuiltinProvider.java  | 17 +++--
 23 files changed, 138 insertions(+), 353 deletions(-)
 create mode 100644 src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageClasspathGlobalScopeProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageGlobalScopeProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageResourceDescriptionStrategy.java
 create mode 100644 src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/scoping/MachineLearningClasspathGlobalScopeProvider.java
 create mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/scoping/OptimisationLanguageClasspathGlobalScopeProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinDSLInfo.java
 delete mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinMapProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/ClasspathDefaultGlobalScopeProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/EvoalReleaseBuiltinDSLProvider.java
 delete mode 100644 src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/OLGlobalScopeProvider.java
 create mode 100644 src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/package-info.java
 create mode 100644 src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/scoping/ClasspathGlobalScopeProvider.java

diff --git a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/DataDescriptionLanguageRuntimeModule.java b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/DataDescriptionLanguageRuntimeModule.java
index a1c23c7c..93d7a62f 100644
--- a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/DataDescriptionLanguageRuntimeModule.java
+++ b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/DataDescriptionLanguageRuntimeModule.java
@@ -8,8 +8,8 @@ import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.naming.SimpleNameProvider;
 import org.eclipse.xtext.scoping.IGlobalScopeProvider;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
 
+import de.evoal.languages.model.ddl.dsl.scoping.DataDescriptionLanguageClasspathGlobalScopeProvider;
 import de.evoal.languages.model.utils.converter.ValueConverterService;
 
 /**
@@ -18,7 +18,7 @@ import de.evoal.languages.model.utils.converter.ValueConverterService;
 public class DataDescriptionLanguageRuntimeModule extends AbstractDataDescriptionLanguageRuntimeModule {
 	@Override
 	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
-		return ImportUriGlobalScopeProvider.class;
+		return DataDescriptionLanguageClasspathGlobalScopeProvider.class;
 	}
 
 	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
diff --git a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageClasspathGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageClasspathGlobalScopeProvider.java
new file mode 100644
index 00000000..830f4a44
--- /dev/null
+++ b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageClasspathGlobalScopeProvider.java
@@ -0,0 +1,10 @@
+package de.evoal.languages.model.ddl.dsl.scoping;
+
+
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
+
+public class DataDescriptionLanguageClasspathGlobalScopeProvider extends ClasspathGlobalScopeProvider {
+	public DataDescriptionLanguageClasspathGlobalScopeProvider() {
+		super("data");
+	}
+}
diff --git a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageGlobalScopeProvider.java
deleted file mode 100644
index e5a0b6c1..00000000
--- a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageGlobalScopeProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package de.evoal.languages.model.ddl.dsl.scoping;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-
-import javax.inject.Inject;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.EcoreUtil2;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.resource.IResourceDescription;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
-import org.eclipse.xtext.util.IResourceScopeCache;
-
-import com.google.inject.Provider;
-
-import de.evoal.languages.model.ddl.DdlPackage;
-
-public class DataDescriptionLanguageGlobalScopeProvider extends ImportUriGlobalScopeProvider {
-	@Inject
-	private IResourceDescription.Manager descriptionManager;
-
-	@Inject
-	private IResourceScopeCache cache;
-
-
-	@Override
-	protected LinkedHashSet<URI> getImportedUris(final Resource resource) {
-		return cache.get("ddl-cache", resource, new Provider<LinkedHashSet<URI>>() {
-			@Override
-			public LinkedHashSet<URI> get() {
-				final LinkedHashSet<URI> uniqueImportURIs = collectImportUris(resource, new LinkedHashSet<URI>(5));
-
-				final Iterator<URI> uriIter = uniqueImportURIs.iterator();
-				while(uriIter.hasNext()) {
-					if(!EcoreUtil2.isValidUri(resource, uriIter.next()))
-						uriIter.remove();
-				}
-				
-				return uniqueImportURIs;
-			}
-
-			private LinkedHashSet<URI> collectImportUris(final Resource resource, final LinkedHashSet<URI> uniqueImportURIs) {
-				final IResourceDescription resourceDescription = descriptionManager.getResourceDescription(resource);
-				Iterable<IEObjectDescription> models = resourceDescription.getExportedObjectsByType(DdlPackage.Literals.DATA_DESCRIPTION_MODEL);
-				
-
-				models.forEach(it -> {
-					String userData = it.getUserData(DataDescriptionLanguageResourceDescriptionStrategy.USES);
-
-					if(userData != null) {
-						Arrays.stream(userData.split(","))
-							  .forEach(uri -> {
-									URI includedUri = URI.createURI(uri);
-									includedUri = includedUri.resolve(resource.getURI());
-									if(uniqueImportURIs.add(includedUri)) {
-										collectImportUris(resource.getResourceSet().getResource(includedUri, true), uniqueImportURIs);
-									}
-							  });
-					}
-				});
-
-				return uniqueImportURIs;
-			}
-		});
-	}
-}
diff --git a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageResourceDescriptionStrategy.java b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageResourceDescriptionStrategy.java
deleted file mode 100644
index 364d7b13..00000000
--- a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageResourceDescriptionStrategy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package de.evoal.languages.model.ddl.dsl.scoping;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.EObjectDescription;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.scoping.impl.ImportUriResolver;
-import org.eclipse.xtext.util.IAcceptor;
-
-import de.evoal.languages.model.ddl.DataDescriptionModel;
-
-import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
-
-public class DataDescriptionLanguageResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {
-	public static final String USES = "uses";
-			
-	@Inject
-	private ImportUriResolver uriResolver;
-	
-	@Override
-	public boolean createEObjectDescriptions(final EObject eObject, final IAcceptor<IEObjectDescription> acceptor) {
-		if(eObject instanceof DataDescriptionModel) {
-			this.createEObjectDescriptionForModel((DataDescriptionModel)eObject, acceptor);
-			return true;
-		} else {
-			return super.createEObjectDescriptions(eObject, acceptor);
-		}
-	}
-
-	private void createEObjectDescriptionForModel(final DataDescriptionModel model, final IAcceptor<IEObjectDescription> acceptor) {
-		final List<String> uris = new ArrayList<>();
-
-		model.getUses().forEach(it -> uris.add(uriResolver.apply(it)));
-		
-		final Map<String, String> userData = new HashMap<>();
-		userData.put(USES, String.join(",", uris));
-
-		acceptor.accept(EObjectDescription.create(QualifiedName.create(model.eResource().getURI().toString()), model, userData));
-	}
-
-}
diff --git a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageScopeProvider.java b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageScopeProvider.java
index 2f2128e7..e23f5bcf 100644
--- a/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageScopeProvider.java
+++ b/src/languages/de.evoal.languages.model.ddl.dsl/src/de/evoal/languages/model/ddl/dsl/scoping/DataDescriptionLanguageScopeProvider.java
@@ -4,10 +4,6 @@
  */
 package de.evoal.languages.model.ddl.dsl.scoping;
 
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.xtext.scoping.IScope;
-
 /**
  * This class contains custom scoping description.
  * 
@@ -15,8 +11,4 @@ import org.eclipse.xtext.scoping.IScope;
  * on how and when to use it.
  */
 public class DataDescriptionLanguageScopeProvider extends AbstractDataDescriptionLanguageScopeProvider {
-	@Override
-	public IScope getScope(final EObject context, final EReference reference) {
-		return super.getScope(context, reference);
-	}
 }
diff --git a/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/GeneratorDSLRuntimeModule.java b/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/GeneratorDSLRuntimeModule.java
index c72e3644..61832d5a 100644
--- a/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/GeneratorDSLRuntimeModule.java
+++ b/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/GeneratorDSLRuntimeModule.java
@@ -5,9 +5,8 @@ package de.evoal.languages.model.generator.dsl;
 
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.scoping.IGlobalScopeProvider;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
 
-import de.evoal.languages.model.generator.dsl.scoping.ClasspathGlobalScopeProvider;
+import de.evoal.languages.model.generator.dsl.scoping.GeneratorClasspathGlobalScopeProvider;
 import de.evoal.languages.model.utils.converter.ValueConverterService;
 
 /**
@@ -16,8 +15,7 @@ import de.evoal.languages.model.utils.converter.ValueConverterService;
 public class GeneratorDSLRuntimeModule extends AbstractGeneratorDSLRuntimeModule {
 	@Override
 	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
-		//return ImportUriGlobalScopeProvider.class;
-		return ClasspathGlobalScopeProvider.class;
+		return GeneratorClasspathGlobalScopeProvider.class;
 	}
 	
     @Override
diff --git a/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/scoping/GeneratorClasspathGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/scoping/GeneratorClasspathGlobalScopeProvider.java
index 65903d2e..a387dbde 100644
--- a/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/scoping/GeneratorClasspathGlobalScopeProvider.java
+++ b/src/languages/de.evoal.languages.model.generator.dsl/src/de/evoal/languages/model/generator/dsl/scoping/GeneratorClasspathGlobalScopeProvider.java
@@ -1,51 +1,10 @@
 package de.evoal.languages.model.generator.dsl.scoping;
 
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.ServiceLoader;
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
 
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.resource.IResourceDescription;
-import org.eclipse.xtext.scoping.IScope;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
-
-import com.google.common.base.Predicate;
-import com.google.inject.Inject;
-
-import de.evoal.languages.model.utils.builtin.BuiltinProvider;
-import de.evoal.languages.model.utils.builtin.BuiltinProviderFactory;
-
-public class ClasspathGlobalScopeProvider extends ImportUriGlobalScopeProvider {
-	@Inject
-	IResourceDescription.Manager mgr;
-
-	@Override
-	public IScope getScope(final Resource resource, final EReference reference, final Predicate<IEObjectDescription> filter) {
-		System.err.println("Asking for scope of " + resource);
-		final BuiltinProvider provider = BuiltinProviderFactory.create();
-		final Collection<java.net.URI> uris = provider.findBuiltins("META-INF/definitions/surrogate/");
-
-		URI libaryResourceURI = URI.createURI("dummy://demo/test.mydsl");
-		Resource libaryResource = resource.getResourceSet().getResource(libaryResourceURI, false);
-		if (libaryResource == null) {
-			System.out.println("LOOOOOOOOAAAAADDDDD");
-			libaryResource = resource.getResourceSet().createResource(libaryResourceURI);
-//			try {
-//				libaryResource.load(new StringInputStream("Hello Libary1! Hello Libary2 from Libary1!"), null);
-//			} catch (final IOException e) {
-//				e.printStackTrace();
-//			}
-		}
-		
-//		IResourceDescription resourceDescription = mgr.getResourceDescription(libaryResource);
-//		Iterable<IEObjectDescription> libary = resourceDescription.getExportedObjects();
-//		return new SimpleScope(super.getScope(resource, reference, filter), libary, false);
-		
-		return super.getScope(resource, reference, filter);
+public class GeneratorClasspathGlobalScopeProvider extends ClasspathGlobalScopeProvider {
+	public GeneratorClasspathGlobalScopeProvider() {
+		super("generator");
 	}
 }
diff --git a/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/MachineLearningLanguageRuntimeModule.java b/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/MachineLearningLanguageRuntimeModule.java
index 4d73b978..606efeb5 100644
--- a/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/MachineLearningLanguageRuntimeModule.java
+++ b/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/MachineLearningLanguageRuntimeModule.java
@@ -6,8 +6,8 @@ package de.evoal.languages.model.mll.dsl;
 
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.scoping.IGlobalScopeProvider;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
 
+import de.evoal.languages.model.mll.dsl.scoping.MachineLearningClasspathGlobalScopeProvider;
 import de.evoal.languages.model.utils.converter.ValueConverterService;
 
 /**
@@ -16,7 +16,7 @@ import de.evoal.languages.model.utils.converter.ValueConverterService;
 public class MachineLearningLanguageRuntimeModule extends AbstractMachineLearningLanguageRuntimeModule {
 	@Override
 	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
-		return ImportUriGlobalScopeProvider.class;
+		return MachineLearningClasspathGlobalScopeProvider.class;
 	}
 	
     @Override
diff --git a/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/scoping/MachineLearningClasspathGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/scoping/MachineLearningClasspathGlobalScopeProvider.java
new file mode 100644
index 00000000..66d95685
--- /dev/null
+++ b/src/languages/de.evoal.languages.model.mll.dsl/src/de/evoal/languages/model/mll/dsl/scoping/MachineLearningClasspathGlobalScopeProvider.java
@@ -0,0 +1,10 @@
+package de.evoal.languages.model.mll.dsl.scoping;
+
+
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
+
+public class MachineLearningClasspathGlobalScopeProvider extends ClasspathGlobalScopeProvider {
+	public MachineLearningClasspathGlobalScopeProvider() {
+		super("surrogate");
+	}
+}
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/OptimisationLanguageRuntimeModule.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/OptimisationLanguageRuntimeModule.java
index 990fd5e7..1584b513 100644
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/OptimisationLanguageRuntimeModule.java
+++ b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/OptimisationLanguageRuntimeModule.java
@@ -7,7 +7,7 @@ package de.evoal.languages.model.ol.dsl;
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.scoping.IGlobalScopeProvider;
 
-import de.evoal.languages.model.ol.dsl.utils.OLGlobalScopeProvider;
+import de.evoal.languages.model.ol.dsl.scoping.OptimisationLanguageClasspathGlobalScopeProvider;
 import de.evoal.languages.model.utils.converter.ValueConverterService;
 
 /**
@@ -16,7 +16,7 @@ import de.evoal.languages.model.utils.converter.ValueConverterService;
 public class OptimisationLanguageRuntimeModule extends AbstractOptimisationLanguageRuntimeModule {
     @Override
     public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
-            return OLGlobalScopeProvider.class;
+            return OptimisationLanguageClasspathGlobalScopeProvider.class;
     }
 
 	@Override
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/scoping/OptimisationLanguageClasspathGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/scoping/OptimisationLanguageClasspathGlobalScopeProvider.java
new file mode 100644
index 00000000..93c0756c
--- /dev/null
+++ b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/scoping/OptimisationLanguageClasspathGlobalScopeProvider.java
@@ -0,0 +1,10 @@
+package de.evoal.languages.model.ol.dsl.scoping;
+
+
+import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
+
+public class OptimisationLanguageClasspathGlobalScopeProvider extends ClasspathGlobalScopeProvider {
+	public OptimisationLanguageClasspathGlobalScopeProvider() {
+		super("optimisation");
+	}
+}
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinDSLInfo.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinDSLInfo.java
deleted file mode 100644
index 5e091d31..00000000
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinDSLInfo.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.evoal.languages.model.ol.dsl.utils;
-
-import java.io.File;
-
-import org.eclipse.emf.common.util.URI;
-
-public class BuiltinDSLInfo {
-	private final File module;
-	private final String fileName;
-	
-	public BuiltinDSLInfo(final File module, final String fileName) {
-		this.module = module;
-		this.fileName = fileName;
-	}
-
-	public File getModule() {
-		return module;
-	}
-
-	public String getFileName() {
-		return fileName;
-	}
-	
-	public URI getImportURI() {
-	    return URI.createURI(String.format("zip:file://%s!/%s", module.toString(), fileName));
-	}
-}
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinMapProvider.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinMapProvider.java
deleted file mode 100644
index 0c6813b6..00000000
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/BuiltinMapProvider.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.evoal.languages.model.ol.dsl.utils;
-
-import java.util.function.Supplier;
-import java.util.stream.Stream;
-
-public interface BuiltinMapProvider extends Supplier<Stream<BuiltinDSLInfo>> {
-
-	void setBasePath(String string);
-
-	void setExtension(final String extension);
-}
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/ClasspathDefaultGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/ClasspathDefaultGlobalScopeProvider.java
deleted file mode 100644
index 27bb559b..00000000
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/ClasspathDefaultGlobalScopeProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package de.evoal.languages.model.ol.dsl.utils;
-
-import java.util.LinkedHashSet;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
-
-/**
- * A global scope provider that injects built-in DSL files.
- */
-public abstract class ClasspathDefaultGlobalScopeProvider extends ImportUriGlobalScopeProvider {
-	/**
-	 * The actual provider.
-	 */
-	private final BuiltinMapProvider provider;
-
-	public ClasspathDefaultGlobalScopeProvider(final BuiltinMapProvider provider) {
-		this.provider = provider;
-	}
-	
-    @Override
-    protected LinkedHashSet<URI> getImportedUris(final Resource resource) {
-        final LinkedHashSet<URI> importedURIs = super.getImportedUris(resource);
-
-        addBuiltinURIs(importedURIs);
-        
-        return importedURIs;
-    }
-    
-    private void addBuiltinURIs(final LinkedHashSet<URI> uris) {
-    	provider.get()
-    			.map(BuiltinDSLInfo::getImportURI)
-    			.forEach(uris::add);
-    }
-
-	protected BuiltinMapProvider getProvider() {
-		return provider;
-	}
-}
\ No newline at end of file
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/EvoalReleaseBuiltinDSLProvider.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/EvoalReleaseBuiltinDSLProvider.java
deleted file mode 100644
index a97a8f7d..00000000
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/EvoalReleaseBuiltinDSLProvider.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package de.evoal.languages.model.ol.dsl.utils;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.stream.Stream;
-
-public class EvoalReleaseBuiltinDSLProvider implements BuiltinMapProvider {
-	public static String evoalReleaseFolder = "/Users/berber/Downloads/evoal";
-
-	private String basepath = "";
-	
-	private String extension = "";
-
-	private void collectModules(final File folder, final List<File> files) {
-        final File [] allFiles = folder.listFiles();
-
-        if(allFiles != null) {
-            for(final File file : allFiles) {
-                if (file.isFile() && file.getName().endsWith(".jar")) {
-                    files.add(file);
-                } else if (file.isDirectory()) {
-                    collectModules(file, files);
-                }
-            }
-        }
-	}
-
-	@Override
-	public Stream<BuiltinDSLInfo> get() {
-		final List<File> modules = new LinkedList<>();
-
-		collectModules(new File(evoalReleaseFolder), modules);
-		
-		final List<BuiltinDSLInfo> dslFiles = new LinkedList<>();
-
-		for(final File module : modules) {
-    	   try (final JarFile moduleJare = new JarFile(module)) {
-    		   final Iterator<JarEntry> iterator = moduleJare.entries().asIterator();
-    		   while(iterator.hasNext()) {
-    			   final JarEntry entry = iterator.next();
-    			   
-    			   if(entry.getName().startsWith(basepath) && entry.getName().endsWith(extension)) {
-    				   dslFiles.add(new BuiltinDSLInfo(module, entry.getName()));
-    			   }
-    		   }
-    	   } catch(final IOException e) {
-    		   System.err.println("Failed to read module " + module);
-    	   }
-		}
-		
-		return dslFiles.stream();
-	}
-
-	@Override
-	public void setBasePath(final String basepath) {
-		this.basepath  = basepath;
-	}
-
-	@Override
-	public void setExtension(final String extension) {
-		this.extension = extension;
-	}
-}
diff --git a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/OLGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/OLGlobalScopeProvider.java
deleted file mode 100644
index 4105232b..00000000
--- a/src/languages/de.evoal.languages.model.ol.dsl/src/de/evoal/languages/model/ol/dsl/utils/OLGlobalScopeProvider.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.evoal.languages.model.ol.dsl.utils;
-
-public class OLGlobalScopeProvider extends ClasspathDefaultGlobalScopeProvider {
-	public OLGlobalScopeProvider() {
-		super(new EvoalReleaseBuiltinDSLProvider());
-		
-		getProvider().setBasePath("definitions/ea");
-		getProvider().setExtension(".dl");
-	}
-}
diff --git a/src/languages/de.evoal.languages.model.utils/META-INF/MANIFEST.MF b/src/languages/de.evoal.languages.model.utils/META-INF/MANIFEST.MF
index fa1d956e..17da45d8 100644
--- a/src/languages/de.evoal.languages.model.utils/META-INF/MANIFEST.MF
+++ b/src/languages/de.evoal.languages.model.utils/META-INF/MANIFEST.MF
@@ -9,4 +9,5 @@ Require-Bundle: org.eclipse.xtext;bundle-version="2.29.0",
 Bundle-RequiredExecutionEnvironment: JavaSE-17
 Automatic-Module-Name: de.evoal.languages.model.utils
 Export-Package: de.evoal.languages.model.utils.builtin,
- de.evoal.languages.model.utils.converter
+ de.evoal.languages.model.utils.converter,
+ de.evoal.languages.model.utils.scoping
diff --git a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProvider.java b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProvider.java
index 11fb0bdf..59e311e7 100644
--- a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProvider.java
+++ b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProvider.java
@@ -3,6 +3,16 @@ package de.evoal.languages.model.utils.builtin;
 import java.net.URI;
 import java.util.Collection;
 
+/**
+ * A provider searches for all available definition files with a specific
+ * basename.
+ */
 public interface BuiltinProvider {
-	public Collection<URI> findBuiltins(final String name);
+	/**
+	 * Find all builtins matching the pattern: META-INF/specifications/{@code basename}/**\/*.dl
+	 * 
+	 * @param basename The location to search in.
+	 * @return A list of URIs to the matching resources.
+	 */
+	public Collection<URI> findBuiltins(final String basename);
 }
diff --git a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProviderFactory.java b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProviderFactory.java
index 8f197727..f28bc930 100644
--- a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProviderFactory.java
+++ b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/BuiltinProviderFactory.java
@@ -13,7 +13,6 @@ public final class BuiltinProviderFactory {
 			return iterator.next();
 		}
 		
-		
 		try {
 			final Class<Supplier<BuiltinProvider>> clazz = (Class<Supplier<BuiltinProvider>>) Class.forName("de.evoal.languages.model.utils.builtin.ExtensionPointLookup");
 			return clazz.newInstance().get();
diff --git a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/ExtensionPointLookup.java b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/ExtensionPointLookup.java
index 9fc5e7f0..bd30ba99 100644
--- a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/ExtensionPointLookup.java
+++ b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/ExtensionPointLookup.java
@@ -1,15 +1,13 @@
 package de.evoal.languages.model.utils.builtin;
 
-import java.util.Arrays;
-import java.util.function.Function;
 import java.util.function.Supplier;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
 import org.eclipse.core.runtime.Platform;
 
+/**
+ * Using Eclipse's extension point mechanism to provide the builtin provider.
+ */
 public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
 
 	@Override
@@ -18,7 +16,6 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
 		
 		for(final IConfigurationElement element : elements) {
 			try {
-				System.out.println(Arrays.toString(element.getAttributeNames()));
 				return (BuiltinProvider)element.createExecutableExtension("class");
 			} catch (Exception e) {
 				// TODO Auto-generated catch block
@@ -29,5 +26,4 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
 
 		return null;
 	}
-
 }
diff --git a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/package-info.java b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/package-info.java
new file mode 100644
index 00000000..e38253d9
--- /dev/null
+++ b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/builtin/package-info.java
@@ -0,0 +1,12 @@
+/**
+ * Built-ins are definition language files that are part of EvoAl plugins and
+ *   describe the extensions for the different DSLs. We inject them automatically
+ *   into the global scope of the DSLs so that the user can simply use them
+ *   without importing them explicitly.
+ *   
+ * Depending on the environment, we need different strategies to find available
+ *   builtins and different mechanisms to create the environment-specific provider.
+ *   Pitifully, we have no dependency injection mechanism for Java module world
+ *   and Eclipse world.
+ */
+package de.evoal.languages.model.utils.builtin;
\ No newline at end of file
diff --git a/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/scoping/ClasspathGlobalScopeProvider.java b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/scoping/ClasspathGlobalScopeProvider.java
new file mode 100644
index 00000000..3e7a70ea
--- /dev/null
+++ b/src/languages/de.evoal.languages.model.utils/src/de/evoal/languages/model/utils/scoping/ClasspathGlobalScopeProvider.java
@@ -0,0 +1,58 @@
+package de.evoal.languages.model.utils.scoping;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
+
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+
+import de.evoal.languages.model.utils.builtin.BuiltinProvider;
+import de.evoal.languages.model.utils.builtin.BuiltinProviderFactory;
+
+public abstract class ClasspathGlobalScopeProvider extends ImportUriGlobalScopeProvider {
+	@Inject
+	IResourceDescription.Manager mgr;
+	
+	private final String name;
+	
+	public ClasspathGlobalScopeProvider(final String name) {
+		this.name = name;
+	}
+
+	@Override
+	protected IScope getScope(Resource resource, boolean ignoreCase, EClass type, Predicate<IEObjectDescription> predicate) {
+		final BuiltinProvider provider = BuiltinProviderFactory.create();
+		final Collection<java.net.URI> files = provider.findBuiltins(name);
+
+		IScope scope = super.getScope(resource, ignoreCase, type, predicate);
+		for(final java.net.URI file : files) {
+			final URI libearyResourceURI = URI.createURI(file.toString());
+			Resource libraryResource = resource.getResourceSet().getResource(libearyResourceURI, false);
+			if (libraryResource == null) {
+				try {
+					libraryResource = resource.getResourceSet().createResource(libearyResourceURI);
+					libraryResource.load(Collections.emptyMap());
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+			
+			final IResourceDescription libraryDescription = mgr.getResourceDescription(libraryResource);
+			scope = SelectableBasedScope.createScope(scope, libraryDescription, predicate, type, ignoreCase);
+		}
+		
+		return scope;
+	}
+}
+
diff --git a/src/languages/de.evoal.ui.core/src/de/evoal/ui/core/builtin/ReleaseBuiltinProvider.java b/src/languages/de.evoal.ui.core/src/de/evoal/ui/core/builtin/ReleaseBuiltinProvider.java
index 9cba99a7..b61d2496 100644
--- a/src/languages/de.evoal.ui.core/src/de/evoal/ui/core/builtin/ReleaseBuiltinProvider.java
+++ b/src/languages/de.evoal.ui.core/src/de/evoal/ui/core/builtin/ReleaseBuiltinProvider.java
@@ -19,15 +19,18 @@ import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+
 import de.evoal.languages.model.utils.builtin.BuiltinProvider;
 
 public class ReleaseBuiltinProvider implements BuiltinProvider {
-	final String evoalRelease = "/Users/berber/repositories/evoal/source--evoal-core/src/core/environment/";
-
 	@Override
 	public Collection<URI> findBuiltins(final String basename) {
+		final IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, "de.evoal.ui.core.main");
+		final String evoalRelease = store.getString("release");
 		final PathMatcher jarMatcher = FileSystems.getDefault().getPathMatcher("glob:**/*.jar");
-		
 		final List<URI> result = new LinkedList<>();
 
 		try {
@@ -45,26 +48,26 @@ public class ReleaseBuiltinProvider implements BuiltinProvider {
 			e.printStackTrace();
 		}
 		
-		System.err.println(result);
-		
 		return result;
 	}
 
 	private void findBuiltins(final Path jarFile, final String basename, final List<URI> result) {
+		final String completeBase = "META-INF/definitions/" + basename;
+		
 		try(final ZipFile file = new JarFile(jarFile.toFile())) {
 			final Enumeration<? extends ZipEntry> entries = file.entries();
+			
 			while(entries.hasMoreElements()) {
 				final ZipEntry entry = entries.nextElement();
 				final String name = entry.getName();
 
-				if(name.startsWith(basename) && name.endsWith(".dl")) {
+				if(name.startsWith(completeBase) && name.endsWith(".dl")) {
 					final FileSystem zipFS = FileSystems.newFileSystem(jarFile);
 					final Path fileInZip = zipFS.getPath(name);
 
 					result.add(fileInZip.toUri());
 				}
 			}
-			
 		} catch(final IOException e) {
 			e.printStackTrace();
 		}
-- 
GitLab