[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 ));
+ }
}
}