summaryrefslogtreecommitdiffstats
path: root/rba.tool.editor/src/rba/tool/editor/linking/RBAModelLinkingService.xtend
blob: f3d6a5262327e9bfe099feb9f2d26d48f4254fb7 (plain)
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
package rba.tool.editor.linking

import com.google.inject.Inject
import java.util.Collections
import org.apache.log4j.Logger
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.linking.impl.DefaultLinkingService
import org.eclipse.xtext.linking.impl.IllegalNodeException
import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.nodemodel.INode
import rba.core.ObjectReference
import rba.core.Package
import rba.core.RBACorePackage
import rba.core.RuleObject

class RBAModelLinkingService extends DefaultLinkingService {

	private static final Logger logger = Logger.getLogger(RBAModelLinkingService);

	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	override getLinkedObjects(EObject context, EReference ref, INode node) throws IllegalNodeException {
		val requiredType = ref.getEReferenceType();
		if(requiredType === null) {
			return Collections.<EObject>emptyList();
		}
		val crossRefString = getCrossRefNodeAsString(node);
		if(crossRefString === null || crossRefString.equals("")) {
			return Collections.<EObject>emptyList();
		}
		if(logger.isDebugEnabled()) {
			logger.debug("before getLinkedObjects: node: '" + crossRefString + "'");
		}

		if(context instanceof ObjectReference && ref === RBACorePackage.Literals.OBJECT_REFERENCE__REF_OBJECT && crossRefString.equals("this")) {
			val containers = EcoreUtil2.getAllContainers(context).filter [ c |
				c instanceof RuleObject && c.eContainer instanceof Package
			].toList;
			if(containers !== null && containers.size === 1) {
				return Collections.singletonList(containers.get(0));
			} else {
				return Collections.emptyList();
			}
		}

		val scope = getScope(context, ref);
		if(scope === null) {
			throw new AssertionError(
				"Scope provider " + scopeProvider.getClass().getName() + " must not return null for context " + context + ", reference " + ref + "! Consider to return IScope.NULLSCOPE instead.");
		}
		val qualifiedLinkName = qualifiedNameConverter.toQualifiedName(crossRefString);
		val eObjectDescription = scope.getSingleElement(qualifiedLinkName);
		if(logger.isDebugEnabled()) {
			logger.debug("after getLinkedObjects: node: '" + crossRefString + "' result: " + eObjectDescription);
		}
		if(eObjectDescription === null) {
			return Collections.emptyList();
		}
		val result = eObjectDescription.getEObjectOrProxy();
		return Collections.singletonList(result);
	}

}