Procházet zdrojové kódy

Refactored integrated resource and validation infrastructure

Andreas Mülder před 13 roky
rodič
revize
3b2fcdfb18
24 změnil soubory, kde provedl 1408 přidání a 667 odebrání
  1. 2 1
      plugins/org.yakindu.sct.model.sgraph.ui/META-INF/MANIFEST.MF
  2. 103 0
      plugins/org.yakindu.sct.model.sgraph.ui/src/org/yakindu/sct/model/sgraph/ui/validation/SCTMarkerCreator.java
  3. 31 0
      plugins/org.yakindu.sct.model.sgraph.ui/src/org/yakindu/sct/model/sgraph/ui/validation/SCTMarkerTypeProvider.java
  4. 463 0
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/AbstractSCTResource.java
  5. 34 0
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/SCTLinker.java
  6. 0 213
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/SGraphInjectMembersResource.java
  7. 392 184
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/util/SGraphValidator.java
  8. 1 2
      plugins/org.yakindu.sct.model.stext.resource/META-INF/MANIFEST.MF
  9. 1 1
      plugins/org.yakindu.sct.model.stext.resource/plugin.xml
  10. 0 61
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/factory/InjectMembersResourceFactory.java
  11. 40 0
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/factory/StextResourceFactory.java
  12. 112 0
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/impl/StextResource.java
  13. 0 61
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/StateInjectionService.java
  14. 0 59
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/StatechartInjectionService.java
  15. 0 65
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/TransitionInjectionService.java
  16. 4 1
      plugins/org.yakindu.sct.model.stext.ui/META-INF/MANIFEST.MF
  17. 25 2
      plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/STextUiModule.java
  18. 78 0
      plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/validation/SCTDiagnosticConverterImpl.java
  19. 33 0
      plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/validation/SCTResourceValidatorImpl.java
  20. 11 9
      plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/STextRuntimeModule.java
  21. 42 7
      plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java
  22. 2 1
      test-plugins/org.yakindu.sct.model.sgraph.test/META-INF/MANIFEST.MF
  23. 20 0
      test-plugins/org.yakindu.sct.model.sgraph.test/src/org/yakindu/sct/model/sgraph/test/SGraphTestModule.java
  24. 14 0
      test-plugins/org.yakindu.sct.model.sgraph.test/src/org/yakindu/sct/model/sgraph/test/TestInjectorProvider.java

+ 2 - 1
plugins/org.yakindu.sct.model.sgraph.ui/META-INF/MANIFEST.MF

@@ -13,4 +13,5 @@ Require-Bundle: org.eclipse.ui,
  org.apache.commons.lang
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
-Export-Package: org.yakindu.sct.model.sgraph.ui
+Export-Package: org.yakindu.sct.model.sgraph.ui,
+ org.yakindu.sct.model.sgraph.ui.validation

+ 103 - 0
plugins/org.yakindu.sct.model.sgraph.ui/src/org/yakindu/sct/model/sgraph/ui/validation/SCTMarkerCreator.java

@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.sgraph.ui.validation;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.xtext.diagnostics.Severity;
+import org.eclipse.xtext.ui.editor.validation.MarkerCreator;
+import org.eclipse.xtext.validation.CheckType;
+import org.eclipse.xtext.validation.Issue;
+import org.eclipse.xtext.validation.Issue.IssueImpl;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SCTMarkerCreator extends MarkerCreator {
+
+	public static final String ELEMENT_ID = "elementId";
+
+	@Override
+	protected void setMarkerAttributes(Issue issue, IResource resource,
+			IMarker marker) throws CoreException {
+		super.setMarkerAttributes(issue, resource, marker);
+		if (issue instanceof WrappingIssue) {
+			marker.setAttribute(ELEMENT_ID,
+					((WrappingIssue) issue).getNotationViewURI());
+		}
+	}
+
+	/**
+	 * 
+	 * @author andreas muelder - Initial contribution and API x
+	 */
+	public static class WrappingIssue extends IssueImpl {
+
+		private final Issue delegate;
+
+		private final String notationViewURI;
+
+		public WrappingIssue(final Issue delegate, String notationViewURI) {
+			this.delegate = delegate;
+			this.notationViewURI = notationViewURI;
+
+		}
+
+		public String getNotationViewURI() {
+			return notationViewURI;
+		}
+
+		public Severity getSeverity() {
+			return delegate.getSeverity();
+		}
+
+		public String getMessage() {
+			return delegate.getMessage();
+		}
+
+		public String getCode() {
+			return delegate.getCode();
+		}
+
+		public CheckType getType() {
+			return delegate.getType();
+		}
+
+		public URI getUriToProblem() {
+			return delegate.getUriToProblem();
+		}
+
+		public Integer getLineNumber() {
+			return delegate.getLineNumber();
+		}
+
+		public Integer getOffset() {
+			return delegate.getOffset();
+		}
+
+		public Integer getLength() {
+			return delegate.getLength();
+		}
+
+		public boolean isSyntaxError() {
+			return delegate.isSyntaxError();
+		}
+
+		public String[] getData() {
+			return delegate.getData();
+		}
+	}
+
+}

+ 31 - 0
plugins/org.yakindu.sct.model.sgraph.ui/src/org/yakindu/sct/model/sgraph/ui/validation/SCTMarkerTypeProvider.java

@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.sgraph.ui.validation;
+
+import org.eclipse.xtext.ui.validation.MarkerTypeProvider;
+import org.eclipse.xtext.validation.Issue;
+import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerCreator.WrappingIssue;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SCTMarkerTypeProvider extends MarkerTypeProvider {
+
+	@Override
+	public String getMarkerType(Issue issue) {
+		if (issue instanceof WrappingIssue) {
+			return "org.yakindu.sct.ui.editor.diagnostic";
+		}
+		return super.getMarkerType(issue);
+	}
+}

+ 463 - 0
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/AbstractSCTResource.java

@@ -0,0 +1,463 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+
+package org.yakindu.sct.model.sgraph.resource;
+
+import java.io.StringReader;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.EClassImpl;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.gmf.runtime.emf.core.resources.GMFResource;
+import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.XtextFactory;
+import org.eclipse.xtext.diagnostics.DiagnosticMessage;
+import org.eclipse.xtext.diagnostics.Severity;
+import org.eclipse.xtext.linking.ILinker;
+import org.eclipse.xtext.linking.ILinkingDiagnosticMessageProvider;
+import org.eclipse.xtext.linking.ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext;
+import org.eclipse.xtext.linking.ILinkingService;
+import org.eclipse.xtext.linking.impl.LinkingHelper;
+import org.eclipse.xtext.linking.impl.XtextLinkingDiagnostic;
+import org.eclipse.xtext.linking.lazy.LazyURIEncoder;
+import org.eclipse.xtext.nodemodel.ICompositeNode;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.eclipse.xtext.parser.IParseResult;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parsetree.reconstr.XtextSerializationException;
+import org.eclipse.xtext.resource.XtextSyntaxDiagnostic;
+import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.util.CancelIndicator;
+import org.eclipse.xtext.util.Triple;
+import org.eclipse.xtext.validation.IConcreteSyntaxValidator;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.sgraph.Transition;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public abstract class AbstractSCTResource extends GMFResource {
+
+	@Inject
+	private IParser parser;
+	@Inject
+	private ILinker linker;
+	@Inject
+	private ISerializer serializer;
+	@Inject
+	private LazyURIEncoder encoder;
+	@Inject
+	private ILinkingService linkingService;
+	@Inject
+	private ILinkingDiagnosticMessageProvider diagnosticMessageProvider;
+	@Inject
+	private LinkingHelper linkingHelper;
+	@Inject
+	private IConcreteSyntaxValidator syntaxValidator;
+
+	protected boolean isParsing = false;
+
+	protected boolean isLinking = false;
+
+	protected boolean isSerializing = false;
+
+	protected Multimap<SpecificationElement, Diagnostic> syntaxDiagnostics;
+
+	protected Multimap<SpecificationElement, Diagnostic> linkingDiagnostics;
+
+	protected Map<SpecificationElement, Diagnostic> sublinkDiagnostics;
+
+	protected abstract void parseTransition(Transition element);
+
+	protected abstract void parseState(State element);
+
+	protected abstract void parseStatechart(Statechart element);
+
+	protected abstract void serializeStatechart(Statechart element);
+
+	protected abstract void serializeState(State element);
+
+	protected abstract void serializeTransition(Transition element);
+
+	public AbstractSCTResource(URI uri) {
+		super(uri);
+		syntaxDiagnostics = HashMultimap.create();
+		linkingDiagnostics = HashMultimap.create();
+	}
+
+	@Override
+	public void attached(EObject eObject) {
+		super.attached(eObject);
+		if (eObject instanceof SpecificationElement) {
+			parseSpecificationElement((SpecificationElement) eObject);
+			linkSpecificationElement((SpecificationElement) eObject);
+			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject,
+					ParseAdapter.class);
+			if (parseAdapter == null) {
+				eObject.eAdapters().add(new ParseAdapter());
+			}
+		}
+		if (NodeModelUtils.getNode(eObject) != null) {
+			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject,
+					SerializeAdapter.class);
+			if (serializeAdapter == null) {
+				//eObject.eAdapters().add(new SerializeAdapter());
+			}
+		}
+	}
+
+	@Override
+	public void detached(EObject eObject) {
+		if (eObject instanceof SpecificationElement) {
+			Adapter parseAdapter = EcoreUtil.getExistingAdapter(eObject,
+					ParseAdapter.class);
+			if (parseAdapter != null) {
+				eObject.eAdapters().remove(parseAdapter);
+			}
+			Adapter serializeAdapter = EcoreUtil.getExistingAdapter(eObject,
+					SerializeAdapter.class);
+			if (serializeAdapter != null) {
+				eObject.eAdapters().remove(serializeAdapter);
+			}
+		}
+		super.detached(eObject);
+	}
+
+	@Override
+	public synchronized EObject getEObject(String uriFragment) {
+		if (encoder.isCrossLinkFragment(this, uriFragment)) {
+			Triple<EObject, EReference, INode> triple = encoder.decode(this,
+					uriFragment);
+			List<EObject> linkedObjects = linkingService.getLinkedObjects(
+					triple.getFirst(), triple.getSecond(), triple.getThird());
+			if (!linkedObjects.isEmpty()) {
+				return linkedObjects.get(0);
+			} else {
+				createDiagnostic(triple);
+			}
+		}
+		return super.getEObject(uriFragment);
+	}
+
+	@Override
+	public synchronized String getURIFragment(EObject eObject) {
+		if (unloadingContents != null) {
+			return super.getURIFragment(eObject);
+		}
+		ICompositeNode node = NodeModelUtils.findActualNodeFor(eObject);
+		if (node != null) {
+			return getXtextFragment(eObject, node);
+		}
+		return super.getURIFragment(eObject);
+	}
+
+	private String getXtextFragment(EObject eObject, ICompositeNode node) {
+		return encoder.encode(eObject,
+				(EReference) eObject.eContainingFeature(), node);
+	}
+
+	protected void createDiagnostic(Triple<EObject, EReference, INode> triple) {
+		SpecificationElement specificationElement = EcoreUtil2
+				.getContainerOfType(triple.getFirst(),
+						SpecificationElement.class);
+		DiagnosticMessage message = createDiagnosticMessage(triple);
+		Diagnostic diagnostic = new XtextLinkingDiagnostic(triple.getThird(),
+				message.getMessage(), message.getIssueCode(),
+				message.getIssueData());
+		linkingDiagnostics.put(specificationElement, diagnostic);
+
+	}
+
+	protected DiagnosticMessage createDiagnosticMessage(
+			Triple<EObject, EReference, INode> triple) {
+		ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext context = createDiagnosticMessageContext(triple);
+		DiagnosticMessage message = diagnosticMessageProvider
+				.getUnresolvedProxyMessage(context);
+		return message;
+	}
+
+	protected ILinkingDiagnosticContext createDiagnosticMessageContext(
+			Triple<EObject, EReference, INode> triple) {
+		return new DiagnosticMessageContext(triple, linkingHelper);
+	}
+
+	// copied from xtext LazyLinkingResource
+	public void resolveLazyCrossReferences(CancelIndicator monitor) {
+		TreeIterator<Object> iterator = EcoreUtil.getAllContents(this, true);
+		while (iterator.hasNext()) {
+			InternalEObject source = (InternalEObject) iterator.next();
+			EStructuralFeature[] eStructuralFeatures = ((EClassImpl.FeatureSubsetSupplier) source
+					.eClass().getEAllStructuralFeatures()).crossReferences();
+			if (eStructuralFeatures != null) {
+				for (EStructuralFeature crossRef : eStructuralFeatures) {
+					if (monitor.isCanceled()) {
+						return;
+					}
+					resolveLazyCrossReference(source, crossRef, monitor);
+				}
+			}
+		}
+	}
+
+	// copied from xtext LazyLinkingResource
+	protected void resolveLazyCrossReference(InternalEObject source,
+			EStructuralFeature crossRef, CancelIndicator monitor) {
+		if (crossRef.isDerived())
+			return;
+		if (crossRef.isMany()) {
+			@SuppressWarnings("unchecked")
+			InternalEList<EObject> list = (InternalEList<EObject>) source
+					.eGet(crossRef);
+			for (int i = 0; i < list.size(); i++) {
+				EObject proxy = list.basicGet(i);
+				if (proxy.eIsProxy()) {
+					URI proxyURI = ((InternalEObject) proxy).eProxyURI();
+					if (getURI().equals(proxyURI.trimFragment())) {
+						final String fragment = proxyURI.fragment();
+						if (encoder.isCrossLinkFragment(this, fragment)
+								&& !monitor.isCanceled()) {
+							EObject target = getEObject(fragment);
+							if (target != null) {
+								try {
+									source.eSetDeliver(false);
+									list.setUnique(i, target);
+								} finally {
+									source.eSetDeliver(true);
+								}
+							}
+						}
+					}
+				}
+			}
+		} else {
+			EObject proxy = (EObject) source.eGet(crossRef, false);
+			if (proxy != null && proxy.eIsProxy()) {
+				URI proxyURI = ((InternalEObject) proxy).eProxyURI();
+				if (getURI().equals(proxyURI.trimFragment())) {
+					final String fragment = proxyURI.fragment();
+					if (encoder.isCrossLinkFragment(this, fragment)
+							&& !monitor.isCanceled()) {
+						EObject target = getEObject(fragment);
+						if (target != null) {
+							try {
+								source.eSetDeliver(false);
+								source.eSet(crossRef, target);
+							} finally {
+								source.eSetDeliver(true);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	protected void parseSpecificationElement(SpecificationElement element) {
+		isParsing = true;
+		if (element instanceof Transition) {
+			parseTransition((Transition) element);
+		} else if (element instanceof State) {
+			parseState((State) element);
+		} else if (element instanceof Statechart) {
+			parseStatechart((Statechart) element);
+		}
+		isParsing = false;
+	}
+
+	protected IParseResult parse(SpecificationElement element, String rule) {
+		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
+		parserRule.setName(rule);
+		String specification = element.getSpecification();
+		IParseResult result = parser.parse(parserRule, new StringReader(
+				specification != null ? specification : ""));
+		createDiagnostics(result, element);
+		return result;
+	}
+
+	protected void createDiagnostics(IParseResult parseResult,
+			SpecificationElement semanticTarget) {
+		syntaxDiagnostics.get(semanticTarget).clear();
+		for (INode error : parseResult.getSyntaxErrors()) {
+			syntaxDiagnostics.put(semanticTarget, new XtextSyntaxDiagnostic(
+					error));
+		}
+	}
+
+	public void linkSpecificationElements() {
+		TreeIterator<EObject> iter = getAllContents();
+		while (iter.hasNext()) {
+			EObject currentObject = iter.next();
+			if (currentObject instanceof SpecificationElement) {
+				linkSpecificationElement((SpecificationElement) currentObject);
+			}
+		}
+	}
+
+	protected void linkSpecificationElement(SpecificationElement element) {
+		isLinking = true;
+		final ListBasedDiagnosticConsumer consumer = new ListBasedDiagnosticConsumer();
+		linker.linkModel(element, consumer);
+		linkingDiagnostics.get(element).clear();
+		linkingDiagnostics
+				.putAll(element, (consumer.getResult(Severity.ERROR)));
+		linkingDiagnostics.putAll(element,
+				(consumer.getResult(Severity.WARNING)));
+		isLinking = false;
+	}
+
+	protected void serializeSpecificationElement(SpecificationElement element) {
+		long t = System.currentTimeMillis();
+		isSerializing = true;
+		if (getSyntaxDiagnostics().get(element).size() > 0
+				|| getLinkingDiagnostics().get(element).size() > 0) {
+			return;
+		}
+		try {
+			if (element instanceof Transition) {
+				serializeTransition((Transition) element);
+			} else if (element instanceof State) {
+				serializeState((State) element);
+			} else if (element instanceof Statechart) {
+				serializeStatechart((Statechart) element);
+			}
+		} catch (XtextSerializationException ex) {
+			// Leave the old specification
+		} catch (IConcreteSyntaxValidator.InvalidConcreteSyntaxException ex) {
+			// Leave the old specification
+		} finally {
+			isSerializing = false;
+			System.out.println("Serializing took "
+					+ (System.currentTimeMillis() - t));
+		}
+	}
+
+	protected String serialize(EObject object) {
+		if (object != null) {
+			return serializer.serialize(object);
+		}
+		return "";
+	}
+
+	public Multimap<SpecificationElement, Diagnostic> getSyntaxDiagnostics() {
+		return syntaxDiagnostics;
+	}
+
+	public Multimap<SpecificationElement, Diagnostic> getLinkingDiagnostics() {
+		return linkingDiagnostics;
+	}
+
+	protected final class SerializeAdapter extends EContentAdapter {
+
+		@Override
+		public void notifyChanged(Notification msg) {
+			super.notifyChanged(msg);
+			if (isLoading() || isParsing || isLinking) {
+				return;
+			}
+			if (msg.getEventType() == Notification.REMOVING_ADAPTER
+					|| msg.getEventType() == Notification.RESOLVE
+					|| msg.getEventType() == Notification.REMOVE
+					|| msg.getEventType() == Notification.REMOVE_MANY) {
+				return;
+			}
+			Object notifier = msg.getNotifier();
+			if (notifier instanceof EObject) {
+				EObject eObject = (EObject) notifier;
+				SpecificationElement container = EcoreUtil2.getContainerOfType(
+						eObject, SpecificationElement.class);
+				if (container != null) {
+					serializeSpecificationElement(container);
+				}
+			}
+		}
+
+		@Override
+		public boolean isAdapterForType(Object type) {
+			return SerializeAdapter.class == type;
+		}
+	}
+
+	protected final class ParseAdapter extends AdapterImpl {
+
+		@Override
+		public void notifyChanged(Notification msg) {
+			if (isSerializing) {
+				return;
+			}
+			if (msg.getFeature() == SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION) {
+				String newValString = msg.getNewStringValue();
+				String oldVString = msg.getOldStringValue();
+				if (newValString != null && !newValString.equals(oldVString)) {
+					parseSpecificationElement((SpecificationElement) msg
+							.getNotifier());
+					linkSpecificationElements();
+				}
+			}
+		}
+
+		@Override
+		public boolean isAdapterForType(Object type) {
+			return ParseAdapter.class == type;
+		}
+	}
+
+	// copied from xtext LazyLinkingResource
+	protected static class DiagnosticMessageContext implements
+			ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext {
+
+		private final Triple<EObject, EReference, INode> triple;
+		private final LinkingHelper linkingHelper;
+
+		protected DiagnosticMessageContext(
+				Triple<EObject, EReference, INode> triple, LinkingHelper helper) {
+			this.triple = triple;
+			this.linkingHelper = helper;
+		}
+
+		public EObject getContext() {
+			return triple.getFirst();
+		}
+
+		public EReference getReference() {
+			return triple.getSecond();
+		}
+
+		public String getLinkText() {
+			return linkingHelper.getCrossRefNodeAsString(triple.getThird(),
+					true);
+		}
+
+	}
+}

+ 34 - 0
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/SCTLinker.java

@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2011 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.sgraph.resource;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.xtext.linking.lazy.LazyLinker;
+import org.eclipse.xtext.nodemodel.impl.CompositeNodeWithSemanticElement;
+
+/**
+ * @author andreas muelder
+ * 
+ */
+public class SCTLinker extends LazyLinker {
+
+	@Override
+	protected void clearReference(EObject obj, EReference ref) {
+		// If the CompositeNodeWithSemanticElement adapter exists, we know that
+		// this is an Xtext model element.
+		if (EcoreUtil.getAdapter(obj.eAdapters(),
+				CompositeNodeWithSemanticElement.class) != null) {
+			super.clearReference(obj, ref);
+		}
+	}
+}

+ 0 - 213
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/SGraphInjectMembersResource.java

@@ -1,213 +0,0 @@
-/**
- * Copyright (c) 2011 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     committers of YAKINDU - initial API and implementation
- */
-package org.yakindu.sct.model.sgraph.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.scoping.IGlobalScopeProvider;
-import org.eclipse.xtext.scoping.IScope;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.model.sgraph.Statechart;
-
-import com.google.common.base.Predicates;
-import com.google.inject.Inject;
-
-import de.itemis.xtext.utils.gmf.resource.InjectMembersResource;
-
-/**
- * Implementation of InjectMembersResource that handles substatecharts set in
- * states by qualifiedName
- * 
- * @author benjamin schwertfeger
- * 
- */
-public class SGraphInjectMembersResource extends InjectMembersResource {
-
-	@Inject
-	IGlobalScopeProvider scopeProvider;
-
-	@Inject
-	IQualifiedNameConverter nameConverter;
-
-	@Inject
-	IQualifiedNameProvider nameProvider;
-
-	public SGraphInjectMembersResource(URI uri) {
-		super(uri);
-	}
-
-	@Override
-	public void doLoad(InputStream inputStream, Map<?, ?> options)
-			throws IOException {
-		super.doLoad(inputStream, options);
-		linkSubStatecharts();
-	}
-
-	private void linkSubStatecharts(State currentState) {
-		removeDiagnostics(currentState);
-		Statechart substatechart = getStatechart(currentState,
-				currentState.getSubstatechartId());
-		currentState.setSubstatechart(substatechart);
-		registerRelinkAdapter(currentState);
-	}
-
-	private void removeDiagnostics(State currentState) {
-		List<org.eclipse.emf.common.util.Diagnostic> diagnostics = getDiagnostics();
-		Iterator<org.eclipse.emf.common.util.Diagnostic> iter = diagnostics
-				.iterator();
-		while (iter.hasNext()) {
-			org.eclipse.emf.common.util.Diagnostic d = iter.next();
-			if (d instanceof BrokenLinkDiagnostic && !d.getData().isEmpty()
-					&& d.getData().get(0) == currentState) {
-				iter.remove();
-			}
-		}
-
-	}
-
-	/**
-	 * Adds a relinkAdapter that observes the source feature and links the model
-	 * element in case of changes again.
-	 * 
-	 * @param object
-	 */
-	private void registerRelinkAdapter(State object) {
-		Adapter existingAdapter = EcoreUtil.getExistingAdapter(object,
-				RelinkAdapter.class);
-		if (existingAdapter == null) {
-			object.eAdapters().add(
-					new RelinkAdapter(object,
-							SGraphPackage.Literals.STATE__SUBSTATECHART_ID));
-		}
-	}
-
-	private void linkSubStatecharts() {
-		TreeIterator<EObject> iter = getAllContents();
-		while (iter.hasNext()) {
-			EObject currentObject = iter.next();
-			if (currentObject instanceof State) {
-				State state = (State) currentObject;
-				if (state.getSubstatechartId() == null
-						&& state.getSubstatechart() != null) {
-					// For compatibility added. If a substate is set, but not
-					// the ID, the ID is updated.
-					state.setSubstatechartId(nameProvider
-							.getFullyQualifiedName(state.getSubstatechart())
-							.toString());
-				}
-				linkSubStatecharts(state);
-			}
-		}
-	}
-
-	private Statechart getStatechart(EObject context, String substatechartId) {
-		if (substatechartId == null || substatechartId.length() == 0) {
-			return null;
-		}
-		IScope scope = scopeProvider.getScope(context.eResource(),
-				SGraphPackage.Literals.STATE__SUBSTATECHART,
-				Predicates.<IEObjectDescription> alwaysTrue());
-		IEObjectDescription statechartDescription = scope
-				.getSingleElement(nameConverter
-						.toQualifiedName(substatechartId));
-		if (statechartDescription != null) {
-			Statechart statechart = null;
-			statechart = (Statechart) statechartDescription.getEObjectOrProxy();
-			if (statechart.eIsProxy()) {
-				statechart = (Statechart) EcoreUtil
-						.resolve(statechart, context);
-			}
-			return statechart;
-		} else {
-			getDiagnostics()
-					.add(new BrokenLinkDiagnostic(
-							org.eclipse.emf.common.util.Diagnostic.ERROR,
-							"source", 0, "Sub statechart '" + substatechartId
-									+ "' not linked", new Object[] { context }));
-		}
-		return null;
-	}
-
-	@Override
-	public void attached(EObject eObject) {
-		super.attached(eObject);
-		if (isLoading() || isParsing())
-			return;
-		if (eObject instanceof State) {
-			linkSubStatecharts((State) eObject);
-		}
-	}
-
-	@Override
-	public void detached(EObject eObject) {
-		super.detached(eObject);
-		Adapter existingAdapter = EcoreUtil.getExistingAdapter(eObject,
-				RelinkAdapter.class);
-		if (existingAdapter != null) {
-			eObject.eAdapters().remove(existingAdapter);
-		}
-	}
-
-	private final class BrokenLinkDiagnostic extends BasicDiagnostic {
-		public BrokenLinkDiagnostic(int severity, String source, int code,
-				String message, Object[] data) {
-			super(severity, source, code, message, data);
-		}
-	}
-
-	/**
-	 * ReparseAdapter listens for feature changes and reparses the whole model.
-	 * 
-	 * @author benjamin schwertfeger
-	 * 
-	 */
-	private final class RelinkAdapter extends AdapterImpl {
-		public final EStructuralFeature expressionFeature;
-
-		private RelinkAdapter(State currentObject,
-				EStructuralFeature expressionFeature) {
-			this.expressionFeature = expressionFeature;
-		}
-
-		@Override
-		public void notifyChanged(Notification msg) {
-			if (msg.getFeature() == expressionFeature) {
-				if (!(msg.getNotifier() instanceof State)) {
-					throw new IllegalStateException(
-							"Changed StatechartID should only rise for states");
-				}
-				linkSubStatecharts((State) msg.getNotifier());
-			}
-		}
-
-		@Override
-		public boolean isAdapterForType(Object type) {
-			return RelinkAdapter.class == type;
-		}
-	}
-}

+ 392 - 184
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/util/SGraphValidator.java

@@ -72,20 +72,24 @@ public class SGraphValidator extends EObjectValidator {
 	public static final String ISSUE_CHOICE_WITHOUT_OUTGOING_TRANSITION = "A choice must have at least one outgoing transition.";
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public static final String copyright = "Copyright (c) 2011 committers of YAKINDU and others.\r\nAll rights reserved. This program and the accompanying materials\r\nare made available under the terms of the Eclipse Public License v1.0\r\nwhich accompanies this distribution, and is available at\r\nhttp://www.eclipse.org/legal/epl-v10.html\r\nContributors:\r\ncommitters of YAKINDU - initial API and implementation\r\n";
 
 	/**
-	 * The cached model package
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * The cached model package <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public static final SGraphValidator INSTANCE = new SGraphValidator();
 
 	/**
-	 * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * A constant for the
+	 * {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of
+	 * diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes}
+	 * from this package. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @see org.eclipse.emf.common.util.Diagnostic#getSource()
 	 * @see org.eclipse.emf.common.util.Diagnostic#getCode()
 	 * @generated
@@ -93,143 +97,186 @@ public class SGraphValidator extends EObjectValidator {
 	public static final String DIAGNOSTIC_SOURCE = "org.yakindu.sct.model.sgraph";
 
 	/**
-	 * A constant with a fixed name that can be used as the base value for additional hand written constants.
-	 * <!-- begin-user-doc --> <!--
+	 * A constant with a fixed name that can be used as the base value for
+	 * additional hand written constants. <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
 
 	/**
-	 * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
-	 * <!-- begin-user-doc
+	 * A constant with a fixed name that can be used as the base value for
+	 * additional hand written constants in a derived class. <!-- begin-user-doc
 	 * --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
 
 	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc --> <!--
+	 * Creates an instance of the switch. <!-- begin-user-doc --> <!--
 	 * end-user-doc -->
-	 * @generated
+	 * 
+	 * @generated NOT
 	 */
 	public SGraphValidator() {
 		super();
 	}
 
 	/**
-	 * Returns the package of this validator switch.
-	 * <!-- begin-user-doc -->
+	 * Returns the package of this validator switch. <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	@Override
 	protected EPackage getEPackage() {
-	  return SGraphPackage.eINSTANCE;
+		return SGraphPackage.eINSTANCE;
 	}
 
 	/**
-	 * Calls <code>validateXXX</code> for the corresponding classifier of the model.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * Calls <code>validateXXX</code> for the corresponding classifier of the
+	 * model. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	@Override
 	protected boolean validate(int classifierID, Object value,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		switch (classifierID) {
-			case SGraphPackage.PSEUDOSTATE:
-				return validatePseudostate((Pseudostate)value, diagnostics, context);
-			case SGraphPackage.VERTEX:
-				return validateVertex((Vertex)value, diagnostics, context);
-			case SGraphPackage.REGION:
-				return validateRegion((Region)value, diagnostics, context);
-			case SGraphPackage.TRANSITION:
-				return validateTransition((Transition)value, diagnostics, context);
-			case SGraphPackage.FINAL_STATE:
-				return validateFinalState((FinalState)value, diagnostics, context);
-			case SGraphPackage.VARIABLE:
-				return validateVariable((Variable)value, diagnostics, context);
-			case SGraphPackage.EVENT:
-				return validateEvent((Event)value, diagnostics, context);
-			case SGraphPackage.CHOICE:
-				return validateChoice((Choice)value, diagnostics, context);
-			case SGraphPackage.STATECHART:
-				return validateStatechart((Statechart)value, diagnostics, context);
-			case SGraphPackage.ENTRY:
-				return validateEntry((Entry)value, diagnostics, context);
-			case SGraphPackage.TRIGGER:
-				return validateTrigger((Trigger)value, diagnostics, context);
-			case SGraphPackage.EFFECT:
-				return validateEffect((Effect)value, diagnostics, context);
-			case SGraphPackage.SPECIFICATION_ELEMENT:
-				return validateSpecificationElement((SpecificationElement)value, diagnostics, context);
-			case SGraphPackage.DECLARATION:
-				return validateDeclaration((Declaration)value, diagnostics, context);
-			case SGraphPackage.REACTION:
-				return validateReaction((Reaction)value, diagnostics, context);
-			case SGraphPackage.REACTIVE_ELEMENT:
-				return validateReactiveElement((ReactiveElement)value, diagnostics, context);
-			case SGraphPackage.EXIT:
-				return validateExit((Exit)value, diagnostics, context);
-			case SGraphPackage.SCOPE:
-				return validateScope((Scope)value, diagnostics, context);
-			case SGraphPackage.SCOPED_ELEMENT:
-				return validateScopedElement((ScopedElement)value, diagnostics, context);
-			case SGraphPackage.SYNCHRONIZATION:
-				return validateSynchronization((Synchronization)value, diagnostics, context);
-			case SGraphPackage.STATE:
-				return validateState((State)value, diagnostics, context);
-			case SGraphPackage.STATEMENT:
-				return validateStatement((Statement)value, diagnostics, context);
-			case SGraphPackage.REGULAR_STATE:
-				return validateRegularState((RegularState)value, diagnostics, context);
-			case SGraphPackage.COMPOSITE_ELEMENT:
-				return validateCompositeElement((CompositeElement)value, diagnostics, context);
-			case SGraphPackage.ENTRY_KIND:
-				return validateEntryKind((EntryKind)value, diagnostics, context);
-			case SGraphPackage.CHOICE_KIND:
-				return validateChoiceKind((ChoiceKind)value, diagnostics, context);
-			default:
-				return true;
+		case SGraphPackage.PSEUDOSTATE:
+			return validatePseudostate((Pseudostate) value, diagnostics,
+					context);
+		case SGraphPackage.VERTEX:
+			return validateVertex((Vertex) value, diagnostics, context);
+		case SGraphPackage.REGION:
+			return validateRegion((Region) value, diagnostics, context);
+		case SGraphPackage.TRANSITION:
+			return validateTransition((Transition) value, diagnostics, context);
+		case SGraphPackage.FINAL_STATE:
+			return validateFinalState((FinalState) value, diagnostics, context);
+		case SGraphPackage.VARIABLE:
+			return validateVariable((Variable) value, diagnostics, context);
+		case SGraphPackage.EVENT:
+			return validateEvent((Event) value, diagnostics, context);
+		case SGraphPackage.CHOICE:
+			return validateChoice((Choice) value, diagnostics, context);
+		case SGraphPackage.STATECHART:
+			return validateStatechart((Statechart) value, diagnostics, context);
+		case SGraphPackage.ENTRY:
+			return validateEntry((Entry) value, diagnostics, context);
+		case SGraphPackage.TRIGGER:
+			return validateTrigger((Trigger) value, diagnostics, context);
+		case SGraphPackage.EFFECT:
+			return validateEffect((Effect) value, diagnostics, context);
+		case SGraphPackage.SPECIFICATION_ELEMENT:
+			return validateSpecificationElement((SpecificationElement) value,
+					diagnostics, context);
+		case SGraphPackage.DECLARATION:
+			return validateDeclaration((Declaration) value, diagnostics,
+					context);
+		case SGraphPackage.REACTION:
+			return validateReaction((Reaction) value, diagnostics, context);
+		case SGraphPackage.REACTIVE_ELEMENT:
+			return validateReactiveElement((ReactiveElement) value,
+					diagnostics, context);
+		case SGraphPackage.EXIT:
+			return validateExit((Exit) value, diagnostics, context);
+		case SGraphPackage.SCOPE:
+			return validateScope((Scope) value, diagnostics, context);
+		case SGraphPackage.SCOPED_ELEMENT:
+			return validateScopedElement((ScopedElement) value, diagnostics,
+					context);
+		case SGraphPackage.SYNCHRONIZATION:
+			return validateSynchronization((Synchronization) value,
+					diagnostics, context);
+		case SGraphPackage.STATE:
+			return validateState((State) value, diagnostics, context);
+		case SGraphPackage.STATEMENT:
+			return validateStatement((Statement) value, diagnostics, context);
+		case SGraphPackage.REGULAR_STATE:
+			return validateRegularState((RegularState) value, diagnostics,
+					context);
+		case SGraphPackage.COMPOSITE_ELEMENT:
+			return validateCompositeElement((CompositeElement) value,
+					diagnostics, context);
+		case SGraphPackage.ENTRY_KIND:
+			return validateEntryKind((EntryKind) value, diagnostics, context);
+		case SGraphPackage.CHOICE_KIND:
+			return validateChoiceKind((ChoiceKind) value, diagnostics, context);
+		default:
+			return true;
 		}
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validatePseudostate(Pseudostate pseudostate,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(pseudostate, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(pseudostate, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(pseudostate, diagnostics, context);
+		if (!validate_NoCircularContainment(pseudostate, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(pseudostate,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(pseudostate, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(pseudostate,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(pseudostate,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(pseudostate, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(pseudostate, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(pseudostate, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(pseudostate, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(pseudostate,
+					diagnostics, context);
 		return result;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateVertex(Vertex vertex, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(vertex, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(vertex, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(vertex, diagnostics, context);
+		if (!validate_NoCircularContainment(vertex, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(vertex,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(vertex, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(vertex, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(vertex,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(vertex, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(vertex, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(vertex, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(vertex, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(vertex,
+					diagnostics, context);
 		return result;
 	}
 
@@ -276,20 +323,35 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateRegion(Region region, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(region, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(region, diagnostics, context);
-		if (result || diagnostics != null) result &= validateRegion_ExactlyOneInitialState(region, diagnostics, context);
+		if (!validate_NoCircularContainment(region, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(region,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(region, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(region, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(region,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(region, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(region, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(region, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(region, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateRegion_ExactlyOneInitialState(region,
+					diagnostics, context);
 		return result;
 	}
 
@@ -306,6 +368,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateTransition(Transition transition,
@@ -315,21 +378,40 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateFinalState(FinalState finalState,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(finalState, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(finalState, diagnostics, context);
-		if (result || diagnostics != null) result &= validateFinalState_OutgoingTransitionCount(finalState, diagnostics, context);
+		if (!validate_NoCircularContainment(finalState, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(finalState,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(finalState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(finalState,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(finalState,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(finalState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(finalState, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(finalState, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(finalState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(finalState,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateFinalState_OutgoingTransitionCount(finalState,
+					diagnostics, context);
 		return result;
 	}
 
@@ -351,21 +433,37 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateState(State state, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(state, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(state, diagnostics, context);
-		if (result || diagnostics != null) result &= validateState_NameIsNotEmpty(state, diagnostics, context);
+		if (!validate_NoCircularContainment(state, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(state, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(state, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(state, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(state,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(state, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(state, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(state, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(state, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(state,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateState_NameIsNotEmpty(state, diagnostics, context);
 		return result;
 	}
 
@@ -386,6 +484,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateStatement(Statement statement,
@@ -395,34 +494,55 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateRegularState(RegularState regularState,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(regularState, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(regularState, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(regularState, diagnostics, context);
+		if (!validate_NoCircularContainment(regularState, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(regularState,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(regularState,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(regularState,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(
+					regularState, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(regularState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(regularState, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(regularState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(regularState, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(regularState,
+					diagnostics, context);
 		return result;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateCompositeElement(CompositeElement compositeElement,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(compositeElement, diagnostics, context);
+		return validate_EveryDefaultConstraint(compositeElement, diagnostics,
+				context);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateVariable(Variable variable,
@@ -432,6 +552,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateEvent(Event event, DiagnosticChain diagnostics,
@@ -441,21 +562,38 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateChoice(Choice choice, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(choice, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(choice, diagnostics, context);
-		if (result || diagnostics != null) result &= validateChoice_OutgoingTransitionCount(choice, diagnostics, context);
+		if (!validate_NoCircularContainment(choice, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(choice,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(choice, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(choice, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(choice,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(choice, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(choice, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(choice, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(choice, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(choice,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateChoice_OutgoingTransitionCount(choice,
+					diagnostics, context);
 		return result;
 	}
 
@@ -469,13 +607,15 @@ public class SGraphValidator extends EObjectValidator {
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
 		// Choice without outgoing transition
 		if (choice.getOutgoingTransitions().size() == 0) {
-			return error(choice, diagnostics, ISSUE_CHOICE_WITHOUT_OUTGOING_TRANSITION);
+			return error(choice, diagnostics,
+					ISSUE_CHOICE_WITHOUT_OUTGOING_TRANSITION);
 		}
 		return true;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateStatechart(Statechart statechart,
@@ -485,22 +625,40 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateEntry(Entry entry, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(entry, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validateEntry_DisallowTrigger(entry, diagnostics, context);
-		if (result || diagnostics != null) result &= validateEntry_OutgoingTransitionCount(entry, diagnostics, context);
+		if (!validate_NoCircularContainment(entry, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(entry, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(entry, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(entry, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(entry,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(entry, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(entry, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(entry, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(entry, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(entry,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateEntry_DisallowTrigger(entry, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateEntry_OutgoingTransitionCount(entry, diagnostics,
+					context);
 		return result;
 	}
 
@@ -548,6 +706,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateTrigger(Trigger trigger,
@@ -557,6 +716,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateEffect(Effect effect, DiagnosticChain diagnostics,
@@ -566,25 +726,30 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateSpecificationElement(
 			SpecificationElement specificationElement,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(specificationElement, diagnostics, context);
+		return validate_EveryDefaultConstraint(specificationElement,
+				diagnostics, context);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateDeclaration(Declaration declaration,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(declaration, diagnostics, context);
+		return validate_EveryDefaultConstraint(declaration, diagnostics,
+				context);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateReaction(Reaction reaction,
@@ -594,34 +759,52 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateReactiveElement(ReactiveElement reactiveElement,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(reactiveElement, diagnostics, context);
+		return validate_EveryDefaultConstraint(reactiveElement, diagnostics,
+				context);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateExit(Exit exit, DiagnosticChain diagnostics,
 			Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(exit, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(exit, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(exit, diagnostics, context);
+		if (!validate_NoCircularContainment(exit, diagnostics, context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(exit, diagnostics,
+				context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(exit, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(exit, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(exit,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(exit, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(exit, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(exit, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(exit, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(exit, diagnostics,
+					context);
 		return result;
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateScope(Scope scope, DiagnosticChain diagnostics,
@@ -631,29 +814,50 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateScopedElement(ScopedElement scopedElement,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(scopedElement, diagnostics, context);
+		return validate_EveryDefaultConstraint(scopedElement, diagnostics,
+				context);
 	}
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateSynchronization(Synchronization synchronization,
 			DiagnosticChain diagnostics, Map<Object, Object> context) {
-		if (!validate_NoCircularContainment(synchronization, diagnostics, context)) return false;
-		boolean result = validate_EveryMultiplicityConforms(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryProxyResolves(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_UniqueID(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryKeyUnique(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(synchronization, diagnostics, context);
-		if (result || diagnostics != null) result &= validateVertex_IncomingTransitionCount(synchronization, diagnostics, context);
+		if (!validate_NoCircularContainment(synchronization, diagnostics,
+				context))
+			return false;
+		boolean result = validate_EveryMultiplicityConforms(synchronization,
+				diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryDataValueConforms(synchronization,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryReferenceIsContained(synchronization,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryBidirectionalReferenceIsPaired(
+					synchronization, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryProxyResolves(synchronization, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_UniqueID(synchronization, diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validate_EveryKeyUnique(synchronization, diagnostics,
+					context);
+		if (result || diagnostics != null)
+			result &= validate_EveryMapEntryUnique(synchronization,
+					diagnostics, context);
+		if (result || diagnostics != null)
+			result &= validateVertex_IncomingTransitionCount(synchronization,
+					diagnostics, context);
 		return result;
 	}
 
@@ -677,6 +881,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateEntryKind(EntryKind entryKind,
@@ -686,6 +891,7 @@ public class SGraphValidator extends EObjectValidator {
 
 	/**
 	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	public boolean validateChoiceKind(ChoiceKind choiceKind,
@@ -694,14 +900,16 @@ public class SGraphValidator extends EObjectValidator {
 	}
 
 	/**
-	 * Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * Returns the resource locator that will be used to fetch messages for this
+	 * validator's diagnostics. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
 	 * @generated
 	 */
 	@Override
 	public ResourceLocator getResourceLocator() {
 		// TODO
-		// Specialize this to return a resource locator for messages specific to this validator.
+		// Specialize this to return a resource locator for messages specific to
+		// this validator.
 		// Ensure that you remove @generated or mark it @generated NOT
 		return super.getResourceLocator();
 	}

+ 1 - 2
plugins/org.yakindu.sct.model.stext.resource/META-INF/MANIFEST.MF

@@ -17,5 +17,4 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.yakindu.sct.model.stext.resource,
  org.yakindu.sct.model.stext.resource.factory,
- org.yakindu.sct.model.stext.resource.provider,
- org.yakindu.sct.model.stext.resource.services
+ org.yakindu.sct.model.stext.resource.provider

+ 1 - 1
plugins/org.yakindu.sct.model.stext.resource/plugin.xml

@@ -6,7 +6,7 @@
  <extension
          point="org.eclipse.emf.ecore.extension_parser">
       <parser
-            class="org.yakindu.sct.model.stext.resource.factory.ExpressionsExecutableExtensionFactory:org.yakindu.sct.model.stext.resource.factory.InjectMembersResourceFactory"
+            class="org.yakindu.sct.model.stext.resource.factory.ExpressionsExecutableExtensionFactory:org.yakindu.sct.model.stext.resource.factory.StextResourceFactory"
             type="sct">
       </parser>
    </extension>

+ 0 - 61
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/factory/InjectMembersResourceFactory.java

@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2011 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.model.stext.resource.factory;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
-import org.eclipse.xtext.Constants;
-import org.yakindu.sct.model.sgraph.resource.SGraphInjectMembersResource;
-import org.yakindu.sct.model.stext.resource.services.StateInjectionService;
-import org.yakindu.sct.model.stext.resource.services.StatechartInjectionService;
-import org.yakindu.sct.model.stext.resource.services.TransitionInjectionService;
-
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.name.Named;
-
-import de.itemis.xtext.utils.gmf.resource.InjectMembersResource;
-
-/**
- * ResourceFactory for the {@link InjectMembersResource} with services for the
- * statechart model.
- * 
- * @author andreas muelder
- * 
- */
-public class InjectMembersResourceFactory extends XMIResourceFactoryImpl {
-
-	@Inject
-	private TransitionInjectionService transitionService;
-	@Inject
-	private StateInjectionService stateService;
-	@Inject
-	private StatechartInjectionService statechartService;
-	@Inject
-	@Named(Constants.LANGUAGE_NAME)
-	private String languageName;
-
-	@Inject
-	Injector injector;
-
-	@Override
-	public Resource createResource(URI uri) {
-		final InjectMembersResource resource = new SGraphInjectMembersResource(
-				uri);
-		injector.injectMembers(resource);
-		resource.getServices().add(transitionService);
-		resource.getServices().add(stateService);
-		resource.getServices().add(statechartService);
-		resource.setLanguageName(languageName);
-		return resource;
-	}
-}

+ 40 - 0
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/factory/StextResourceFactory.java

@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2011 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.stext.resource.factory;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.yakindu.sct.model.stext.resource.impl.StextResource;
+
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+/**
+ * ResourceFactory for the {@link InjectMembersResource} with services for the
+ * statechart model.
+ * 
+ * @author andreas muelder
+ * 
+ */
+public class StextResourceFactory extends XMIResourceFactoryImpl {
+
+	@Inject
+	Injector injector;
+
+	@Override
+	public Resource createResource(URI uri) {
+		final StextResource resource = new StextResource(
+				uri);
+		injector.injectMembers(resource);
+		return resource;
+	}
+}

+ 112 - 0
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/impl/StextResource.java

@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+
+package org.yakindu.sct.model.stext.resource.impl;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.xtext.parser.IParseResult;
+import org.yakindu.sct.model.sgraph.Declaration;
+import org.yakindu.sct.model.sgraph.Reaction;
+import org.yakindu.sct.model.sgraph.Scope;
+import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
+import org.yakindu.sct.model.stext.stext.StateSpecification;
+import org.yakindu.sct.model.stext.stext.StatechartSpecification;
+import org.yakindu.sct.model.stext.stext.TransitionReaction;
+import org.yakindu.sct.model.stext.stext.TransitionSpecification;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class StextResource extends AbstractSCTResource {
+
+	public StextResource(URI uri) {
+		super(uri);
+	}
+
+	protected void serializeStatechart(Statechart statechart) {
+		StringBuilder builder = new StringBuilder();
+		for (Scope scope : statechart.getScopes()) {
+			builder.append(serialize(scope));
+		}
+		statechart.setSpecification(builder.toString());
+	}
+
+	protected void serializeState(State state) {
+		if(state.getScopes().size() != 1)
+			return;
+		Scope scope = state.getScopes().get(0);
+		EList<Declaration> declarations = scope.getDeclarations();
+		StringBuilder builder = new StringBuilder();
+		for (Declaration declaration : declarations) {
+			builder.append(serializeReaction((Reaction) declaration));
+		}
+		state.setSpecification(builder.toString());
+	}
+
+	private String serializeReaction(Reaction reaction) {
+		StringBuilder builder = new StringBuilder();
+		builder.append(serialize(reaction.getTrigger()));
+		if (reaction.getEffect() != null) {
+			builder.append(" / ");
+			builder.append(serialize(reaction.getEffect()));
+		}
+		return builder.toString();
+	}
+
+	protected void serializeTransition(Transition transition) {
+		transition.setSpecification(serializeReaction(transition));
+	}
+
+	protected void parseStatechart(Statechart statechart) {
+		IParseResult parseResult = parse(statechart,
+				StatechartSpecification.class.getSimpleName());
+
+		StatechartSpecification rootASTElement = (StatechartSpecification) parseResult
+				.getRootASTElement();
+
+		EList<Scope> definitionScopes = rootASTElement.getScopes();
+		statechart.getScopes().clear();
+		statechart.setNamespace(rootASTElement.getNamespace());
+		if (definitionScopes != null) {
+			statechart.getScopes().addAll(definitionScopes);
+		}
+	}
+
+	protected void parseState(State state) {
+		IParseResult parseResult = parse(state,
+				StateSpecification.class.getSimpleName());
+		StateSpecification rootASTElement = (StateSpecification) parseResult
+				.getRootASTElement();
+		state.getScopes().clear();
+		if (rootASTElement.getScope() != null) {
+			state.getScopes().add(rootASTElement.getScope());
+		}
+	}
+
+	protected void parseTransition(Transition transition) {
+		IParseResult parseResult = parse(transition,
+				TransitionSpecification.class.getSimpleName());
+		TransitionSpecification rootASTElement = (TransitionSpecification) parseResult
+				.getRootASTElement();
+		if (rootASTElement.getReaction() != null) {
+			TransitionReaction reaction = rootASTElement.getReaction();
+			transition.setEffect(reaction.getEffect());
+			transition.setTrigger(reaction.getTrigger());
+		}
+	}
+
+}

+ 0 - 61
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/StateInjectionService.java

@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2011 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.model.stext.resource.services;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.yakindu.sct.model.sgraph.Declaration;
-import org.yakindu.sct.model.sgraph.SGraphFactory;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.sgraph.Scope;
-import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.model.stext.stext.StateSpecification;
-
-import de.itemis.xtext.utils.gmf.resource.AbstractXtextMemberInjectionService;
-import de.itemis.xtext.utils.gmf.resource.IMemberInjectionService;
-
-/**
- * Implementation if {@link IMemberInjectionService} interface to inject the
- * members of the {@link State} from the textual expression.F
- * 
- * @author andreas muelder (andreas.muelder@itemis.de)
- * 
- */
-public class StateInjectionService extends
-		AbstractXtextMemberInjectionService<State, StateSpecification> {
-
-	@Override
-	public String getParserRule() {
-		return StateSpecification.class.getSimpleName();
-	}
-
-	@Override
-	public void setFeatures(State original, StateSpecification rootAST) {
-		Scope localScope = SGraphFactory.eINSTANCE.createScope();
-		original.getScopes().clear();
-		if (rootAST.getScope() != null) {
-			EList<Declaration> declarations = rootAST.getScope()
-					.getDeclarations();
-			localScope.getDeclarations().addAll(declarations);
-			original.getScopes().add(localScope);
-		}
-	}
-
-	public boolean isServiceFor(EObject object) {
-		return object instanceof State;
-	}
-
-	public EStructuralFeature getSourceFeature() {
-		return SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION;
-	}
-
-}

+ 0 - 59
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/StatechartInjectionService.java

@@ -1,59 +0,0 @@
-/**
- * Copyright (c) 2011 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.model.stext.resource.services;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.sgraph.Scope;
-import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.model.stext.stext.StatechartSpecification;
-
-import de.itemis.xtext.utils.gmf.resource.AbstractXtextMemberInjectionService;
-import de.itemis.xtext.utils.gmf.resource.IMemberInjectionService;
-
-/**
- * Implementation if {@link IMemberInjectionService} interface to inject the
- * members of the {@link State} from the textual expression.F
- * 
- * @author andreas muelder (andreas.muelder@itemis.de)
- * 
- */
-public class StatechartInjectionService
-		extends
-		AbstractXtextMemberInjectionService<Statechart, StatechartSpecification> {
-
-	public boolean isServiceFor(EObject object) {
-		return object instanceof Statechart;
-	}
-
-	@Override
-	public void setFeatures(Statechart original, StatechartSpecification rootAST) {
-		EList<Scope> definitionScopes = rootAST.getScopes();
-		original.getScopes().clear();
-		original.setNamespace(rootAST.getNamespace());
-		if (definitionScopes != null) {
-			original.getScopes().addAll(definitionScopes);
-		}
-	}
-
-	public EStructuralFeature getSourceFeature() {
-		return SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION;
-	}
-
-	@Override
-	public String getParserRule() {
-		return StatechartSpecification.class.getSimpleName();
-	}
-
-}

+ 0 - 65
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/services/TransitionInjectionService.java

@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2011 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.model.stext.resource.services;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.yakindu.sct.model.sgraph.Effect;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.sgraph.Transition;
-import org.yakindu.sct.model.sgraph.Trigger;
-import org.yakindu.sct.model.stext.stext.TransitionReaction;
-import org.yakindu.sct.model.stext.stext.TransitionSpecification;
-
-import de.itemis.xtext.utils.gmf.resource.AbstractXtextMemberInjectionService;
-
-/**
- * 
- * @author andreas muelder (andreas.muelder@itemis.de)
- * 
- */
-public class TransitionInjectionService
-		extends
-		AbstractXtextMemberInjectionService<Transition, TransitionSpecification> {
-
-	@Override
-	public String getParserRule() {
-		return TransitionSpecification.class.getSimpleName();
-	}
-
-	@Override
-	public void injectMembers(EObject object) {
-		super.injectMembers(object);
-	}
-
-	@Override
-	public void setFeatures(Transition original, TransitionSpecification rootAST) {
-		Trigger trigger = null;
-		Effect effect = null;
-		if (rootAST.getReaction() != null) {
-			TransitionReaction reaction = rootAST.getReaction();
-			trigger = reaction.getTrigger();
-			effect = reaction.getEffect();
-		}
-		original.setTrigger(trigger);
-		original.setEffect(effect);
-
-	}
-
-	public boolean isServiceFor(EObject object) {
-		return object instanceof Transition;
-	}
-
-	public EAttribute getSourceFeature() {
-		return SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION;
-	}
-
-}

+ 4 - 1
plugins/org.yakindu.sct.model.stext.ui/META-INF/MANIFEST.MF

@@ -17,7 +17,10 @@ Require-Bundle: org.yakindu.sct.model.stext;visibility:=reexport,
  org.yakindu.sct.model.stext.edit;bundle-version="1.0.0",
  org.eclipse.help;bundle-version="3.5.100",
  org.yakindu.sct.doc.user;bundle-version="1.0.0",
- de.itemis.xtext.utils.jface;bundle-version="1.0.0"
+ de.itemis.xtext.utils.jface;bundle-version="1.0.0",
+ org.eclipse.gmf.runtime.notation;bundle-version="1.5.0",
+ org.yakindu.sct.model.sgraph.ui;bundle-version="1.0.0",
+ org.eclipse.gmf.runtime.emf.core;bundle-version="1.4.1"
 Import-Package: org.apache.log4j,
  org.apache.commons.logging
 Bundle-RequiredExecutionEnvironment: J2SE-1.5

+ 25 - 2
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/STextUiModule.java

@@ -10,14 +10,22 @@ import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
 import org.eclipse.xtext.ui.editor.model.IResourceForEditorInputFactory;
 import org.eclipse.xtext.ui.editor.model.JavaClassPathResourceForIEditorInputFactory;
 import org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory;
+import org.eclipse.xtext.ui.editor.validation.MarkerCreator;
 import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 import org.eclipse.xtext.ui.resource.SimpleResourceSetProvider;
 import org.eclipse.xtext.ui.resource.XtextResourceSetProvider;
 import org.eclipse.xtext.ui.shared.Access;
+import org.eclipse.xtext.ui.validation.MarkerTypeProvider;
+import org.eclipse.xtext.validation.IDiagnosticConverter;
+import org.eclipse.xtext.validation.IResourceValidator;
+import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerCreator;
+import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerTypeProvider;
 import org.yakindu.sct.model.stext.ui.contentassist.STextStatefulFactory;
 import org.yakindu.sct.model.stext.ui.help.CustomCSSHelpHoverProvider;
 import org.yakindu.sct.model.stext.ui.help.STextUserHelpDocumentationProvider;
 import org.yakindu.sct.model.stext.ui.hyperlink.NullHyperlinkDetector;
+import org.yakindu.sct.model.stext.ui.validation.SCTDiagnosticConverterImpl;
+import org.yakindu.sct.model.stext.ui.validation.SCTResourceValidatorImpl;
 
 import com.google.inject.Binder;
 import com.google.inject.name.Names;
@@ -57,6 +65,22 @@ public class STextUiModule extends
 		return CustomCSSHelpHoverProvider.class;
 	}
 
+	public Class<? extends IDiagnosticConverter> bindIDiagnosticConverter() {
+		return SCTDiagnosticConverterImpl.class;
+	}
+
+	public Class<? extends MarkerCreator> bindMarkerCreator() {
+		return SCTMarkerCreator.class;
+	}
+
+	public Class<? extends MarkerTypeProvider> bindMarkerTypeProvider() {
+		return SCTMarkerTypeProvider.class;
+	}
+
+	public Class<? extends IResourceValidator> bindIResourceValidator() {
+		return SCTResourceValidatorImpl.class;
+	}
+
 	@Override
 	public void configure(Binder binder) {
 		super.configure(binder);
@@ -64,12 +88,11 @@ public class STextUiModule extends
 				.toInstance("/StextHoverStyleSheet.css");
 	}
 
-	
 	@Override
 	public Class<? extends IHyperlinkDetector> bindIHyperlinkDetector() {
 		return NullHyperlinkDetector.class;
 	}
-	
+
 	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
 		if (Access.getJdtHelper().get().isJavaCoreAvailable()) {
 			return Access.getJavaProjectsState();

+ 78 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/validation/SCTDiagnosticConverterImpl.java

@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.stext.ui.validation;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.eclipse.xtext.util.IAcceptor;
+import org.eclipse.xtext.validation.DiagnosticConverterImpl;
+import org.eclipse.xtext.validation.Issue;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerCreator;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SCTDiagnosticConverterImpl extends DiagnosticConverterImpl {
+
+	@Override
+	public void convertValidatorDiagnostic(final Diagnostic diagnostic,
+			final IAcceptor<Issue> acceptor) {
+		super.convertValidatorDiagnostic(diagnostic, new IAcceptor<Issue>() {
+			@Override
+			public void accept(Issue t) {
+				if (diagnostic.getData().get(0) instanceof EObject) {
+					EObject eObject = (EObject) diagnostic.getData().get(0);
+					if (eObject != null && eObject.eResource() != null) {
+						if (NodeModelUtils.getNode(eObject) != null) {
+							eObject = EcoreUtil2.getContainerOfType(eObject,
+									SpecificationElement.class);
+						}
+						if (eObject != null && eObject.eResource() != null) {
+							View notationView = findNotationView(eObject);
+							if (notationView != null
+									&& notationView.eResource() != null) {
+								acceptor.accept(new SCTMarkerCreator.WrappingIssue(
+										t, notationView.eResource()
+												.getURIFragment(notationView)));
+							}
+						}
+					}
+				}
+				acceptor.accept(t);
+			}
+		});
+	}
+
+	protected View findNotationView(EObject semanticElement) {
+		EObject diagram = (EObject) EcoreUtil.getObjectByType(semanticElement
+				.eResource().getContents(), NotationPackage.eINSTANCE
+				.getDiagram());
+		TreeIterator<EObject> iterator = diagram.eAllContents();
+		while (iterator.hasNext()) {
+			EObject eObject = iterator.next();
+			if (eObject instanceof View
+					&& semanticElement.equals(((View) eObject).getElement())) {
+				return (View) eObject;
+			}
+		}
+		return null;
+	}
+
+}

+ 33 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/validation/SCTResourceValidatorImpl.java

@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.stext.ui.validation;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.util.CancelIndicator;
+import org.eclipse.xtext.validation.ResourceValidatorImpl;
+import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SCTResourceValidatorImpl extends ResourceValidatorImpl {
+
+	@Override
+	protected void resolveProxies(final Resource resource,
+			final CancelIndicator monitor) {
+		if (resource instanceof AbstractSCTResource) {
+			((AbstractSCTResource) resource)
+					.resolveLazyCrossReferences(monitor);
+		}
+	}
+}

+ 11 - 9
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/STextRuntimeModule.java

@@ -6,6 +6,7 @@ import org.eclipse.xtext.scoping.IScopeProvider;
 import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
 import org.yakindu.base.types.ITypeSystemAccess;
 import org.yakindu.base.types.impl.BaseTypeSystemAccessImpl;
+import org.yakindu.sct.model.sgraph.resource.SCTLinker;
 import org.yakindu.sct.model.stext.conversion.StextValueConverterService;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.scoping.NamespaceLocalScopeResolver;
@@ -16,8 +17,6 @@ import org.yakindu.sct.model.stext.validation.TypeInferrer;
 import com.google.inject.Binder;
 import com.google.inject.name.Names;
 
-import de.itemis.xtext.utils.gmf.resource.InjectMembersLinker;
-
 /**
  * Use this class to register components to be used at runtime / without the
  * Equinox extension registry.
@@ -34,8 +33,12 @@ public class STextRuntimeModule extends
 
 	@Override
 	public Class<? extends ILinker> bindILinker() {
-		return InjectMembersLinker.class;
+		return SCTLinker.class;
 	}
+	
+	// public Class<? extends LazyURIEncoder> bindLazyURIEncoder() {
+	// return SCTLazyURIEncoder.class;
+	// }
 
 	@Override
 	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
@@ -46,16 +49,15 @@ public class STextRuntimeModule extends
 	public Class<? extends org.eclipse.xtext.conversion.IValueConverterService> bindIValueConverterService() {
 		return StextValueConverterService.class;
 	}
-	
-	public Class<? extends ITypeSystemAccess> bindITypeSystemAccess(){
+
+	public Class<? extends ITypeSystemAccess> bindITypeSystemAccess() {
 		return BaseTypeSystemAccessImpl.class;
 	}
-	
-	public Class<? extends ITypeInferrer> bindITypeInferrer(){
+
+	public Class<? extends ITypeInferrer> bindITypeInferrer() {
 		return TypeInferrer.class;
 	}
-	
-	
+
 	// contributed by
 	// org.eclipse.xtext.generator.scoping.AbstractScopingFragment
 	public void configureIScopeProviderDelegate(Binder binder) {

+ 42 - 7
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -11,6 +11,7 @@
  */
 package org.yakindu.sct.model.stext.validation;
 
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -18,7 +19,8 @@ import java.util.Map;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
+import org.eclipse.xtext.Constants;
 import org.eclipse.xtext.Keyword;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.nodemodel.ICompositeNode;
@@ -26,6 +28,7 @@ import org.eclipse.xtext.nodemodel.INode;
 import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
 import org.eclipse.xtext.validation.Check;
 import org.eclipse.xtext.validation.CheckType;
+import org.eclipse.xtext.validation.EValidatorRegistrar;
 import org.eclipse.xtext.validation.ValidationMessageAcceptor;
 import org.yakindu.base.types.Event;
 import org.yakindu.base.types.ITypeSystemAccess;
@@ -37,8 +40,12 @@ import org.yakindu.sct.model.sgraph.Choice;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Scope;
 import org.yakindu.sct.model.sgraph.ScopedElement;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Statement;
 import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
+import org.yakindu.sct.model.sgraph.util.SGraphValidator;
 import org.yakindu.sct.model.stext.services.STextGrammarAccess;
 import org.yakindu.sct.model.stext.stext.AssignmentExpression;
 import org.yakindu.sct.model.stext.stext.DefaultEvent;
@@ -60,8 +67,7 @@ import org.yakindu.sct.model.stext.stext.StextPackage;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
 import com.google.inject.Inject;
-
-import de.itemis.xtext.utils.gmf.resource.InjectMembersResource;
+import com.google.inject.name.Named;
 
 /**
  * s Several validations for nonsensical expressions.
@@ -88,6 +94,37 @@ public class STextJavaValidator extends AbstractSTextJavaValidator {
 	private ITypeSystemAccess tsAccess;
 	@Inject
 	private IQualifiedNameProvider nameProvider;
+	@Inject
+	@Named(Constants.LANGUAGE_NAME)
+	private String languageName;
+
+	@Inject
+	public void register(EValidatorRegistrar registrar) {
+		super.register(registrar);
+		registrar.register(SGraphPackage.eINSTANCE, new SGraphValidator());
+	}
+
+	@Check(CheckType.FAST)
+	public void checkUnresolvableProxies(Statechart sc) {
+		AbstractSCTResource resource = (AbstractSCTResource) sc.eResource();
+		for (Map.Entry<SpecificationElement, Collection<Diagnostic>> entry : resource
+				.getLinkingDiagnostics().asMap().entrySet()) {
+			for (Diagnostic diag : entry.getValue()) {
+				error(diag.getMessage(), entry.getKey(), null, -1);
+			}
+		}
+	}
+
+	@Check(CheckType.FAST)
+	public void checkSyntaxErrors(Statechart sc) {
+		AbstractSCTResource resource = (AbstractSCTResource) sc.eResource();
+		for (Map.Entry<SpecificationElement, Collection<Diagnostic>> entry : resource
+				.getSyntaxDiagnostics().asMap().entrySet()) {
+			for (Diagnostic diag : entry.getValue()) {
+				error(diag.getMessage(), entry.getKey(), null, -1);
+			}
+		}
+	}
 
 	@Check(CheckType.FAST)
 	public void checkOperationArguments_FeatureCall(final FeatureCall call) {
@@ -358,10 +395,8 @@ public class STextJavaValidator extends AbstractSTextJavaValidator {
 	@Override
 	protected String getCurrentLanguage(Map<Object, Object> context,
 			EObject eObject) {
-		Resource resource = eObject.eResource();
-		if (resource instanceof InjectMembersResource)
-			return ((InjectMembersResource) resource).getLanguageName();
-		return super.getCurrentLanguage(context, eObject);
+		return languageName;
+
 	}
 
 	private INode findNode(EObject source, boolean sourceFound, INode root,

+ 2 - 1
test-plugins/org.yakindu.sct.model.sgraph.test/META-INF/MANIFEST.MF

@@ -8,7 +8,8 @@ Require-Bundle: org.yakindu.sct.model.sgraph;bundle-version="1.0.0",
  org.junit;bundle-version="3.8.2",
  org.eclipse.ui,
  org.eclipse.core.runtime,
- org.yakindu.sct.model.stext;bundle-version="1.0.0"
+ org.yakindu.sct.model.stext;bundle-version="1.0.0",
+ org.eclipse.xtext.junit4;bundle-version="2.3.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Vendor: YAKINDU

+ 20 - 0
test-plugins/org.yakindu.sct.model.sgraph.test/src/org/yakindu/sct/model/sgraph/test/SGraphTestModule.java

@@ -0,0 +1,20 @@
+package org.yakindu.sct.model.sgraph.test;
+
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.xtext.Constants;
+
+import com.google.inject.Binder;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
+
+public class SGraphTestModule implements Module {
+
+	public void configure(Binder binder) {
+		binder.bind(String.class)
+				.annotatedWith(Names.named(Constants.LANGUAGE_NAME))
+				.toInstance("org.yakindu.sct.model.sgraph");
+		binder.bind(EValidator.Registry.class).toInstance(
+				EValidator.Registry.INSTANCE);
+	}
+
+}

+ 14 - 0
test-plugins/org.yakindu.sct.model.sgraph.test/src/org/yakindu/sct/model/sgraph/test/TestInjectorProvider.java

@@ -0,0 +1,14 @@
+package org.yakindu.sct.model.sgraph.test;
+
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public class TestInjectorProvider implements IInjectorProvider {
+
+	public Injector getInjector() {
+		return Guice.createInjector(new SGraphTestModule());
+	}
+
+}