[nobug] Change synchronization setup to reduce chance of blocking UI during validation
diff --git a/xml/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java b/xml/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
index 38b7cd7..e73f2d9 100644
--- a/xml/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
+++ b/xml/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2017 IBM Corporation and others.
+ * Copyright (c) 2001, 2023 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
@@ -17,6 +17,7 @@
 import java.io.InputStream;
 import java.io.Reader;
 import java.net.URL;
+import java.net.URLConnection;
 import java.time.Duration;
 import java.util.HashMap;
 import java.util.Map;
@@ -48,6 +49,7 @@
  */
 public class ValidatorHelper
 {
+  private static final int TWO_MINUTES = (int) Duration.ofMinutes(2).toMillis();
   public boolean isGrammarEncountered = false;
   public boolean isDTDEncountered = false;
   public boolean isNamespaceEncountered = false;
@@ -388,10 +390,12 @@
     return string;
   }
 
-  private static boolean checkGrammarImpl(String location) {
+  private static boolean doCheckGrammar(String location) {
     try {
       URL url = new URL(location);
-      try (InputStream is = url.openStream()) {
+      URLConnection connection = url.openConnection();
+      connection.setConnectTimeout(TWO_MINUTES);
+      try (InputStream is = connection.getInputStream()) {
         return true;
       }
     } catch (Exception e) {
@@ -400,11 +404,13 @@
     return false;
   }
 
-  private synchronized static boolean checkGrammar(String location) {
+  private static boolean checkGrammar(String location) {
     GrammarEncounteredResult result = grammarCheckerCache.get(location);
-    if (result == null || (System.currentTimeMillis() - result.timestamp) > Duration.ofMinutes(10).toMillis()) {
-      result = new GrammarEncounteredResult(checkGrammarImpl(location));
-      grammarCheckerCache.put(location, result);
+    if (result == null || (System.currentTimeMillis() - result.timestamp) > TWO_MINUTES) {
+      result = new GrammarEncounteredResult(doCheckGrammar(location));
+      synchronized (grammarCheckerCache) {
+    	  grammarCheckerCache.put(location, result);
+      }
     }
     return result.result;
   }