com.francetelecom.clara.cloud.presentation.applications.ApplicationsPage.java Source code

Java tutorial

Introduction

Here is the source code for com.francetelecom.clara.cloud.presentation.applications.ApplicationsPage.java

Source

/**
 * Copyright (C) 2015 Orange
 * 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 com.francetelecom.clara.cloud.presentation.applications;

import com.francetelecom.clara.cloud.commons.AuthorizationException;
import com.francetelecom.clara.cloud.commons.BusinessException;
import com.francetelecom.clara.cloud.core.service.ManageApplication;
import com.francetelecom.clara.cloud.core.service.exception.*;
import com.francetelecom.clara.cloud.coremodel.Application;
import com.francetelecom.clara.cloud.coremodel.ApplicationRelease;
import com.francetelecom.clara.cloud.coremodel.SSOId;
import com.francetelecom.clara.cloud.presentation.HomePage;
import com.francetelecom.clara.cloud.presentation.common.Breadcrumbs;
import com.francetelecom.clara.cloud.presentation.common.NavigationMenuFirstLevel;
import com.francetelecom.clara.cloud.presentation.common.WicketUtils;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerHelperPage;
import com.francetelecom.clara.cloud.presentation.designer.pages.DesignerPage;
import com.francetelecom.clara.cloud.presentation.models.FirstApplicationReleaseInfos;
import com.francetelecom.clara.cloud.presentation.tools.BreadcrumbsItem;
import com.francetelecom.clara.cloud.presentation.tools.BusinessExceptionHandler;
import com.francetelecom.clara.cloud.presentation.tools.WicketSession;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.LoggerFactory;
import org.wicketstuff.annotation.mount.MountPath;

import java.net.URL;
import java.util.*;

/**
 * ApplicationsPage
 * <p>
 * panel used to create an application release
 * <p>
 * Last update : $LastChangedDate$ Last author : $Author$
 * 
 * @version : $Revision$
 */
@MountPath("/applications")
@AuthorizeInstantiation({ "ROLE_USER", "ROLE_ADMIN" })
public class ApplicationsPage extends DesignerHelperPage {

    private static final long serialVersionUID = -1549651870557920802L;

    private static final transient org.slf4j.Logger logger = LoggerFactory.getLogger(ApplicationsPage.class);

    public static SSOId[] toSSOIdsArray(String membersStr) {
        membersStr = membersStr.replaceAll("\\s+", " ").trim();
        String[] members = membersStr == null ? new String[0] : membersStr.split(" ");
        SSOId[] ssoIds = new SSOId[members.length];
        for (int i = 0; i < members.length; i++) {
            ssoIds[i] = new SSOId(members[i]);
        }
        return ssoIds;
    }

    public static Set<SSOId> toSSOIdsSet(String membersStr) {
        membersStr = membersStr.replaceAll("\\s+", " ").trim();
        String[] members = membersStr == null ? new String[0] : membersStr.split(" ");
        Set<SSOId> ssoIds = new HashSet<>();
        for (int i = 0; i < members.length; i++) {
            ssoIds.add(new SSOId(members[i]));
        }
        return ssoIds;
    }

    @SpringBean
    private ManageApplication manageApplication;

    private WebMarkupContainer container;

    private final PageParameters params = new PageParameters();

    private ApplicationCreatePanel appCreatePanel;

    AjaxLink newApp;
    WebMarkupContainer buttonContainer;
    ApplicationsTablePanel appsTablePanel;
    FeedbackPanel feedback;

    public ApplicationsPage(PageParameters params) {
        super(params);
        initComponents();
    }

    private void initComponents() {

        setPagetitle();
        createFirstLevelNavigation();
        createBreadCrumbs();
        createGlobalFeedbackPanel();
        createEmptyAppFormPanel();
        createNewAppButton();
        createAppsTable();

    }

    private void createFirstLevelNavigation() {
        NavigationMenuFirstLevel navFirstLvl = new NavigationMenuFirstLevel();
        add(navFirstLvl);
    }

    private void setPagetitle() {
        /* set head page title to display in browser title bar */
        add(new Label("head_page_title",
                WicketUtils.getStringResourceModel(this, "portal.design.web.title.applications.home")));
    }

    private void createBreadCrumbs() {

        List<BreadcrumbsItem> breadcrumbsItems = new ArrayList<BreadcrumbsItem>();

        breadcrumbsItems
                .add(new BreadcrumbsItem(HomePage.class, "portal.design.breadcrumbs.homepage", null, false));
        breadcrumbsItems.add(new BreadcrumbsItem(this.getClass(), params,
                "portal.design.breadcrumbs.applications.home", null, true));

        Breadcrumbs breadcrumbs = new Breadcrumbs("breadcrumbs", breadcrumbsItems);
        add(breadcrumbs);

    }

    private void createGlobalFeedbackPanel() {
        feedback = new FeedbackPanel("feedback");
        feedback.setOutputMarkupId(true);
        add(feedback);

    }

    private void createEmptyAppFormPanel() {

        container = new WebMarkupContainer("createAppContainer");
        container.setOutputMarkupId(true);
        container.setOutputMarkupPlaceholderTag(true);
        container.add(new EmptyPanel("appCreateForm"));

        add(container);
    }

    private void createNewAppButton() {

        buttonContainer = new WebMarkupContainer("buttonContainer");
        buttonContainer.setOutputMarkupId(true);

        // create link
        newApp = new AjaxLink("newAppLink") {

            private static final long serialVersionUID = 4466738576333544274L;

            @Override
            public void onClick(AjaxRequestTarget target) {

                appCreatePanel = new ApplicationCreatePanel("appCreateForm", manageApplicationRelease);

                // container.remove("appCreateForm");
                // container.add(appCreatePanel);

                container.replace(appCreatePanel);
                target.add(container);

                this.setVisible(false);
                target.add(buttonContainer);

            }
        };
        newApp.setMarkupId("newAppLink");
        buttonContainer.add(newApp);
        add(buttonContainer);

    }

    private void createAppsTable() {
        appsTablePanel = new ApplicationsTablePanel("appsTablePanel");
        appsTablePanel.setOutputMarkupId(true);
        add(appsTablePanel);
    }

    public void addFirstApplicationCreation(Form<?> form, AjaxRequestTarget target, ApplicationRelease appRelease,
            String currentMiddlewareProfile) {
        String action = "create first application ";
        FirstApplicationReleaseInfos appFirstApplicationReleaseInfos = (FirstApplicationReleaseInfos) form
                .getModelObject();

        String appUid;
        try {
            String applicationCode = appFirstApplicationReleaseInfos.getAppCode();
            String applicationLabel = appFirstApplicationReleaseInfos.getAppLabel();
            String applicationDescription = appFirstApplicationReleaseInfos.getAppDescription();
            Boolean applicationPublic = appFirstApplicationReleaseInfos.getAppPublic();
            SSOId[] members = toSSOIdsArray(appFirstApplicationReleaseInfos.getMembers());
            action += " appCode=" + applicationCode + " appLabel=" + applicationLabel + " appDescription="
                    + applicationDescription + " appPublic=" + applicationPublic + " users="
                    + Arrays.toString(members);
            logger.info(action);
            if (applicationPublic.booleanValue()) {
                appUid = manageApplication.createPublicApplication(applicationCode, applicationLabel,
                        applicationDescription, null, members);
            } else {
                appUid = manageApplication.createPrivateApplication(applicationCode, applicationLabel,
                        applicationDescription, null, members);
            }
            params.set("appUid", appUid);

        } catch (DuplicateApplicationException e) {
            logger.warn("Error (DuplicateApplicationException) while {} : {}", action, e.getMessage());
            BusinessExceptionHandler.addError(target, feedback, e);
            return;
        } catch (PaasUserNotFoundException e) {
            logger.warn("Error (PaasUserNotFoundException) while {} : {}", action, e.getMessage());
            BusinessExceptionHandler.addError(target, feedback, e);
            return;
        } catch (AuthorizationException e) {
            logger.warn("Error (AuthorizationException) while {} : {}", action, e.getMessage());
            BusinessExceptionHandler.addError(target, feedback,
                    new BusinessException(getString("portal.application.notmember")));
            return;
        }

        String releaseUid;
        try {
            action = "create first application release";
            String releaseUser = WicketSession.get().getPaasUser().getSsoId().getValue();
            String releaseVersion = appFirstApplicationReleaseInfos.getReleaseVersion();
            String releaseDescription = appFirstApplicationReleaseInfos.getDescription();
            URL releaseVersionControlUrl = appFirstApplicationReleaseInfos.getVersionControlUrl();
            action += " releaseUser=" + releaseUser + " releaseVersion=" + releaseVersion
                    + " releaseMiddlewareProfile=" + currentMiddlewareProfile + " releaseDescription="
                    + releaseDescription;
            logger.info(action);
            // Creates and persists release
            releaseUid = manageApplicationRelease.createApplicationRelease(appUid, releaseUser, releaseVersion,
                    releaseDescription, releaseVersionControlUrl, currentMiddlewareProfile);
            params.set("releaseUid", releaseUid);
        } catch (ObjectNotFoundException e) {
            BusinessExceptionHandler.addError(target, feedback, e);
            return;
        } catch (DuplicateApplicationReleaseException e) {
            BusinessExceptionHandler.addError(target, feedback, e);
            return;
        }

        try {
            if (appCreatePanel.shouldFork()) {
                action += " cloning " + appRelease.toString();
                manageLogicalDeployment.cloneLogicalDeployment(appRelease.getUID(), releaseUid);
            }
        } catch (InvalidReleaseException e) {
            logger.warn("Error (InvalidReleaseException) while {} : {}", action, e.getMessage());
            BusinessExceptionHandler.addError(target, feedback, e);
            return;
        }

        String successMsg = getString("portal.application.creation.successful",
                new Model<Object[]>(new Object[] { appFirstApplicationReleaseInfos.getAppLabel(),
                        appFirstApplicationReleaseInfos.getReleaseVersion() }));
        try {
            action = "going to result page (designer)";
            DesignerPage designerPage = new DesignerPage(params);
            Session.get().info(successMsg);
            setResponsePage(designerPage);
        } catch (Throwable e) {
            logger.error("Exception while " + action + ":" + e.getMessage(), e);
        }
    }

    public void cancelFirstApplicationCreation(AjaxRequestTarget target) {
        resetPage(target);
    }

    private void resetPage(AjaxRequestTarget target) {
        newApp.setVisible(true);
        target.add(buttonContainer);

        container.replace(new EmptyPanel("appCreateForm"));
        target.add(container);
    }

    public void deleteApplication(AjaxRequestTarget target, Application app) {
        try {
            manageApplication.deleteApplication(app.getUID());
            target.add(appsTablePanel);
        } catch (ObjectNotFoundException e) {
            BusinessExceptionHandler handler = new BusinessExceptionHandler(feedback);
            handler.error(e);
        }
    }

    public ManageApplication getManageApplication() {
        return manageApplication;
    }

    // We need this method for wicket tester

    @Override
    public PageParameters getPageParameters() {
        return params;
    }

    @Override
    public FeedbackPanel getFeedbackPanel() {
        return this.feedback;
    }

    public boolean isApplicationLabelUnique(String appLabel) {
        try {
            return manageApplication.isApplicationLabelUnique(appLabel);
        } catch (BusinessException e) {
            BusinessExceptionHandler handler = new BusinessExceptionHandler(feedback);
            handler.error(e);
            return false;
        }
    }
}