Browse Source

Bugfix for eobjects from xtext which are not inside an eobject from xtext. Could be used for all parsed eobjects.

benjamin.schwertfeger@googlemail.com 12 years ago
parent
commit
5ee06d04fc

+ 100 - 2
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/resource/AbstractSCTResource.java

@@ -12,6 +12,7 @@
 package org.yakindu.sct.model.sgraph.resource;
 
 import java.io.StringReader;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -65,6 +66,7 @@ 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.base.Strings;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
@@ -77,6 +79,8 @@ import com.google.inject.name.Named;
  */
 public abstract class AbstractSCTResource extends GMFResource {
 
+	public static final String SCT_PREFIX = "SCT_";
+
 	@Inject
 	private IParser parser;
 	@Inject
@@ -191,11 +195,47 @@ public abstract class AbstractSCTResource extends GMFResource {
 				createDiagnostic(triple);
 			}
 		}
+		EObject sctObject = getSCTEObject(uriFragment);
+		if (sctObject != null) {
+			return sctObject;
+		}
 		return super.getEObject(uriFragment);
 	}
 
-	private List<EObject> resolveLocalXtextFragment(EObject container, EReference reference,
-			INode node) {
+	protected EObject getSCTEObject(String uriFragment) {
+		if (uriFragment != null && uriFragment.startsWith(SCT_PREFIX)) {
+			return getEmfEObject(uriFragment.substring(SCT_PREFIX.length()));
+		}
+		return null;
+	}
+
+	protected EObject getEmfEObject(String uriFragment) {
+		int length = uriFragment.length();
+		if (length > 0) {
+			if (uriFragment.charAt(0) == '/') {
+				ArrayList<String> uriFragmentPath = new ArrayList<String>(4);
+				int start = 1;
+				for (int i = 1; i < length; ++i) {
+					if (uriFragment.charAt(i) == '/') {
+						uriFragmentPath.add(start == i ? "" : uriFragment
+								.substring(start, i));
+						start = i + 1;
+					}
+				}
+				uriFragmentPath.add(uriFragment.substring(start));
+				return getEObject(uriFragmentPath);
+			} else if (uriFragment.charAt(length - 1) == '?') {
+				int index = uriFragment.lastIndexOf('?', length - 2);
+				if (index > 0) {
+					uriFragment = uriFragment.substring(0, index);
+				}
+			}
+		}
+		return null;
+	}
+
+	private List<EObject> resolveLocalXtextFragment(EObject container,
+			EReference reference, INode node) {
 		Object value = container.eGet(reference);
 		if (reference.isMany()) {
 			List<?> list = (List<?>) value;
@@ -222,9 +262,67 @@ public abstract class AbstractSCTResource extends GMFResource {
 				&& eObject.eContainingFeature() != null) {
 			return getXtextFragment(eObject, node);
 		}
+		if (node != null) {
+			String sctFragment = getSCTFragment(eObject);
+			if (sctFragment != null) {
+				return sctFragment;
+			}
+		}
 		return super.getURIFragment(eObject);
 	}
 
+	protected String getSCTFragment(EObject eObject) {
+		String fragment = getEmfFragment(eObject);
+		if (!Strings.isNullOrEmpty(fragment)) {
+			return SCT_PREFIX + fragment;
+		}
+		return null;
+	}
+
+	/**
+	 * Fragment calculation from ResourceImpl
+	 * 
+	 * @param eObject
+	 * @return
+	 */
+	protected String getEmfFragment(EObject eObject) {
+		InternalEObject internalEObject = (InternalEObject) eObject;
+		if (internalEObject.eDirectResource() == this
+				|| unloadingContents != null
+				&& unloadingContents.contains(internalEObject)) {
+			return "/" + getURIFragmentRootSegment(eObject);
+		} else {
+			List<String> uriFragmentPath = new ArrayList<String>();
+			boolean isContained = false;
+			for (InternalEObject container = internalEObject
+					.eInternalContainer(); container != null; container = internalEObject
+					.eInternalContainer()) {
+				uriFragmentPath.add(container.eURIFragmentSegment(
+						internalEObject.eContainingFeature(), internalEObject));
+				internalEObject = container;
+				if (container.eDirectResource() == this
+						|| unloadingContents != null
+						&& unloadingContents.contains(container)) {
+					isContained = true;
+					break;
+				}
+			}
+
+			if (!isContained) {
+				return "/-1";
+			}
+
+			StringBuffer result = new StringBuffer("/");
+			result.append(getURIFragmentRootSegment(internalEObject));
+
+			for (int i = uriFragmentPath.size() - 1; i >= 0; --i) {
+				result.append('/');
+				result.append(uriFragmentPath.get(i));
+			}
+			return result.toString();
+		}
+	}
+
 	private String getXtextFragment(EObject eObject, ICompositeNode node) {
 		return encoder.encode(eObject.eContainer(),
 				(EReference) eObject.eContainingFeature(), node);