Issue #2704 smarter thin client connectivity dialog and connection

checking

Change-Id: I90d3b47ba6fa80eac2a9a6933c4038d9536830af

Former-commit-id: 24bbf4949d [formerly c28085118f] [formerly 75ca70fba6] [formerly 24bbf4949d [formerly c28085118f] [formerly 75ca70fba6] [formerly fd43d9e095 [formerly 75ca70fba6 [formerly 36d571557def95e0eb1350c4e68cbe3e225f282a]]]]
Former-commit-id: fd43d9e095
Former-commit-id: 1dcb3a77c3 [formerly c0256ac19e] [formerly d828ad996a7bd8eb159d4cd60c7b851fc8ac8486 [formerly 2111989497]]
Former-commit-id: 65cd03344892f0b8870a3dcdc9e97aa695e0a8e5 [formerly 9e09da8bb6]
Former-commit-id: 93a740106d
This commit is contained in:
Nate Jensen 2014-02-05 15:48:11 -06:00
parent f41d73618d
commit aba5c50bfe
21 changed files with 830 additions and 225 deletions

View file

@ -19,6 +19,10 @@
**/
package com.raytheon.uf.viz.core.comm;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.raytheon.uf.common.comm.IHttpsCredentialsHandler;
import com.raytheon.uf.viz.core.auth.UserController;
@ -34,6 +38,7 @@ import com.raytheon.uf.viz.core.auth.UserController;
* ------------ ---------- ----------- --------------------------
* Mar 04, 2013 1786 mpduff Initial creation.
* Jun 07, 2013 1981 mpduff Save user's username in UserController.
* Feb 10, 2014 2704 njensen Added credentialsFailed()
*
* </pre>
*
@ -59,4 +64,11 @@ public class CaveHttpsCredentialsHandler implements IHttpsCredentialsHandler {
UserController.updateUserData(credentials[0]);
return credentials;
}
@Override
public void credentialsFailed() {
MessageDialog.openError(new Shell(Display.getDefault()),
"Login failed",
"Invalid username and/or password. Please try again.");
}
}

View file

@ -20,9 +20,7 @@
package com.raytheon.uf.viz.core.comm;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -55,7 +53,8 @@ import com.raytheon.uf.viz.core.requests.ThriftClient;
* Mar 22, 2013 1786 mpduff Changed to use HttpClient for
* connectivity.
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Jan 15, 2013 njensen Added printConnectivityProblems()
* Jan 15, 2014 njensen Added printConnectivityProblems()
* Feb 04, 2014 2704 njensen Check JMS capability, return exceptions with results
*
* </pre>
*
@ -77,9 +76,16 @@ public class ConnectivityManager {
public String server;
public Exception exception;
public ConnectivityResult(boolean hc, String server) {
this(hc, server, null);
}
public ConnectivityResult(boolean hc, String server, Exception e) {
this.hasConnectivity = hc;
this.server = server;
this.exception = e;
}
}
@ -94,6 +100,7 @@ public class ConnectivityManager {
public static void checkHttpServer(String server,
IConnectivityCallback callback) {
boolean good = false;
Exception exc = null;
try {
HttpClient client = HttpClient.getInstance();
HttpGet request = new HttpGet();
@ -101,9 +108,9 @@ public class ConnectivityManager {
client.executeRequest(request);
good = true;
} catch (Exception e) {
printConnectivityProblem(server, "http", e);
exc = e;
}
callback.connectionChecked(new ConnectivityResult(good, server));
callback.connectionChecked(new ConnectivityResult(good, server, exc));
}
/**
@ -115,12 +122,13 @@ public class ConnectivityManager {
public static void checkLocalizationServer(String server,
IConnectivityCallback callback) {
boolean good = false;
Exception exc = null;
try {
good = checkLocalizationServer(server, true) != null;
} catch (Exception e) {
printConnectivityProblem(server, "localization", e);
exc = e;
}
callback.connectionChecked(new ConnectivityResult(good, server));
callback.connectionChecked(new ConnectivityResult(good, server, exc));
}
/**
@ -142,47 +150,49 @@ public class ConnectivityManager {
.sendRequest(req, server);
getServersResponseCache.put(server, resp);
return resp;
}
/**
* Checks the connectivity of the given server
* Checks the connectivity of the given alert service
*
* @param server
* server to check
* @return whether quit was selected. TODO: need to return two booleans, one
* for quit and one for connectivity
*/
public static void checkJmsServer(String server,
public static void checkAlertService(String server,
IConnectivityCallback callback) {
boolean good = true;
Exception exc = null;
try {
ActiveMQConnectionFactory f = new ActiveMQConnectionFactory(server);
f.createConnection().close();
} catch (JMSException e) {
printConnectivityProblem(server, "JMS", e);
exc = e;
good = false;
}
callback.connectionChecked(new ConnectivityResult(good, server));
callback.connectionChecked(new ConnectivityResult(good, server, exc));
}
/**
* Prints the connectivity exception to the console, to help with diagnosing
* connection issues
* Checks the connectivity of the given JMS server
*
* @param server
* the server address it attempted to connect to
* @param serverType
* the type of server it attempted to connect to
* @param e
* the exception that occurred
* @param connectionString
* @param callback
*/
private static void printConnectivityProblem(String server,
String serverType, Exception e) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()) + " MAY NOT BE AN ERROR:");
System.out.println("Couldn't connect to " + serverType + " server at "
+ server);
e.printStackTrace(System.out);
public static void checkJmsServer(String connectionString,
IConnectivityCallback callback) {
boolean good = true;
Exception exc = null;
try {
JMSConnection jms = new JMSConnection(connectionString);
jms.getFactory().createConnection().close();
} catch (JMSException e) {
exc = e;
good = false;
}
callback.connectionChecked(new ConnectivityResult(good,
connectionString, exc));
}
}

View file

@ -42,7 +42,8 @@ import org.eclipse.ui.PlatformUI;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 6, 2013 1786 mpduff Initial creation
* Mar 06, 2013 1786 mpduff Initial creation
* Feb 10, 2014 2704 njensen Allow message to expand size of dialog
*
* </pre>
*
@ -50,6 +51,7 @@ import org.eclipse.ui.PlatformUI;
* @version 1.0
*/
public class HttpsLoginDlg extends Dialog {
private static final long serialVersionUID = 1L;
private Shell shell;
@ -76,7 +78,7 @@ public class HttpsLoginDlg extends Dialog {
*/
public HttpsLoginDlg(String message) {
super(new Shell(Display.getDefault(), SWT.TITLE));
this.message = message;
this.message = message.replace("\"", "");
}
/**
@ -112,7 +114,9 @@ public class HttpsLoginDlg extends Dialog {
comp.setLayout(new GridLayout(2, false));
GridData gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd.widthHint = 500;
if (message == null || message.length() < 50) {
gd.widthHint = 500;
}
gd.horizontalSpan = 2;
Label authMessage = new Label(comp, SWT.CENTER);

View file

@ -19,11 +19,17 @@
**/
package com.raytheon.uf.viz.core.localization;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.UnknownHostException;
import java.util.regex.Pattern;
import org.apache.http.conn.HttpHostConnectException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.VerifyEvent;
@ -41,6 +47,8 @@ import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.raytheon.uf.common.comm.HttpServerException;
import com.raytheon.uf.common.comm.InvalidURIException;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
@ -58,6 +66,8 @@ import com.raytheon.uf.viz.core.comm.IConnectivityCallback;
* ------------ ---------- ----------- --------------------------
* Aug 05, 2009 mschenke Initial creation
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Feb 04, 2014 2704 njensen Shifted some private fields/methods to protected,
* Added status and details, better site validation
*
* </pre>
*
@ -66,16 +76,23 @@ import com.raytheon.uf.viz.core.comm.IConnectivityCallback;
*/
public class ConnectivityPreferenceDialog extends Dialog {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ConnectivityPreferenceDialog.class, "CAVE");
protected static final Pattern VALID_SITENAME = Pattern
.compile("^[A-Za-z0-9._-]+$");
private class LocalizationCallback implements IConnectivityCallback {
@Override
public void connectionChecked(ConnectivityResult results) {
localizationGood = results.hasConnectivity;
appendDetails(buildDetails(results));
if (!results.hasConnectivity && status == null) {
status = buildErrorMessage(results);
}
}
}
private class AlertVizCallback implements IConnectivityCallback {
@ -83,19 +100,20 @@ public class ConnectivityPreferenceDialog extends Dialog {
@Override
public void connectionChecked(ConnectivityResult results) {
alertVizGood = results.hasConnectivity;
appendDetails(buildDetails(results));
if (!results.hasConnectivity && status == null) {
status = buildErrorMessage(results);
}
}
}
/**
* Set time dialog shell
*/
private Shell shell;
/**
* Display component
*/
private Display display;
protected Display display;
private Label localizationLabel;
@ -115,10 +133,16 @@ public class ConnectivityPreferenceDialog extends Dialog {
private String site = "";
private Text siteText;
protected Text siteText;
private Label statusLabel;
private boolean canceled = false;
private Composite detailsComp;
private StyledText detailsText;
private IConnectivityCallback localizationCallback = new LocalizationCallback();
private IConnectivityCallback alertCallback = new AlertVizCallback();
@ -126,14 +150,20 @@ public class ConnectivityPreferenceDialog extends Dialog {
/**
* Title of the dialog.
*/
private static final String dialogTitle = "Connectivity Preferences";
private String title;
public ConnectivityPreferenceDialog(boolean checkAlertViz) {
this(new Shell(Display.getDefault()), checkAlertViz);
protected String status;
protected String details;
public ConnectivityPreferenceDialog(boolean checkAlertViz, String title) {
this(new Shell(Display.getDefault()), checkAlertViz, title);
}
public ConnectivityPreferenceDialog(Shell parentShell, boolean checkAlertViz) {
public ConnectivityPreferenceDialog(Shell parentShell,
boolean checkAlertViz, String title) {
super(parentShell);
this.title = title;
localization = LocalizationManager.getInstance()
.getLocalizationServer();
site = LocalizationManager.getInstance().getSite();
@ -155,8 +185,8 @@ public class ConnectivityPreferenceDialog extends Dialog {
if (!validate()) {
Shell parent = getParent();
display = parent.getDisplay();
shell = new Shell(parent, SWT.DIALOG_TRIM);
shell.setText(dialogTitle);
shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE);
shell.setText(title);
// Create the main layout for the shell.
GridLayout mainLayout = new GridLayout(1, true);
@ -165,6 +195,9 @@ public class ConnectivityPreferenceDialog extends Dialog {
initializeComponents();
shell.pack();
shell.setMinimumSize(shell.getBounds().width,
shell.getBounds().height);
updateStatus(false, status, details);
shell.open();
while (!shell.isDisposed()) {
@ -177,16 +210,69 @@ public class ConnectivityPreferenceDialog extends Dialog {
}
private void initializeComponents() {
createErrorText();
Composite textBoxComp = new Composite(shell, SWT.NONE);
textBoxComp.setLayout(new GridLayout(2, false));
createTextBoxes(textBoxComp);
createStatusText();
createBottomButtons();
}
private void createErrorText() {
Label label = new Label(shell, SWT.CENTER);
label.setText("Error: Unable to connect to localization server");
/**
* Creates the status label, text, and details button
*/
protected void createStatusText() {
Composite comp = new Composite(shell, SWT.NONE);
comp.setLayout(new GridLayout(3, false));
comp.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
Label lbl = new Label(comp, SWT.NONE);
lbl.setText("Status:");
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
statusLabel = new Label(comp, SWT.BORDER);
statusLabel.setLayoutData(gd);
statusLabel.setText("");
final Button detailsButton = new Button(comp, SWT.TOGGLE);
detailsButton.setText("Details");
detailsButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (detailsComp.isVisible()) {
((GridData) detailsComp.getLayoutData()).exclude = true;
detailsComp.setVisible(false);
shell.pack();
} else {
((GridData) detailsComp.getLayoutData()).exclude = false;
((GridData) detailsComp.getLayoutData()).widthHint = detailsComp
.getBounds().width;
detailsComp.setVisible(true);
shell.pack();
}
}
});
createDetailsText();
}
/**
* Creates the expanding details text
*/
protected void createDetailsText() {
detailsComp = new Composite(shell, SWT.NONE);
detailsComp.setLayout(new GridLayout(1, false));
detailsComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint = 150;
detailsText = new StyledText(detailsComp, SWT.BORDER | SWT.MULTI
| SWT.H_SCROLL | SWT.V_SCROLL);
detailsText.setText("");
detailsText.setLayoutData(gd);
/*
* Hide the composite
*/
((GridData) detailsComp.getLayoutData()).exclude = true;
detailsComp.setVisible(false);
}
protected void createTextBoxes(Composite textBoxComp) {
@ -194,12 +280,12 @@ public class ConnectivityPreferenceDialog extends Dialog {
localizationLabel = new Label(textBoxComp, SWT.RIGHT);
localizationLabel.setText("Localization Server:");
GridData gd = new GridData(SWT.RIGHT, SWT.None, true, true);
GridData gd = new GridData(SWT.RIGHT, SWT.CENTER, true, true);
gd.widthHint = 150;
localizationLabel.setLayoutData(gd);
localizationText = new Text(textBoxComp, SWT.NONE);
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
localizationText = new Text(textBoxComp, SWT.BORDER);
gd = new GridData(SWT.LEFT, SWT.None, true, true);
gd.widthHint = 300;
localizationText.setLayoutData(gd);
localizationText.setText(localization == null ? "" : localization);
@ -207,17 +293,18 @@ public class ConnectivityPreferenceDialog extends Dialog {
Label label = new Label(textBoxComp, SWT.RIGHT);
label.setText("Site:");
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd = new GridData(SWT.RIGHT, SWT.CENTER, true, true);
gd.widthHint = 150;
label.setLayoutData(gd);
siteText = new Text(textBoxComp, SWT.NONE);
siteText = new Text(textBoxComp, SWT.BORDER);
siteText.addVerifyListener(new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
e.text = e.text.toUpperCase();
}
});
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd = new GridData(SWT.LEFT, SWT.None, true, true);
gd.widthHint = 300;
siteText.setLayoutData(gd);
siteText.setText(site == null ? "" : site);
@ -299,7 +386,7 @@ public class ConnectivityPreferenceDialog extends Dialog {
shell.setVisible(false);
MessageDialog
.openError(
null,
shell,
"Connectivity Error",
"Unable to validate localization preferences, please enter valid options or quit the application");
shell.setVisible(true);
@ -327,6 +414,8 @@ public class ConnectivityPreferenceDialog extends Dialog {
}
public boolean validate() {
status = null;
details = null;
if (localizationText != null && !localizationText.isDisposed()
&& localizationText.isEnabled()) {
String localization = localizationText.getText().trim();
@ -360,20 +449,28 @@ public class ConnectivityPreferenceDialog extends Dialog {
} else {
validateSite();
}
return siteGood && localizationGood && alertVizGood;
boolean everythingGood = siteGood && localizationGood && alertVizGood;
updateStatus(everythingGood, status, details);
return everythingGood;
}
private void validateLocalization() {
ConnectivityManager.checkLocalizationServer(localization, localizationCallback);
ConnectivityManager.checkLocalizationServer(localization,
localizationCallback);
}
private void validateAlertviz() {
ConnectivityManager.checkJmsServer(alertVizServer, alertCallback);
ConnectivityManager.checkAlertService(alertVizServer, alertCallback);
}
private void validateSite() {
if (site == null || site.trim().equals("")) {
protected void validateSite() {
if (site == null || site.trim().length() == 0
|| !VALID_SITENAME.matcher(site).find()) {
siteGood = false;
if (status == null) {
status = "Invalid Site ID";
}
} else {
siteGood = true;
}
@ -387,6 +484,20 @@ public class ConnectivityPreferenceDialog extends Dialog {
}
}
/**
* Gets the color for the status label
*
* @param isGood
* @return
*/
protected Color getForegroundColor(boolean isGood) {
if (isGood) {
return display.getSystemColor(SWT.COLOR_DARK_GREEN);
} else {
return display.getSystemColor(SWT.COLOR_DARK_RED);
}
}
public String getLocalization() {
return localization;
}
@ -438,4 +549,118 @@ public class ConnectivityPreferenceDialog extends Dialog {
localizationText.setEnabled(enabled);
}
}
/**
* Builds a details string based on a stacktrace of connectivity results. If
* there is no exception with the results, this returns the empty string.
*
* @param results
* @return
*/
protected String buildDetails(ConnectivityResult results) {
StringBuilder sb = new StringBuilder();
if (results.exception != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
results.exception.printStackTrace(ps);
String stack = baos.toString();
ps.close();
sb.append(stack);
}
return sb.toString();
}
/**
* Adds new details to the details field without overwriting it
*
* @param newDetails
*/
protected void appendDetails(String newDetails) {
if (details == null) {
details = "";
}
if (details.length() > 0) {
details += "\n\n\n";
}
details += newDetails;
}
/**
* Creates an error message for the status label by attempting to find the
* most relevant error message from the exception's stacktrace.
*
* @param result
* @return
*/
protected String buildErrorMessage(ConnectivityResult result) {
StringBuilder sb = new StringBuilder();
Exception prettyErrExc = result.exception;
/*
* Loop through the Caused Bys and try to find one that is the most
* useful for the label. This is totally arbitrary and corresponds to
* what njensen predicted would be most useful.
*/
while (prettyErrExc != null) {
if (prettyErrExc instanceof HttpHostConnectException
|| prettyErrExc instanceof InvalidURIException) {
sb.append(prettyErrExc.getMessage());
break;
}
if (prettyErrExc instanceof UnknownHostException) {
sb.append("Unknown host: " + prettyErrExc.getMessage());
break;
} else if (prettyErrExc instanceof HttpServerException) {
sb.append("Server returned Error ");
String emsg = prettyErrExc.getMessage();
int titleIndex = emsg.indexOf("<title>");
if (titleIndex > -1) {
String httpMsg = emsg.substring(titleIndex + 7,
emsg.indexOf("</title>"));
sb.append(httpMsg);
} else {
int statusCode = ((HttpServerException) prettyErrExc)
.getStatusCode();
sb.append(statusCode);
break;
}
}
prettyErrExc = (Exception) prettyErrExc.getCause();
}
if (sb.length() == 0) {
if (result.exception != null
&& result.exception.getMessage() != null) {
sb.append(result.exception.getMessage());
} else {
sb.append("Connectivity Error");
}
}
return sb.toString();
}
/**
* Updates the status label and details of the connectivity dialog
*
* @param good
* @param status
* @param details
*/
protected void updateStatus(boolean good, String status, String details) {
if (statusLabel != null && !statusLabel.isDisposed()
&& detailsText != null && !detailsText.isDisposed()) {
statusLabel.setForeground(getForegroundColor(good));
detailsText.setText(details != null ? details : "");
if (good) {
statusLabel.setText("Successful connection");
} else {
if (status != null) {
statusLabel.setText(status);
} else {
throw new IllegalStateException(
"Connectivity dialog received non-good status without status message");
}
}
}
}
}

View file

@ -52,6 +52,7 @@ import com.raytheon.uf.viz.core.exception.VizException;
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Aug 27, 2013 2295 bkowal The entire jms connection string is now
* provided by EDEX.
* Feb 04, 2014 2704 njensen Pass connectivity dialog title
*
* </pre>
*
@ -108,7 +109,7 @@ public class LocalizationInitializer {
protected void setupServers() throws VizException {
if (promptUI) {
ConnectivityPreferenceDialog dlg = new ConnectivityPreferenceDialog(
checkAlertviz);
checkAlertviz, "Connectivity Preferences");
if (dlg.open() == true) {
System.exit(0);
}

View file

@ -95,6 +95,7 @@ import com.raytheon.uf.viz.core.requests.ThriftClient;
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Aug 27, 2013 2295 bkowal The entire jms connection string is now
* provided by EDEX.
* Feb 04, 2014 2704 njensen Allow setting server without saving
*
* </pre>
*
@ -210,19 +211,39 @@ public class LocalizationManager implements IPropertyChangeListener {
}
}
/**
* Sets the localization server and saves the setting
*
* @param currentServer
* the localization URI
*/
public void setCurrentServer(String currentServer) {
setCurrentServer(currentServer, true);
}
/**
* Sets the localization server
*
* @param currentServer
* the localization URI
* @param save
* whether or not to save the setting
*/
public void setCurrentServer(String currentServer, boolean save) {
if (!this.currentServer.equals(currentServer)) {
this.currentServer = currentServer;
if (!overrideServer) {
localizationStore.putValue(
LocalizationConstants.P_LOCALIZATION_HTTP_SERVER,
this.currentServer);
applyChanges();
if (save) {
applyChanges();
}
}
try {
GetServersResponse resp = ConnectivityManager.checkLocalizationServer(
currentServer, false);
GetServersResponse resp = ConnectivityManager
.checkLocalizationServer(currentServer, false);
VizApp.setHttpServer(resp.getHttpServer());
VizApp.setJmsConnectionString(resp.getJmsConnectionString());
VizApp.setPypiesServer(resp.getPypiesServer());

View file

@ -236,7 +236,7 @@ public class LocalizationPreferences extends FieldEditorPreferencePage
if (alertEditor != null) {
text = alertEditor.getTextControl(getFieldEditorParent());
ConnectivityManager.checkJmsServer(text.getText().trim(),
ConnectivityManager.checkAlertService(text.getText().trim(),
new IConnectivityCallback() {
@Override
public void connectionChecked(ConnectivityResult results) {
@ -260,6 +260,7 @@ public class LocalizationPreferences extends FieldEditorPreferencePage
* @see
* org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
}

View file

@ -86,7 +86,7 @@ public class LocalizationServerEditor extends StringFieldEditor implements
ConnectivityManager.checkHttpServer(this.getTextControl().getText(),
this);
} else {
ConnectivityManager.checkJmsServer(this.getTextControl().getText(),
ConnectivityManager.checkAlertService(this.getTextControl().getText(),
this);
}
if (!good) {

View file

@ -123,8 +123,10 @@ public class AlertVizApplication implements IStandaloneComponent {
AlertvizJob as = new AlertvizJob(port);
if (as.isAlreadyStarted()) {
Container.logInternal(Priority.ERROR,
"Alertviz already started on port: " + port + ", exiting");
String exitMsg = "Alertviz already started on port: " + port
+ ", exiting";
System.out.println(exitMsg);
Container.logInternal(Priority.ERROR, exitMsg);
return IApplication.EXIT_OK;
}

View file

@ -36,6 +36,7 @@ import com.raytheon.uf.viz.core.comm.ConnectivityManager;
import com.raytheon.uf.viz.core.comm.ConnectivityManager.ConnectivityResult;
import com.raytheon.uf.viz.core.comm.IConnectivityCallback;
import com.raytheon.uf.viz.thinclient.Activator;
import com.raytheon.uf.viz.thinclient.ThinClientUriUtil;
import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
/**
@ -51,6 +52,7 @@ import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
* Jan 14, 2013 1469 bkowal The hdf5 data directory is no longer a
* preference.
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Feb 04, 2014 2704 njensen Only one field for proxy server
*
* </pre>
*
@ -61,9 +63,7 @@ public class ThinClientServerPreferences extends FieldEditorPreferencePage {
private BooleanFieldEditor useProxies;
private StringFieldEditor pypiesServer;
private StringFieldEditor servicesServer;
private StringFieldEditor proxyServer;
private Button connectivityButton;
@ -92,18 +92,11 @@ public class ThinClientServerPreferences extends FieldEditorPreferencePage {
"&Use Proxy Servers", getFieldEditorParent());
addField(useProxies);
servicesServer = new StringFieldEditor(
ThinClientPreferenceConstants.P_SERVICES_PROXY,
"&Services Address: ", getFieldEditorParent());
servicesServer.setErrorMessage("Cannot connect to Services server");
addField(servicesServer);
pypiesServer = new StringFieldEditor(
ThinClientPreferenceConstants.P_PYPIES_PROXY,
"&Pypies Address: ", getFieldEditorParent());
pypiesServer.setErrorMessage("Cannot connect to Pypies server");
addField(pypiesServer);
proxyServer = new StringFieldEditor(
ThinClientPreferenceConstants.P_PROXY_ADDRESS,
"&Proxy Address: ", getFieldEditorParent());
proxyServer.setErrorMessage("Cannot connect to Proxy server");
addField(proxyServer);
addConnectivityButton();
}
@ -131,43 +124,40 @@ public class ThinClientServerPreferences extends FieldEditorPreferencePage {
* Check the connectivity of the server field editors
*/
private void checkConnectivity() {
final ConnectivityResult result = new ConnectivityResult(false, "");
final ConnectivityResult servicesResult = new ConnectivityResult(false,
"");
final ConnectivityResult pypiesResult = new ConnectivityResult(false,
"");
String errorMessage = "Cannot connect to proxy server: ";
boolean serverError = false;
// check HTTP Server
Text text = servicesServer.getTextControl(getFieldEditorParent());
ConnectivityManager.checkLocalizationServer(text.getText().trim(),
Text text = proxyServer.getTextControl(getFieldEditorParent());
String proxyAddr = text.getText().trim();
ConnectivityManager.checkLocalizationServer(
ThinClientUriUtil.getServicesAddress(proxyAddr),
new IConnectivityCallback() {
@Override
public void connectionChecked(ConnectivityResult results) {
result.hasConnectivity = results.hasConnectivity;
servicesResult.hasConnectivity = results.hasConnectivity;
}
});
if (result.hasConnectivity) {
text.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_WHITE));
} else {
text.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_RED));
serverError = true;
}
// check Pypies Server
Text textPypies = pypiesServer.getTextControl(getFieldEditorParent());
ConnectivityManager.checkHttpServer(textPypies.getText().trim(),
ConnectivityManager.checkHttpServer(
ThinClientUriUtil.getPypiesAddress(proxyAddr),
new IConnectivityCallback() {
@Override
public void connectionChecked(ConnectivityResult results) {
result.hasConnectivity = results.hasConnectivity;
pypiesResult.hasConnectivity = results.hasConnectivity;
}
});
if (result.hasConnectivity) {
textPypies.setBackground(Display.getDefault().getSystemColor(
if (servicesResult.hasConnectivity && pypiesResult.hasConnectivity) {
text.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_WHITE));
} else {
textPypies.setBackground(Display.getDefault().getSystemColor(
text.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_RED));
serverError = true;
}
@ -191,8 +181,7 @@ public class ThinClientServerPreferences extends FieldEditorPreferencePage {
private void updateEnabledFields() {
boolean useProxies = this.useProxies.getBooleanValue();
servicesServer.setEnabled(useProxies, connectivityButton.getParent());
pypiesServer.setEnabled(useProxies, connectivityButton.getParent());
proxyServer.setEnabled(useProxies, connectivityButton.getParent());
connectivityButton.setEnabled(useProxies);
}

View file

@ -0,0 +1,91 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.thinclient;
/**
* Utilities for manipulating thin client URIs
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 3, 2014 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class ThinClientUriUtil {
private static String services = "services";
private static String pypies = "pypies";
static {
services = System.getProperty("thinclient.proxy.services", services);
pypies = System.getProperty("thinclient.proxy.pypies", pypies);
}
private ThinClientUriUtil() {
}
/**
* Returns the address to connect to EDEX services when going through the
* thin client proxy
*
* @param proxyAddress
* the address of the proxy server
* @return
*/
public static String getServicesAddress(String proxyAddress) {
return appendTrailingSlash(proxyAddress) + services;
}
/**
* Returns the address to connect to PyPIES when going through the thin
* client proxy
*
* @param proxyAddress
* the address of the proxy server
* @return
*/
public static String getPypiesAddress(String proxyAddress) {
return appendTrailingSlash(proxyAddress) + pypies;
}
/**
* Appends a trailing slash to an address if the address does not have one
*
* @param proxyAddress
* @return
*/
private static String appendTrailingSlash(String proxyAddress) {
if (!proxyAddress.endsWith("/")) {
proxyAddress += "/";
}
return proxyAddress;
}
}

View file

@ -25,15 +25,15 @@ import org.apache.commons.collections.map.DefaultedMap;
import org.eclipse.jface.preference.IPreferenceStore;
import com.raytheon.uf.common.comm.HttpClient;
import com.raytheon.uf.common.localization.msgs.GetServersRequest;
import com.raytheon.uf.common.localization.msgs.GetServersResponse;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.VizServers;
import com.raytheon.uf.viz.core.comm.ConnectivityManager;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.localization.LocalizationInitializer;
import com.raytheon.uf.viz.core.localization.LocalizationManager;
import com.raytheon.uf.viz.core.requests.ThriftClient;
import com.raytheon.uf.viz.thinclient.Activator;
import com.raytheon.uf.viz.thinclient.ThinClientUriUtil;
import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
import com.raytheon.uf.viz.thinclient.ui.ThinClientConnectivityDialog;
@ -51,8 +51,9 @@ import com.raytheon.uf.viz.thinclient.ui.ThinClientConnectivityDialog;
* Dec 06, 2012 1396 njensen Added setting VizServers
* Jan 14, 2013 1469 bkowal Removed setting the hdf5 data directory
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Aug 27, 2013 2295 bkowal The entire jms connection string is
* Aug 27, 2013 2295 bkowal The entire jms connection string is
* now provided by EDEX.
* Feb 04, 2014 2704 njensen Single proxy address/preference
*
* </pre>
*
@ -87,20 +88,25 @@ public class ThinClientLocalizationInitializer extends LocalizationInitializer {
.getBoolean(ThinClientPreferenceConstants.P_DISABLE_JMS);
if (store.getBoolean(ThinClientPreferenceConstants.P_USE_PROXIES)) {
String servicesProxy = store
.getString(ThinClientPreferenceConstants.P_SERVICES_PROXY);
LocalizationManager.getInstance().setCurrentServer(servicesProxy);
String proxyAddr = store
.getString(ThinClientPreferenceConstants.P_PROXY_ADDRESS);
String servicesProxy = ThinClientUriUtil
.getServicesAddress(proxyAddr);
LocalizationManager.getInstance().setCurrentServer(servicesProxy,
false);
VizApp.setHttpServer(servicesProxy);
if (!disableJMS) {
GetServersRequest req = new GetServersRequest();
GetServersResponse resp = (GetServersResponse) ThriftClient
.sendLocalizationRequest(req);
GetServersResponse resp = ConnectivityManager
.checkLocalizationServer(servicesProxy, false);
if (!disableJMS) {
VizApp.setJmsConnectionString(resp.getJmsConnectionString());
}
}
VizApp.setHttpServer(servicesProxy);
VizApp.setPypiesServer(store
.getString(ThinClientPreferenceConstants.P_PYPIES_PROXY));
String pypiesProxy = ThinClientUriUtil
.getPypiesAddress(proxyAddr);
VizApp.setPypiesServer(pypiesProxy);
boolean compressRequests = store
.getBoolean(ThinClientPreferenceConstants.P_ENABLE_REQUEST_COMPRESSION);
HttpClient.getInstance().setCompressRequests(compressRequests);

View file

@ -30,6 +30,7 @@ package com.raytheon.uf.viz.thinclient.preferences;
* ------------ ---------- ----------- --------------------------
* Oct 20, 2011 mschenke Initial creation
* Jan 14, 2013 1469 bkowal The hdf5 data directory is no longer a preference constant.
* Feb 04, 2014 2704 njensen Single proxy preference constant
*
* </pre>
*
@ -47,10 +48,6 @@ public class ThinClientPreferenceConstants {
public static String P_USE_PROXIES = "useHttpProxy";
public static String P_SERVICES_PROXY = "servicesProxyAddress";
public static String P_PYPIES_PROXY = "pypiesProxyAddress";
public static String P_MENU_TIME_UPDATE_INTERVALS = "menuTimeUpdateInterval";
public static String P_DATA_UPDATE_INTERVALS = "dataUpdateInterval";
@ -70,4 +67,6 @@ public class ThinClientPreferenceConstants {
public static String P_ENABLE_REQUEST_COMPRESSION = "enableRequestCompression";
public static String P_PREFERENCE_PLACEHOLDER = "placeholderPreference";
public static String P_PROXY_ADDRESS = "proxyAddress";
}

View file

@ -27,25 +27,30 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.raytheon.uf.common.localization.msgs.GetServersResponse;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.comm.ConnectivityManager;
import com.raytheon.uf.viz.core.comm.ConnectivityManager.ConnectivityResult;
import com.raytheon.uf.viz.core.comm.IConnectivityCallback;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.localization.ConnectivityPreferenceDialog;
import com.raytheon.uf.viz.core.localization.LocalizationConstants;
import com.raytheon.uf.viz.core.localization.LocalizationManager;
import com.raytheon.uf.viz.thinclient.Activator;
import com.raytheon.uf.viz.thinclient.ThinClientUriUtil;
import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
/**
* TODO Add Description
* Connectivity dialog for launching thinclient or thinalertviz. Contains extra
* options not available when connecting with a normal CAVE.
*
* <pre>
*
@ -55,6 +60,7 @@ import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
* ------------ ---------- ----------- --------------------------
* Nov 23, 2011 bsteffen Initial creation
* Aug 02, 2013 2202 bsteffen Add edex specific connectivity checking.
* Feb 04, 2014 2704 njensen Refactored
*
* </pre>
*
@ -71,8 +77,11 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
@Override
public void connectionChecked(ConnectivityResult results) {
servicesGood = results.hasConnectivity;
appendDetails(buildDetails(results));
if (!results.hasConnectivity && status == null) {
status = buildErrorMessage(results);
}
}
}
private class PypiesCallback implements IConnectivityCallback {
@ -80,26 +89,30 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
@Override
public void connectionChecked(ConnectivityResult results) {
pypiesGood = results.hasConnectivity;
appendDetails(buildDetails(results));
if (!results.hasConnectivity && status == null) {
status = buildErrorMessage(results);
}
}
}
private class JmsCallback implements IConnectivityCallback {
@Override
public void connectionChecked(ConnectivityResult results) {
jmsGood = results.hasConnectivity;
appendDetails(buildDetails(results));
if (!results.hasConnectivity && status == null) {
status = buildErrorMessage(results);
}
}
}
private Label servicesLabel;
private Text servicesText;
private String services = "";
private boolean servicesGood = false;
private IConnectivityCallback servicesCallback = new ServicesCallback();
private Label pypiesLabel;
private Text pypiesText;
private String pypies = "";
private boolean pypiesGood = false;
private IConnectivityCallback pypiesCallback = new PypiesCallback();
@ -108,15 +121,29 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
private boolean useProxy = false;
private Button disableJmsCheck;
private boolean disableJms = false;
private boolean jmsGood = false;
private Label jmsErrorLabel;
private IConnectivityCallback jmsCallback = new JmsCallback();
private Text proxyText;
private String proxyAddress;
public ThinClientConnectivityDialog(boolean checkAlertViz) {
super(checkAlertViz);
super(checkAlertViz, "Thin Client Connectivity Preferences");
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
useProxy = store
.getBoolean(ThinClientPreferenceConstants.P_USE_PROXIES);
services = store
.getString(ThinClientPreferenceConstants.P_SERVICES_PROXY);
pypies = store.getString(ThinClientPreferenceConstants.P_PYPIES_PROXY);
disableJms = store
.getBoolean(ThinClientPreferenceConstants.P_DISABLE_JMS);
proxyAddress = store
.getString(ThinClientPreferenceConstants.P_PROXY_ADDRESS);
}
@Override
@ -124,66 +151,75 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
super.createTextBoxes(textBoxComp);
Label label = new Label(textBoxComp, SWT.RIGHT);
label.setText("Use Proxy Servers:");
GridData gd = new GridData(SWT.RIGHT, SWT.None, true, true);
label.setText("Disable JMS:");
GridData gd = new GridData(SWT.RIGHT, SWT.CENTER, true, true);
gd.widthHint = 150;
label.setLayoutData(gd);
useProxyCheck = new Button(textBoxComp, SWT.CHECK | SWT.LEFT);
Composite jmsComp = new Composite(textBoxComp, SWT.NONE);
GridLayout gl = new GridLayout(2, false);
gl.marginHeight = 0;
gl.marginWidth = 0;
jmsComp.setLayout(gl);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
jmsComp.setLayoutData(gd);
disableJmsCheck = new Button(jmsComp, SWT.CHECK | SWT.LEFT);
disableJmsCheck.setSelection(disableJms);
disableJmsCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
disableJms = disableJmsCheck.getSelection();
validate();
}
});
jmsErrorLabel = new Label(jmsComp, SWT.LEFT);
jmsErrorLabel.setText("Error connecting to JMS");
jmsErrorLabel.setForeground(display.getSystemColor(SWT.COLOR_RED));
jmsErrorLabel.setVisible(false);
label = new Label(textBoxComp, SWT.RIGHT);
label.setText("Use Proxy Server:");
gd = new GridData(SWT.RIGHT, SWT.CENTER, true, true);
gd.widthHint = 150;
label.setLayoutData(gd);
Composite proxyComp = new Composite(textBoxComp, SWT.NONE);
gl = new GridLayout(2, false);
gl.marginHeight = 0;
gl.marginWidth = 0;
proxyComp.setLayout(gl);
gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
proxyComp.setLayoutData(gd);
useProxyCheck = new Button(proxyComp, SWT.CHECK | SWT.LEFT);
useProxyCheck.setSelection(useProxy);
useProxyCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateProxyEnabled();
}
});
servicesLabel = new Label(textBoxComp, SWT.RIGHT);
servicesLabel.setText("Services Proxy Address:");
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd.widthHint = 150;
servicesLabel.setLayoutData(gd);
proxyText = new Text(proxyComp, SWT.NONE | SWT.BORDER);
gd = new GridData(SWT.FILL, SWT.None, true, true);
proxyText.setLayoutData(gd);
proxyText.setText(proxyAddress == null ? "" : proxyAddress);
proxyText.setBackground(getTextColor(servicesGood && pypiesGood));
servicesText = new Text(textBoxComp, SWT.NONE);
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd.widthHint = 300;
servicesText.setLayoutData(gd);
servicesText.setText(services);
if (!servicesGood) {
servicesText.setBackground(textBoxComp.getDisplay().getSystemColor(
SWT.COLOR_RED));
}
pypiesLabel = new Label(textBoxComp, SWT.RIGHT);
pypiesLabel.setText("Pypies Proxy Address:");
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd.widthHint = 150;
pypiesLabel.setLayoutData(gd);
pypiesText = new Text(textBoxComp, SWT.NONE);
gd = new GridData(SWT.RIGHT, SWT.None, true, true);
gd.widthHint = 300;
pypiesText.setLayoutData(gd);
pypiesText.setText(pypies);
if (!pypiesGood) {
pypiesText.setBackground(textBoxComp.getDisplay().getSystemColor(
SWT.COLOR_RED));
}
updateProxyEnabled();
}
@Override
protected void applySettings() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setValue(ThinClientPreferenceConstants.P_USE_PROXIES, useProxy);
store.setValue(ThinClientPreferenceConstants.P_DISABLE_JMS, disableJms);
if (useProxy) {
store.setValue(ThinClientPreferenceConstants.P_SERVICES_PROXY,
services);
store.setValue(ThinClientPreferenceConstants.P_PYPIES_PROXY, pypies);
// Set the site and alertViz server for super.
LocalizationManager.getInstance().setCurrentSite(getSite());
store.setValue(ThinClientPreferenceConstants.P_USE_PROXIES,
useProxy);
store.setValue(ThinClientPreferenceConstants.P_PROXY_ADDRESS,
proxyAddress);
if (getAlertVizServer() != null) {
LocalizationManager
.getInstance()
@ -191,11 +227,11 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
.setValue(LocalizationConstants.P_ALERT_SERVER,
getAlertVizServer());
}
// setting the site will save the preference store
LocalizationManager.getInstance().setCurrentSite(getSite());
try {
((IPersistentPreferenceStore) store).save();
((IPersistentPreferenceStore) LocalizationManager.getInstance()
.getLocalizationStore()).save();
} catch (IOException e) {
statusHandler.handle(Priority.SIGNIFICANT,
"Unable to persist localization preference store", e);
@ -208,50 +244,88 @@ public class ThinClientConnectivityDialog extends ConnectivityPreferenceDialog {
@Override
public boolean validate() {
boolean superValid = super.validate();
if (!useProxy) {
return superValid;
return super.validate();
}
if (servicesText != null && !servicesText.isDisposed()
&& servicesText.isEnabled()) {
String services = servicesText.getText().trim();
if (!servicesGood || !this.services.equals(services)) {
this.services = services;
validateServices();
servicesText.setBackground(getTextColor(servicesGood));
}
} else {
status = null;
details = null;
// validate proxy
if (proxyText != null && !proxyText.isDisposed()
&& proxyText.isEnabled()) {
proxyAddress = proxyText.getText();
}
if (proxyAddress != null && proxyAddress.length() > 0) {
validateServices();
}
if (pypiesText != null && !pypiesText.isDisposed()
&& pypiesText.isEnabled()) {
String pypies = pypiesText.getText().trim();
if (!pypiesGood || !this.pypies.equals(pypies)) {
this.pypies = pypies;
validatePypies();
pypiesText.setBackground(getTextColor(pypiesGood));
}
} else {
validatePypies();
} else {
status = "Please enter a thin client proxy server address";
}
return servicesGood && pypiesGood && isSiteGood() && isAlertVizGood();
if (proxyText != null && !proxyText.isDisposed()) {
proxyText.setBackground(getTextColor(servicesGood && pypiesGood));
}
// only check Jms if it's enabled and we can connect to the services
if (!disableJms) {
if (servicesGood) {
try {
GetServersResponse response = ConnectivityManager
.checkLocalizationServer(ThinClientUriUtil
.getServicesAddress(proxyAddress), false);
ConnectivityManager.checkJmsServer(
response.getJmsConnectionString(), jmsCallback);
} catch (VizException e) {
if (status == null) {
status = "Error connecting to JMS";
}
appendDetails(buildDetails(new ConnectivityResult(false,
null, e)));
jmsGood = false;
}
} else {
// JMS can't be good if services fail cause then we don't
// even know where to connect JMS to
jmsGood = false;
}
}
jmsGood = (jmsGood || disableJms);
if (jmsErrorLabel != null && !jmsErrorLabel.isDisposed()) {
jmsErrorLabel.setVisible(!jmsGood);
}
// validate site
if (siteText != null && !siteText.isDisposed()) {
super.setSite(siteText.getText());
}
super.validateSite();
if (siteText != null && !siteText.isDisposed()) {
siteText.setBackground(getTextColor(isSiteGood()));
}
boolean everythingGood = servicesGood && pypiesGood && isSiteGood()
&& isAlertVizGood() && jmsGood;
updateStatus(everythingGood, status, details);
return everythingGood;
}
private void validateServices() {
ConnectivityManager.checkLocalizationServer(services, servicesCallback);
ConnectivityManager.checkLocalizationServer(
ThinClientUriUtil.getServicesAddress(proxyAddress),
servicesCallback);
}
private void validatePypies() {
ConnectivityManager.checkHttpServer(pypies, pypiesCallback);
ConnectivityManager.checkHttpServer(
ThinClientUriUtil.getPypiesAddress(proxyAddress),
pypiesCallback);
}
private void updateProxyEnabled() {
useProxy = useProxyCheck.getSelection();
servicesLabel.setEnabled(useProxy);
servicesText.setEnabled(useProxy);
pypiesLabel.setEnabled(useProxy);
pypiesText.setEnabled(useProxy);
setLocalizationEnabled(!useProxy);
proxyText.setEnabled(useProxy);
super.setLocalizationEnabled(!useProxy);
validate();
}

View file

@ -104,6 +104,8 @@ import com.raytheon.uf.common.util.ByteArrayOutputStreamPool.ByteArrayOutputStre
* Mar 11, 2013 1786 mpduff Add https capability.
* Jun 12, 2013 2102 njensen Better error handling when using
* DynamicSerializeStreamHandler
* Feb 04, 2014 2704 njensen Better error message with bad address
* Https authentication failures notify handler
*
* </pre>
*
@ -400,7 +402,6 @@ public class HttpClient {
private HttpClient() {
}
private org.apache.http.client.HttpClient getHttpsInstance() {
return HttpsHolder.sslClient;
}
@ -539,6 +540,14 @@ public class HttpClient {
"Error retrying http request", e);
return resp;
}
if (resp.getStatusLine().getStatusCode() == 401) {
// obtained credentials and they failed!
if (handler != null) {
handler.credentialsFailed();
}
}
}
} else {
resp = getHttpInstance().execute(put);
@ -589,6 +598,10 @@ public class HttpClient {
try {
String host = put.getURI().getHost();
if (host == null) {
throw new InvalidURIException("Invalid URI: "
+ put.getURI().toString());
}
ongoing = currentRequestsCount.get(host);
if (ongoing == null) {
ongoing = new AtomicInteger();
@ -651,21 +664,21 @@ public class HttpClient {
// so we only want to error off here if we're using a
// DynamicSerializeStreamHandler because deserializing will fail
// badly
String exceptionMsg = "HTTP server returned error code: "
+ resp.getStatusLine().getStatusCode();
int statusCode = resp.getStatusLine().getStatusCode();
DefaultInternalStreamHandler errorHandler = new DefaultInternalStreamHandler();
String serverErrorMsg = null;
String exceptionMsg = null;
try {
errorHandler.handleStream(resp.getEntity().getContent());
serverErrorMsg = new String(errorHandler.byteResult);
exceptionMsg = new String(errorHandler.byteResult);
} catch (IOException e) {
statusHandler
.warn("Error reading the server's error message");
}
if (serverErrorMsg != null) {
exceptionMsg += "\n" + serverErrorMsg;
if (exceptionMsg == null) {
exceptionMsg = "HTTP server returned error code: "
+ statusCode;
}
throw new CommunicationException(exceptionMsg);
throw new HttpServerException(exceptionMsg, statusCode);
}
// should only be able to get here if we didn't encounter the
@ -720,7 +733,7 @@ public class HttpClient {
// if there was an error reading the input stream,
// notify but continue
statusHandler.handle(Priority.EVENTB,
"Error reading InputStream, assuming closed", e);
"Error reading InputStream, assuming closed");
}
try {
SafeGzipDecompressingEntity.close();
@ -1173,7 +1186,7 @@ public class HttpClient {
new AuthScope(host, port),
new UsernamePasswordCredentials(username, password));
}
/**
* @param httpsConfiguration
* the httpsConfiguration to set
@ -1188,5 +1201,5 @@ public class HttpClient {
public IHttpsConfiguration getHttpsConfiguration() {
return httpsConfiguration;
}
}

View file

@ -0,0 +1,71 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.common.comm;
/**
* A communication exception corresponding to an error returned from an http
* server and including the http status code.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 6, 2014 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class HttpServerException extends CommunicationException {
private static final long serialVersionUID = 1L;
private int statusCode;
public HttpServerException() {
super();
}
public HttpServerException(String message, Throwable cause) {
super(message, cause);
}
public HttpServerException(String message) {
super(message);
}
public HttpServerException(Throwable cause) {
super(cause);
}
public HttpServerException(String message, int statusCode) {
super(message);
this.statusCode = statusCode;
}
public int getStatusCode() {
return statusCode;
}
}

View file

@ -28,7 +28,9 @@ package com.raytheon.uf.common.comm;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 4, 2013 1786 mpduff Initial creation
* Mar 04, 2013 1786 mpduff Initial creation
* Feb 10, 2014 2704 njensen Added credentialsFailed()
*
*
* </pre>
*
@ -48,4 +50,6 @@ public interface IHttpsCredentialsHandler {
* @return String Array, username and password
*/
String[] getCredentials(String authValue);
void credentialsFailed();
}

View file

@ -0,0 +1,60 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.common.comm;
/**
* A communication exception specific to an invalid URI, such as
* http//someAddress (instead of http://someAddress)
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 6, 2014 njensen Initial creation
*
* </pre>
*
* @author njensen
* @version 1.0
*/
public class InvalidURIException extends CommunicationException {
private static final long serialVersionUID = 1L;
public InvalidURIException() {
super();
}
public InvalidURIException(String message, Throwable cause) {
super(message, cause);
}
public InvalidURIException(String message) {
super(message);
}
public InvalidURIException(Throwable cause) {
super(cause);
}
}

View file

@ -47,7 +47,7 @@ public class WfsConnectionUtil {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(WfsConnectionUtil.class);
private static final Pattern COMMA_PATTERN = Pattern.compile(",");
/**
@ -119,6 +119,7 @@ public class WfsConnectionUtil {
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 19, 2013 2120 dhladky Initial creation
* Feb 10, 2014 2704 njensen Added credentialsFailed()
*
* </pre>
*
@ -141,6 +142,12 @@ public class WfsConnectionUtil {
this.password = password;
this.username = username;
}
@Override
public void credentialsFailed() {
statusHandler
.error("Failed to authenticate with supplied username and password");
}
}
/**
@ -196,9 +203,11 @@ public class WfsConnectionUtil {
return httpPort;
}
}
/**
* Removes un-needed unique Identifier from PointDataSetMetaData derived URL's
* Removes un-needed unique Identifier from PointDataSetMetaData derived
* URL's
*
* @param rootUrl
* @return
*/

View file

@ -46,4 +46,10 @@ public class TestHttpsCredentialsHandler implements IHttpsCredentialsHandler {
return new String[] { HttpTestConstants.USERNAME,
HttpTestConstants.PASSWD };
}
@Override
public void credentialsFailed() {
// TODO Auto-generated method stub
}
}

View file

@ -37,11 +37,18 @@ package com.raytheon.uf.common.comm;
* @version 1.0
*/
public class TestProxyHttpsCredentialsHandler implements IHttpsCredentialsHandler {
public class TestProxyHttpsCredentialsHandler implements
IHttpsCredentialsHandler {
@Override
public String[] getCredentials(String message) {
return new String[] { HttpTestConstants.USERNAME,
HttpTestConstants.PASSWD };
}
@Override
public void credentialsFailed() {
// TODO Auto-generated method stub
}
}