aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend
blob: fc4b721ab5805560658a4a3a58dca2cfba395953 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package hu.bme.mit.inf.dslreasoner.application.linking

import com.google.inject.Inject
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry
import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport
import java.util.Collections
import java.util.List
import java.util.Optional
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.conversion.IValueConverterService
import org.eclipse.xtext.conversion.ValueConverterException
import org.eclipse.xtext.linking.impl.DefaultLinkingService
import org.eclipse.xtext.nodemodel.ILeafNode
import org.eclipse.xtext.nodemodel.INode
import org.eclipse.emf.ecore.resource.ResourceSet
import org.eclipse.emf.ecore.EPackage

class ApplicationConfigurationLinkingService extends DefaultLinkingService{

    //@Inject Logger logger

    @Inject IValueConverterService valueConverterService
    @Inject IMetamodelProvider metamodelProvider
    
    public static extension ApplicationConfigurationPackage pac = ApplicationConfigurationPackage.eINSTANCE

    override getLinkedObjects(EObject context, EReference ref, INode node) {
    	if(context instanceof EPackageImport) {
    		if(ref == EPackageImport_ImportedPackage && node instanceof ILeafNode) {
    			return getEPackage(context as EPackageImport, node as ILeafNode)
    		}
    	} else if(context instanceof ViatraImport) {
    		if(ref == viatraImport_ImportedViatra) {
    			return getViatra(context as ViatraImport, node)
    		}
        } else if(context instanceof PatternEntry) {
        	if(ref === patternEntry_Package) {
        		return getViatraPackage(context as PatternEntry,node)
        	}
        }
        return super.getLinkedObjects(context, ref, node)
    }
	
	def getViatraPackage(PatternEntry entry, INode node) {
		val document = EcoreUtil2.getContainerOfType(entry,ConfigurationScript)
		val nodeString = valueConverterService.toValue(node.text,
                linkingHelper.getRuleNameFrom(node.grammarElement), node).toString.replaceAll("\\s","")
		val patternModels = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull
		val List<EObject> patternModelsWithSameNamespace = patternModels.filter[nodeString.equals(it.packageName)].filter(EObject).toList
		return patternModelsWithSameNamespace
	}

    private def getEPackage(EPackageImport packageImport, ILeafNode node) {
        val x = getNSUri(node)
        if(x.isPresent) {
        	val uriString = x.get
        	val epackageByMetamodelProvider = metamodelProvider.loadEPackage(uriString, packageImport.eResource.resourceSet)
        	val epackageByMe = ePackageByMe(packageImport.eResource.resourceSet,uriString)
        	//println(epackageByMetamodelProvider)
        	//println(epackageByMe)
            if(epackageByMetamodelProvider!==null) {
            	return  Collections.singletonList(epackageByMetamodelProvider as EObject)
            } else if(epackageByMe !== null) {
            	return Collections.singletonList(epackageByMe as EObject)
            } else {
            	emptyList
            }           
        } else {
        	return emptyList
        }
    }
    
    private def ePackageByMe(ResourceSet rs, String uri) {
    	try {
    		val resource = rs.getResource(URI.createURI(uri), true);
    		return resource.contents.head as EPackage
    	} catch (Exception e) {
    		return null
    	}
    }
    
    private def getViatra(ViatraImport viatraImport, INode node) {
    	val uri = getNSUri(node)
    	if(uri.present) {
    		var URI createdURI
    		try{
    			createdURI = URI.createURI(uri.get)
    		}catch(IllegalArgumentException e) {
    			return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node)
    		}
    		var Resource res
    		try{
    			res = viatraImport.eResource.resourceSet.getResource(createdURI,true);
    		} catch(RuntimeException  e){
    			return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node)
    		}
    		if(res!==null && !res.contents.nullOrEmpty) {
    			return #[res.contents.head]
    		} else {
    			return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node)
    		}
    	} else {
    		return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node)
    	}
    }
    
    private def getNSUri(INode node) {
        try {
            val convertedValue = valueConverterService.toValue(node.text,
                linkingHelper.getRuleNameFrom(node.grammarElement), node)
            Optional.of(convertedValue as String)
        } catch (ValueConverterException e) {
            Optional.empty
        }
    }
}