aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/util/ParseUtil.xtend
blob: 005304ea2446b8232c939e8176c8eafd0755a413 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util

import com.google.inject.Guice
import com.google.inject.Injector
import com.google.inject.Module
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage
import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
import java.io.ByteArrayInputStream
import java.io.InputStream
import java.util.LinkedHashMap
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.util.EcoreUtil
import org.eclipse.viatra.query.patternlanguage.PatternLanguageStandaloneSetup
import org.eclipse.viatra.query.patternlanguage.annotations.ExtensionBasedAnnotationValidatorLoader
import org.eclipse.viatra.query.patternlanguage.annotations.IAnnotationValidatorLoader
import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageRuntimeModule
import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup
import org.eclipse.viatra.query.patternlanguage.emf.GenmodelExtensionLoader
import org.eclipse.viatra.query.patternlanguage.emf.IGenmodelMappingLoader
import org.eclipse.viatra.query.patternlanguage.emf.eMFPatternLanguage.PatternModel
import org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder
import org.eclipse.xtext.resource.XtextResourceSet

class MyModule extends EMFPatternLanguageRuntimeModule implements Module{
    def public Class<? extends IAnnotationValidatorLoader> bindAnnotationValidatorLoader() {
        return typeof(ExtensionBasedAnnotationValidatorLoader);
    }
    def public Class<? extends IGenmodelMappingLoader> bindGenmodelMappingLoader() {
        return typeof(GenmodelExtensionLoader);
    }
}

class ParseUtil {
	val Injector injector;
	new() {
		PatternLanguageStandaloneSetup.doSetup
		EMFPatternLanguageStandaloneSetup.doSetup;
		PartialinterpretationPackage.eINSTANCE.class;
		LogicproblemPackage.eINSTANCE.class;
		LogiclanguagePackage.eINSTANCE.class;
		
		injector = internalCreateInjector//(new EMFPatternLanguageStandaloneSetup()).createInjectorAndDoEMFRegistration();
	}
	
	def protected Injector internalCreateInjector() {
        var newInjector = new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration();
        //XXX the following line enforce the tests to be run in an Eclipse environment
       val Module module = new MyModule
       newInjector = Guice.createInjector(module)
       //ViatraQueryLoggingUtil.setExternalLogger(newInjector.getInstance(Logger.class));
       //EMFPatternLanguagePlugin.getInstance().addCompoundInjector(newInjector,EMFPatternLanguagePlugin.TEST_INJECTOR_PRIORITY);
        return newInjector;
    }
	
//	@Inject
//   	var ParseHelper<PatternModel> parseHelper;
    val builder = new SpecificationBuilder
	
	public def parse(CharSequence vqlFileContent) {
		//val patternModel = this.parseHelper.parse(vqlFileContent)
		val XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet);
		val Resource resource = resourceSet.createResource(URI.createURI("dummy:/example.vql"));
		val InputStream in = new ByteArrayInputStream(vqlFileContent.toString.getBytes());
		resource.load(in, resourceSet.getLoadOptions());
		val patternModel = resource.getContents().get(0) as PatternModel;
		
		EcoreUtil.resolveAll(resource)
		resource.validate
		val res = new LinkedHashMap
		for(pattern : patternModel.patterns) {
			val querySpecification = builder.getOrCreateSpecification(pattern)
			res.put(querySpecification.fullyQualifiedName,querySpecification)
			//println('''«querySpecification.fullyQualifiedName» -> «querySpecification»''')
		}
		resource.validate
		return res
	}
	
	def private validate(Resource resource) {
		val errors = resource.errors
		if(!errors.isEmpty) {
			println('''-- Errors --''')
			errors.forEach[println('''> «it»''')]
			println('''------------''')	
		}
	}
}