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