I got the issue resolved.
This answer helped me a lot. java swing clear the event queue Infact the key concept is same.
So for the code part I modified the modules with the
lockWindow
private void lockWindow(final Window window) {
if (window instanceof RootPaneContainer
&& ((RootPaneContainer) window).getRootPane() != null
&& !lockedWindows.containsKey(window)) {
java.util.Timer timer = null;
try {
//don't do invalidate, invalidate as the first step
//((RootPaneContainer) window).getContentPane().invalidate();
// Create an object to store original details for the locked window.
LockedWindow lockedWindow = new LockedWindow();
lockedWindows.put((RootPaneContainer) window, lockedWindow);
lockedWindow.originalGlassPane = ((RootPaneContainer) window).getGlassPane();
//okk may be glasspane only in integrated scenario is causing the issue
//comment it and check, we are still putting it in the map above but its doing nothing
/*
// Remember the original glass pane and visibility before locking.
//okk is this the only issue? What should be the originalGlassPane first time? null?
lockedWindow.originalGlassPane = ((RootPaneContainer) window).getGlassPane();
System.err.println("Original galss pane : " + ((RootPaneContainer) window).getGlassPane());
lockedWindow.wasVisible = ((RootPaneContainer) window).getContentPane().isVisible();
// Add a LockedGlassPane to the window.
LockedGlassPane lgp = new LockedGlassPane();
lgp.setVisible(true); //hide the contents of the window
((RootPaneContainer) window).setGlassPane(lgp);
//don't do this stuff too
((RootPaneContainer) window).getContentPane().setVisible(false);
lgp.setVisible(true); //redisplays the lock message after set as glassPane.
*/
LockedGlassPane lgp = new LockedGlassPane();
((RootPaneContainer) window).setGlassPane(lgp);
timer = switchToBusyCursor(window);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
//do nothing
System.err.println("Am I interrupted?");
}
//okk the above thing worked, it doesnt lock naturlly, now try if setting visible code is an issue?
//great this thing works so this also is not an issue, only galsspane in SiteManager is
lockedWindow.wasVisible = ((RootPaneContainer) window).getContentPane().isVisible();
((RootPaneContainer) window).getContentPane().repaint();
// Minimize the window (if requested), while keeping a record of
// which windows have been minimized so that they can be restored
// later when the TimeoutTarget is unlocked.
//don't do this stuff too - as unlock is not working investigating that
if (window instanceof Frame) {
Frame frame = (Frame) window;
// Remember the original minimized state of the window.
lockedWindow.minimized = (frame.getExtendedState() & Frame.ICONIFIED) != 0;
if (lockMinimized) {
frame.setExtendedState(Frame.ICONIFIED);
}
}
//
//Note required now, but keeping in case the requirement changes again.
//
// Prevent the window from being closed while this target is
// locked.
// lockedWindow.windowListeners = window.getWindowListeners();
// for (WindowListener wl : lockedWindow.windowListeners) {
// window.removeWindowListener(wl);
// }
//if (window instanceof JFrame) {
// JFrame jframe = (JFrame) window;
// lockedWindow.originalDefaultCloseOperation = jframe.getDefaultCloseOperation();
// jframe.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//} else if (window instanceof JDialog) {
// JDialog jdialog = (JDialog) window;
// lockedWindow.originalDefaultCloseOperation = jdialog.getDefaultCloseOperation();
// jdialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//}
} catch (Exception e) {
System.err.println(getThreadPrefix() + " Failed to lock window." + e.getLocalizedMessage());
} finally {
switchToNormalCursorEventThread(window, timer);
}
}
}
unlockWindow
private void unlockWindow(RootPaneContainer window) {
try {
LockedWindow lockedWindow = lockedWindows.get(window);
//System.err.println(getThreadPrefix() + " Unlocking window::: " + lockeWindow.isDisplayable());
if (lockedWindow != null && ((Frame) window).isDisplayable()) {
System.err.println(getThreadPrefix() + "Unlocking..." + lockedWindow);
// Restore the original glasspane for the window
//okk may be glasspane only in integrated scenario is causing the issue
//comment it and check, we are still putting it in the map above but its doing nothing
//okk is this the only issue? What should be the originalGlassPane first time? null?
if (lockedWindow.originalGlassPane != null) {
System.err.println(getThreadPrefix() + "Reset original glass pane.");
window.setGlassPane(lockedWindow.originalGlassPane);
//lockedWindow.originalGlassPane.setVisible(true);
}
//make content pane visible again.
//(window).getContentPane().setVisible(lockedWindow.wasVisible);
//okk try this
//(window).getContentPane().setVisible(true);
//(window).getRootPane().invalidate();
//okk the above thing worked, it doesnt lock naturlly, now try if setting visible code is an issue?
//great this thing works so this also is not an issue
(window).getContentPane().setVisible(lockedWindow.wasVisible);
(window).getRootPane().repaint();
// Restore (un-minimize) the window if it wasn't minimized before
// the lock.
//do this tuff anyways
if (!lockedWindow.minimized && window instanceof Frame) {
((Frame) window).setExtendedState(((Frame) window).getExtendedState()
& ~Frame.ICONIFIED);
}
// Restore the original default close operation from before the
// lock, which will normally allow the window to be closed.
//dont do listeneres??
if (window instanceof Window) {
if (lockedWindow.windowListeners != null) {
for (WindowListener wl : lockedWindow.windowListeners) {
System.err.print("windowlistener is not null " + wl);
((Window) window).addWindowListener(wl);
}
}
if (window instanceof JFrame) {
((JFrame) window)
.setDefaultCloseOperation(lockedWindow.originalDefaultCloseOperation);
} else if (window instanceof JDialog) {
((JDialog) window)
.setDefaultCloseOperation(lockedWindow.originalDefaultCloseOperation);
}
}
//try this too
//((RootPaneContainer)window).setGlassPane(null);
//lockedWindows.remove(window);
//stopEventTrap
stopEventTrap((Frame)window);
System.err.println(getThreadPrefix() + " Window has been unlocked");
}
} catch (Exception e) {
System.err.println(getThreadPrefix() + " Failed to unlock window. " + e.getLocalizedMessage());
}
}
Added these new methods taken from above answer with modifications as p[er my use case
public static java.util.Timer switchToBusyCursor(final Window frame) {
startEventTrap(frame);
java.util.TimerTask timerTask = new java.util.TimerTask() {
public void run() {
startWaitCursor(frame);
}
};
final java.util.Timer timer = new java.util.Timer();
timer.schedule(timerTask, DELAY_MS);
return timer;
}
public static void switchToNormalCursorEventThread(final Window window, final java.util.Timer timer) {
Runnable r = new Runnable() {
public void run() {
switchToNormalCursor(window, timer);
}
};
javax.swing.SwingUtilities.invokeLater(r);
}
public static void switchToNormalCursor(final Window window, final java.util.Timer timer) {
timer.cancel();
stopWaitCursor(window);
//stopEventTrap(window);
}
private static void startWaitCursor(Window window) {
((RootPaneContainer) window).getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR));
((RootPaneContainer) window).getGlassPane().addMouseListener(mouseAdapter);
((RootPaneContainer) window).getGlassPane().setVisible(true);
}
private static void stopWaitCursor(Window window) {
((RootPaneContainer) window).getGlassPane().setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR));
//((RootPaneContainer) window).getGlassPane().removeMouseListener(mouseAdapter);
//((RootPaneContainer) window).getGlassPane().setVisible(false);
}
private static void startEventTrap(Window window) {
((RootPaneContainer) window).getGlassPane().addMouseListener(mouseAdapter);
((RootPaneContainer) window).getGlassPane().setVisible(true);
}
private static void stopEventTrap(Window window) {
java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue();
((RootPaneContainer) window).getGlassPane().removeMouseListener(mouseAdapter);
((RootPaneContainer) window).getGlassPane().setVisible(false);
}
private static final java.awt.event.MouseAdapter mouseAdapter = new java.awt.event.MouseAdapter() {
};
I have also taken threaddumps and analysed them as @trashgod said. I found that was correct too, IMHO, nothing blocking / wrong there. Though yes, AWTEventQueue-0 was at the same code point always.