[119296] Web service wizard hangs when WSDL not available..
diff --git a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUI.properties b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUI.properties
index e261ae4..b264a23 100644
--- a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUI.properties
+++ b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUI.properties
@@ -23,6 +23,7 @@
 # 20060420   120714 kathy@ca.ibm.com - Kathy Chan
 # 20060420   135912 joan@ca.ibm.com - Joan Haggarty
 # 20060510   141115 rsinha@ca.ibm.com - Rupam Kuehner
+# 20060509   119296 pmoogk@ca.ibm.com - Peter Moogk
 ###############################################################################
 
 #
@@ -626,3 +627,5 @@
 # Note to translation do not translate keyword ServerId
 MSG_INFO_ANT_SERVER_HEADING=Server IDs (ServerId)
 MSG_INFO_ANT_SERVER=Server: {0}
+
+MSG_INFO_WSDL_OPERATION_TIMED_OUT=Could not retrieve the WSDL file {0}.  Do you want to continue to wait for this file?
diff --git a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUIMessages.java b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUIMessages.java
index b7169fb..4aaeaa6 100644
--- a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUIMessages.java
+++ b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/ConsumptionUIMessages.java
@@ -23,6 +23,7 @@
  * 20060420   135912 joan@ca.ibm.com - Joan Haggarty
  * 20060426   138647 joan@ca.ibm.com - Joan Haggarty
  * 20060510   141115 rsinha@ca.ibm.com - Rupam Kuehner
+ * 20060509   119296 pmoogk@ca.ibm.com - Peter Moogk
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.consumption.ui;
 
@@ -382,6 +383,7 @@
     public static String MSG_PROJECT_MUST_EXIST;
     public static String MSG_ERROR_INVALID_MULTIPLE_SERVICE_SELECT;
     public static String MSG_ERROR_MODULE_DEPENDENCY;
+    public static String MSG_INFO_WSDL_OPERATION_TIMED_OUT;
 
 
 	static {
diff --git a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/ClientWizardWidget.java b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/ClientWizardWidget.java
index b3729af..45236c7 100644
--- a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/ClientWizardWidget.java
+++ b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/ClientWizardWidget.java
@@ -15,6 +15,7 @@
  * 20060420   135912 joan@ca.ibm.com - Joan Haggarty
  * 20060424   138052 kathy@ca.ibm.com - Kathy Chan
  * 20060425   137831 rsinha@ca.ibm.com - Rupam Kuehner
+ * 20060509   119296 pmoogk@ca.ibm.com - Peter Moogk
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.consumption.ui.widgets;
 
@@ -22,6 +23,7 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.ws.internal.consumption.common.WSDLParserFactory;
 import org.eclipse.jst.ws.internal.consumption.ui.ConsumptionUIMessages;
 import org.eclipse.jst.ws.internal.consumption.ui.command.data.EclipseIPath2URLStringTransformer;
 import org.eclipse.jst.ws.internal.consumption.ui.common.ValidationUtils;
@@ -277,13 +279,13 @@
   
    public WebServicesParser getWebServicesParser()
 	{
-		return parser_;
+		return WSDLParserFactory.getWSDLParser();
 	}
 	
 	public void setWebServicesParser(WebServicesParser parser)
 	{
-		parser_ = parser;	
-		clientWidget_.setWebServicesParser(parser);
+		parser_ = getWebServicesParser();
+		clientWidget_.setWebServicesParser(parser_);
 	}
    
   public TypeRuntimeServer getClientTypeRuntimeServer()
@@ -466,7 +468,7 @@
 		  
 		   wsdlDialog_.setComponentName(getComponentName());
 		   wsdlDialog_.setProject(getProject());
-		   wsdlDialog_.setWebServiceURI(getWebServiceURI());		   
+		   wsdlDialog_.setWebServiceURI(getWebServiceURI());		
 		   
 		   int result = wsdlDialog_.open();
 		   
diff --git a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/TimedWSDLSelectionConditionCommand.java b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/TimedWSDLSelectionConditionCommand.java
new file mode 100644
index 0000000..df2b7ca
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/TimedWSDLSelectionConditionCommand.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * yyyymmdd bug      Email and other contact information
+ * -------- -------- -----------------------------------------------------------
+ * 20060504   119296 pmoogk@ca.ibm.com - Peter Moogk
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.consumption.ui.widgets;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.ws.internal.consumption.ui.ConsumptionUIMessages;
+import org.eclipse.wst.command.internal.env.core.common.Condition;
+import org.eclipse.wst.command.internal.env.ui.common.TimedOperation;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.ws.internal.parser.wsil.WebServicesParser;
+
+
+public class TimedWSDLSelectionConditionCommand extends AbstractDataModelOperation implements Condition
+{
+  WSDLSelectionConditionCommand selectionCommand;
+  
+  public TimedWSDLSelectionConditionCommand()
+  {
+    selectionCommand = new WSDLSelectionConditionCommand();
+  }
+
+  public void setWebServicesParser(WebServicesParser webServicesParser)
+  {
+    selectionCommand.setWebServicesParser( webServicesParser );
+  }
+
+  public WebServicesParser getWebServicesParser()
+  {
+    return selectionCommand.getWebServicesParser();
+  }
+  
+  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable )
+  {
+    String         timeOutMessage = ConsumptionUIMessages.bind( ConsumptionUIMessages.MSG_INFO_WSDL_OPERATION_TIMED_OUT, getWebServiceURI() );
+    
+    TimedOperation timedOperation = new TimedOperation( selectionCommand, 10000, timeOutMessage );
+    
+    return timedOperation.execute(monitor, adaptable);
+  }
+  
+  public boolean evaluate()
+  {
+    return selectionCommand.evaluate();
+  }
+
+  public String getWebServiceURI()
+  {
+    return selectionCommand.getWebServiceURI();
+  }
+
+  public void setWebServiceURI(String webServiceURI)
+  {
+    selectionCommand.setWebServiceURI(webServiceURI);
+  }
+  
+  public String getWsdlURI()
+  {
+    return getWebServiceURI();
+  }
+/**
+ * @return Returns the httpBasicAuthPassword.
+ */
+public String getHttpBasicAuthPassword() {
+	return selectionCommand.getHttpBasicAuthPassword();
+}
+/**
+ * @return Returns the httpBasicAuthUsername.
+ */
+public String getHttpBasicAuthUsername() {
+	return selectionCommand.getHttpBasicAuthUsername();
+}
+}
diff --git a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/object/WSDLSelectionWidget.java b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/object/WSDLSelectionWidget.java
index fbda8d9..1b83415 100644
--- a/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/object/WSDLSelectionWidget.java
+++ b/bundles/org.eclipse.jst.ws.consumption.ui/src/org/eclipse/jst/ws/internal/consumption/ui/widgets/object/WSDLSelectionWidget.java
@@ -12,12 +12,12 @@
  * 20060410   135441 joan@ca.ibm.com - Joan Haggarty
  * 20060410   136011 kathy@ca.ibm.com - Kathy Chan
  * 20060420   135912 joan@ca.ibm.com - Joan Haggarty
+ * 20060504   119296 pmoogk@ca.ibm.com - Peter Moogk
  *******************************************************************************/
 package org.eclipse.jst.ws.internal.consumption.ui.widgets.object;
 
 import java.io.File;
 import java.net.MalformedURLException;
-
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -38,7 +38,7 @@
 import org.eclipse.jst.ws.internal.common.ResourceUtils;
 import org.eclipse.jst.ws.internal.consumption.common.WSDLParserFactory;
 import org.eclipse.jst.ws.internal.consumption.ui.ConsumptionUIMessages;
-import org.eclipse.jst.ws.internal.consumption.ui.widgets.WSDLSelectionConditionCommand;
+import org.eclipse.jst.ws.internal.consumption.ui.widgets.TimedWSDLSelectionConditionCommand;
 import org.eclipse.jst.ws.internal.consumption.ui.widgets.WSDLSelectionTreeWidget;
 import org.eclipse.jst.ws.internal.ui.common.DialogResourceBrowser;
 import org.eclipse.jst.ws.internal.ui.common.FileExtensionFilter;
@@ -230,7 +230,7 @@
     }
     if (wsURI != null && wsURI.indexOf(':') >= 0 && webServicesParser.getWebServiceEntityByURI(wsURI) == null)
     {
-      WSDLSelectionConditionCommand cmd = new WSDLSelectionConditionCommand();
+      TimedWSDLSelectionConditionCommand cmd = new TimedWSDLSelectionConditionCommand();
       cmd.setWebServicesParser(webServicesParser);
       cmd.setWebServiceURI(wsURI);
       cmd.execute(null, null);
@@ -601,7 +601,7 @@
 	    }
 	    if (wsURI != null && wsURI.indexOf(':') >= 0 && webServicesParser.getWebServiceEntityByURI(wsURI) == null)
 	    {
-	      WSDLSelectionConditionCommand cmd = new WSDLSelectionConditionCommand();
+	      TimedWSDLSelectionConditionCommand cmd = new TimedWSDLSelectionConditionCommand();
 	      cmd.setWebServicesParser(webServicesParser);
 	      cmd.setWebServiceURI(wsURI);
 	      cmd.execute(null, null);
diff --git a/bundles/org.eclipse.wst.command.env.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.command.env.ui/META-INF/MANIFEST.MF
index 27d61c5..2de362a 100644
--- a/bundles/org.eclipse.wst.command.env.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.command.env.ui/META-INF/MANIFEST.MF
@@ -7,6 +7,7 @@
 Bundle-Vendor: %PLUGIN_PROVIDER
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.command.internal.env.ui;x-internal:=true,
+ org.eclipse.wst.command.internal.env.ui.common;x-internal:=true,
  org.eclipse.wst.command.internal.env.ui.dialog;x-internal:=true,
  org.eclipse.wst.command.internal.env.ui.eclipse;x-internal:=true,
  org.eclipse.wst.command.internal.env.ui.plugin;x-internal:=true,
diff --git a/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUI.properties b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUI.properties
index 0c74610..4c0ebd8 100644
--- a/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUI.properties
+++ b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUI.properties
@@ -1,12 +1,15 @@
 ###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
+# Copyright (c) 2001, 2006 IBM Corporation and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
 # http://www.eclipse.org/legal/epl-v10.html
 #
 # Contributors:
-#     IBM Corporation - initial API and implementation
+# IBM Corporation - initial API and implementation
+# yyyymmdd bug      Email and other contact information
+# -------- -------- -----------------------------------------------------------
+# 20060509   119296 pmoogk@ca.ibm.com - Peter Moogk
 ###############################################################################
 
 BUTTON_SHOW_ALL_DIALOGS=&Show All
@@ -27,3 +30,4 @@
 DIALOG_TITLE_OVERWRITE=Confirm Overwrite
 
 MSG_ERROR_WIZARD_ID_NOT_FOUND=IWAB0013E Could not find wizard id: {0}
+MSG_ERROR_OPERATION_TIMED_OUT=Operation timed out.
diff --git a/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUIMessages.java b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUIMessages.java
index a332a5f..8931d84 100644
--- a/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUIMessages.java
+++ b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/EnvironmentUIMessages.java
@@ -1,12 +1,15 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *     IBM Corporation - initial API and implementation
+ * IBM Corporation - initial API and implementation
+ * yyyymmdd bug      Email and other contact information
+ * -------- -------- -----------------------------------------------------------
+ * 20060509   119296 pmoogk@ca.ibm.com - Peter Moogk
  *******************************************************************************/
 package org.eclipse.wst.command.internal.env.ui;
 
@@ -35,8 +38,9 @@
 	public static String MSG_ERR_COPYING_ANT_FILES;
 	public static String MSG_WARNING_FILE_EXISTS;
 	public static String DIALOG_TITLE_OVERWRITE;
+  public static String MSG_ERROR_OPERATION_TIMED_OUT;
 
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, EnvironmentUIMessages.class);
 	}
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/common/TimedOperation.java b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/common/TimedOperation.java
new file mode 100644
index 0000000..1bc3b9f
--- /dev/null
+++ b/bundles/org.eclipse.wst.command.env.ui/src/org/eclipse/wst/command/internal/env/ui/common/TimedOperation.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * yyyymmdd bug      Email and other contact information
+ * -------- -------- -----------------------------------------------------------
+ * 20060504   119296 pmoogk@ca.ibm.com - Peter Moogk
+ *******************************************************************************/
+package org.eclipse.wst.command.internal.env.ui.common;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.AbstractOperation;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.commands.operations.IUndoableOperation;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.command.internal.env.ui.EnvironmentUIMessages;
+
+public class TimedOperation implements IUndoableOperation
+{
+  private AbstractOperation operation;
+  private int               timeout;
+  private IProgressMonitor  tempMonitor;
+  private IAdaptable        tempInfo;
+  private IStatus           returnStatus;
+  private boolean           operationComplete;
+  private String            timeOutMessage;
+  
+  public TimedOperation( AbstractOperation operation, int timeout, String timeOutMessage )
+  {
+    this.operation      = operation;
+    this.timeout        = timeout;
+    this.timeOutMessage = timeOutMessage;
+  }
+
+  public IStatus execute(IProgressMonitor monitor, IAdaptable info) 
+  {
+    Thread  executeThread = new Thread( new OperationRunnable() );
+    
+    returnStatus      = Status.OK_STATUS;
+    tempMonitor       = monitor;
+    tempInfo          = info;
+    operationComplete = false;
+    executeThread.start();
+    
+    synchronized( operation )
+    {
+      while( !operationComplete )
+      {
+        try
+        {
+          operation.wait(timeout);
+        }
+        catch( InterruptedException exc )
+        {
+          Status errorStatus = new Status( IStatus.ERROR,"id", 0, exc.getMessage(), exc );
+          executeThread.interrupt();
+          return errorStatus;
+        }
+        
+        if( !operationComplete )
+        {
+          // We timed out, since the execution thread hasn't set operationComplete 
+          // to true.
+          Status  errorStatus = new Status( IStatus.ERROR,"id", 0, EnvironmentUIMessages.MSG_ERROR_OPERATION_TIMED_OUT, null);
+          Shell   shell       = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+          boolean waitMore    = MessageDialog.openConfirm(shell, EnvironmentUIMessages.MSG_ERROR_OPERATION_TIMED_OUT, timeOutMessage );
+          
+          if( !waitMore )
+          {
+            executeThread.interrupt();
+            operationComplete = true;
+            return errorStatus;
+          }
+        }
+      }
+    }
+    
+    // We completed successfully.  Therefore return the status set in the forked
+    // thread.
+    return returnStatus;
+  }
+
+  private class OperationRunnable implements Runnable
+  {
+    public void run()
+    {
+      try
+      {
+        returnStatus = operation.execute(tempMonitor, tempInfo);
+      }
+      catch( Throwable exc )
+      {
+        returnStatus = new Status( IStatus.ERROR,"id", 0, exc.getMessage(), exc );
+      }
+      finally
+      {
+        synchronized( operation )
+        {
+          operationComplete = true;
+          operation.notify();
+        }        
+      }
+    }
+  }
+  
+  public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException
+  {
+    return operation.redo(monitor, info);
+  }
+
+  public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException
+  {
+    return operation.undo(monitor, info);
+  }
+  public IUndoContext[] getContexts()
+  {
+    return operation.getContexts();
+  }
+
+  public boolean hasContext(IUndoContext context)
+  {
+    return operation.hasContext(context);
+  }
+
+  public void addContext(IUndoContext context)
+  {
+    operation.addContext(context);
+  }
+
+  public boolean canExecute()
+  {
+    return operation.canExecute();
+  }
+
+  public boolean canRedo()
+  {
+    return operation.canRedo();
+  }
+
+  public boolean canUndo()
+  {
+    return operation.canUndo();
+  }
+
+  public void dispose()
+  {
+    operation.dispose();
+  }
+
+  public String getLabel()
+  {
+    return operation.getLabel();
+  }
+
+  public void removeContext(IUndoContext context)
+  {
+    operation.removeContext(context);
+  }
+
+  public void setLabel(String name)
+  {
+    operation.setLabel(name);
+  }
+}
diff --git a/bundles/org.eclipse.wst.ws.parser/src/org/eclipse/wst/ws/internal/parser/wsil/WebServicesParser.java b/bundles/org.eclipse.wst.ws.parser/src/org/eclipse/wst/ws/internal/parser/wsil/WebServicesParser.java
index 1acc20c..166e27c 100644
--- a/bundles/org.eclipse.wst.ws.parser/src/org/eclipse/wst/ws/internal/parser/wsil/WebServicesParser.java
+++ b/bundles/org.eclipse.wst.ws.parser/src/org/eclipse/wst/ws/internal/parser/wsil/WebServicesParser.java
@@ -1,13 +1,16 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * Copyright (c) 2001, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  * IBM Corporation - initial API and implementation
- ******************************************************************************/
+ * yyyymmdd bug      Email and other contact information
+ * -------- -------- -----------------------------------------------------------
+ * 20060504   119296 pmoogk@ca.ibm.com - Peter Moogk
+ *******************************************************************************/
 
 package org.eclipse.wst.ws.internal.parser.wsil;
 
@@ -181,13 +184,24 @@
   private void parseURL(int parseOption) throws MalformedURLException, IOException, ParserConfigurationException, SAXException, WWWAuthenticationException
   {
     WebServiceEntity wsEntity = new WebServiceEntity();
-    wsEntity.setURI(uri_);
-    byte[] b = getInputStreamAsByteArray(uri_);
+    
+    // This variable makes this object a little more thread safe than it was
+    // before, although this object is not completely thread safe.  The scenario
+    // that we are trying to avoid is where one call to this method gets blocked
+    // at the getInputStreamAsByteArray call.  Then a second call to the method
+    // is made that changes the uri_ global variable.  When the first call
+    // completes it would use uri_ value from the second invocation instead
+    // of the value from the first.  Storing the uri_ into this variable helps 
+    // avoid this bad scenario.
+    String theUri = uri_;
+    
+    wsEntity.setURI(theUri);
+    byte[] b = getInputStreamAsByteArray(theUri);
     wsEntity.setBytes(b);
     setHTTPSettings(wsEntity);
-    uriToEntityTable_.put(uri_, wsEntity);
+    uriToEntityTable_.put(theUri, wsEntity);
     // parse uri_ as a HTML document
-    HTMLHeadHandler headHandler = new HTMLHeadHandler(uri_);
+    HTMLHeadHandler headHandler = new HTMLHeadHandler(theUri);
     byte[] head = headHandler.harvestHeadTags(b);
     SAXParserFactory factory = SAXParserFactory.newInstance();
     factory.setNamespaceAware(false);
@@ -208,7 +222,7 @@
       wsEntity.setType(WebServiceEntity.TYPE_HTML);
       for (int i = 0; i < wsilURIs.length; i++)
       {
-        String absoluteURI = convertToAbsoluteURI(uri_, wsilURIs[i]);
+        String absoluteURI = convertToAbsoluteURI(theUri, wsilURIs[i]);
         WebServiceEntity wsilEntity = new WebServiceEntity();
         wsilEntity.setType(WebServiceEntity.TYPE_WSIL);
         wsilEntity.setURI(absoluteURI);
@@ -250,7 +264,7 @@
     {
       try
       {
-        parseWSIL(uri_, parseOption);
+        parseWSIL(theUri, parseOption);
         // no exception thrown if uri_ is a WSIL document
         wsEntity.setType(WebServiceEntity.TYPE_WSIL);
       }
@@ -260,7 +274,7 @@
         // then parse uri_ as a DISCO document.
         try
         {
-          parseDISCO(uri_, parseOption);
+          parseDISCO(theUri, parseOption);
           // no exception thrown if uri_ is a DISCO document
           wsEntity.setType(WebServiceEntity.TYPE_DISCO);
         }
@@ -270,7 +284,7 @@
           // then parse uri_ as a WSDL document
           try
           {
-            parseWSDL(uri_);
+            parseWSDL(theUri);
             // no exception thrown if uri_ is a WSDL document
             wsEntity.setType(WebServiceEntity.TYPE_WSDL);
           }