diff -r ab3600ec2d1b editor.lib/apichanges.xml --- a/editor.lib/apichanges.xml Fri Jul 18 13:27:14 2008 +0200 +++ b/editor.lib/apichanges.xml Mon Jul 21 18:45:47 2008 +0200 @@ -104,6 +104,19 @@ is the proper place. + + + BaseDocument.atomicLock() method deprecated. + + + + + +

BaseDocument.atomicLock() and atomicUnlock () methods deprecated. User should use BaseDocument.runAtomic () instead. +

+
+ +
Deprecating old settings and completion API diff -r ab3600ec2d1b editor.lib/nbproject/project.properties --- a/editor.lib/nbproject/project.properties Fri Jul 18 13:27:14 2008 +0200 +++ b/editor.lib/nbproject/project.properties Mon Jul 21 18:45:47 2008 +0200 @@ -39,7 +39,7 @@ javac.compilerargs=-Xlint:unchecked javac.source=1.5 -spec.version.base=1.27.0 +spec.version.base=1.28.0 is.autoload=true javadoc.arch=${basedir}/arch.xml diff -r ab3600ec2d1b editor.lib/src/org/netbeans/editor/BaseDocument.java --- a/editor.lib/src/org/netbeans/editor/BaseDocument.java Fri Jul 18 13:27:14 2008 +0200 +++ b/editor.lib/src/org/netbeans/editor/BaseDocument.java Mon Jul 21 18:45:47 2008 +0200 @@ -44,10 +44,12 @@ import java.awt.Font; import java.awt.Font; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; +import java.lang.StackTraceElement; import java.util.Hashtable; import java.util.ArrayList; import java.util.Dictionary; import java.util.Enumeration; +import java.util.List; import java.util.Map; import java.io.Reader; import java.io.Writer; @@ -56,6 +58,8 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent; import java.util.EventListener; import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.PreferenceChangeEvent; @@ -95,6 +99,8 @@ import org.netbeans.modules.editor.lib.T import org.netbeans.modules.editor.lib.TrailingWhitespaceRemove; import org.netbeans.modules.editor.lib.SettingsConversions; import org.openide.util.Lookup; +import org.openide.util.RequestProcessor; +import org.openide.util.RequestProcessor.Task; import org.openide.util.WeakListeners; /** @@ -1405,7 +1411,7 @@ public class BaseDocument extends Abstra */ public void runAtomicAsUser(Runnable r) { boolean completed = false; - atomicLock(); + atomicLockImpl (); try { r.run(); completed = true; @@ -1415,7 +1421,7 @@ public class BaseDocument extends Abstra breakAtomicLock(); } } finally { - atomicUnlock(); + atomicUnlockImpl (); } } } @@ -1652,7 +1658,42 @@ public class BaseDocument extends Abstra } } - public final void atomicLock() { + private static Set + reportedClasses = new HashSet (); + private static Set + openedLocks = new HashSet (); + private static RequestProcessor + requestProcessor = new RequestProcessor ("BaseDocument"); + private static Task task; + + @Deprecated + public final synchronized void atomicLock () { + Exception exception = new Exception (); + StackTraceElement[] stack = exception.getStackTrace (); + if (stack.length > 1) { + String className = stack [1].getClassName (); + if (!reportedClasses.contains (className)) { + LOG.warning (className + " uses deprecated, slow and dangerous method BaseDocument.atomicLock ()."); //NOI18N + reportedClasses.add (className); + } + openedLocks.add (className); + } + if (task == null) { + task = requestProcessor.create (new Runnable () { + public void run () { + synchronized (BaseDocument.this) { + System.out.println("Invalid locks:"); + for (String className : openedLocks) + System.out.println(" " + className); + } + } + }); + task.schedule (2000); + } + atomicLockImpl (); + } + + private final void atomicLockImpl () { synchronized (this) { NotifyModifyStatus notifyModifyStatus = (NotifyModifyStatus)STATUS.get(); if (notifyModifyStatus == null) { @@ -1674,7 +1715,22 @@ public class BaseDocument extends Abstra } } - public final void atomicUnlock() { + @Deprecated + public final synchronized void atomicUnlock () { + Exception exception = new Exception (); + StackTraceElement[] stack = exception.getStackTrace (); + if (stack.length > 1) { + String className = stack [1].getClassName (); + openedLocks.remove (className); + } + atomicUnlockImpl (); + if (atomicDepth == 0) { + task.cancel (); + task = null; + } + } + + private final void atomicUnlockImpl () { boolean modsDone = false; boolean lastAtomic = false; synchronized (this) {