com.francetelecom.clara.cloud.stepdefs.CreateAppStepdefs.java Source code

Java tutorial

Introduction

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

import com.francetelecom.clara.cloud.TestHelper;
import com.francetelecom.clara.cloud.application.impl.DoubleAuthentication;
import com.francetelecom.clara.cloud.commons.AuthorizationException;
import com.francetelecom.clara.cloud.commons.MissingDefaultUserException;
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.ManagePaasUser;
import com.francetelecom.clara.cloud.core.service.exception.ApplicationNotFoundException;
import com.francetelecom.clara.cloud.core.service.exception.PaasUserNotFoundException;
import com.francetelecom.clara.cloud.coremodel.*;
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.mvn.consumer.MvnRepoDao;
import com.francetelecom.clara.cloud.mvn.consumer.MvnRepoDaoTestUtils;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto;
import com.francetelecom.clara.cloud.services.dto.EnvironmentDto.EnvironmentTypeEnum;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;

import java.net.URL;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static java.util.Arrays.asList;
import static org.fest.assertions.Assertions.assertThat;

/**
 *
 */
@ContextConfiguration(locations = "classpath:com/francetelecom/clara/cloud/stepdefs/cucumber-context.xml")
@DirtiesContext
public class CreateAppStepdefs {

    private static final SSOId[] SSO_IDS_TYPE = new SSOId[] {};
    @Autowired(required = true)
    ManagePaasUser managePaasUser;

    @Autowired(required = true)
    ManageApplication manageApplication;

    @Autowired(required = true)
    ManageApplicationRelease manageApplicationRelease;

    @Autowired(required = true)
    ManageEnvironment manageEnvironment;

    @Autowired(required = true)
    ManageLogicalDeployment manageLogicalDeployment;

    @Autowired(required = true)
    EnvironmentRepository environmentRepository;

    @Autowired
    @Qualifier(value = "jeeProbeLogicalModelCatalog")
    SampleAppFactory logicalModelCatalog;

    @Autowired
    @Qualifier("mvnDao")
    protected MvnRepoDao mvnRepoDaoMock;

    private Set<String> createAppMembers;
    private Set<String> updateAppPrivateMembers;
    private ListFilterEnum list_filter;
    private String applicationId;
    private String applicationName;
    private AppVisibilityEnum createAppVisibility;
    private String releaseId;
    private String releaseName;
    private String environmentID;
    private boolean isReleaseAccessible;

    @Given("^the following users are registered:$")
    public void given_the_following_users_have_registered(List<SpecUser> users) throws Throwable {
        for (SpecUser specUser : users) {
            //FIXME: workaround for art #147272: use cuid as firstname
            PaasUser paasUser = new PaasUser(specUser.cuid, specUser.last_name, new SSOId(specUser.cuid),
                    "any@email.com");
            paasUser.setPaasUserRole(specUser.role);
            // persist paas user
            managePaasUser.checkBeforeCreatePaasUser(paasUser);
            // make sure it was properly written by fetching it from DB
            managePaasUser.findPaasUser(specUser.cuid);
        }
    }

    @Given("^I'm logged in as (.*)$")
    public void given_I_m_logged_in_as(String cuid) throws Throwable {
        PaasUser user = managePaasUser.findPaasUser(cuid);
        SecurityContextHolder.getContext()
                .setAuthentication(new DoubleAuthentication(cuid, user.getPaasUserRole()));
    }

    @When("^I request to create a (.*) application with the following list of members: (.*)$")
    public void when_I_request_to_create_a_private_application_with_the_following_list_of_members_member_list(
            AppVisibilityEnum visibility, String member_list) throws Throwable {
        this.createAppVisibility = visibility;
        this.createAppMembers = parseMembers(member_list);
    }

    @Then("^the application creation request is (.*) potentially with the following error message: (.*)$")
    public void then_the_application_creation_request_is_accepted_or_rejected_with_the_following_error_message_message(
            RequestStatusEnum status, String message) throws Throwable {
        try {
            switch (createAppVisibility) {
            case PUBLIC:
                applicationId = manageApplication.createPublicApplication("aCode", "aLabel", "random desc",
                        new URL("http://any-url.org"), getSsoIdsArrayFromStrings(createAppMembers));
                break;
            case PRIVATE:
                applicationId = manageApplication.createPrivateApplication("aCode", "aLabel", "random desc",
                        new URL("http://any-url.org"), getSsoIdsArrayFromStrings(createAppMembers));
            }
            if (status.shouldReject()) {
                Assert.fail("expected creation to be refused");
            } else {
                //The list of members should be valid, after remov
                Application app = manageApplication.findApplicationByUID(applicationId);
                assertThat(app.listMembers()).containsExactly(getSsoIdsSetFromStrings(createAppMembers).toArray());
            }
        } catch (PaasUserNotFoundException e) {
            assertThat(convertToUiMessage(e).trim()).isEqualTo(message.trim());
        } catch (MissingDefaultUserException e) {
            assertThat(convertToUiMessage(e).trim()).isEqualTo(message.trim());
        } catch (AuthorizationException e) {
            assertThat(convertToUiMessage(e).trim()).isEqualTo(message.trim());
        } catch (Exception e) {
            Assert.fail("expected creation to be " + status + " caught:" + e);
        }
    }

    @Given("^I successfully created a (.*) application with (.*) as member list$")
    public void given_I_successfully_created_an_application_with_given_member_list(AppVisibilityEnum visibility,
            String members) throws Throwable {
        switch (visibility) {
        case PRIVATE:
            applicationId = manageApplication.createPrivateApplication("aCode" + System.currentTimeMillis(), //make the label and code unique to avoid collision among step of a single scenario
                    "aLabel" + System.currentTimeMillis(), "random desc", new URL("http://any-url.org"),
                    getSsoIdsArrayFromStrings(parseMembers(members)));
            break;
        case PUBLIC:
            applicationId = manageApplication.createPublicApplication("aCode" + System.currentTimeMillis(), //make the label and code unique to avoid collision among step of a single scenario
                    "aLabel" + System.currentTimeMillis(), "random desc", new URL("http://any-url.org"),
                    getSsoIdsArrayFromStrings(parseMembers(members)));
            break;
        }
        Application app = manageApplication.findApplicationByUID(applicationId);
        assertThat(app.listMembers()).containsExactly(getSsoIdsArrayFromStrings(parseMembers(members)));
    }

    @When("^I request to update the application with the following list of members: (.*)$")
    public void when_I_request_to_update_the_application_with_the_following_list_of_members_member_list(
            String member_list) throws Throwable {
        this.updateAppPrivateMembers = parseMembers(member_list);
    }

    @When("^I request the application (.*)$")
    public void when_I_request_the_given_application(String app_name) throws ApplicationNotFoundException {
        Collection<Application> apps = manageApplication.findApplications();
        for (Application application : apps) {
            if (application.getLabel().equals(app_name)) {
                applicationId = application.getUID();
                return;
            }
        }
        Assert.fail("Application " + app_name + " should have been found.");
    }

    @When("^I request the release (.*) of the application (.*)$")
    public void when_I_request_the_given_release(String release_name, String app_name) throws Throwable {
        applicationName = app_name;
        releaseName = release_name;

        Authentication previousAuth = SecurityContextHolder.getContext().getAuthentication();
        TestHelper.loginAsAdmin();

        Collection<ApplicationRelease> releases = manageApplicationRelease.findApplicationReleases(0,
                Integer.MAX_VALUE);
        for (ApplicationRelease release : releases) {
            if (!release.getApplication().getLabel().equals(app_name)) {
                continue;
            }
            if (release.getReleaseVersion().equals(release_name)) {
                releaseId = release.getUID();
                SecurityContextHolder.getContext().setAuthentication(previousAuth);
                return;
            }
        }
        Assert.fail("Release " + app_name + '-' + release_name + " should have been found.");
    }

    @When("^I request to see details on environment (.*) associated to application (.*) and release (.*)$")
    public void when_I_request_the_given_environment(String env_name, String app_name, String release_name)
            throws Throwable {
        // find releaseID first
        when_I_request_the_given_release(release_name, app_name);

        Authentication previousAuth = SecurityContextHolder.getContext().getAuthentication();
        TestHelper.loginAsAdmin();

        Collection<EnvironmentDto> envs = manageEnvironment.findEnvironments();
        for (EnvironmentDto environmentDto : envs) {
            if (environmentDto.getReleaseUID().equals(releaseId)) {
                environmentID = environmentDto.getUid();

                // Update environment state to RUNNING instead of CREATING as activation is mocked
                // This allows to later start/stop/delete the environment
                Environment environment = environmentRepository.findByUid(environmentID);
                environment.updateStatus(EnvironmentStatus.RUNNING, "", 0);
                environmentRepository.save(environment);
                SecurityContextHolder.getContext().setAuthentication(previousAuth);
                return;
            }
        }
    }

    @Then("^the application update request is (.*) potentially with the following error message: (.*)$")
    public void then_the_application_update_request_is_accepted_or_rejected_with_the_following_error_message_message(
            RequestStatusEnum status, String message) throws Throwable {
        try {
            Application app = manageApplication.findApplicationByUID(applicationId);
            app.setMembers(getSsoIdsSetFromStrings(updateAppPrivateMembers));
            manageApplication.updateApplication(app);
            if (status.shouldReject()) {
                Assert.fail("expected update to be refused");
            } else {
                app = manageApplication.findApplicationByUID(applicationId);
                Object[] requestedMembersWithoutDuplicates = getSsoIdsSetFromStrings(updateAppPrivateMembers)
                        .toArray();
                assertThat(app.listMembers()).containsExactly(requestedMembersWithoutDuplicates);
            }
        } catch (PaasUserNotFoundException e) {
            assertThat(convertToUiMessage(e).trim()).isEqualTo(message.trim());
        } catch (MissingDefaultUserException e) {
            assertThat(convertToUiMessage(e).trim()).isEqualTo(message.trim());
        } catch (Exception e) {
            Assert.fail("expected update to be " + status + " caught:" + e);
        }
    }

    @When("^I list applications using the \"(.*)\" filter$")
    public void when_I_list_applications_using_the_given_filter(ListFilterEnum filter) throws Throwable {
        list_filter = filter;
    }

    @When("^I list releases using the \"(.*)\" filter$")
    public void when_I_list_releases_using_the_given_filter(ListFilterEnum filter) throws Throwable {
        list_filter = filter;
    }

    @When("^I list environments using the \"(.*)\" filter$")
    public void when_I_list_environments_using_the_given_filter(ListFilterEnum filter) throws Throwable {
        list_filter = filter;
    }

    @And("^the following applications were created:$")
    public void given_the_following_applications_were_created(List<SpecApp> createdApplications) throws Throwable {
        TestHelper.loginAsAdmin();
        for (SpecApp specApp : createdApplications) {
            String applicationUID = null;
            switch (specApp.visibility) {
            case PRIVATE:
                applicationUID = manageApplication.createPrivateApplication(specApp.app_name, specApp.app_name,
                        "random desc", new URL("http://any-url.org"),
                        getSsoIdsArrayFromStrings(parseMembers(specApp.member_list)));
                break;
            case PUBLIC:
                applicationUID = manageApplication.createPublicApplication(specApp.app_name, specApp.app_name,
                        "random desc", new URL("http://any-url.org"),
                        getSsoIdsArrayFromStrings(parseMembers(specApp.member_list)));
                break;
            }
            for (int i = 0; i < specApp.nb_releases; i++) {
                manageApplicationRelease.createApplicationRelease(applicationUID, "jlt0000", i + ".0");
            }
        }
        TestHelper.logout();
    }

    @And("^the following releases were created:$")
    public void given_the_following_releases_were_created(List<SpecRelease> createdReleases) throws Throwable {
        TestHelper.loginAsAdmin();
        for (SpecRelease specRelease : createdReleases) {
            String applicationUID = null;
            Collection<Application> apps = manageApplication.findApplications();
            for (Application application : apps) {
                if (application.getLabel().equals(specRelease.app_name)) {
                    applicationUID = application.getUID();
                    break;
                }
            }
            assertThat(applicationUID).isNotNull();
            manageApplicationRelease.createApplicationRelease(applicationUID, "jlt0000", specRelease.app_release);
        }
        TestHelper.logout();
    }

    @And("^the following environments were created:$")
    public void given_the_following_environments_were_created(List<SpecEnvironment> createdEnvironments)
            throws Throwable {
        TestHelper.loginAsAdmin();
        for (SpecEnvironment specEnvironment : createdEnvironments) {
            String releaseUID = null;
            int logicalDeploymentId = -1;
            Collection<ApplicationRelease> releases = manageApplicationRelease.findApplicationReleases(0,
                    Integer.MAX_VALUE);
            for (ApplicationRelease release : releases) {
                if (!release.getApplication().getLabel().equals(specEnvironment.app_name)) {
                    continue;
                }
                if (release.getReleaseVersion().equals(specEnvironment.app_release)) {
                    releaseUID = release.getUID();
                    logicalDeploymentId = release.getLogicalDeployment().getId();
                    break;
                }
            }
            assertThat(releaseUID).isNotNull();

            // Configure MvnRepoDao Mock
            MvnRepoDaoTestUtils.mockResolveUrl(mvnRepoDaoMock);

            // Refetch to eagerly fetch all fields.
            LogicalDeployment logicalDeployment = manageLogicalDeployment
                    .findLogicalDeployment(logicalDeploymentId);

            logicalModelCatalog.populateLogicalDeployment(logicalDeployment);
            logicalDeployment = manageLogicalDeployment.updateLogicalDeployment(logicalDeployment);
            logicalDeployment = manageLogicalDeployment
                    .checkOverallConsistencyAndUpdateLogicalDeployment(logicalDeployment);

            manageEnvironment.createEnvironment(releaseUID, EnvironmentTypeEnum.DEVELOPMENT, "jlt0000",
                    specEnvironment.env_name);
        }
        TestHelper.logout();
    }

    @Then("^the listed applications are:$")
    public void then_the_listed_applications_are(List<ListedApplication> expectedListedApplications)
            throws Throwable {
        Set<ListedApplication> apps = listApplications(list_filter);
        Assert.assertEquals(new HashSet<>(expectedListedApplications), apps);
    }

    @Then("^the listed releases are:$")
    public void then_the_listed_releases_are(List<SpecRelease> expectedListedReleases) throws Throwable {
        Set<SpecRelease> releases = listReleases(list_filter);
        Assert.assertEquals(new HashSet<>(expectedListedReleases), new HashSet<>(releases));
    }

    @Then("^the listed environments are:$")
    public void then_the_listed_environments_are(List<SpecEnvironment> expectedListedEnvironments)
            throws Throwable {
        Set<SpecEnvironment> environments = listEnvironments(list_filter);
        Assert.assertEquals(new HashSet<>(expectedListedEnvironments), new HashSet<>(environments));
    }

    @Then("^I (.*) edit the application$")
    public void then_I_can_edit_the_application_or_not(AccessRightsEnum can_edit) throws Throwable {
        Application requestedApp = manageApplication.findApplicationByUID(applicationId);
        switch (can_edit) {
        case CAN:
            Assert.assertTrue("Application " + requestedApp.getLabel() + " must be editable.",
                    requestedApp.isEditable());
            manageApplication.updateApplication(requestedApp);
            break;
        case CANNOT:
            Assert.assertFalse("Application " + requestedApp.getLabel() + " should not be editable.",
                    requestedApp.isEditable());
            try {
                manageApplication.updateApplication(requestedApp);
                Assert.fail("Application " + requestedApp + " should not be editable.");
            } catch (AuthorizationException exc) {
            }
            break;
        }
    }

    @Then("^I (.*) edit the release$")
    public void then_I_can_edit_the_release_or_not(AccessRightsEnum can_edit) throws Throwable {
        ApplicationRelease requestedRelease;
        if (isReleaseAccessible) {
            requestedRelease = manageApplicationRelease.findApplicationReleaseByUID(releaseId);
        } else {
            Authentication previousAuth = SecurityContextHolder.getContext().getAuthentication();
            TestHelper.loginAsAdmin();
            requestedRelease = manageApplicationRelease.findApplicationReleaseByUID(releaseId);
            SecurityContextHolder.getContext().setAuthentication(previousAuth);
        }

        switch (can_edit) {
        case CAN:
            if (isReleaseAccessible) {
                // The editable flag makes sense only for accessible release
                Assert.assertTrue(
                        "Release " + requestedRelease.getApplication().getLabel() + '-'
                                + requestedRelease.getReleaseVersion() + " must be editable.",
                        requestedRelease.getApplication().isEditable());
            }
            manageApplicationRelease.updateApplicationRelease(requestedRelease);
            break;
        case CANNOT:
            if (isReleaseAccessible) {
                // The editable flag makes sense only for accessible release
                Assert.assertFalse(
                        "Release " + requestedRelease.getApplication().getLabel() + '-'
                                + requestedRelease.getReleaseVersion() + " should not be editable.",
                        requestedRelease.getApplication().isEditable());
            }
            try {
                manageApplicationRelease.updateApplicationRelease(requestedRelease);
                Assert.fail("Release should not be editable.");
            } catch (AuthorizationException exc) {
            }
            break;
        }
    }

    @Then("^I (.*) access the release$")
    public void then_I_can_access_the_release_or_not(AccessRightsEnum can_access) throws Throwable {
        switch (can_access) {
        case CAN:
            isReleaseAccessible = true;
            manageApplicationRelease.findApplicationReleaseByUID(releaseId);
            break;
        case CANNOT:
            isReleaseAccessible = false;
            try {
                manageApplicationRelease.findApplicationReleaseByUID(releaseId);
                Assert.fail("Release should not be accessible.");
            } catch (AuthorizationException exc) {
            }
            break;
        }
    }

    @Then("^I (.*) access the environment$")
    public void then_I_can_access_the_environment_or_not(AccessRightsEnum can_access) throws Throwable {
        switch (can_access) {
        case CAN:
            manageEnvironment.findEnvironmentByUID(environmentID);
            break;
        case CANNOT:
            try {
                manageEnvironment.findEnvironmentByUID(environmentID);
                Assert.fail("Environment should not be accessible.");
            } catch (AuthorizationException exc) {
            }
            break;
        }
    }

    @Then("^I (.*) create a new release for this application$")
    public void then_I_can_create_a_new_release_or_not(AccessRightsEnum can_create) throws Throwable {
        Application requestedApp = manageApplication.findApplicationByUID(applicationId);
        switch (can_create) {
        case CAN:
            String releaseUid = manageApplicationRelease.createApplicationRelease(requestedApp.getUID(), "jlt0000",
                    "1.0-test");
            manageApplicationRelease.deleteApplicationRelease(releaseUid);
            break;
        case CANNOT:
            try {
                manageApplicationRelease.createApplicationRelease(requestedApp.getUID(), "jlt0000", "1.0-test");
                Assert.fail("Expected creation to be refused.");
            } catch (AuthorizationException e) {
            }
            break;
        }
    }

    @Then("^I (.*) list the releases$")
    public void then_I_can_list_the_releases_or_not(AccessRightsEnum can_list) throws Throwable {
        Application requestedApp = manageApplication.findApplicationByUID(applicationId);
        int releaseListSize = manageApplicationRelease.findApplicationReleasesByAppUID(requestedApp.getUID())
                .size();
        switch (can_list) {
        case CAN:
            assertThat(releaseListSize).as("Release list size of application " + requestedApp.getLabel())
                    .isPositive();
            break;
        case CANNOT:
            assertThat(releaseListSize).as("Release list size of application " + requestedApp.getLabel()).isZero();
            break;
        }
    }

    @Then("^I (.*) start the environment$")
    public void then_I_can_start_the_environment_or_not(AccessRightsEnum can_start) throws Throwable {
        switch (can_start) {
        case CAN:
            manageEnvironment.startEnvironment(environmentID);
            break;
        case CANNOT:
            try {
                manageEnvironment.startEnvironment(environmentID);
                Assert.fail("Expected environment start to be refused.");
            } catch (AuthorizationException e) {
            }
            break;
        }
    }

    @Then("^I (.*) stop the environment$")
    public void then_I_can_stop_the_environment_or_not(AccessRightsEnum can_stop) throws Throwable {
        switch (can_stop) {
        case CAN:
            manageEnvironment.stopEnvironment(environmentID);
            break;
        case CANNOT:
            try {
                manageEnvironment.stopEnvironment(environmentID);
                Assert.fail("Expected environment stop to be refused.");
            } catch (AuthorizationException e) {
            }
            break;
        }
    }

    @Then("^I (.*) delete the environment$")
    public void then_I_can_delete_the_environment_or_not(AccessRightsEnum can_delete) throws Throwable {
        switch (can_delete) {
        case CAN:
            manageEnvironment.deleteEnvironment(environmentID);
            break;
        case CANNOT:
            try {
                manageEnvironment.deleteEnvironment(environmentID);
                Assert.fail("Expected environment deletion to be refused.");
            } catch (AuthorizationException e) {
            }
            break;
        }
    }

    @Then("^I see member_list=(.*)$")
    public void then_i_see_member_list(String member_list) throws Throwable {
        Application requestedApp = manageApplication.findApplicationByUID(applicationId);
        Assert.assertEquals(getSsoIdsSetFromStrings(parseMembers(member_list)),
                new HashSet<>(requestedApp.listMembers()));
    }

    private String convertToUiMessage(MissingDefaultUserException e) {
        return "an application needs to have at least one member specified";
    }

    private String convertToUiMessage(AuthorizationException e) {
        return "[should add warning: lost membership of this application]";
    }

    private String convertToUiMessage(PaasUserNotFoundException e) {
        String missingUserId = e.getMissingUserId().toString();
        return "unable to set user \"" + missingUserId + "\" as member as it is unknown.";
    }

    private static SSOId[] getSsoIdsArrayFromStrings(Collection<String> ssoIdStrings) {
        Set<SSOId> ssoIds = getSsoIdsSetFromStrings(ssoIdStrings);
        return ssoIds.toArray(SSO_IDS_TYPE);
    }

    private static Set<SSOId> getSsoIdsSetFromStrings(Collection<String> ssoIdStrings) {
        Set<SSOId> ssoIds = new HashSet<>();
        for (String userId : ssoIdStrings) {
            SSOId ssoId = new SSOId(userId);
            ssoIds.add(ssoId);
        }
        return ssoIds;
    }

    private static Set<String> parseMembers(String member_list) {
        Set<String> members;
        if (member_list.isEmpty()) {
            members = new HashSet<>();
        } else {
            members = new HashSet<>(asList(member_list.split(" +")));
        }
        return members;
    }

    private Set<ListedApplication> listApplications(ListFilterEnum list_application_filter)
            throws ApplicationNotFoundException {
        Set<ListedApplication> listedApplications = new HashSet<>();
        Collection<Application> foundApplications = null;

        switch (list_application_filter) {
        case ALL_APPLICATIONS:
            foundApplications = manageApplication.findApplications();
            break;
        case DEFAULT:
            foundApplications = manageApplication.findMyApplications();
            break;
        default:
            Assert.fail("Unexpected filter: " + list_application_filter);
        }

        for (Application app : foundApplications) {
            ListedApplication listedApplication = new ListedApplication(app.getLabel(), app.listMembers(),
                    app.isEditable());
            listedApplications.add(listedApplication);
        }
        return listedApplications;
    }

    private Set<SpecRelease> listReleases(ListFilterEnum list_filter) throws ApplicationNotFoundException {
        Set<SpecRelease> listedReleases = new HashSet<>();
        Collection<ApplicationRelease> foundReleases = null;

        switch (list_filter) {
        case ALL_RELEASES:
            foundReleases = manageApplicationRelease.findApplicationReleases(0, Integer.MAX_VALUE);
            break;
        case DEFAULT:
            foundReleases = manageApplicationRelease.findMyApplicationReleases();
            break;
        default:
            Assert.fail("Unexpected filter: " + list_filter);
        }

        for (ApplicationRelease release : foundReleases) {
            SpecRelease listedRelease = new SpecRelease();
            listedRelease.app_name = release.getApplication().getLabel();
            listedRelease.app_release = release.getReleaseVersion();
            listedReleases.add(listedRelease);
        }
        return listedReleases;
    }

    private Set<SpecEnvironment> listEnvironments(ListFilterEnum list_filter) throws ApplicationNotFoundException {
        Set<SpecEnvironment> listedEnvironments = new HashSet<>();
        Collection<EnvironmentDto> foundEnvironments = null;

        switch (list_filter) {
        case ALL_ENVIRONMENTS:
            foundEnvironments = manageEnvironment.findEnvironments();
            break;
        case DEFAULT:
            foundEnvironments = manageEnvironment.findMyEnvironments();
            break;
        default:
            Assert.fail("Unexpected filter: " + list_filter);
        }

        for (EnvironmentDto environment : foundEnvironments) {
            SpecEnvironment listedEnvironment = new SpecEnvironment();
            listedEnvironment.app_name = environment.getApplicationLabel();
            listedEnvironment.app_release = environment.getReleaseVersion();
            listedEnvironment.env_name = environment.getLabel();
            listedEnvironments.add(listedEnvironment);
        }
        return listedEnvironments;
    }

    public static class SpecEnvironment {
        private String app_name;
        private String app_release;
        private String env_name;

        /* (non-Javadoc)
         * @see java.lang.Object#hashCode()
         */
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((app_name == null) ? 0 : app_name.hashCode());
            result = prime * result + ((app_release == null) ? 0 : app_release.hashCode());
            result = prime * result + ((env_name == null) ? 0 : env_name.hashCode());
            return result;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            SpecEnvironment other = (SpecEnvironment) obj;
            if (app_name == null) {
                if (other.app_name != null)
                    return false;
            } else if (!app_name.equals(other.app_name))
                return false;
            if (app_release == null) {
                if (other.app_release != null)
                    return false;
            } else if (!app_release.equals(other.app_release))
                return false;
            if (env_name == null) {
                if (other.env_name != null)
                    return false;
            } else if (!env_name.equals(other.env_name))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
        }

    }

    public static class SpecRelease {
        private String app_name;
        private String app_release;

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((app_name == null) ? 0 : app_name.hashCode());
            result = prime * result + ((app_release == null) ? 0 : app_release.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            SpecRelease other = (SpecRelease) obj;
            if (app_name == null) {
                if (other.app_name != null)
                    return false;
            } else if (!app_name.equals(other.app_name))
                return false;
            if (app_release == null) {
                if (other.app_release != null)
                    return false;
            } else if (!app_release.equals(other.app_release))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
        }
    }

    public static class SpecUser {
        private String cuid;
        private String first_name;
        private String last_name;
        private PaasRoleEnum role;
    }

    public static class SpecApp {
        private String app_name;
        private String member_list;
        private AppVisibilityEnum visibility;
        private int nb_releases;
    }

    public static class ListedApplication {
        private String app_name;
        private String member_list;
        private boolean can_edit;

        public ListedApplication(String app_name, Collection<SSOId> listMembers, boolean can_edit) {
            this.app_name = app_name;
            this.member_list = "";
            for (SSOId ssoId : listMembers) {
                member_list += ssoId.getValue();
                member_list += " ";
            }
            member_list = member_list.trim();
            this.can_edit = can_edit;
        }

        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
        }

        /* (non-Javadoc)
         * @see java.lang.Object#hashCode()
         */
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((app_name == null) ? 0 : app_name.hashCode());
            result = prime * result + (can_edit ? 1231 : 1237);
            result = prime * result + ((member_list == null) ? 0 : parseMembers(member_list).hashCode());
            return result;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            ListedApplication other = (ListedApplication) obj;
            if (app_name == null) {
                if (other.app_name != null)
                    return false;
            } else if (!app_name.equals(other.app_name))
                return false;
            if (can_edit != other.can_edit)
                return false;
            if (member_list == null) {
                if (other.member_list != null)
                    return false;
            } else if (!parseMembers(member_list).equals(parseMembers(other.member_list)))
                return false;
            return true;
        }
    }
}