com.francetelecom.clara.cloud.presentation.tools.PopulateDatasService.java Source code

Java tutorial

Introduction

Here is the source code for com.francetelecom.clara.cloud.presentation.tools.PopulateDatasService.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.tools;

import com.francetelecom.clara.cloud.commons.BusinessException;
import com.francetelecom.clara.cloud.commons.TechnicalException;
import com.francetelecom.clara.cloud.core.service.ManageApplication;
import com.francetelecom.clara.cloud.core.service.ManageApplicationRelease;
import com.francetelecom.clara.cloud.core.service.ManageEnvironment;
import com.francetelecom.clara.cloud.core.service.exception.DuplicateApplicationReleaseException;
import com.francetelecom.clara.cloud.core.service.exception.ObjectNotFoundException;
import com.francetelecom.clara.cloud.coremodel.Application;
import com.francetelecom.clara.cloud.coremodel.ApplicationRelease;
import com.francetelecom.clara.cloud.coremodel.PaasUser;
import com.francetelecom.clara.cloud.deployment.logical.service.ManageLogicalDeployment;
import com.francetelecom.clara.cloud.logicalmodel.LogicalDeployment;
import com.francetelecom.clara.cloud.logicalmodel.samplecatalog.SampleAppFactory;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;

import javax.validation.ConstraintViolationException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * Created by IntelliJ IDEA. User: Thomas Escalle - tawe8231 Entity :
 * FT/OLNC/RD/MAPS/MEP/MSE Date: 02/11/11
 * 
 * Allows user to create automatically applications / releases / logical model /
 * environment, invoking "populate page"
 * 
 */

public class PopulateDatasService {

    /**
     * Logger
     */
    private static final transient Logger logger = LoggerFactory.getLogger(PopulateDatasService.class);

    /**
     * @todo BVA/TES dont work on mock version !? Spring automatically injects
     *       all known beans of type
     *       {@link com.francetelecom.clara.cloud.logicalmodel.samplecatalog.SampleAppFactory}
     *       . See http://static.springsource.org/spring/docs/current/spring-
     *       framework-reference/html/beans.html#beans-annotation-config
     * @todo : WARN "Autowired" notation is only for test, and must be replaced
     *       by context bean definition
     */
    @Autowired
    Map<String, SampleAppFactory> sampleAppsCatalog;

    private ManageApplication manageApplication;

    private ManageApplicationRelease manageApplicationRelease;

    private ManageLogicalDeployment manageLogicalDeployment;

    private ManageEnvironment manageEnvironment;

    PaasUser user = null;

    // needed by spring
    public PopulateDatasService() {
        logger.debug("PopulateDatasService()");
    }

    private SampleAppFactory getAppFactory(String appName) {
        for (Map.Entry<String, SampleAppFactory> entry : sampleAppsCatalog.entrySet()) {
            String beanName = entry.getKey();
            SampleAppFactory appFactory = entry.getValue();
            if (beanName.startsWith(appName)) {
                return appFactory;
            }
        }

        return null;
    }

    private Application createApp(String beanName, SampleAppFactory appFactory)
            throws BusinessException, MalformedURLException {

        // create app
        String appLabel = appFactory.getAppLabel();
        String appCode = appFactory.getAppCode();
        String appDescription = appFactory.getAppDescription();
        String appVersionControl = appFactory.getApplicationVersionControl();

        if (appLabel == null) {
            appLabel = beanName.substring(0, beanName.indexOf("LogicalModelCatalog"));
        }
        if (appCode == null) {
            appCode = appLabel.substring(0, 4) + 1;
        }
        if (appDescription == null) {
            appDescription = "Sample app description for " + appLabel;
        }
        if (appVersionControl == null) {
            appVersionControl = "http://default.version.control.url";
        }

        String applicationUID;
        try {
            applicationUID = manageApplication.createPublicApplication(appCode, appLabel, appDescription,
                    new URL(appVersionControl), WicketSession.get().getPaasUser().getSsoId());
            return manageApplication.findApplicationByUID(applicationUID);
        } catch (DataIntegrityViolationException dataException) {
            logger.error(dataException.getMessage());
            throw new BusinessException(dataException);
        } catch (BusinessException be) {
            throw be;
        } catch (Exception e) {
            Throwable rootCauseException = ExceptionUtils.getRootCause(e);
            if (rootCauseException instanceof ConstraintViolationException) {
                logger.error(rootCauseException.getMessage());
                throw new BusinessException(rootCauseException);
            }
            logger.error(e.getMessage());
            throw new TechnicalException(e);
        }
    }

    private ApplicationRelease createRelease(Application app, SampleAppFactory appFactory, String version)
            throws MalformedURLException, DuplicateApplicationReleaseException, ObjectNotFoundException {
        ApplicationRelease release;

        // create app
        String releaseDescription = appFactory.getAppReleaseDescription();
        String releaseVersionControl = appFactory.getApplicationReleaseVersionControl();

        if (releaseDescription == null) {
            releaseDescription = app.getDescription() + " and it's release " + version;
        }
        if (releaseVersionControl == null) {
            releaseVersionControl = "http://default.version.control.url";
        }

        // Creates and persists release
        String releaseUid = manageApplicationRelease.createApplicationRelease(app.getUID(),
                WicketSession.get().getPaasUser().getSsoId().getValue(), version);
        // Find the created release
        release = manageApplicationRelease.findApplicationReleaseByUID(releaseUid);
        // Set other properties and save change
        release.setDescription(releaseDescription);
        release.setVersionControlUrl(new URL(releaseVersionControl));

        // release.addPaasUser(WicketSession.get().getPaasUser(),
        // PaasRoleEnum.RELEASE_MANAGER);
        manageApplicationRelease.updateApplicationRelease(release);
        return release;
    }

    private void populateLogicalDeployment(SampleAppFactory appFactory, ApplicationRelease release)
            throws BusinessException {

        LogicalDeployment logicalDeploymentToUpdate = manageLogicalDeployment
                .findLogicalDeployment(release.getLogicalDeployment().getId());
        LogicalDeployment ld = appFactory.populateLogicalDeployment(logicalDeploymentToUpdate);
        manageLogicalDeployment.checkOverallConsistencyAndUpdateLogicalDeployment(ld);
    }

    public List<PopulateApplicationInformation> getApplicationsList() {
        List<PopulateApplicationInformation> appList = new ArrayList<PopulateApplicationInformation>();

        for (Map.Entry<String, SampleAppFactory> entry : sampleAppsCatalog.entrySet()) {
            String beanName = entry.getKey();
            if ((entry.getValue()).isInstantiable()) {
                PopulateApplicationInformation pai = new PopulateApplicationInformation(beanName, "1", "0");
                appList.add(pai);
            }
        }
        return appList;
    }

    public void setSampleAppsCatalog(Map<String, SampleAppFactory> sampleAppsCatalog) {
        logger.debug("  setSampleAppsCatalog");
        this.sampleAppsCatalog = sampleAppsCatalog;
    }

    public void setManageApplication(ManageApplication manageApplication) {
        this.manageApplication = manageApplication;
    }

    public void setManageApplicationRelease(ManageApplicationRelease manageApplicationRelease) {
        this.manageApplicationRelease = manageApplicationRelease;
    }

    public void setManageLogicalDeployment(ManageLogicalDeployment manageLogicalDeployment) {
        this.manageLogicalDeployment = manageLogicalDeployment;
    }

    public void setManageEnvironment(ManageEnvironment manageEnvironment) {
        this.manageEnvironment = manageEnvironment;
    }

    public void setUser(PaasUser user) {
        this.user = user;
    }

    public void populateSingleApp(String appName, String nbOfReleases, String nbOfEnvironments, boolean mock)
            throws MalformedURLException, BusinessException {
        SampleAppFactory appFactory = getAppFactory(appName);
        String version;

        // Create application
        Application app = createApp(appName, appFactory);

        for (int i = 1; i <= Integer.parseInt(nbOfReleases); i++) {
            version = "G00R0" + i;

            // create release
            ApplicationRelease release = createRelease(app, appFactory, version);

            // Populate logical model.
            populateLogicalDeployment(appFactory, release);

            for (int j = 1; j <= Integer.parseInt(nbOfEnvironments); j++) {

                List<EnvironmentDto.EnvironmentTypeEnum> envTypeList = new ArrayList<EnvironmentDto.EnvironmentTypeEnum>();

                Collections.addAll(envTypeList, EnvironmentDto.EnvironmentTypeEnum.values());

                Random random = new Random();

                EnvironmentDto.EnvironmentTypeEnum envType;

                // if mock mode activate we can select a random type of
                // environment
                if (mock)
                    envType = envTypeList.get(random.nextInt(envTypeList.size()));
                // if mock mode deactivate we can only create development
                // environment
                else
                    envType = EnvironmentDto.EnvironmentTypeEnum.DEVELOPMENT;

                manageEnvironment.isEnvironmentLabelUniqueForRelease(
                        WicketSession.get().getPaasUser().getSsoId().getValue(), "my env " + j, release.getUID());

                manageEnvironment.createEnvironment(release.getUID(), envType,
                        WicketSession.get().getPaasUser().getSsoId().getValue(), "my env " + j);
            }
        }
    }
}

class PopulateApplicationInformation implements Serializable {

    private static final long serialVersionUID = -6378722506474391605L;

    String appName;
    String nbOfReleases;
    String nbOfEnvironments;

    PopulateApplicationInformation(String appName, String nbOfReleases, String nbOfEnvironments) {
        this.appName = appName;
        this.nbOfReleases = nbOfReleases;
        this.nbOfEnvironments = nbOfEnvironments;
    }

    public String getAppName() {
        return appName;
    }

    public String getNbOfReleases() {
        return nbOfReleases;
    }

    public String getNbOfEnvironments() {
        return nbOfEnvironments;
    }

}