Use XNotifyingDispatch to avoid races

Change-Id: Ia91bd08122052f5ea206eb9e6c03524e6e3ec245
This commit is contained in:
Stephan Bergmann 2012-12-07 16:21:34 +01:00
parent a6d6d1c24b
commit 21ea372541

View File

@ -36,10 +36,13 @@ import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.accessibility.XAccessibleStateSet; import com.sun.star.accessibility.XAccessibleStateSet;
import com.sun.star.awt.XWindow; import com.sun.star.awt.XWindow;
import com.sun.star.container.XIndexAccess; import com.sun.star.container.XIndexAccess;
import com.sun.star.frame.DispatchResultEvent;
import com.sun.star.frame.XController; import com.sun.star.frame.XController;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider; import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XDispatchResultListener;
import com.sun.star.frame.XModel; import com.sun.star.frame.XModel;
import com.sun.star.frame.XNotifyingDispatch;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.sheet.XSpreadsheet; import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.sheet.XSpreadsheetDocument;
@ -124,18 +127,44 @@ public class ScAccessiblePageHeaderArea extends TestCase {
aParseURL[0].Complete = ".uno:PrintPreview"; aParseURL[0].Complete = ".uno:PrintPreview";
xParser.parseStrict(aParseURL); xParser.parseStrict(aParseURL);
URL aURL = aParseURL[0]; URL aURL = aParseURL[0];
XDispatch xDispatcher = xDispProv.queryDispatch(aURL, "", 0); XNotifyingDispatch xDispatcher = UnoRuntime.queryInterface(
if(xDispatcher != null) XNotifyingDispatch.class, xDispProv.queryDispatch(aURL, "", 0));
xDispatcher.dispatch( aURL, null ); final int[] ok = new int[] { 0 };
XDispatchResultListener listener = new XDispatchResultListener() {
public void disposing(EventObject Source) {
synchronized (ok) {
if (ok[0] == 0) {
ok[0] = 1;
}
ok.notifyAll();
}
}
public void dispatchFinished(DispatchResultEvent Result) {
synchronized (ok) {
ok[0] = 2;
ok.notifyAll();
}
}
};
xDispatcher.dispatchWithNotification(
aURL, null, listener);
synchronized (ok) {
while (ok[0] == 0) {
try {
ok.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
if (ok[0] != 2) {
throw new RuntimeException("missing disptachFinished");
}
}
} catch (com.sun.star.uno.Exception e) { } catch (com.sun.star.uno.Exception e) {
log.println("Couldn't change mode"); log.println("Couldn't change mode");
throw new StatusException(Status.failed("Couldn't change mode")); throw new StatusException(Status.failed("Couldn't change mode"));
} }
try {
Thread.sleep(500);
} catch (InterruptedException ex) {}
AccessibilityTools at = new AccessibilityTools(); AccessibilityTools at = new AccessibilityTools();
XWindow xWindow = at.getCurrentContainerWindow( (XMultiServiceFactory) Param.getMSF(), aModel); XWindow xWindow = at.getCurrentContainerWindow( (XMultiServiceFactory) Param.getMSF(), aModel);
@ -213,4 +242,4 @@ public class ScAccessiblePageHeaderArea extends TestCase {
throw new StatusException( "Couldn't create document ", e ); throw new StatusException( "Couldn't create document ", e );
} }
} }
} }