Просмотр исходного кода

Updates URI resolving in AbstractSCTResource

Andreas Mülder 12 лет назад
Родитель
Сommit
fa86eef547

+ 44 - 162
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/AbstractSCTResource.java

@@ -12,7 +12,6 @@
 package org.yakindu.sct.model.sgraph.resource;
 package org.yakindu.sct.model.sgraph.resource;
 
 
 import java.io.StringReader;
 import java.io.StringReader;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -145,13 +144,11 @@ public abstract class AbstractSCTResource extends GMFResource {
 		if (eObject instanceof SpecificationElement) {
 		if (eObject instanceof SpecificationElement) {
 			parseSpecificationElement((SpecificationElement) eObject);
 			parseSpecificationElement((SpecificationElement) eObject);
 			linkSpecificationElement((SpecificationElement) eObject);
 			linkSpecificationElement((SpecificationElement) eObject);
-			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject,
-					ParseAdapter.class);
+			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject, ParseAdapter.class);
 			if (parseAdapter == null) {
 			if (parseAdapter == null) {
 				eObject.eAdapters().add(new ParseAdapter());
 				eObject.eAdapters().add(new ParseAdapter());
 			}
 			}
-			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject,
-					SerializeAdapter.class);
+			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject, SerializeAdapter.class);
 			if (serializeAdapter == null) {
 			if (serializeAdapter == null) {
 				eObject.eAdapters().add(new SerializeAdapter());
 				eObject.eAdapters().add(new SerializeAdapter());
 			}
 			}
@@ -161,13 +158,11 @@ public abstract class AbstractSCTResource extends GMFResource {
 	@Override
 	@Override
 	public void detached(EObject eObject) {
 	public void detached(EObject eObject) {
 		if (eObject instanceof SpecificationElement) {
 		if (eObject instanceof SpecificationElement) {
-			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject,
-					ParseAdapter.class);
+			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject, ParseAdapter.class);
 			if (parseAdapter != null) {
 			if (parseAdapter != null) {
 				eObject.eAdapters().remove(parseAdapter);
 				eObject.eAdapters().remove(parseAdapter);
 			}
 			}
-			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject,
-					SerializeAdapter.class);
+			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject, SerializeAdapter.class);
 			if (serializeAdapter != null) {
 			if (serializeAdapter != null) {
 				eObject.eAdapters().remove(serializeAdapter);
 				eObject.eAdapters().remove(serializeAdapter);
 			}
 			}
@@ -178,15 +173,12 @@ public abstract class AbstractSCTResource extends GMFResource {
 	@Override
 	@Override
 	public synchronized EObject getEObject(String uriFragment) {
 	public synchronized EObject getEObject(String uriFragment) {
 		if (encoder.isCrossLinkFragment(this, uriFragment)) {
 		if (encoder.isCrossLinkFragment(this, uriFragment)) {
-			Triple<EObject, EReference, INode> triple = encoder.decode(this,
-					uriFragment);
+			Triple<EObject, EReference, INode> triple = encoder.decode(this, uriFragment);
 			List<EObject> linkedObjects = null;
 			List<EObject> linkedObjects = null;
 			if (triple.getSecond().isContainment()) {
 			if (triple.getSecond().isContainment()) {
-				linkedObjects = resolveLocalXtextFragment(triple.getFirst(),
-						triple.getSecond(), triple.getThird());
+				linkedObjects = resolveLocalXtextFragment(triple.getFirst(), triple.getSecond(), triple.getThird());
 			} else {
 			} else {
-				linkedObjects = linkingService.getLinkedObjects(
-						triple.getFirst(), triple.getSecond(),
+				linkedObjects = linkingService.getLinkedObjects(triple.getFirst(), triple.getSecond(),
 						triple.getThird());
 						triple.getThird());
 			}
 			}
 			if (!linkedObjects.isEmpty()) {
 			if (!linkedObjects.isEmpty()) {
@@ -195,52 +187,17 @@ public abstract class AbstractSCTResource extends GMFResource {
 				createDiagnostic(triple);
 				createDiagnostic(triple);
 			}
 			}
 		}
 		}
-		EObject sctObject = getSCTEObject(uriFragment);
-		if (sctObject != null) {
-			return sctObject;
-		}
-		return super.getEObject(uriFragment);
-	}
-
-	protected EObject getSCTEObject(String uriFragment) {
 		if (uriFragment != null && uriFragment.startsWith(SCT_PREFIX)) {
 		if (uriFragment != null && uriFragment.startsWith(SCT_PREFIX)) {
-			return getEmfEObject(uriFragment.substring(SCT_PREFIX.length()));
-		}
-		return null;
-	}
-
-	protected EObject getEmfEObject(String uriFragment) {
-		int length = uriFragment.length();
-		if (length > 0) {
-			if (uriFragment.charAt(0) == '/') {
-				ArrayList<String> uriFragmentPath = new ArrayList<String>(4);
-				int start = 1;
-				for (int i = 1; i < length; ++i) {
-					if (uriFragment.charAt(i) == '/') {
-						uriFragmentPath.add(start == i ? "" : uriFragment
-								.substring(start, i));
-						start = i + 1;
-					}
-				}
-				uriFragmentPath.add(uriFragment.substring(start));
-				return getEObject(uriFragmentPath);
-			} else if (uriFragment.charAt(length - 1) == '?') {
-				int index = uriFragment.lastIndexOf('?', length - 2);
-				if (index > 0) {
-					uriFragment = uriFragment.substring(0, index);
-				}
-			}
+			return super.getEObject(uriFragment.substring(SCT_PREFIX.length()));
 		}
 		}
-		return null;
+		return super.getEObject(uriFragment);
 	}
 	}
 
 
-	private List<EObject> resolveLocalXtextFragment(EObject container,
-			EReference reference, INode node) {
+	private List<EObject> resolveLocalXtextFragment(EObject container, EReference reference, INode node) {
 		Object value = container.eGet(reference);
 		Object value = container.eGet(reference);
 		if (reference.isMany()) {
 		if (reference.isMany()) {
 			List<?> list = (List<?>) value;
 			List<?> list = (List<?>) value;
-			List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(
-					container, reference);
+			List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(container, reference);
 			int index = nodesForFeature.indexOf(node);
 			int index = nodesForFeature.indexOf(node);
 			if (list.size() > index) {
 			if (list.size() > index) {
 				return Collections.singletonList((EObject) list.get(index));
 				return Collections.singletonList((EObject) list.get(index));
@@ -257,99 +214,39 @@ public abstract class AbstractSCTResource extends GMFResource {
 			return super.getURIFragment(eObject);
 			return super.getURIFragment(eObject);
 		}
 		}
 		ICompositeNode node = NodeModelUtils.findActualNodeFor(eObject);
 		ICompositeNode node = NodeModelUtils.findActualNodeFor(eObject);
-		if (node != null
-				&& NodeModelUtils.getNode(eObject.eContainer()) != null
-				&& eObject.eContainingFeature() != null) {
-			return getXtextFragment(eObject, node);
-		}
 		if (node != null) {
 		if (node != null) {
-			String sctFragment = getSCTFragment(eObject);
-			if (sctFragment != null) {
-				return sctFragment;
+			String fragment = super.getURIFragment(eObject);
+			if (!Strings.isNullOrEmpty(fragment)) {
+				return SCT_PREFIX + fragment;
 			}
 			}
 		}
 		}
 		return super.getURIFragment(eObject);
 		return super.getURIFragment(eObject);
 	}
 	}
 
 
-	protected String getSCTFragment(EObject eObject) {
-		String fragment = getEmfFragment(eObject);
-		if (!Strings.isNullOrEmpty(fragment)) {
-			return SCT_PREFIX + fragment;
-		}
-		return null;
-	}
-
-	/**
-	 * Fragment calculation from ResourceImpl
-	 * 
-	 * @param eObject
-	 * @return
-	 */
-	protected String getEmfFragment(EObject eObject) {
-		InternalEObject internalEObject = (InternalEObject) eObject;
-		if (internalEObject.eDirectResource() == this
-				|| unloadingContents != null
-				&& unloadingContents.contains(internalEObject)) {
-			return "/" + getURIFragmentRootSegment(eObject);
-		} else {
-			List<String> uriFragmentPath = new ArrayList<String>();
-			boolean isContained = false;
-			for (InternalEObject container = internalEObject
-					.eInternalContainer(); container != null; container = internalEObject
-					.eInternalContainer()) {
-				uriFragmentPath.add(container.eURIFragmentSegment(
-						internalEObject.eContainingFeature(), internalEObject));
-				internalEObject = container;
-				if (container.eDirectResource() == this
-						|| unloadingContents != null
-						&& unloadingContents.contains(container)) {
-					isContained = true;
-					break;
-				}
-			}
-
-			if (!isContained) {
-				return "/-1";
-			}
-
-			StringBuffer result = new StringBuffer("/");
-			result.append(getURIFragmentRootSegment(internalEObject));
-
-			for (int i = uriFragmentPath.size() - 1; i >= 0; --i) {
-				result.append('/');
-				result.append(uriFragmentPath.get(i));
-			}
-			return result.toString();
-		}
-	}
-
-	private String getXtextFragment(EObject eObject, ICompositeNode node) {
-		return encoder.encode(eObject.eContainer(),
-				(EReference) eObject.eContainingFeature(), node);
+	@Override
+	public String getID(EObject eObject) {
+		if (NodeModelUtils.getNode(eObject) != null)
+			return null;
+		return super.getID(eObject);
 	}
 	}
 
 
 	protected void createDiagnostic(Triple<EObject, EReference, INode> triple) {
 	protected void createDiagnostic(Triple<EObject, EReference, INode> triple) {
-		SpecificationElement specificationElement = EcoreUtil2
-				.getContainerOfType(triple.getFirst(),
-						SpecificationElement.class);
+		SpecificationElement specificationElement = EcoreUtil2.getContainerOfType(triple.getFirst(),
+				SpecificationElement.class);
 		DiagnosticMessage message = createDiagnosticMessage(triple);
 		DiagnosticMessage message = createDiagnosticMessage(triple);
-		Diagnostic diagnostic = new XtextLinkingDiagnostic(triple.getThird(),
-				message.getMessage(), message.getIssueCode(),
-				message.getIssueData());
+		Diagnostic diagnostic = new XtextLinkingDiagnostic(triple.getThird(), message.getMessage(),
+				message.getIssueCode(), message.getIssueData());
 		linkingDiagnostics.put(specificationElement, diagnostic);
 		linkingDiagnostics.put(specificationElement, diagnostic);
 
 
 	}
 	}
 
 
-	protected DiagnosticMessage createDiagnosticMessage(
-			Triple<EObject, EReference, INode> triple) {
+	protected DiagnosticMessage createDiagnosticMessage(Triple<EObject, EReference, INode> triple) {
 		ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext context = createDiagnosticMessageContext(triple);
 		ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext context = createDiagnosticMessageContext(triple);
-		DiagnosticMessage message = diagnosticMessageProvider
-				.getUnresolvedProxyMessage(context);
+		DiagnosticMessage message = diagnosticMessageProvider.getUnresolvedProxyMessage(context);
 		return message;
 		return message;
 	}
 	}
 
 
-	protected ILinkingDiagnosticContext createDiagnosticMessageContext(
-			Triple<EObject, EReference, INode> triple) {
+	protected ILinkingDiagnosticContext createDiagnosticMessageContext(Triple<EObject, EReference, INode> triple) {
 		return new DiagnosticMessageContext(triple, linkingHelper);
 		return new DiagnosticMessageContext(triple, linkingHelper);
 	}
 	}
 
 
@@ -358,8 +255,8 @@ public abstract class AbstractSCTResource extends GMFResource {
 		TreeIterator<Object> iterator = EcoreUtil.getAllContents(this, true);
 		TreeIterator<Object> iterator = EcoreUtil.getAllContents(this, true);
 		while (iterator.hasNext()) {
 		while (iterator.hasNext()) {
 			InternalEObject source = (InternalEObject) iterator.next();
 			InternalEObject source = (InternalEObject) iterator.next();
-			EStructuralFeature[] eStructuralFeatures = ((EClassImpl.FeatureSubsetSupplier) source
-					.eClass().getEAllStructuralFeatures()).crossReferences();
+			EStructuralFeature[] eStructuralFeatures = ((EClassImpl.FeatureSubsetSupplier) source.eClass()
+					.getEAllStructuralFeatures()).crossReferences();
 			if (eStructuralFeatures != null) {
 			if (eStructuralFeatures != null) {
 				for (EStructuralFeature crossRef : eStructuralFeatures) {
 				for (EStructuralFeature crossRef : eStructuralFeatures) {
 					if (monitor.isCanceled()) {
 					if (monitor.isCanceled()) {
@@ -372,22 +269,20 @@ public abstract class AbstractSCTResource extends GMFResource {
 	}
 	}
 
 
 	// copied from xtext LazyLinkingResource
 	// copied from xtext LazyLinkingResource
-	protected void resolveLazyCrossReference(InternalEObject source,
-			EStructuralFeature crossRef, CancelIndicator monitor) {
+	protected void resolveLazyCrossReference(InternalEObject source, EStructuralFeature crossRef,
+			CancelIndicator monitor) {
 		if (crossRef.isDerived())
 		if (crossRef.isDerived())
 			return;
 			return;
 		if (crossRef.isMany()) {
 		if (crossRef.isMany()) {
 			@SuppressWarnings("unchecked")
 			@SuppressWarnings("unchecked")
-			InternalEList<EObject> list = (InternalEList<EObject>) source
-					.eGet(crossRef);
+			InternalEList<EObject> list = (InternalEList<EObject>) source.eGet(crossRef);
 			for (int i = 0; i < list.size(); i++) {
 			for (int i = 0; i < list.size(); i++) {
 				EObject proxy = list.basicGet(i);
 				EObject proxy = list.basicGet(i);
 				if (proxy.eIsProxy()) {
 				if (proxy.eIsProxy()) {
 					URI proxyURI = ((InternalEObject) proxy).eProxyURI();
 					URI proxyURI = ((InternalEObject) proxy).eProxyURI();
 					if (getURI().equals(proxyURI.trimFragment())) {
 					if (getURI().equals(proxyURI.trimFragment())) {
 						final String fragment = proxyURI.fragment();
 						final String fragment = proxyURI.fragment();
-						if (encoder.isCrossLinkFragment(this, fragment)
-								&& !monitor.isCanceled()) {
+						if (encoder.isCrossLinkFragment(this, fragment) && !monitor.isCanceled()) {
 							EObject target = getEObject(fragment);
 							EObject target = getEObject(fragment);
 							if (target != null) {
 							if (target != null) {
 								try {
 								try {
@@ -407,8 +302,7 @@ public abstract class AbstractSCTResource extends GMFResource {
 				URI proxyURI = ((InternalEObject) proxy).eProxyURI();
 				URI proxyURI = ((InternalEObject) proxy).eProxyURI();
 				if (getURI().equals(proxyURI.trimFragment())) {
 				if (getURI().equals(proxyURI.trimFragment())) {
 					final String fragment = proxyURI.fragment();
 					final String fragment = proxyURI.fragment();
-					if (encoder.isCrossLinkFragment(this, fragment)
-							&& !monitor.isCanceled()) {
+					if (encoder.isCrossLinkFragment(this, fragment) && !monitor.isCanceled()) {
 						EObject target = getEObject(fragment);
 						EObject target = getEObject(fragment);
 						if (target != null) {
 						if (target != null) {
 							try {
 							try {
@@ -441,18 +335,15 @@ public abstract class AbstractSCTResource extends GMFResource {
 		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
 		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
 		parserRule.setName(rule);
 		parserRule.setName(rule);
 		String specification = element.getSpecification();
 		String specification = element.getSpecification();
-		IParseResult result = parser.parse(parserRule, new StringReader(
-				specification != null ? specification : ""));
+		IParseResult result = parser.parse(parserRule, new StringReader(specification != null ? specification : ""));
 		createDiagnostics(result, element);
 		createDiagnostics(result, element);
 		return result;
 		return result;
 	}
 	}
 
 
-	protected void createDiagnostics(IParseResult parseResult,
-			SpecificationElement semanticTarget) {
+	protected void createDiagnostics(IParseResult parseResult, SpecificationElement semanticTarget) {
 		syntaxDiagnostics.get(semanticTarget).clear();
 		syntaxDiagnostics.get(semanticTarget).clear();
 		for (INode error : parseResult.getSyntaxErrors()) {
 		for (INode error : parseResult.getSyntaxErrors()) {
-			syntaxDiagnostics.put(semanticTarget, new XtextSyntaxDiagnostic(
-					error));
+			syntaxDiagnostics.put(semanticTarget, new XtextSyntaxDiagnostic(error));
 		}
 		}
 	}
 	}
 
 
@@ -471,17 +362,14 @@ public abstract class AbstractSCTResource extends GMFResource {
 		final ListBasedDiagnosticConsumer consumer = new ListBasedDiagnosticConsumer();
 		final ListBasedDiagnosticConsumer consumer = new ListBasedDiagnosticConsumer();
 		linker.linkModel(element, consumer);
 		linker.linkModel(element, consumer);
 		linkingDiagnostics.get(element).clear();
 		linkingDiagnostics.get(element).clear();
-		linkingDiagnostics
-				.putAll(element, (consumer.getResult(Severity.ERROR)));
-		linkingDiagnostics.putAll(element,
-				(consumer.getResult(Severity.WARNING)));
+		linkingDiagnostics.putAll(element, (consumer.getResult(Severity.ERROR)));
+		linkingDiagnostics.putAll(element, (consumer.getResult(Severity.WARNING)));
 		isLinking = false;
 		isLinking = false;
 	}
 	}
 
 
 	protected void serializeSpecificationElement(SpecificationElement element) {
 	protected void serializeSpecificationElement(SpecificationElement element) {
 		isSerializing = true;
 		isSerializing = true;
-		if (getSyntaxDiagnostics().get(element).size() > 0
-				|| getLinkingDiagnostics().get(element).size() > 0) {
+		if (getSyntaxDiagnostics().get(element).size() > 0 || getLinkingDiagnostics().get(element).size() > 0) {
 			return;
 			return;
 		}
 		}
 		try {
 		try {
@@ -529,16 +417,13 @@ public abstract class AbstractSCTResource extends GMFResource {
 				if (isLoading() || isParsing || isLinking || isSerializing) {
 				if (isLoading() || isParsing || isLinking || isSerializing) {
 					return;
 					return;
 				}
 				}
-				if (msg.getEventType() == Notification.REMOVING_ADAPTER
-						|| msg.getEventType() == Notification.RESOLVE) {
+				if (msg.getEventType() == Notification.REMOVING_ADAPTER || msg.getEventType() == Notification.RESOLVE) {
 					return;
 					return;
 				}
 				}
 				Object notifier = msg.getNotifier();
 				Object notifier = msg.getNotifier();
 				if (notifier instanceof EObject) {
 				if (notifier instanceof EObject) {
 					EObject eObject = (EObject) notifier;
 					EObject eObject = (EObject) notifier;
-					SpecificationElement container = EcoreUtil2
-							.getContainerOfType(eObject,
-									SpecificationElement.class);
+					SpecificationElement container = EcoreUtil2.getContainerOfType(eObject, SpecificationElement.class);
 					if (container != null) {
 					if (container != null) {
 						serializeSpecificationElement(container);
 						serializeSpecificationElement(container);
 					}
 					}
@@ -563,8 +448,7 @@ public abstract class AbstractSCTResource extends GMFResource {
 				String newValString = msg.getNewStringValue();
 				String newValString = msg.getNewStringValue();
 				String oldVString = msg.getOldStringValue();
 				String oldVString = msg.getOldStringValue();
 				if (newValString != null && !newValString.equals(oldVString)) {
 				if (newValString != null && !newValString.equals(oldVString)) {
-					parseSpecificationElement((SpecificationElement) msg
-							.getNotifier());
+					parseSpecificationElement((SpecificationElement) msg.getNotifier());
 					linkSpecificationElements();
 					linkSpecificationElements();
 				}
 				}
 			}
 			}
@@ -591,8 +475,7 @@ public abstract class AbstractSCTResource extends GMFResource {
 		private final Triple<EObject, EReference, INode> triple;
 		private final Triple<EObject, EReference, INode> triple;
 		private final LinkingHelper linkingHelper;
 		private final LinkingHelper linkingHelper;
 
 
-		protected DiagnosticMessageContext(
-				Triple<EObject, EReference, INode> triple, LinkingHelper helper) {
+		protected DiagnosticMessageContext(Triple<EObject, EReference, INode> triple, LinkingHelper helper) {
 			this.triple = triple;
 			this.triple = triple;
 			this.linkingHelper = helper;
 			this.linkingHelper = helper;
 		}
 		}
@@ -606,8 +489,7 @@ public abstract class AbstractSCTResource extends GMFResource {
 		}
 		}
 
 
 		public String getLinkText() {
 		public String getLinkText() {
-			return linkingHelper.getCrossRefNodeAsString(triple.getThird(),
-					true);
+			return linkingHelper.getCrossRefNodeAsString(triple.getThird(), true);
 		}
 		}
 
 
 	}
 	}

+ 45 - 32
test-plugins/org.yakindu.sct.model.stext.resource.test/src/org/yakindu/sct/model/stext/resource/test/SCTResourceTest.java

@@ -17,13 +17,16 @@ import static junit.framework.Assert.assertTrue;
 
 
 import java.io.File;
 import java.io.File;
 import java.util.Collections;
 import java.util.Collections;
+import java.util.List;
 
 
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
 import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
 import org.eclipse.xtext.resource.XtextSyntaxDiagnostic;
 import org.eclipse.xtext.resource.XtextSyntaxDiagnostic;
 import org.eclipse.xtext.util.CancelIndicator;
 import org.eclipse.xtext.util.CancelIndicator;
@@ -52,6 +55,7 @@ import org.yakindu.sct.model.stext.stext.TimeEventSpec;
 import org.yakindu.sct.model.stext.stext.TimeEventType;
 import org.yakindu.sct.model.stext.stext.TimeEventType;
 import org.yakindu.sct.model.stext.stext.TimeUnit;
 import org.yakindu.sct.model.stext.stext.TimeUnit;
 import org.yakindu.sct.model.stext.ui.internal.STextActivator;
 import org.yakindu.sct.model.stext.ui.internal.STextActivator;
+import org.yakindu.sct.test.models.SCTUnitTestModels;
 
 
 import com.google.inject.Injector;
 import com.google.inject.Injector;
 
 
@@ -71,16 +75,14 @@ public class SCTResourceTest {
 
 
 	@Before
 	@Before
 	public void setUp() throws Exception {
 	public void setUp() throws Exception {
-		Injector injector = STextActivator.getInstance().getInjector(
-				STextActivator.ORG_YAKINDU_SCT_MODEL_STEXT_STEXT);
+		Injector injector = STextActivator.getInstance().getInjector(STextActivator.ORG_YAKINDU_SCT_MODEL_STEXT_STEXT);
 		ResourceSet resourceSet = new ResourceSetImpl();
 		ResourceSet resourceSet = new ResourceSetImpl();
 		res = new StextResource(URI.createURI("test.test"));
 		res = new StextResource(URI.createURI("test.test"));
-		res.eAdapters().add(
-				new ContextElementAdapter(new IContextElementProvider() {
-					public EObject getContextObject() {
-						return res.getContents().get(0);
-					}
-				}));
+		res.eAdapters().add(new ContextElementAdapter(new IContextElementProvider() {
+			public EObject getContextObject() {
+				return res.getContents().get(0);
+			}
+		}));
 		resourceSet.getResources().add(res);
 		resourceSet.getResources().add(res);
 		injector.injectMembers(res);
 		injector.injectMembers(res);
 	}
 	}
@@ -90,6 +92,29 @@ public class SCTResourceTest {
 		res = null;
 		res = null;
 	}
 	}
 
 
+	@Test
+	public void testFragments() throws Exception {
+		SCTUnitTestModels models = new SCTUnitTestModels();
+		List<Statechart> originalStatecharts = models.loadAllStatecharts();
+		List<Statechart> targetStatecharts = models.loadAllStatecharts();
+		for (int i = 0; i < originalStatecharts.size(); i++) {
+			Statechart statechart = originalStatecharts.get(i);
+			Statechart targetStatechart = targetStatecharts.get(i);
+			Resource targetResource = targetStatechart.eResource();
+			assertTrue(statechart != targetStatechart);
+			assertTrue(EcoreUtil.equals(statechart, targetStatechart));
+			TreeIterator<EObject> allContents = EcoreUtil.getAllContents(statechart.eResource(), true);
+			while (allContents.hasNext()) {
+				EObject next = allContents.next();
+				String fragment = EcoreUtil.getURI(next).fragment();
+				EObject targetObject = targetResource.getEObject(fragment);
+				assertNotNull("Could not resolve fragment " + fragment + " for EObject " + next + "in statechart "
+						+ statechart.getName(), targetObject);
+				assertTrue(EcoreUtil.equals(next, targetObject));
+			}
+		}
+	}
+
 	@Test
 	@Test
 	public void testStatechartParsing() {
 	public void testStatechartParsing() {
 		Statechart statechart = createStatechart("internal: event Event1");
 		Statechart statechart = createStatechart("internal: event Event1");
@@ -98,12 +123,10 @@ public class SCTResourceTest {
 		assertEquals(1, statechart.getScopes().size());
 		assertEquals(1, statechart.getScopes().size());
 		Scope scope = statechart.getScopes().get(0);
 		Scope scope = statechart.getScopes().get(0);
 		assertTrue(scope instanceof InternalScope);
 		assertTrue(scope instanceof InternalScope);
-		EList<Declaration> declarations = ((InternalScope) scope)
-				.getDeclarations();
+		EList<Declaration> declarations = ((InternalScope) scope).getDeclarations();
 		Declaration declaration = declarations.get(0);
 		Declaration declaration = declarations.get(0);
 		assertTrue(declaration instanceof EventDefinition);
 		assertTrue(declaration instanceof EventDefinition);
-		assertEquals("" + res.getSyntaxDiagnostics(), 0, res
-				.getSyntaxDiagnostics().size());
+		assertEquals("" + res.getSyntaxDiagnostics(), 0, res.getSyntaxDiagnostics().size());
 	}
 	}
 
 
 	@Test
 	@Test
@@ -122,8 +145,7 @@ public class SCTResourceTest {
 		assertEquals(0, state.getReactions().size());
 		assertEquals(0, state.getReactions().size());
 		res.getContents().add(state);
 		res.getContents().add(state);
 		assertEquals(1, state.getReactions().size());
 		assertEquals(1, state.getReactions().size());
-		assertEquals("" + res.getSyntaxDiagnostics(), 0, res
-				.getSyntaxDiagnostics().size());
+		assertEquals("" + res.getSyntaxDiagnostics(), 0, res.getSyntaxDiagnostics().size());
 	}
 	}
 
 
 	public void testInvalidExpressionParsing() {
 	public void testInvalidExpressionParsing() {
@@ -142,8 +164,7 @@ public class SCTResourceTest {
 		Event event = internalScope.getEvents().get(0);
 		Event event = internalScope.getEvents().get(0);
 		event.setName("Event2");
 		event.setName("Event2");
 		assertEquals("internal: event Event2\n", statechart.getSpecification());
 		assertEquals("internal: event Event2\n", statechart.getSpecification());
-		assertEquals("" + res.getSyntaxDiagnostics(), 0, res
-				.getSyntaxDiagnostics().size());
+		assertEquals("" + res.getSyntaxDiagnostics(), 0, res.getSyntaxDiagnostics().size());
 	}
 	}
 
 
 	@Test
 	@Test
@@ -155,15 +176,13 @@ public class SCTResourceTest {
 		TimeEventSpec timeTrigger = stextFac.createTimeEventSpec();
 		TimeEventSpec timeTrigger = stextFac.createTimeEventSpec();
 		timeTrigger.setType(TimeEventType.EVERY);
 		timeTrigger.setType(TimeEventType.EVERY);
 		timeTrigger.setUnit(TimeUnit.SECOND);
 		timeTrigger.setUnit(TimeUnit.SECOND);
-		PrimitiveValueExpression exp = stextFac
-				.createPrimitiveValueExpression();
+		PrimitiveValueExpression exp = stextFac.createPrimitiveValueExpression();
 		IntLiteral literal = stextFac.createIntLiteral();
 		IntLiteral literal = stextFac.createIntLiteral();
 		literal.setValue(42);
 		literal.setValue(42);
 		exp.setValue(literal);
 		exp.setValue(literal);
 		timeTrigger.setValue(exp);
 		timeTrigger.setValue(exp);
 		trigger.getTriggers().add(timeTrigger);
 		trigger.getTriggers().add(timeTrigger);
-		assertEquals("after 10\n s , every 42 s [true] / 3 * 3",
-				transition.getSpecification());
+		assertEquals("after 10\n s , every 42 s [true] / 3 * 3", transition.getSpecification());
 		assertEquals("" + res.getErrors(), 0, res.getErrors().size());
 		assertEquals("" + res.getErrors(), 0, res.getErrors().size());
 	}
 	}
 
 
@@ -172,8 +191,7 @@ public class SCTResourceTest {
 		res.setSerializerEnabled(true);
 		res.setSerializerEnabled(true);
 		State state = createState("entry / 3 * 3");
 		State state = createState("entry / 3 * 3");
 		res.getContents().add(state);
 		res.getContents().add(state);
-		LocalReaction reaction = (LocalReaction) state.getLocalReactions().get(
-				0);
+		LocalReaction reaction = (LocalReaction) state.getLocalReactions().get(0);
 		ReactionTrigger trigger = (ReactionTrigger) reaction.getTrigger();
 		ReactionTrigger trigger = (ReactionTrigger) reaction.getTrigger();
 		ExitEvent exitEvent = stextFac.createExitEvent();
 		ExitEvent exitEvent = stextFac.createExitEvent();
 		trigger.getTriggers().add(exitEvent);
 		trigger.getTriggers().add(exitEvent);
@@ -188,13 +206,10 @@ public class SCTResourceTest {
 		Transition transition = createTransition("Event1 [true] / 3 * 3");
 		Transition transition = createTransition("Event1 [true] / 3 * 3");
 		res.getContents().add(transition);
 		res.getContents().add(transition);
 		res.resolveLazyCrossReferences(CancelIndicator.NullImpl);
 		res.resolveLazyCrossReferences(CancelIndicator.NullImpl);
-		assertEquals("" + res.getLinkingDiagnostics(), 0, res
-				.getLinkingDiagnostics().size());
+		assertEquals("" + res.getLinkingDiagnostics(), 0, res.getLinkingDiagnostics().size());
 		ReactionTrigger trigger = (ReactionTrigger) transition.getTrigger();
 		ReactionTrigger trigger = (ReactionTrigger) transition.getTrigger();
-		RegularEventSpec eventSpec = (RegularEventSpec) trigger.getTriggers()
-				.get(0);
-		ElementReferenceExpression expression = (ElementReferenceExpression) eventSpec
-				.getEvent();
+		RegularEventSpec eventSpec = (RegularEventSpec) trigger.getTriggers().get(0);
+		ElementReferenceExpression expression = (ElementReferenceExpression) eventSpec.getEvent();
 		EventDefinition reference = (EventDefinition) expression.getReference();
 		EventDefinition reference = (EventDefinition) expression.getReference();
 		assertNotNull(reference);
 		assertNotNull(reference);
 		assertEquals("Event1", reference.getName());
 		assertEquals("Event1", reference.getName());
@@ -241,10 +256,8 @@ public class SCTResourceTest {
 
 
 		assertEquals("" + res.getErrors(), 0, res.getErrors().size());
 		assertEquals("" + res.getErrors(), 0, res.getErrors().size());
 		ReactionTrigger trigger = (ReactionTrigger) transition.getTrigger();
 		ReactionTrigger trigger = (ReactionTrigger) transition.getTrigger();
-		RegularEventSpec eventSpec = (RegularEventSpec) trigger.getTriggers()
-				.get(0);
-		ElementReferenceExpression expression = (ElementReferenceExpression) eventSpec
-				.getEvent();
+		RegularEventSpec eventSpec = (RegularEventSpec) trigger.getTriggers().get(0);
+		ElementReferenceExpression expression = (ElementReferenceExpression) eventSpec.getEvent();
 		EventDefinition reference = (EventDefinition) expression.getReference();
 		EventDefinition reference = (EventDefinition) expression.getReference();
 		assertNotNull(reference);
 		assertNotNull(reference);
 		assertEquals("Event1", reference.getName());
 		assertEquals("Event1", reference.getName());

+ 17 - 0
test-plugins/org.yakindu.sct.test.models/src/org/yakindu/sct/test/models/SCTUnitTestModels.java

@@ -10,6 +10,11 @@
  */
  */
 package org.yakindu.sct.test.models;
 package org.yakindu.sct.test.models;
 
 
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.yakindu.sct.model.sgraph.Statechart;
 
 
 /**
 /**
  * 
  * 
@@ -54,4 +59,16 @@ public class SCTUnitTestModels extends AbstractTestModelsUtil {
 		return TESTMODEL_DIR;
 		return TESTMODEL_DIR;
 	}
 	}
 
 
+	public List<Statechart> loadAllStatecharts() throws Exception {
+		List<Statechart> result = new ArrayList<Statechart>();
+		Field[] fields = getClass().getFields();
+		for (Field field : fields) {
+			String value = (String) field.get(this);
+			if (value.endsWith(".sct")) {
+				result.add(loadStatechartFromResource(value));
+			}
+		}
+		return result;
+	}
+
 }
 }