Skip to content
Snippets Groups Projects
Commit 221fd0cf authored by Bernhard Johannes Berger's avatar Bernhard Johannes Berger
Browse files

Towards classpath-based dl loading.

parent 85fc6526
No related branches found
No related tags found
No related merge requests found
Pipeline #244591 passed
Showing
with 58 additions and 346 deletions
...@@ -8,8 +8,8 @@ import org.eclipse.xtext.conversion.IValueConverterService; ...@@ -8,8 +8,8 @@ import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.naming.SimpleNameProvider;
import org.eclipse.xtext.scoping.IGlobalScopeProvider; 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; import de.evoal.languages.model.utils.converter.ValueConverterService;
/** /**
...@@ -18,7 +18,7 @@ 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 { public class DataDescriptionLanguageRuntimeModule extends AbstractDataDescriptionLanguageRuntimeModule {
@Override @Override
public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() { public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
return ImportUriGlobalScopeProvider.class; return DataDescriptionLanguageClasspathGlobalScopeProvider.class;
} }
public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() { public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
......
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");
}
}
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;
}
});
}
}
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));
}
}
...@@ -4,10 +4,6 @@ ...@@ -4,10 +4,6 @@
*/ */
package de.evoal.languages.model.ddl.dsl.scoping; 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. * This class contains custom scoping description.
* *
...@@ -15,8 +11,4 @@ import org.eclipse.xtext.scoping.IScope; ...@@ -15,8 +11,4 @@ import org.eclipse.xtext.scoping.IScope;
* on how and when to use it. * on how and when to use it.
*/ */
public class DataDescriptionLanguageScopeProvider extends AbstractDataDescriptionLanguageScopeProvider { public class DataDescriptionLanguageScopeProvider extends AbstractDataDescriptionLanguageScopeProvider {
@Override
public IScope getScope(final EObject context, final EReference reference) {
return super.getScope(context, reference);
}
} }
...@@ -5,9 +5,8 @@ package de.evoal.languages.model.generator.dsl; ...@@ -5,9 +5,8 @@ package de.evoal.languages.model.generator.dsl;
import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.scoping.IGlobalScopeProvider; 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; import de.evoal.languages.model.utils.converter.ValueConverterService;
/** /**
...@@ -16,8 +15,7 @@ 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 { public class GeneratorDSLRuntimeModule extends AbstractGeneratorDSLRuntimeModule {
@Override @Override
public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() { public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
//return ImportUriGlobalScopeProvider.class; return GeneratorClasspathGlobalScopeProvider.class;
return ClasspathGlobalScopeProvider.class;
} }
@Override @Override
......
package de.evoal.languages.model.generator.dsl.scoping; package de.evoal.languages.model.generator.dsl.scoping;
import java.io.IOException; import de.evoal.languages.model.utils.scoping.ClasspathGlobalScopeProvider;
import java.util.Collection;
import java.util.Iterator;
import java.util.ServiceLoader;
import org.eclipse.emf.common.util.URI; public class GeneratorClasspathGlobalScopeProvider extends ClasspathGlobalScopeProvider {
import org.eclipse.emf.ecore.EReference; public GeneratorClasspathGlobalScopeProvider() {
import org.eclipse.emf.ecore.resource.Resource; super("generator");
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);
} }
} }
...@@ -6,8 +6,8 @@ package de.evoal.languages.model.mll.dsl; ...@@ -6,8 +6,8 @@ package de.evoal.languages.model.mll.dsl;
import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.scoping.IGlobalScopeProvider; 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; import de.evoal.languages.model.utils.converter.ValueConverterService;
/** /**
...@@ -16,7 +16,7 @@ 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 { public class MachineLearningLanguageRuntimeModule extends AbstractMachineLearningLanguageRuntimeModule {
@Override @Override
public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() { public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
return ImportUriGlobalScopeProvider.class; return MachineLearningClasspathGlobalScopeProvider.class;
} }
@Override @Override
......
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");
}
}
...@@ -7,7 +7,7 @@ package de.evoal.languages.model.ol.dsl; ...@@ -7,7 +7,7 @@ package de.evoal.languages.model.ol.dsl;
import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.scoping.IGlobalScopeProvider; 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; import de.evoal.languages.model.utils.converter.ValueConverterService;
/** /**
...@@ -16,7 +16,7 @@ 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 { public class OptimisationLanguageRuntimeModule extends AbstractOptimisationLanguageRuntimeModule {
@Override @Override
public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() { public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
return OLGlobalScopeProvider.class; return OptimisationLanguageClasspathGlobalScopeProvider.class;
} }
@Override @Override
......
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");
}
}
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));
}
}
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);
}
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
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;
}
}
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");
}
}
...@@ -9,4 +9,5 @@ Require-Bundle: org.eclipse.xtext;bundle-version="2.29.0", ...@@ -9,4 +9,5 @@ Require-Bundle: org.eclipse.xtext;bundle-version="2.29.0",
Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-RequiredExecutionEnvironment: JavaSE-17
Automatic-Module-Name: de.evoal.languages.model.utils Automatic-Module-Name: de.evoal.languages.model.utils
Export-Package: de.evoal.languages.model.utils.builtin, 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
...@@ -3,6 +3,16 @@ package de.evoal.languages.model.utils.builtin; ...@@ -3,6 +3,16 @@ package de.evoal.languages.model.utils.builtin;
import java.net.URI; import java.net.URI;
import java.util.Collection; import java.util.Collection;
/**
* A provider searches for all available definition files with a specific
* basename.
*/
public interface BuiltinProvider { 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);
} }
...@@ -13,7 +13,6 @@ public final class BuiltinProviderFactory { ...@@ -13,7 +13,6 @@ public final class BuiltinProviderFactory {
return iterator.next(); return iterator.next();
} }
try { try {
final Class<Supplier<BuiltinProvider>> clazz = (Class<Supplier<BuiltinProvider>>) Class.forName("de.evoal.languages.model.utils.builtin.ExtensionPointLookup"); final Class<Supplier<BuiltinProvider>> clazz = (Class<Supplier<BuiltinProvider>>) Class.forName("de.evoal.languages.model.utils.builtin.ExtensionPointLookup");
return clazz.newInstance().get(); return clazz.newInstance().get();
......
package de.evoal.languages.model.utils.builtin; package de.evoal.languages.model.utils.builtin;
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.InvalidRegistryObjectException;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
/**
* Using Eclipse's extension point mechanism to provide the builtin provider.
*/
public class ExtensionPointLookup implements Supplier<BuiltinProvider>{ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
@Override @Override
...@@ -18,7 +16,6 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{ ...@@ -18,7 +16,6 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
for(final IConfigurationElement element : elements) { for(final IConfigurationElement element : elements) {
try { try {
System.out.println(Arrays.toString(element.getAttributeNames()));
return (BuiltinProvider)element.createExecutableExtension("class"); return (BuiltinProvider)element.createExecutableExtension("class");
} catch (Exception e) { } catch (Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
...@@ -29,5 +26,4 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{ ...@@ -29,5 +26,4 @@ public class ExtensionPointLookup implements Supplier<BuiltinProvider>{
return null; return null;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment