Omaha #5578 Fix a freeze when issue time is updated with a dialog open.
Former-commit-id: 1973778a4e37e0c3a7e8b1995a9da4ba185cc200
This commit is contained in:
parent
e140ced3bb
commit
de4228f4cd
1 changed files with 67 additions and 28 deletions
|
@ -189,6 +189,7 @@ import com.raytheon.viz.ui.simulatedtime.SimulatedTimeOperations;
|
||||||
* 02/24/2016 5411 randerso Leave issue times in mixed case.
|
* 02/24/2016 5411 randerso Leave issue times in mixed case.
|
||||||
* 03/01/2016 14775 ryu Initialize product definition for product correction;
|
* 03/01/2016 14775 ryu Initialize product definition for product correction;
|
||||||
* modified saveFile() and getDir().
|
* modified saveFile() and getDir().
|
||||||
|
* 06/28/2016 5578 bsteffen Prevent getTimeZones from calling python while synced with the UI thread.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author lvenable
|
* @author lvenable
|
||||||
|
@ -441,6 +442,12 @@ public class ProductEditorComp extends Composite implements
|
||||||
|
|
||||||
private String prodEditorDirectory = null;
|
private String prodEditorDirectory = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zones don't change so save the time zone for each segment to save trips
|
||||||
|
* to python when time is updated.
|
||||||
|
*/
|
||||||
|
private final Map<List<String>, Collection<String>> zonesToTimeZones = new HashMap<>();
|
||||||
|
|
||||||
private final DataManager dm;
|
private final DataManager dm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1076,7 +1083,27 @@ public class ProductEditorComp extends Composite implements
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateExpireTimeFromTimer() {
|
private void updateExpireTimeFromTimer() {
|
||||||
VizApp.runAsync(new Runnable() {
|
/*
|
||||||
|
* Calling into python on the UI thread can result in a deadlock if the
|
||||||
|
* python thread is using the UI thread to open a dialog. To get around
|
||||||
|
* this get(and cache) the time zones on this thread amd then actually
|
||||||
|
* update the times on the UIThread which will use the cached time
|
||||||
|
* zones.
|
||||||
|
*/
|
||||||
|
ProductDataStruct pds = textComp.getProductDataStruct();
|
||||||
|
if (pds == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String officeTimeZone = dm.getParmManager().compositeGridLocation()
|
||||||
|
.getTimeZone();
|
||||||
|
for (SegmentData segment : pds.getSegmentsArray()) {
|
||||||
|
if (segment.getSementMap().containsKey("nwstime")) {
|
||||||
|
getTimeZones(decodeUGCs(segment), officeTimeZone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VizApp.runSync(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
updateExpireTime();
|
updateExpireTime();
|
||||||
|
@ -2072,35 +2099,37 @@ public class ProductEditorComp extends Composite implements
|
||||||
textComp.replaceText(tip, expireTimeStr);
|
textComp.replaceText(tip, expireTimeStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// we make this replacement last since purge time and
|
|
||||||
// vtecs are fixed length and this is variable length,
|
|
||||||
// which ensures we only need to reParse() once per
|
|
||||||
// segment
|
|
||||||
List<String> zones = decodeUGCs(pds.getSegmentsArray()
|
|
||||||
.get(i));
|
|
||||||
Collection<String> timeZones = dm.getTextProductMgr()
|
|
||||||
.getTimeZones(zones, officeTimeZone);
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (String tz : timeZones) {
|
|
||||||
String issueTime;
|
|
||||||
if (tz.equals(officeTimeZone)) {
|
|
||||||
issueTime = officeIssueTime;
|
|
||||||
} else {
|
|
||||||
fmt.setTimeZone(TimeZone.getTimeZone(tz));
|
|
||||||
issueTime = fmt.format(now);
|
|
||||||
}
|
|
||||||
if (sb.length() > 0) {
|
|
||||||
sb.append(" /");
|
|
||||||
sb.append(issueTime);
|
|
||||||
sb.append("/");
|
|
||||||
} else {
|
|
||||||
sb.append(issueTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tip = segMap.get("nwstime");
|
tip = segMap.get("nwstime");
|
||||||
if (tip != null) {
|
if (tip != null) {
|
||||||
|
/*
|
||||||
|
* we make this replacement last since purge time
|
||||||
|
* and vtecs are fixed length and this is variable
|
||||||
|
* length, which ensures we only need to reParse()
|
||||||
|
* once per segment
|
||||||
|
*/
|
||||||
|
List<String> zones = decodeUGCs(pds
|
||||||
|
.getSegmentsArray().get(i));
|
||||||
|
Collection<String> timeZones = getTimeZones(zones,
|
||||||
|
officeTimeZone);
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (String tz : timeZones) {
|
||||||
|
String issueTime;
|
||||||
|
if (tz.equals(officeTimeZone)) {
|
||||||
|
issueTime = officeIssueTime;
|
||||||
|
} else {
|
||||||
|
fmt.setTimeZone(TimeZone.getTimeZone(tz));
|
||||||
|
issueTime = fmt.format(now);
|
||||||
|
}
|
||||||
|
if (sb.length() > 0) {
|
||||||
|
sb.append(" /");
|
||||||
|
sb.append(issueTime);
|
||||||
|
sb.append("/");
|
||||||
|
} else {
|
||||||
|
sb.append(issueTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
textComp.replaceText(tip, sb.toString());
|
textComp.replaceText(tip, sb.toString());
|
||||||
}
|
}
|
||||||
textComp.endUpdate();
|
textComp.endUpdate();
|
||||||
|
@ -2116,6 +2145,16 @@ public class ProductEditorComp extends Composite implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Collection<String> getTimeZones(List<String> zones,
|
||||||
|
String officeTimeZone) {
|
||||||
|
Collection<String> result = zonesToTimeZones.get(zones);
|
||||||
|
if (result == null) {
|
||||||
|
result = dm.getTextProductMgr().getTimeZones(zones, officeTimeZone);
|
||||||
|
zonesToTimeZones.put(zones, result);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given the issuance time, expiration time (desired), and the VTEC codes,
|
* Given the issuance time, expiration time (desired), and the VTEC codes,
|
||||||
* returns the appropriate expiration time. Expiration time is the earliest
|
* returns the appropriate expiration time. Expiration time is the earliest
|
||||||
|
|
Loading…
Add table
Reference in a new issue