Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: aa28dcd1b0c48594112f0cec0ca421cd3a31f24a (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
125
126
package org.eclipse.emf.ecore.xcore.resource;

import java.util.Iterator;

import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xcore.XPackage;
import org.eclipse.emf.ecore.xcore.mappings.XcoreMapper;
import org.eclipse.emf.ecore.xcore.scoping.LazyCreationProxyUriConverter;
import org.eclipse.emf.ecore.xcore.util.XcoreEcoreBuilder;
import org.eclipse.emf.ecore.xcore.util.XcoreGenmodelBuilder;
import org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.IScopeProvider;
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.xbase.resource.XbaseResource;

import com.google.inject.Inject;
import com.google.inject.Provider;

public class XcoreResource extends XbaseResource {
	
	@Inject
	private LazyCreationProxyUriConverter proxyConverter;
	
	@Inject
	private IQualifiedNameProvider nameProvider; 
	
  @Inject
  private XcoreJvmInferrer jvmInferrer;
  
  @Inject
  private XcoreGenmodelBuilder genModelBuilder;
  
  @Inject
  private Provider<XcoreEcoreBuilder> xcoreEcoreBuilderProvider;
  
  @Inject
  private IScopeProvider scopeProvider;

  @Inject
  private XcoreMapper mapper;
	
  
  @Override
  protected void discardLateInitializedState()
  {
    EList<EObject> contents = getContents();
    int size = contents.size();
    if (size > 1)
    {
  		for (Iterator<EObject> i = contents.iterator(); i.hasNext(); )
      {
        EObject eObject = i.next();
        if (eObject instanceof EPackage || eObject instanceof GenModel || eObject instanceof JvmGenericType)
        {
          unload(eObject);
        }
        else if (eObject instanceof XPackage)
        {
        	mapper.unsetMapping((XPackage)eObject);
        }
      }
    }
	}
	
	protected void installLateInitializedState() 
	{
		if (getParseResult() != null && getParseResult().getRootASTElement() instanceof XPackage)
    {
			XPackage model = (XPackage) getParseResult().getRootASTElement();
      XcoreEcoreBuilder xcoreEcoreBuilder = xcoreEcoreBuilderProvider.get();
      EPackage ePackage = xcoreEcoreBuilder.getEPackage(model);
      super.getContents().add(ePackage);
      GenModel genModel = genModelBuilder.getGenModel(model);
      xcoreEcoreBuilder.link(); 
      genModelBuilder.initializeUsedGenPackages(genModel);
      super.getContents().addAll(jvmInferrer.getDeclaredTypes(model));
      getCache().clear(this);
    }
	}
	
	@Override
	public synchronized EObject getEObject(String uriFragment) {
		Pair<EClass,QualifiedName> fragmentInfo = proxyConverter.decodeFragment(uriFragment);
		if (fragmentInfo != null) {
			return findEObject(fragmentInfo.getFirst(), fragmentInfo.getSecond());
		} else {
			return super.getEObject(uriFragment);
		}
	}

	/**
	 * finds the EObject of the given type and the given {@link QualifiedName}.
	 * 
	 * TODO optimize
	 */
	protected EObject findEObject(EClass clazz, QualifiedName name) {
		if (clazz == TypesPackage.Literals.JVM_GENERIC_TYPE) {
			IScope scope = scopeProvider.getScope(getContents().get(0), TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE);
			final IEObjectDescription desc = scope.getSingleElement(name);
			return desc == null ? null : desc.getEObjectOrProxy();
		}
		TreeIterator<EObject> iterator = EcoreUtil.getAllContents(this, false);
		while (iterator.hasNext()) {
			EObject candidate = iterator.next();
			if (clazz.isInstance(candidate)) {
				QualifiedName qualifiedName = nameProvider.getFullyQualifiedName(candidate);
				if (name.equals(qualifiedName))
					return candidate;
			}
		}
		return null;
	}
	
}

Back to the top