opus.gwt.management.console.client.deployer.ProjectDeployerController.java Source code

Java tutorial

Introduction

Here is the source code for opus.gwt.management.console.client.deployer.ProjectDeployerController.java

Source

/*############################################################################
# Copyright 2010 North Carolina State University                             #
#                                                                            #
#   Licensed under the Apache License, Version 2.0 (the "License");          #
#   you may not use this file except in compliance with the License.         #
#   You may obtain a copy of the License at                                  #
#                                                                            #
#       http://www.apache.org/licenses/LICENSE-2.0                           #
#                                                                            #
#   Unless required by applicable law or agreed to in writing, software      #
#   distributed under the License is distributed on an "AS IS" BASIS,        #
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
#   See the License for the specific language governing permissions and      #
#   limitations under the License.                                           #
############################################################################*/

package opus.gwt.management.console.client.deployer;

import java.util.ArrayList;

import opus.gwt.management.console.client.ClientFactory;
import opus.gwt.management.console.client.JSVariableHandler;
import opus.gwt.management.console.client.event.AsyncRequestEvent;
import opus.gwt.management.console.client.event.BreadCrumbEvent;
import opus.gwt.management.console.client.event.DeployProjectEvent;
import opus.gwt.management.console.client.event.DeployProjectEventHandler;
import opus.gwt.management.console.client.event.PanelTransitionEvent;
import opus.gwt.management.console.client.event.PanelTransitionEventHandler;
import opus.gwt.management.console.client.resources.ProjectDeployerCss.ProjectDeployerStyle;
import opus.gwt.management.console.client.resources.images.OpusImages;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Widget;

public class ProjectDeployerController extends Composite {

    private static applicationDeployerUiBinder uiBinder = GWT.create(applicationDeployerUiBinder.class);

    interface applicationDeployerUiBinder extends UiBinder<Widget, ProjectDeployerController> {
    }

    private final String deploymentURL = "/deployments/projectName/";

    private ProjectOptionsPanel projectOptionsPanel;
    private DatabaseOptionsPanel databaseOptionsPanel;
    private DeploymentOptionsPanel deploymentOptionsPanel;
    private AppBrowserPanel appBrowserPanel;
    private EventBus eventBus;
    private String createdProjectName;
    private PopupPanel loadingPopup;
    private JSVariableHandler jsVarHandler;
    private ClientFactory clientFactory;
    private int currentPanelIndex;

    @UiField
    DeckPanel deployerDeckPanel;
    @UiField
    ProjectDeployerStyle style;

    public ProjectDeployerController(ClientFactory clientFactory) {
        initWidget(uiBinder.createAndBindUi(this));
        this.createdProjectName = "";
        this.currentPanelIndex = 0;
        this.eventBus = clientFactory.getEventBus();
        this.clientFactory = clientFactory;
        this.jsVarHandler = clientFactory.getJSVariableHandler();
        this.loadingPopup = new PopupPanel(false, true);
        this.appBrowserPanel = new AppBrowserPanel(clientFactory);
        this.projectOptionsPanel = new ProjectOptionsPanel(clientFactory);
        this.databaseOptionsPanel = new DatabaseOptionsPanel(clientFactory);
        this.deploymentOptionsPanel = new DeploymentOptionsPanel(clientFactory);
        setupLoadingPopup();
        setupDeployerDeckPanel();
        registerHandlers();
        setupBreadCrumbs();
        String token = jsVarHandler.getProjectToken();
        if (token != null) {
            eventBus.fireEvent(new AsyncRequestEvent("handleImportAppList", token));
        }
    }

    private void setupDeployerDeckPanel() {
        deployerDeckPanel.add(appBrowserPanel);
        deployerDeckPanel.add(projectOptionsPanel);
        deployerDeckPanel.add(databaseOptionsPanel);
        deployerDeckPanel.add(deploymentOptionsPanel);
        appBrowserPanel.setTitle("Application Browser");
        projectOptionsPanel.setTitle("Project Options");
        databaseOptionsPanel.setTitle("Database Options");
        deploymentOptionsPanel.setTitle("Deployment Options");
        deployerDeckPanel.showWidget(0);
        appBrowserPanel.setHeight("");
        appBrowserPanel.setWidth("");
    }

    private void setupBreadCrumbs() {
        String[] crumbs = { appBrowserPanel.getTitle(), projectOptionsPanel.getTitle(),
                databaseOptionsPanel.getTitle(), deploymentOptionsPanel.getTitle() };
        eventBus.fireEvent(new BreadCrumbEvent(BreadCrumbEvent.Action.SET_CRUMBS, crumbs));
    }

    private void registerHandlers() {
        eventBus.addHandler(PanelTransitionEvent.TYPE, new PanelTransitionEventHandler() {
            public void onPanelTransition(PanelTransitionEvent event) {
                if (event.getTransitionType() == PanelTransitionEvent.TransitionTypes.NEXT) {
                    currentPanelIndex++;
                    Widget panel = event.getPanel();
                    deployerDeckPanel.showWidget(currentPanelIndex);
                    eventBus.fireEvent(new BreadCrumbEvent(BreadCrumbEvent.Action.SET_ACTIVE,
                            deployerDeckPanel.getWidget(deployerDeckPanel.getVisibleWidget()).getTitle()));
                    setFocus(panel);
                } else if (event.getTransitionType() == PanelTransitionEvent.TransitionTypes.PREVIOUS) {
                    currentPanelIndex--;
                    deployerDeckPanel.showWidget(currentPanelIndex);
                    eventBus.fireEvent(new BreadCrumbEvent(BreadCrumbEvent.Action.SET_ACTIVE,
                            deployerDeckPanel.getWidget(deployerDeckPanel.getVisibleWidget()).getTitle()));
                }
                if (event.getTransitionType() == PanelTransitionEvent.TransitionTypes.DEPLOY) {
                    reset();
                }
            }
        });
        eventBus.addHandler(DeployProjectEvent.TYPE, new DeployProjectEventHandler() {
            public void onDeployProject(DeployProjectEvent event) {
                deployProject();
            }
        });
    }

    private void reset() {
        projectOptionsPanel.reset();
        appBrowserPanel.reset();
        databaseOptionsPanel.reset();
        deploymentOptionsPanel.reset();
        setupBreadCrumbs();
        deployerDeckPanel.showWidget(0);
        currentPanelIndex = 0;
    }

    private void setupLoadingPopup() {
        FlowPanel fp = new FlowPanel();
        Label label = new Label("Deploying Project...");
        Image loadingImage = new Image(OpusImages.INSTANCE.loadingSpinner());
        loadingImage.setStyleName(style.loadingImage());
        label.setStyleName(style.loadingLabel());
        fp.add(loadingImage);
        fp.add(label);
        loadingPopup.add(fp);
    }

    public void setFocus(Widget panel) {
        if (panel.getClass().equals(databaseOptionsPanel.getClass())) {
            deploymentOptionsPanel.setFocus();
        } else if (panel.getClass().equals(appBrowserPanel.getClass())) {
            projectOptionsPanel.setFocus();
        } else if (panel.getClass().equals(projectOptionsPanel.getClass())) {
            databaseOptionsPanel.setFocus();
        }
    }

    private void deployProject() {
        createdProjectName = deploymentOptionsPanel.getProjectName();

        ArrayList<String> paths = appBrowserPanel.getAppPaths();
        ArrayList<String> apptypes = appBrowserPanel.getAppTypes();
        ArrayList<String> appNames = appBrowserPanel.getAppNames();

        StringBuffer formBuilder = new StringBuffer();
        formBuilder.append("csrfmiddlewaretoken=");
        formBuilder.append(URL.encodeQueryString(jsVarHandler.getCSRFTokenURL()));

        formBuilder.append("&form-TOTAL_FORMS=");
        formBuilder.append(URL.encodeQueryString(String.valueOf(paths.size())));
        formBuilder.append("&form-INITIAL_FORMS=");
        formBuilder.append(URL.encodeQueryString(String.valueOf(0)));
        formBuilder.append("&form-MAX_NUM_FORMS=");

        for (int i = 0; i < paths.size(); i++) {
            formBuilder.append("&form-" + i + "-apptype=");
            formBuilder.append(apptypes.get(i));

            formBuilder.append("&form-" + i + "-apppath=");
            formBuilder.append(paths.get(i));

            formBuilder.append("&form-" + i + "-appname=");
            formBuilder.append(appNames.get(i));
        }

        formBuilder.append(deploymentOptionsPanel.getPostData());
        formBuilder.append(projectOptionsPanel.getPostData());
        formBuilder.append(databaseOptionsPanel.getPostData());

        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,
                "/deployments/" + createdProjectName + "/");
        builder.setHeader("Content-type", "application/x-www-form-urlencoded");
        //builder.setHeader(header, value);

        try {
            Request request = builder.sendRequest(formBuilder.toString(), new RequestCallback() {
                public void onError(Request request, Throwable exception) {
                    ErrorPanel ep = new ErrorPanel(clientFactory);
                    ep.errorHTML.setHTML("<p>Error Occured</p>");
                    deployerDeckPanel.add(ep);
                    deployerDeckPanel.showWidget(deployerDeckPanel.getWidgetIndex(ep));
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getText().contains("Back to")) {
                        loadingPopup.hide();
                        eventBus.fireEvent(new AsyncRequestEvent("addProject", createdProjectName));
                    } else {
                        loadingPopup.hide();
                        ErrorPanel ep = new ErrorPanel(clientFactory);
                        ep.errorHTML.setHTML(response.getText());
                        deployerDeckPanel.add(ep);
                        deployerDeckPanel.showWidget(deployerDeckPanel.getWidgetIndex(ep));
                    }
                }
            });
        } catch (RequestException e) {

        }

        loadingPopup.setGlassEnabled(true);
        loadingPopup.setGlassStyleName(style.loadingGlass());
        loadingPopup.show();
        int left = (Window.getClientWidth() / 2) - 150;
        int top = (Window.getClientHeight() / 2) - 10;
        loadingPopup.setPopupPosition(left, top);
        loadingPopup.show();
    }
}