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