Skip to content

Commit 11feeaa

Browse files
committed
8222108: Reduce minRefreshTime for updating remote printer list on Windows
Reviewed-by: prr, serb
1 parent 383e7df commit 11feeaa

File tree

2 files changed

+48
-64
lines changed

2 files changed

+48
-64
lines changed

src/java.desktop/windows/classes/sun/print/PrintServiceLookupProvider.java

Lines changed: 37 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import java.security.AccessController;
2929
import java.util.ArrayList;
30+
import java.util.Arrays;
31+
import java.util.Comparator;
3032
import javax.print.DocFlavor;
3133
import javax.print.MultiDocPrintService;
3234
import javax.print.PrintService;
@@ -47,9 +49,11 @@ public class PrintServiceLookupProvider extends PrintServiceLookup {
4749
private PrintService defaultPrintService;
4850
private String[] printers; /* excludes the default printer */
4951
private PrintService[] printServices; /* includes the default printer */
50-
private static boolean pollServices = true;
51-
private static final int DEFAULT_MINREFRESH = 240; // 4 minutes
52-
private static int minRefreshTime = DEFAULT_MINREFRESH;
52+
53+
private static final int DEFAULT_REFRESH_TIME = 240; // 4 minutes
54+
private static final int MINIMUM_REFRESH_TIME = 120; // 2 minutes
55+
private static final boolean pollServices;
56+
private static final int refreshTime;
5357

5458
static {
5559
/* The system property "sun.java2d.print.polling"
@@ -58,12 +62,7 @@ public class PrintServiceLookupProvider extends PrintServiceLookup {
5862
*/
5963
String pollStr = java.security.AccessController.doPrivileged(
6064
new sun.security.action.GetPropertyAction("sun.java2d.print.polling"));
61-
62-
if (pollStr != null) {
63-
if (pollStr.equalsIgnoreCase("false")) {
64-
pollServices = false;
65-
}
66-
}
65+
pollServices = !("false".equalsIgnoreCase(pollStr));
6766

6867
/* The system property "sun.java2d.print.minRefreshTime"
6968
* can be used to specify minimum refresh time (in seconds)
@@ -72,17 +71,9 @@ public class PrintServiceLookupProvider extends PrintServiceLookup {
7271
String refreshTimeStr = java.security.AccessController.doPrivileged(
7372
new sun.security.action.GetPropertyAction(
7473
"sun.java2d.print.minRefreshTime"));
75-
76-
if (refreshTimeStr != null) {
77-
try {
78-
minRefreshTime = Integer.parseInt(refreshTimeStr);
79-
} catch (NumberFormatException e) {
80-
// ignore
81-
}
82-
if (minRefreshTime < DEFAULT_MINREFRESH) {
83-
minRefreshTime = DEFAULT_MINREFRESH;
84-
}
85-
}
74+
refreshTime = (refreshTimeStr != null)
75+
? getRefreshTime(refreshTimeStr)
76+
: DEFAULT_REFRESH_TIME;
8677

8778
java.security.AccessController.doPrivileged(
8879
new java.security.PrivilegedAction<Void>() {
@@ -93,6 +84,17 @@ public Void run() {
9384
});
9485
}
9586

87+
private static int getRefreshTime(final String refreshTimeStr) {
88+
try {
89+
int minRefreshTime = Integer.parseInt(refreshTimeStr);
90+
return (minRefreshTime < MINIMUM_REFRESH_TIME)
91+
? MINIMUM_REFRESH_TIME
92+
: minRefreshTime;
93+
} catch (NumberFormatException e) {
94+
return DEFAULT_REFRESH_TIME;
95+
}
96+
}
97+
9698
/* The singleton win32 print lookup service.
9799
* Code that is aware of this field and wants to use it must first
98100
* see if its null, and if so instantiate it by calling a method such as
@@ -398,60 +400,38 @@ scope of the query would be too big to handle(at times).
398400
count of printer status changes(add\remove) and based on it update the printers
399401
list.
400402
*/
401-
class RemotePrinterChangeListener implements Runnable {
402-
private String[] prevRemotePrinters;
403+
class RemotePrinterChangeListener implements Comparator<String>, Runnable {
403404

404405
RemotePrinterChangeListener() {
405406
}
406407

407-
private boolean doCompare(String[] str1, String[] str2) {
408-
if (str1 == null && str2 == null) {
409-
return false;
410-
} else if (str1 == null || str2 == null) {
411-
return true;
412-
}
413-
414-
if (str1.length != str2.length) {
415-
return true;
416-
} else {
417-
for (int i = 0; i < str1.length; i++) {
418-
for (int j = 0; j < str2.length; j++) {
419-
// skip if both are nulls
420-
if (str1[i] == null && str2[j] == null) {
421-
continue;
422-
}
423-
424-
// return true if there is a 'difference' but
425-
// no need to access the individual string
426-
if (str1[i] == null || str2[j] == null) {
427-
return true;
428-
}
429-
430-
// do comparison only if they are non-nulls
431-
if (!str1[i].equals(str2[j])) {
432-
return true;
433-
}
434-
}
435-
}
436-
}
437-
438-
return false;
408+
@Override
409+
public int compare(String o1, String o2) {
410+
return ((o1 == null)
411+
? ((o2 == null) ? 0 : 1)
412+
: ((o2 == null) ? -1 : o1.compareTo(o2)));
439413
}
440414

441415
@Override
442416
public void run() {
443417
// Init the list of remote printers
444-
prevRemotePrinters = getRemotePrintersNames();
418+
String[] prevRemotePrinters = getRemotePrintersNames();
419+
if (prevRemotePrinters != null) {
420+
Arrays.sort(prevRemotePrinters, this);
421+
}
445422

446423
while (true) {
447424
try {
448-
Thread.sleep(minRefreshTime * 1000);
425+
Thread.sleep(refreshTime * 1000);
449426
} catch (InterruptedException e) {
450427
break;
451428
}
452429

453430
String[] currentRemotePrinters = getRemotePrintersNames();
454-
if (doCompare(prevRemotePrinters, currentRemotePrinters)) {
431+
if (currentRemotePrinters != null) {
432+
Arrays.sort(currentRemotePrinters, this);
433+
}
434+
if (!Arrays.equals(prevRemotePrinters, currentRemotePrinters)) {
455435
// The list of remote printers got updated,
456436
// so update the cached list printers which
457437
// includes both local and network printers

test/jdk/java/awt/print/RemotePrinterStatusRefresh/RemotePrinterStatusRefresh.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323

2424
/*
2525
* @test
26-
* @bug 8153732 8212202 8221263 8221412
26+
* @bug 8153732 8212202 8221263 8221412 8222108
2727
* @requires (os.family == "Windows")
2828
* @summary Windows remote printer changes do not reflect in lookupPrintServices()
29-
* @run main/manual RemotePrinterStatusRefresh
29+
* @run main/manual/othervm -Dsun.java2d.print.minRefreshTime=120 RemotePrinterStatusRefresh
3030
*/
3131

3232
import java.awt.BorderLayout;
@@ -63,6 +63,9 @@
6363

6464
public class RemotePrinterStatusRefresh extends WindowAdapter {
6565

66+
private static final long DEFAULT_REFRESH_TIME = 240L;
67+
private static final long MINIMAL_REFRESH_TIME = 120L;
68+
6669
private static final long refreshTime = getRefreshTime();
6770

6871
private static final long TIMEOUT = refreshTime * 4 + 60;
@@ -181,7 +184,7 @@ public Component getListCellRendererComponent(JList<?> list,
181184
+ "configured printers.\n"
182185
+ "Step 1: Add or Remove a network printer using "
183186
+ "Windows Control Panel.\n"
184-
+ "Step 2: Wait for 4 minutes after adding or removing.\n"
187+
+ "Step 2: Wait for 2\u20134 minutes after adding or removing.\n"
185188
+ " \"Next printer refresh in\" gives you a "
186189
+ "rough estimation on when update will happen.\n"
187190
+ "Step 3: Click Refresh."
@@ -195,7 +198,7 @@ public Component getListCellRendererComponent(JList<?> list,
195198
+ "Step 5: Click Pass if the list of printers is correctly "
196199
+ "updated.\n"
197200
+ "Step 6: If the list is not updated, wait for another "
198-
+ "4 minutes, and then click Refresh again.\n"
201+
+ "2\u20134 minutes, and then click Refresh again.\n"
199202
+ "Step 7: If the list does not update, click Fail.\n"
200203
+ "\n"
201204
+ "You have to click Refresh to enable Pass and Fail buttons. "
@@ -215,12 +218,13 @@ public static void main(String[] args) throws Exception {
215218

216219
private static long getRefreshTime() {
217220
String refreshTime =
218-
System.getProperty("sun.java2d.print.minRefreshTime", "240");
221+
System.getProperty("sun.java2d.print.minRefreshTime",
222+
Long.toString(DEFAULT_REFRESH_TIME));
219223
try {
220224
long value = Long.parseLong(refreshTime);
221-
return value < 240L ? 240L : value;
225+
return value < MINIMAL_REFRESH_TIME ? MINIMAL_REFRESH_TIME : value;
222226
} catch (NumberFormatException e) {
223-
return 240L;
227+
return DEFAULT_REFRESH_TIME;
224228
}
225229
}
226230

0 commit comments

Comments
 (0)