diff --git a/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java b/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java index 23459298044..e27c9a9e129 100644 --- a/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java +++ b/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationMap.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.Set; +import org.eclipse.core.runtime.ILog; + import org.eclipse.jface.text.Position; @@ -54,11 +56,38 @@ public AnnotationMap(int capacity) { fInternalMap= new HashMap<>(capacity); } + /** + * Sets the lock object for this object. Subsequent calls to specified methods of this object + * are synchronized on this lock object. Which methods are synchronized is specified by the + * implementer. + *
+ * If the lock object is not explicitly set by this method, the annotation map uses its internal + * lock object for synchronization. + *
+ * + *+ * You should not override an existing lock object unless you own that lock object yourself. + * Use the existing lock object instead. + *
+ * + * @param lockObject the lock object. Ifnull is given, internal lock object is
+ * used for locking.
+ */
@Override
public synchronized void setLockObject(Object lockObject) {
+ if(fLockObject != null && fLockObject != lockObject) {
+ ILog log= ILog.of(AnnotationMap.class);
+ String message = "Attempt to override existing lock object of AnnotationMap."; //$NON-NLS-1$
+ log.warn(message, new IllegalStateException(message));
+ }
fLockObject= lockObject;
}
+ /**
+ * Lock object used to synchronize concurrent access to the internal map data.
+ *
+ * @return never returns null
+ */
@Override
public synchronized Object getLockObject() {
if (fLockObject == null) {
diff --git a/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java b/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
index 5ab6cf9e0dc..8e90654a28c 100644
--- a/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
+++ b/bundles/org.eclipse.text/src/org/eclipse/jface/text/source/AnnotationModel.java
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.core.runtime.Assert;
@@ -338,11 +339,30 @@ protected IAnnotationMap getAnnotationMap() {
return (IAnnotationMap) fAnnotations;
}
+ /**
+ * Subclasses should never return null. Clients should use the lock
+ * object in order to synchronize concurrent access to the internal map data.
+ *
+ * @return never returns null
+ */
@Override
public Object getLockObject() {
- return getAnnotationMap().getLockObject();
+ return Objects.requireNonNull(getAnnotationMap().getLockObject());
}
+ /**
+ * Sets the lock object for this object. Subsequent calls to specified methods of this object
+ * are synchronized on this lock object. Which methods are synchronized is specified by the
+ * implementer.
+ *
+ * + * You should not override an existing lock object unless you own that lock object yourself. + * Use the existing lock object instead. + *
+ * + * @param lockObject the lock object. Ifnull is given, default implementation uses
+ * the internal lock object for locking.
+ */
@Override
public void setLockObject(Object lockObject) {
getAnnotationMap().setLockObject(lockObject);
@@ -661,23 +681,12 @@ private void cleanup(boolean fireModelChanged, boolean forkNotification) {
IAnnotationMap annotations= getAnnotationMap();
Object mapLock = annotations.getLockObject();
- if (mapLock == null) {
- Iteratornull
+ */
+ @Override
+ Object getLockObject();
+
+ /**
+ * Sets the lock object for this object. Subsequent calls to specified methods of this object
+ * are synchronized on this lock object. Which methods are synchronized is specified by the
+ * implementer.
+ * + * You should not override an existing lock object unless you own that lock object yourself. + * Use the existing lock object instead. + *
+ * + * @param lockObject the lock object. Nevernull.
+ */
+ @Override
+ void setLockObject(Object lockObject);
}