[Ltk-Model] Add nullable annotations
diff --git a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
index feede62..8c6e31b 100644
--- a/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
+++ b/ltk/org.eclipse.statet.ltk.core/src/org/eclipse/statet/ltk/model/core/impl/AbstractModelEventJob.java
@@ -14,13 +14,13 @@
 
 package org.eclipse.statet.ltk.model.core.impl;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
 import java.util.HashMap;
 import java.util.LinkedList;
 
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 
@@ -44,36 +44,15 @@
  * Abstract model update event job
  */
 @NonNullByDefault
-public abstract class AbstractModelEventJob<TModelElement extends LtkModelElement<?>, InfoType extends SourceUnitModelInfo> extends Job {
+public abstract class AbstractModelEventJob<TModelElement
+		extends LtkModelElement<?>, InfoType extends SourceUnitModelInfo> extends Job {
 	
 	
-	private static class SafeRunnable implements ISafeRunnable {
-		
-		final ElementChangedEvent event;
-		ElementChangedListener listener;
-		
-		public SafeRunnable(final ElementChangedEvent event) {
-			this.event= event;
-		}
-		
-		@Override
-		public void run() {
-			this.listener.elementChanged(this.event);
-		}
-		
-		@Override
-		public void handleException(final Throwable e) {
-			LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, -1,
-					"An error occured while notifying an ElementChangedListener.", e )); //$NON-NLS-1$
-		}
-		
-	}
-	
 	protected class Task {
 		
 		private final TModelElement element;
-		private InfoType oldInfo;
-		private InfoType newInfo;
+		private @Nullable InfoType oldInfo;
+		private @Nullable InfoType newInfo;
 		
 		
 		public Task(final TModelElement element) {
@@ -85,11 +64,11 @@
 			return this.element;
 		}
 		
-		public InfoType getOldInfo() {
+		public @Nullable InfoType getOldInfo() {
 			return this.oldInfo;
 		}
 		
-		public InfoType getNewInfo() {
+		public @Nullable InfoType getNewInfo() {
 			return this.newInfo;
 		}
 		
@@ -122,7 +101,8 @@
 	
 	
 	public void addUpdate(final TModelElement element,
-			final InfoType oldModel, final InfoType newModel) {
+			final @Nullable InfoType oldModel, final @Nullable InfoType newModel) {
+		nonNullAssert(element);
 		synchronized (this.tasksLock) {
 			Task task= this.taskDetail.get(element);
 			if (task == null) {
@@ -147,25 +127,32 @@
 	
 	@Override
 	protected IStatus run(final IProgressMonitor monitor) {
-		while (true) {
-			Task task;
-			synchronized (this.tasksLock) {
-				final @Nullable TModelElement element= (!this.taskQueue.isEmpty()) ? this.taskQueue.removeFirst() : null;
-				if (element == null || this.stop) {
-					this.working= false;
-					return Status.OK_STATUS;
+		try {
+			while (true) {
+				final Task task;
+				synchronized (this.tasksLock) {
+					final @Nullable TModelElement element= (!this.taskQueue.isEmpty()) ?
+							this.taskQueue.removeFirst() :
+							null;
+					if (element == null || this.stop) {
+						return Status.OK_STATUS;
+					}
+					this.working= true;
+					task= nonNullAssert(this.taskDetail.remove(element));
 				}
-				this.working= true;
-				task= this.taskDetail.remove(element);
+				try {
+					task.run();
+				}
+				catch (final Throwable e) {
+					LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID,
+							String.format("An error occurred when firing model event for %1$s.", //$NON-NLS-1$
+									this.modelManager.getModelTypeId() ),
+							e ));
+				}
 			}
-			try {
-				task.run();
-			}
-			catch (final Throwable e) {
-				LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID, -1,
-						"An error occurred when firing model event for " + this.modelManager.getModelTypeId() + ".", //$NON-NLS-1$
-						e ));
-			}
+		}
+		finally {
+			this.working= false;
 		}
 	}
 	
@@ -184,11 +171,17 @@
 		}
 		final WorkingContext context= su.getWorkingContext();
 		final ElementChangedEvent event= new ElementChangedEvent(delta, context);
-		final SafeRunnable runnable= new SafeRunnable(event);
 		final ImIdentityList<ElementChangedListener> listeners= this.modelManager.getElementChangedListeners(context);
 		for (final ElementChangedListener listener : listeners) {
-			runnable.listener= listener;
-			SafeRunner.run(runnable);
+			try {
+				listener.elementChanged(event);
+			}
+			catch (final Exception | LinkageError | AssertionError e) {
+				LtkCorePlugin.log(new Status(IStatus.ERROR, Ltk.BUNDLE_ID,
+						String.format("An error occurred while handling a model element change for %1$s.", //$NON-NLS-1$
+								this.modelManager.getModelTypeId() ),
+						e ));
+			}
 		}
 	}