From 5a57acb7f0cd179a6e77e1682fcfc64735c49f11 Mon Sep 17 00:00:00 2001
From: iweigelt <iweigelt@1434b563-b632-4741-aa49-43a3a8374d2e>
Date: Fri, 20 May 2011 19:56:18 +0000
Subject: [PATCH] Fixed bug #3305107 (Renaming Machine creates NPE when trying
 to open in Camille)

git-svn-id: svn://svn.code.sf.net/p/rodin-b-sharp/svn/trunk/Camille@11694 1434b563-b632-4741-aa49-43a3a8374d2e
---
 org.eventb.texteditor.feature/feature.xml     |  6 ++-
 org.eventb.texttools/META-INF/MANIFEST.MF     |  2 +-
 .../eventb/texttools/PersistenceHelper.java   | 48 ++++++++++++++++++-
 .../texttools/diff/EventBReferencesCheck.java |  2 +-
 4 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/org.eventb.texteditor.feature/feature.xml b/org.eventb.texteditor.feature/feature.xml
index baf2c57..50dfe3e 100644
--- a/org.eventb.texteditor.feature/feature.xml
+++ b/org.eventb.texteditor.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eventb.texteditor.feature"
       label="Camille TextEditor"
-      version="2.1.2"
+      version="2.1.3"
       provider-name="Heinrich-Heine University Dusseldorf"
       plugin="org.eventb.texteditor.ui">
 
@@ -10,7 +10,9 @@
       A text editor for the Rodin platform to edit Event-B models
 -----------------------------------------------------------
 Release History:
-2.1.0.beta - Rodin 2.1.1 release compatible with EventB-EMF Framework 3.3.0 
+2.1.3 - Bigfix release for Bug #3305107 (NPE after renaming a machine)
+2.1.0.beta - Rodin 2.1.1 release compatible with EventB-EMF Framework
+3.3.0 
 (emf-compare 1.1.2)
 2.0.1 - Rodin 2.0 release
 2.0.0 - Rodin 1.3.1 release compatible with 
diff --git a/org.eventb.texttools/META-INF/MANIFEST.MF b/org.eventb.texttools/META-INF/MANIFEST.MF
index 40609c3..7dcfb55 100644
--- a/org.eventb.texttools/META-INF/MANIFEST.MF
+++ b/org.eventb.texttools/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Event-B EMF Texttools
 Bundle-SymbolicName: org.eventb.texttools;singleton:=true
-Bundle-Version: 2.1.2
+Bundle-Version: 2.1.3
 Bundle-Activator: org.eventb.texttools.TextToolsPlugin
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,3.7.0)",
  org.eclipse.jface.text;bundle-version="[3.5.0,3.7.0)",
diff --git a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
index e4c2b96..d9a921c 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
@@ -29,6 +29,13 @@ import org.eventb.emf.core.EventBNamedCommentedComponentElement;
 import org.eventb.texttools.merge.ModelMerge;
 import org.eventb.texttools.prettyprint.PrettyPrinter;
 
+import de.be4.eventb.core.parser.BException;
+import de.be4.eventb.core.parser.EventBParser;
+import de.be4.eventb.core.parser.node.AContextParseUnit;
+import de.be4.eventb.core.parser.node.AMachineParseUnit;
+import de.be4.eventb.core.parser.node.PParseUnit;
+import de.be4.eventb.core.parser.node.Start;
+
 public class PersistenceHelper {
 
 	public static final Boolean DEBUG = false;
@@ -168,7 +175,42 @@ public class PersistenceHelper {
 			// we should find a text representation in the EMF
 			final String text = getTextAnnotation(resource);
 
-			if (text != null) {
+
+			/* workaround for Bug #3305107 
+			 * 
+			 * When a machine- or contextfile is renamed the lastmodified date does not change.
+			 * Since isTextUptodate() compares timestamps only, it returns true for renamed files.
+			 * */
+			boolean namesMatch = true;
+			final EventBNamedCommentedComponentElement rootElement = getComponent(resource);
+			if (rootElement != null) {
+				final EventBParser parser = new EventBParser();
+				try {
+					Start start = parser.parse(text, false);
+					System.out.println(start);
+					PParseUnit pParseUnit = start.getPParseUnit();
+					String parsedName = null;
+					if (pParseUnit instanceof AMachineParseUnit){
+						parsedName = ((AMachineParseUnit)start.getPParseUnit()).getName().getText();
+					}
+					if (pParseUnit instanceof AContextParseUnit){
+						parsedName = ((AContextParseUnit)start.getPParseUnit()).getName().getText();
+					}
+					
+					if (parsedName != null){
+						if (!parsedName.equals(rootElement.getName())){
+							namesMatch = false;
+							System.err.println("Conflicting names of ParseUnit! Expected name: '" + rootElement.getName() + "' actual name: '" + parsedName + "'! Prettyprinting unit...");
+						}
+					}
+				} catch (BException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+			/* End of woraround */
+			
+			if (text != null && namesMatch) {
 				return text;
 			}
 		}
@@ -270,6 +312,10 @@ public class PersistenceHelper {
 	private static boolean isTextUptodate(final Resource resource) {
 		final long textTimestamp = getTextTimestamp(resource);
 
+		if (true){
+			//return false;
+		}
+		
 		try {
 			final IResource file = getIResource(resource);
 			// refresh to get latest timestamp
diff --git a/org.eventb.texttools/src/org/eventb/texttools/diff/EventBReferencesCheck.java b/org.eventb.texttools/src/org/eventb/texttools/diff/EventBReferencesCheck.java
index c166559..d242420 100755
--- a/org.eventb.texttools/src/org/eventb/texttools/diff/EventBReferencesCheck.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/diff/EventBReferencesCheck.java
@@ -125,7 +125,7 @@ public class EventBReferencesCheck extends ReferencesCheck {
 	public List<UnmatchElement> filterUnmatchedElements(List<UnmatchElement> unmatched) {
 		final List<UnmatchElement> filteredUnmatched = new ArrayList<UnmatchElement>(unmatched.size());
 		for (UnmatchElement element : unmatched) {
-			if (!shouldBeIgnoredAllowContainment(element.getElement().eContainmentFeature())) {
+			if (element.getElement().eContainmentFeature() == null || !shouldBeIgnoredAllowContainment(element.getElement().eContainmentFeature())) {
 				filteredUnmatched.add(element);
 			}
 		}
-- 
GitLab