gov.nist.spectrumbrowser.client.SpectrumBrowser.java Source code

Java tutorial

Introduction

Here is the source code for gov.nist.spectrumbrowser.client.SpectrumBrowser.java

Source

/*
* Conditions Of Use 
* 
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), and others. 
* This software has been contributed to the public domain. 
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. 
* As a result, a formal license is not needed to use this software.
* 
* This software is provided "AS IS."  
* NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY.  NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* this software.
*/
package gov.nist.spectrumbrowser.client;

import gov.nist.spectrumbrowser.admin.Admin;
import gov.nist.spectrumbrowser.admin.ScreenConfig;
import gov.nist.spectrumbrowser.admin.SystemConfig;
import gov.nist.spectrumbrowser.common.AbstractSpectrumBrowser;
import gov.nist.spectrumbrowser.common.AbstractSpectrumBrowserService;
import gov.nist.spectrumbrowser.common.Defines;
import gov.nist.spectrumbrowser.common.SpectrumBrowserCallback;

import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.Window.ClosingHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.reveregroup.gwt.imagepreloader.FitImage;
import com.reveregroup.gwt.imagepreloader.ImageLoadEvent;
import com.reveregroup.gwt.imagepreloader.ImageLoadHandler;
import com.reveregroup.gwt.imagepreloader.ImagePreloader;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class SpectrumBrowser extends AbstractSpectrumBrowser implements EntryPoint {

    private Image waitImage;
    private String sessionToken;
    private boolean userLoggedIn;
    public static TextBox emailEntry;
    public static int MAP_WIDTH = 600;
    private static Button confirmButton;
    private String loginEmailAddress = null;
    private MyHandler handler = new MyHandler();
    public static PasswordTextBox passwordEntry;
    public static final String LOGOFF_LABEL = "Logoff";
    public static int SPEC_WIDTH, SPEC_HEIGHT, MAP_HEIGHT;
    public static VerticalPanel rootVerticalPanel, verticalPanel;
    private static Logger logger = Logger.getLogger("SpectrumBrowser");
    private Button sendButton, createButton, forgotButton, changeButton;
    private static HashMap<String, SensorInfoDisplay> sensorInformationTable = new HashMap<String, SensorInfoDisplay>();
    private static SpectrumBrowserServiceAsync spectrumBrowserService = new SpectrumBrowserServiceAsyncImpl(
            getBaseUrl());
    private static String systemWarning = "You are accessing a U.S. Government information system, "
            + "which includes: 1) this computer, 2) this computer network, 3) all computers  "
            + "connected to this network, and 4) all devices and storage media attached to this "
            + "network or to a computer on this network. You understand and consent to the following: "
            + "you may access this information system for authorized use only; "
            + "you have no reasonable expectation of privacy regarding any communication of "
            + "data transiting or stored on this information system; at any time and for any "
            + "lawful Government purpose, the Government may monitor, intercept, and search and "
            + "seize any communication or data transiting or stored on this information system; "
            + "and any communications or data transiting or stored on this information system may "
            + "be disclosed or used for any lawful Government purpose.";
    static {
        GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
            public void onUncaughtException(Throwable e) {
                logger.log(Level.SEVERE, "Uncaught Exception", e);
            }
        });
        Window.addWindowClosingHandler(new ClosingHandler() {
            @Override
            public void onWindowClosing(ClosingEvent event) {
                event.setMessage("Spectrum Browser: Close this window?");

            }
        });

        // Logoff on close.
        Window.addCloseHandler(new CloseHandler<Window>() {
            @Override
            public void onClose(CloseEvent<Window> event) {
                spectrumBrowserService.logOff(new SpectrumBrowserCallback<String>() {
                    @Override
                    public void onSuccess(String result) {
                        Window.alert("Successfully logged off.");

                    }

                    @Override
                    public void onFailure(Throwable throwable) {
                        // TODO Auto-generated method stub

                    }
                });
            }
        });
    }

    @Override
    public void onModuleLoad() {
        logger.fine("onModuleLoad");

        spectrumBrowserService.getScreenConfig(new SpectrumBrowserCallback<String>() {
            @Override
            public void onSuccess(String result) {
                try {
                    logger.finer("Result: " + result);
                    JSONValue jsonValue = JSONParser.parseLenient(result);

                    SpectrumBrowser.MAP_WIDTH = (int) jsonValue.isObject().get(Defines.MAP_WIDTH).isNumber()
                            .doubleValue();

                    SpectrumBrowser.MAP_HEIGHT = (int) jsonValue.isObject().get(Defines.MAP_HEIGHT).isNumber()
                            .doubleValue();

                    SpectrumBrowser.SPEC_WIDTH = (int) jsonValue.isObject().get(Defines.SPEC_WIDTH).isNumber()
                            .doubleValue();

                    SpectrumBrowser.SPEC_HEIGHT = (int) jsonValue.isObject().get(Defines.SPEC_HEIGHT).isNumber()
                            .doubleValue();
                    Window.setTitle("MSOD:Login");
                    for (int i = 0; i < RootPanel.get().getWidgetCount(); i++) {
                        RootPanel.get().remove(i);
                    }
                    rootVerticalPanel = new VerticalPanel();
                    rootVerticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
                    rootVerticalPanel.setStyleName("loginPanel");
                    RootPanel.get().add(rootVerticalPanel);
                    ImagePreloader.load(SpectrumBrowser.getIconsPath() + "ajax-loader.gif", new ImageLoadHandler() {

                        @Override
                        public void imageLoaded(ImageLoadEvent event) {
                            waitImage.setUrl(event.getImageUrl());
                            waitImage.setVisible(false);
                        }
                    });

                    HorizontalPanel waitImagePanel = new HorizontalPanel();
                    waitImagePanel.setHeight(40 + "px");
                    waitImage = new FitImage();
                    waitImagePanel.add(waitImage);
                    rootVerticalPanel.add(waitImagePanel);

                    HorizontalPanel hpanel = new HorizontalPanel();
                    int height = 50;
                    Image nistLogo = new Image(SpectrumBrowser.getIconsPath() + "nist-logo.png");
                    nistLogo.setPixelSize((int) (215.0 / 95.0) * height, height);
                    Image ntiaLogo = new Image(SpectrumBrowser.getIconsPath() + "ntia-logo.png");
                    ntiaLogo.setPixelSize(height, height);
                    hpanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
                    hpanel.add(nistLogo);
                    HTML html = new HTML("<h2>CAC Measured Spectrum Occupancy Database (BETA)</h2>");
                    hpanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
                    hpanel.add(html);
                    hpanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
                    hpanel.add(ntiaLogo);

                    rootVerticalPanel.add(hpanel);
                    verticalPanel = new VerticalPanel();
                    verticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
                    verticalPanel.setStyleName("loginPanel");
                    verticalPanel.setSpacing(20);
                    rootVerticalPanel.add(verticalPanel);

                    if (jsonValue.isObject().get(Defines.WARNING_TEXT) != null) {
                        SpectrumBrowser.systemWarning = jsonValue.isObject().get(Defines.WARNING_TEXT).isString()
                                .stringValue();
                    }

                    if (systemWarning != null) {
                        displayWarning();
                    } else {
                        draw();
                    }
                } catch (Throwable th) {
                    logger.log(Level.SEVERE, "Error Parsing JSON", th);
                }
            }

            @Override
            public void onFailure(Throwable throwable) {
                Window.alert("Error contacting server. Please try later");
            }

        });
    }

    public void showWaitImage() {
        waitImage.setVisible(true);
    }

    public void hideWaitImage() {
        waitImage.setVisible(false);
    }

    public void draw() {

        spectrumBrowserService.isAuthenticationRequired(new SpectrumBrowserCallback<String>() {

            @Override
            public void onSuccess(String result) {
                try {
                    verticalPanel.clear();
                    logger.finer("Result: " + result);
                    JSONValue jsonValue = JSONParser.parseLenient(result);
                    boolean isAuthenticationRequired = jsonValue.isObject().get("AuthenticationRequired")
                            .isBoolean().booleanValue();
                    if (isAuthenticationRequired) {
                        Grid grid = new Grid(2, 2);

                        grid.setText(0, 0, "Email Address");
                        emailEntry = new TextBox();
                        emailEntry.setWidth("250px");
                        emailEntry.addKeyDownHandler(handler);
                        grid.setWidget(0, 1, emailEntry);

                        grid.setText(1, 0, "Password");
                        passwordEntry = new PasswordTextBox();
                        passwordEntry.setWidth("250px");
                        passwordEntry.addKeyDownHandler(handler);
                        grid.setWidget(1, 1, passwordEntry);

                        grid.getCellFormatter().addStyleName(0, 0, "alignMagic");
                        grid.getCellFormatter().addStyleName(1, 0, "alignMagic");

                        verticalPanel.add(grid);

                        Grid buttonGrid = new Grid(1, 4);

                        sendButton = new Button("Sign in");
                        sendButton.addStyleName("sendButton");
                        sendButton.addClickHandler(handler);
                        buttonGrid.setWidget(0, 0, sendButton);

                        createButton = new Button("Request Account");
                        createButton.addClickHandler(handler);
                        buttonGrid.setWidget(0, 1, createButton);

                        forgotButton = new Button("Reset Password");
                        forgotButton.addClickHandler(handler);
                        buttonGrid.setWidget(0, 2, forgotButton);

                        changeButton = new Button("Change Password");
                        changeButton.addClickHandler(handler);
                        buttonGrid.setWidget(0, 3, changeButton);

                        verticalPanel.add(buttonGrid);
                    } else {
                        sessionToken = jsonValue.isObject().get(Defines.SESSION_TOKEN).isString().stringValue();
                        setSessionToken(sessionToken);
                        SpectrumBrowser.this.showWaitImage();
                        new SpectrumBrowserShowDatasets(SpectrumBrowser.this, verticalPanel);
                    }
                } catch (Throwable th) {
                    logger.log(Level.SEVERE, "Error Parsing JSON", th);
                    Window.alert("Error Communicating with server");
                    onModuleLoad();
                }
            }

            @Override
            public void onFailure(Throwable throwable) {
                Window.alert("Error contacting server. Please try later");
            }

        });
    }

    private void displayWarning() {
        verticalPanel.clear();

        verticalPanel.add(new HTML(systemWarning));
        confirmButton = new Button("OK");
        verticalPanel.add(confirmButton);
        confirmButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                draw();
            }
        });
    }

    private void loginHandler() {
        String emailAddress, password;
        emailAddress = password = "";

        emailAddress = emailEntry.getValue().trim();
        password = passwordEntry.getValue();

        logger.finer("LogintoServer: " + emailAddress);
        if (emailAddress == null || emailAddress.length() == 0) {
            Window.alert("Email address is required");
            return;
        }
        if (password == null || password.length() == 0) {
            Window.alert("Password is required");
            return;
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put(Defines.ACCOUNT_EMAIL_ADDRESS, new JSONString(emailAddress));
        jsonObject.put(Defines.ACCOUNT_PASSWORD, new JSONString(password));
        jsonObject.put(Defines.ACCOUNT_PRIVILEGE, new JSONString(Defines.USER_PRIVILEGE));
        setLoginEmailAddress(emailAddress);

        getSpectrumBrowserService().authenticate(jsonObject.toString(), new SpectrumBrowserCallback<String>() {
            @Override
            public void onFailure(Throwable errorTrace) {
                logger.log(Level.SEVERE, "Error sending request to the server", errorTrace);
                Window.alert("Error communicating with the server.");
            }

            @Override
            public void onSuccess(String result) {
                try {
                    JSONValue jsonValue = JSONParser.parseStrict(result);
                    JSONObject jsonObject = jsonValue.isObject();
                    String status = jsonObject.get(Defines.STATUS).isString().stringValue();
                    String statusMessage = jsonObject.get(Defines.STATUS_MESSAGE).isString().stringValue();
                    if (status.equals("OK")) {
                        sessionToken = jsonObject.get(Defines.SESSION_ID).isString().stringValue();
                        setSessionToken(sessionToken);
                        setUserLoggedIn(true);
                        SpectrumBrowser.this.showWaitImage();
                        new SpectrumBrowserShowDatasets(SpectrumBrowser.this, verticalPanel);
                    } else {
                        Window.alert(statusMessage);
                    }
                } catch (Throwable ex) {
                    Window.alert("Problem parsing json");
                    logger.log(Level.SEVERE, " Problem parsing json", ex);

                }
            }
        });
    }

    private class MyHandler implements ClickHandler, KeyDownHandler {

        @Override
        public void onKeyDown(KeyDownEvent event) {
            if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
                loginHandler();
            }
        }

        @Override
        public void onClick(ClickEvent event) {

            if (sendButton == event.getSource()) {
                loginHandler();
            }

            if (createButton == event.getSource()) {
                new UserCreateAccount(verticalPanel, SpectrumBrowser.this).draw();
            }

            if (forgotButton == event.getSource()) {
                new UserForgotPassword(verticalPanel, SpectrumBrowser.this).draw();
            }

            if (changeButton == event.getSource()) {
                new UserChangePassword(verticalPanel, Defines.USER_PRIVILEGE, SpectrumBrowser.this).draw();
            }
        }

    }

    public void logoff() {
        spectrumBrowserService.logOff(new SpectrumBrowserCallback<String>() {
            @Override
            public void onFailure(Throwable caught) {
                SpectrumBrowser.clearSessionTokens();
                SpectrumBrowser.destroySessionToken();
                verticalPanel.clear();
                if (systemWarning != null) {
                    displayWarning();
                } else {
                    draw();
                }
            }

            @Override
            public void onSuccess(String result) {
                SpectrumBrowser.clearSessionTokens();
                SpectrumBrowser.destroySessionToken();
                verticalPanel.clear();
                if (systemWarning != null) {
                    displayWarning();
                } else {
                    draw();
                }
            }
        });
    }

    public SpectrumBrowserServiceAsync getSpectrumBrowserService() {
        return spectrumBrowserService;
    }

    @Override
    public boolean isUserLoggedIn() {
        return userLoggedIn;
    }

    public void displayError(String errorMessage) {
        Window.alert(errorMessage);
        if (this.isUserLoggedIn())
            logoff();
    }

    public static String getGeneratedDataPath(String sensorId) {
        SensorInfoDisplay si = sensorInformationTable.get(sensorId);
        if (si == null) {
            logger.severe("getGeneratedDataPath: Null returned from sensorInformationTable for " + sensorId);
            return null;
        } else {
            return si.getBaseUrl() + "/generated/";
        }
    }

    public void setUserLoggedIn(boolean flag) {
        this.userLoggedIn = flag;
    }

    public static void addSensor(SensorInfoDisplay sensorInformation) {
        sensorInformationTable.put(sensorInformation.getId(), sensorInformation);
    }

    public static String getBaseUrl(String sensorId) {
        SensorInfoDisplay si = sensorInformationTable.get(sensorId);
        if (si == null) {
            return null;
        } else {
            return si.getBaseUrl() + "/spectrumbrowser/";
        }
    }

    public static void clearSensorInformation() {
        logger.finer("clearSensorInformation");
        String sessionToken = getSessionToken();
        sensorInformationTable.clear();
        clearSessionTokens();
        setSessionToken(sessionToken);
    }

    public static String getSessionTokenForSensor(String sensorId) {
        String url = sensorInformationTable.get(sensorId).getBaseUrl();
        logger.finer("getSessionTokenForSensor: " + sensorId + " / " + url);
        return getSessionToken(url);
    }

    public static String getBaseUrlAuthority(String sensorId) {
        SensorInfoDisplay si = sensorInformationTable.get(sensorId);
        if (si == null) {
            return null;
        } else {
            return si.getBaseUrl();
        }
    }

    public static void logoffAllSensors() {
        spectrumBrowserService.logOff(new SpectrumBrowserCallback<String>() {
            @Override
            public void onSuccess(String result) {
            }

            @Override
            public void onFailure(Throwable throwable) {
                logger.log(Level.SEVERE, "Problem logging off", throwable);
            }
        });
        for (String sensorId : SpectrumBrowser.sensorInformationTable.keySet())
            spectrumBrowserService.logOff(sensorId, new SpectrumBrowserCallback<String>() {

                @Override
                public void onSuccess(String result) {
                }

                @Override
                public void onFailure(Throwable throwable) {
                    logger.log(Level.SEVERE, "Problem logging off", throwable);

                }
            });
    }

    public void setLoginEmailAddress(String emailAddress) {
        this.loginEmailAddress = emailAddress;
    }

    public String getLoginEmailAddress() {
        return this.loginEmailAddress;
    }

}