de.iteratec.iteraplan.businesslogic.service.ElasticMiContextAndStakeholderManagerInitializationServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for de.iteratec.iteraplan.businesslogic.service.ElasticMiContextAndStakeholderManagerInitializationServiceImpl.java

Source

/*
 * iteraplan is an IT Governance web application developed by iteratec, GmbH
 * Copyright (C) 2004 - 2014 iteratec, GmbH
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY ITERATEC, ITERATEC DISCLAIMS THE
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 *
 * You can contact iteratec GmbH headquarters at Inselkammerstr. 4
 * 82008 Munich - Unterhaching, Germany, or at email address info@iteratec.de.
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 *
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "iteraplan" logo. If the display of the logo is not reasonably
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by iteraplan".
 */
package de.iteratec.iteraplan.businesslogic.service;

import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import de.iteratec.iteraplan.elasticmi.ElasticMiContext;
import de.iteratec.iteraplan.elasticmi.M3CRepository;
import de.iteratec.iteraplan.elasticmi.permission.ElasticMiAccessLevel;
import de.iteratec.iteraplan.elasticmi.permission.ElasticMiFeatureGroupPermission;
import de.iteratec.iteraplan.elasticmi.permission.ElasticMiFunctionalPermission;
import de.iteratec.iteraplan.elasticmi.permission.ElasticMiPermission;
import de.iteratec.iteraplan.elasticmi.permission.ElasticMiTypePermission;
import de.iteratec.iteraplan.elasticmi.permission.StakeholderManager;
import de.iteratec.iteraplan.model.ArchitecturalDomain;
import de.iteratec.iteraplan.model.BusinessDomain;
import de.iteratec.iteraplan.model.BusinessFunction;
import de.iteratec.iteraplan.model.BusinessMapping;
import de.iteratec.iteraplan.model.BusinessObject;
import de.iteratec.iteraplan.model.BusinessProcess;
import de.iteratec.iteraplan.model.BusinessUnit;
import de.iteratec.iteraplan.model.InformationSystem;
import de.iteratec.iteraplan.model.InformationSystemDomain;
import de.iteratec.iteraplan.model.InformationSystemInterface;
import de.iteratec.iteraplan.model.InfrastructureElement;
import de.iteratec.iteraplan.model.Isr2BoAssociation;
import de.iteratec.iteraplan.model.Product;
import de.iteratec.iteraplan.model.Project;
import de.iteratec.iteraplan.model.Tcr2IeAssociation;
import de.iteratec.iteraplan.model.TechnicalComponent;
import de.iteratec.iteraplan.model.TypeOfBuildingBlock;
import de.iteratec.iteraplan.model.attribute.AttributeTypeGroup;
import de.iteratec.iteraplan.model.user.PermissionAttrTypeGroup;
import de.iteratec.iteraplan.model.user.PermissionFunctional;
import de.iteratec.iteraplan.model.user.Role;
import de.iteratec.iteraplan.model.user.Role2BbtPermission;
import de.iteratec.iteraplan.model.user.Role2BbtPermission.EditPermissionType;
import de.iteratec.iteraplan.model.user.TypeOfFunctionalPermission;
import de.iteratec.iteraplan.model.user.User;

public class ElasticMiContextAndStakeholderManagerInitializationServiceImpl
        implements ElasticMiContextAndStakeholderManagerInitializationService {

    private final AttributeTypeGroupService attributeTypeGroupService;
    private final UserService userService;
    private final RoleService roleService;
    private final M3CRepository m3cRepository;

    final private StakeholderManager stakeholderManager;

    public ElasticMiContextAndStakeholderManagerInitializationServiceImpl(
            final AttributeTypeGroupService attributeTypeGroupService, final UserService userService,
            final RoleService roleService, final M3CRepository m3cRepository,
            final StakeholderManager stakeholderManager) {
        this.attributeTypeGroupService = attributeTypeGroupService;
        this.userService = userService;
        this.roleService = roleService;
        this.m3cRepository = m3cRepository;
        this.stakeholderManager = stakeholderManager;
    }

    /**{@inheritDoc}**/
    @Override
    public ElasticMiContext initializeMiContextAndStakeholderManager(String userLogin, String dataSource) {
        synchronized (stakeholderManager) {
            initializeStakeholderManager();

            de.iteratec.iteraplan.elasticmi.permission.User user = stakeholderManager
                    .findUserByPersistentName(userLogin);

            ElasticMiContext elasticMiContext = new ElasticMiContext(user, dataSource, m3cRepository);
            ElasticMiContext.setCurrentContext(elasticMiContext);

            return elasticMiContext;
        }
    }

    private void initializeStakeholderManager() {
        clearStakeholderManager();

        createTypePermissions();
        createFeaturureGroupPermissions();
        Map<Role, de.iteratec.iteraplan.elasticmi.permission.Role> roleMapping = createRoles();
        createUsers(roleMapping);
    }

    private void createTypePermissions() {
        for (String bbtName : bbtPersistentNames().values()) {
            stakeholderManager.addTypePermission(new ElasticMiTypePermission(bbtName, ElasticMiAccessLevel.READ));
            stakeholderManager.addTypePermission(new ElasticMiTypePermission(bbtName, ElasticMiAccessLevel.CREATE));
            stakeholderManager.addTypePermission(new ElasticMiTypePermission(bbtName, ElasticMiAccessLevel.UPDATE));
            stakeholderManager.addTypePermission(new ElasticMiTypePermission(bbtName, ElasticMiAccessLevel.DELETE));
        }
    }

    private void createFeaturureGroupPermissions() {
        for (AttributeTypeGroup atg : attributeTypeGroupService.getAllAttributeTypeGroups()) {
            stakeholderManager.addFeatureGroupPermission(
                    new ElasticMiFeatureGroupPermission(atg.getName(), ElasticMiAccessLevel.READ));
            stakeholderManager.addFeatureGroupPermission(
                    new ElasticMiFeatureGroupPermission(atg.getName(), ElasticMiAccessLevel.UPDATE));
        }
    }

    private Map<Role, de.iteratec.iteraplan.elasticmi.permission.Role> createRoles() {
        Map<Role, de.iteratec.iteraplan.elasticmi.permission.Role> roles = Maps.newHashMap();
        Set<String> allAtgNames = allAtgNames();
        Set<String> explicitAtgNames = Sets.newHashSet();
        for (Role iteraplanRole : roleService.loadElementList()) {
            de.iteratec.iteraplan.elasticmi.permission.Role elasticRole = stakeholderManager
                    .createRole(iteraplanRole.getRoleName());
            roles.put(iteraplanRole, elasticRole);
            grantBbtPerms(iteraplanRole, elasticRole);
            Set<String> newExplicitAtgNames = grantAtgPerms(iteraplanRole, elasticRole);
            explicitAtgNames = Sets.union(explicitAtgNames, newExplicitAtgNames);
        }
        for (String atgName : allAtgNames) {
            if (!explicitAtgNames.contains(atgName)) {
                ElasticMiFeatureGroupPermission updatePerm = stakeholderManager
                        .findFeatureGroupPermissionByPersistentName(ElasticMiAccessLevel.UPDATE + ":" + atgName);
                for (de.iteratec.iteraplan.elasticmi.permission.Role role : stakeholderManager.getRoles()) {
                    role.grantFeatureGroupPermission(updatePerm);
                }
            }
        }
        initSupervisorRole();
        return roles;
    }

    private void grantBbtPerms(Role iteraplanRole, de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        Map<String, Set<ElasticMiTypePermission>> miPermsByType = Maps.newHashMap();
        //set BBT perms for create, update, delete
        Set<Role2BbtPermission> iteraplanBbbtPermissions = aggregateRole2BbtPermissions(iteraplanRole);
        for (Role2BbtPermission iteraplanPermission : iteraplanBbbtPermissions) {
            EditPermissionType permType = iteraplanPermission.getType();
            TypeOfBuildingBlock typeOfBb = iteraplanPermission.getBbt().getTypeOfBuildingBlock();
            ElasticMiTypePermission typePerm = resolveTypePermission(permType, typeOfBb);
            addNullSafe(miPermsByType, typePerm);
        }
        //bbt read perms, correspond to functional perms in iteraplan
        for (PermissionFunctional perm : iteraplanRole.getPermissionsFunctionalAggregated()) {
            ElasticMiTypePermission elasticReadPerm = mapFunctionalPermToMiTypeReadPermission(
                    perm.getTypeOfFunctionalPermission());
            if (elasticReadPerm != null) {
                addNullSafe(miPermsByType, elasticReadPerm);
            }
        }

        for (Entry<String, Set<ElasticMiTypePermission>> entry : miPermsByType.entrySet()) {
            ElasticMiTypePermission maximalFullPermission = determineMaximalCompleteTypePermission(entry);
            if (maximalFullPermission != null) {
                elasticRole.grantTypePermission(maximalFullPermission);
            }
        }

        //handle abstract associations
        handleAbstractAssociationPerms(elasticRole);
    }

    private static void addNullSafe(Map<String, Set<ElasticMiTypePermission>> destination,
            ElasticMiTypePermission perm) {
        if (destination.get(perm.getStructuredTypePersistentName()) == null) {
            destination.put(perm.getStructuredTypePersistentName(), Sets.<ElasticMiTypePermission>newHashSet());
        }
        destination.get(perm.getStructuredTypePersistentName()).add(perm);
    }

    private Set<String> grantAtgPerms(Role iteraplanRole,
            de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        Set<String> explicitAtgNames = Sets.newHashSet();
        Set<PermissionAttrTypeGroup> atgPerms = iteraplanRole.getPermissionsAttrTypeGroupAggregated();
        for (PermissionAttrTypeGroup atgPerm : atgPerms) {
            ElasticMiAccessLevel accessLevel = mapAtgPermissionType(atgPerm);
            ElasticMiFeatureGroupPermission fgPerm = stakeholderManager.findFeatureGroupPermissionByPersistentName(
                    accessLevel.name() + ":" + atgPerm.getAttributeTypeGroupName());
            elasticRole.grantFeatureGroupPermission(fgPerm);
            explicitAtgNames.add(atgPerm.getAttributeTypeGroupName());
        }
        return explicitAtgNames;
    }

    private void createUsers(Map<Role, de.iteratec.iteraplan.elasticmi.permission.Role> roleMapping) {
        for (User iteraplanUser : userService.loadElementList()) {
            de.iteratec.iteraplan.elasticmi.permission.User elasticUser = stakeholderManager
                    .createUser(iteraplanUser.getLoginName());
            elasticUser.setDefaultLocale(Locale.ENGLISH);
            elasticUser.setEmail(iteraplanUser.getEmail());
            elasticUser.setFirstName(iteraplanUser.getFirstName());
            elasticUser.setLastName(iteraplanUser.getLastName());

            Set<de.iteratec.iteraplan.elasticmi.permission.Role> elasticRoles = Sets.newHashSet();
            for (Role role : iteraplanUser.getRoles()) {
                if (roleMapping.get(role) != null) {
                    elasticRoles.add(roleMapping.get(role));
                }
            }
            for (de.iteratec.iteraplan.elasticmi.permission.Role elasticRole : elasticRoles) {
                elasticUser.addRole(elasticRole);
            }
        }
    }

    private void clearStakeholderManager() {
        stakeholderManager.dropUsers();
        stakeholderManager.dropRoles();
        stakeholderManager.dropFunctionalPermissions();
        stakeholderManager.dropFeatureGroupPermissions();
        stakeholderManager.dropTypePermissions();
    }

    private void handleAbstractAssociationPerms(de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        handleIsr2BoAssociation(elasticRole);
        handleTcr2IeAssociation(elasticRole);
        handleTransports(elasticRole);
    }

    private void handleIsr2BoAssociation(de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        boolean boReadPerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.BUSINESSOBJECT), ElasticMiAccessLevel.READ));
        boolean boUpdatePerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.BUSINESSOBJECT), ElasticMiAccessLevel.UPDATE));
        boolean isrReadPerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.INFORMATIONSYSTEMRELEASE), ElasticMiAccessLevel.READ));
        boolean isrUpdatePerm = hasPermission(elasticRole,
                new ElasticMiTypePermission(bbtPersistentNames().get(TypeOfBuildingBlock.INFORMATIONSYSTEMRELEASE),
                        ElasticMiAccessLevel.UPDATE));
        if (boUpdatePerm || isrUpdatePerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.DELETE.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.ISR2BOASSOCIATION)));
        } else if (boReadPerm || isrReadPerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.READ.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.ISR2BOASSOCIATION)));
        }
    }

    private void handleTcr2IeAssociation(de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        boolean tcrReadPerm = hasPermission(elasticRole,
                new ElasticMiTypePermission(bbtPersistentNames().get(TypeOfBuildingBlock.TECHNICALCOMPONENTRELEASE),
                        ElasticMiAccessLevel.READ));
        boolean tcrUpdatePerm = hasPermission(elasticRole,
                new ElasticMiTypePermission(bbtPersistentNames().get(TypeOfBuildingBlock.TECHNICALCOMPONENTRELEASE),
                        ElasticMiAccessLevel.UPDATE));
        boolean ieReadPerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.INFRASTRUCTUREELEMENT), ElasticMiAccessLevel.READ));
        boolean ieUpdatePerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.INFRASTRUCTUREELEMENT), ElasticMiAccessLevel.UPDATE));
        if (tcrUpdatePerm || ieUpdatePerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.DELETE.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.TCR2IEASSOCIATION)));
        } else if (tcrReadPerm || ieReadPerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.READ.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.TCR2IEASSOCIATION)));
        }
    }

    private void handleTransports(de.iteratec.iteraplan.elasticmi.permission.Role elasticRole) {
        boolean boReadPerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.BUSINESSOBJECT), ElasticMiAccessLevel.READ));
        boolean boUpdatePerm = hasPermission(elasticRole, new ElasticMiTypePermission(
                bbtPersistentNames().get(TypeOfBuildingBlock.BUSINESSOBJECT), ElasticMiAccessLevel.UPDATE));
        boolean intReadPerm = hasPermission(elasticRole,
                new ElasticMiTypePermission(
                        bbtPersistentNames().get(TypeOfBuildingBlock.INFORMATIONSYSTEMINTERFACE),
                        ElasticMiAccessLevel.READ));
        boolean intUpdatePerm = hasPermission(elasticRole,
                new ElasticMiTypePermission(
                        bbtPersistentNames().get(TypeOfBuildingBlock.INFORMATIONSYSTEMINTERFACE),
                        ElasticMiAccessLevel.UPDATE));
        if (boUpdatePerm || intUpdatePerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.DELETE.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.TRANSPORT)));
        } else if (boReadPerm || intReadPerm) {
            elasticRole.grantTypePermission(
                    stakeholderManager.findTypePermissionByPersistentName(ElasticMiAccessLevel.READ.name() + ":"
                            + bbtPersistentNames().get(TypeOfBuildingBlock.TRANSPORT)));
        }
    }

    private static boolean hasPermission(de.iteratec.iteraplan.elasticmi.permission.Role elasticRole,
            ElasticMiPermission perm) {
        for (ElasticMiPermission permission : elasticRole.getAllPermissions()) {
            if (permission.implies(perm)) {
                return true;
            }
        }
        return false;
    }

    private ElasticMiTypePermission resolveTypePermission(EditPermissionType permissionType,
            TypeOfBuildingBlock typeOfBuildingBlock) {
        ElasticMiAccessLevel elasticAccessLevel = mapEditPermissionType(permissionType);
        String persistentName = bbtPersistentNames().get(typeOfBuildingBlock);
        return stakeholderManager
                .findTypePermissionByPersistentName(elasticAccessLevel.name() + ":" + persistentName);
    }

    private static ElasticMiAccessLevel mapEditPermissionType(EditPermissionType editPermissionType) {
        if (EditPermissionType.CREATE.equals(editPermissionType)) {
            return ElasticMiAccessLevel.CREATE;
        } else if (EditPermissionType.DELETE.equals(editPermissionType)) {
            return ElasticMiAccessLevel.DELETE;
        } else {
            return ElasticMiAccessLevel.UPDATE;
        }
    }

    private static ElasticMiAccessLevel mapAtgPermissionType(PermissionAttrTypeGroup atgPerm) {
        if (PermissionAttrTypeGroup.READ_KEY.equals(atgPerm.getPermissionKey())) {
            return ElasticMiAccessLevel.READ;
        } else if (PermissionAttrTypeGroup.READ_WRITE_KEY.endsWith(atgPerm.getPermissionKey())) {
            return ElasticMiAccessLevel.UPDATE;
        }
        return null;
    }

    private ElasticMiTypePermission mapFunctionalPermToMiTypeReadPermission(TypeOfFunctionalPermission perm) {
        String typeName = null;
        if (TypeOfFunctionalPermission.ARCHITECTURALDOMAIN.equals(perm)) {
            typeName = ArchitecturalDomain.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSDOMAIN.equals(perm)) {
            typeName = BusinessDomain.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSFUNCTION.equals(perm)) {
            typeName = BusinessFunction.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSMAPPING.equals(perm)) {
            typeName = BusinessMapping.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSOBJECT.equals(perm)) {
            typeName = BusinessObject.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSPROCESS.equals(perm)) {
            typeName = BusinessProcess.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.BUSINESSUNIT.equals(perm)) {
            typeName = BusinessUnit.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.INFORMATIONSYSTEMDOMAIN.equals(perm)) {
            typeName = InformationSystemDomain.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.INFORMATIONSYSTEMINTERFACE.equals(perm)) {
            typeName = InformationSystemInterface.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.INFORMATIONSYSTEMRELEASE.equals(perm)) {
            typeName = InformationSystem.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.INFRASTRUCTUREELEMENT.equals(perm)) {
            typeName = InfrastructureElement.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.PRODUCT.equals(perm)) {
            typeName = Product.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.PROJECT.equals(perm)) {
            typeName = Project.class.getSimpleName();
        } else if (TypeOfFunctionalPermission.TECHNICALCOMPONENTRELEASES.equals(perm)) {
            typeName = TechnicalComponent.class.getSimpleName();
        }
        if (typeName != null) {
            return stakeholderManager
                    .findTypePermissionByPersistentName(ElasticMiAccessLevel.READ + ":" + typeName);
        }
        return null;
    }

    private void initSupervisorRole() {
        de.iteratec.iteraplan.elasticmi.permission.Role supervisorRole = stakeholderManager
                .findRoleByPersistentName(Role.SUPERVISOR_ROLE_NAME);
        for (ElasticMiTypePermission perm : stakeholderManager.getTypePermissions()) {
            supervisorRole.grantTypePermission(perm);
        }
        for (ElasticMiFeatureGroupPermission perm : stakeholderManager.getFeatureGroupPermissions()) {
            supervisorRole.grantFeatureGroupPermission(perm);
        }
        for (ElasticMiFunctionalPermission perm : stakeholderManager.getFunctionalPermissions()) {
            supervisorRole.grantFunctionalPermission(perm);
        }
    }

    private Set<String> allAtgNames() {
        Set<String> names = Sets.newHashSet();
        for (AttributeTypeGroup atg : attributeTypeGroupService.getAllAttributeTypeGroups()) {
            names.add(atg.getName());
        }
        return names;
    }

    private static Map<TypeOfBuildingBlock, String> bbtPersistentNames() {
        Map<TypeOfBuildingBlock, String> map = Maps.newHashMap();

        map.put(TypeOfBuildingBlock.ARCHITECTURALDOMAIN, ArchitecturalDomain.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSDOMAIN, BusinessDomain.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSFUNCTION, BusinessFunction.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSMAPPING, BusinessMapping.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSOBJECT, BusinessObject.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSPROCESS, BusinessProcess.class.getSimpleName());
        map.put(TypeOfBuildingBlock.BUSINESSUNIT, BusinessUnit.class.getSimpleName());
        map.put(TypeOfBuildingBlock.INFORMATIONSYSTEM, InformationSystem.class.getSimpleName());
        map.put(TypeOfBuildingBlock.INFORMATIONSYSTEMRELEASE, InformationSystem.class.getSimpleName());
        map.put(TypeOfBuildingBlock.INFORMATIONSYSTEMDOMAIN, InformationSystemDomain.class.getSimpleName());
        map.put(TypeOfBuildingBlock.INFORMATIONSYSTEMINTERFACE, InformationSystemInterface.class.getSimpleName());
        map.put(TypeOfBuildingBlock.INFRASTRUCTUREELEMENT, InfrastructureElement.class.getSimpleName());
        map.put(TypeOfBuildingBlock.ISR2BOASSOCIATION, Isr2BoAssociation.class.getSimpleName());
        map.put(TypeOfBuildingBlock.PRODUCT, Product.class.getSimpleName());
        map.put(TypeOfBuildingBlock.PROJECT, Project.class.getSimpleName());
        map.put(TypeOfBuildingBlock.TCR2IEASSOCIATION, Tcr2IeAssociation.class.getSimpleName());
        map.put(TypeOfBuildingBlock.TECHNICALCOMPONENT, TechnicalComponent.class.getSimpleName());
        map.put(TypeOfBuildingBlock.TECHNICALCOMPONENTRELEASE, TechnicalComponent.class.getSimpleName());
        map.put(TypeOfBuildingBlock.TRANSPORT, "InformationFlow");

        return map;
    }

    private static Set<Role2BbtPermission> aggregateRole2BbtPermissions(Role role) {
        Set<Role2BbtPermission> allPerms = Sets.newHashSet(role.getPermissionsBbt());
        for (Role part : role.getConsistsOfRolesAggregated()) {
            allPerms.addAll(part.getPermissionsBbt());
        }
        return allPerms;
    }

    private static ElasticMiTypePermission determineMaximalCompleteTypePermission(
            Entry<String, Set<ElasticMiTypePermission>> perms) {
        boolean containsRead = false;
        boolean containsUpdate = false;
        boolean containsCreate = false;
        boolean containsDelete = false;

        for (ElasticMiTypePermission perm : perms.getValue()) {
            if (ElasticMiAccessLevel.READ.equals(perm.getAccessLevel())) {
                containsRead = true;
            } else if (ElasticMiAccessLevel.UPDATE.equals(perm.getAccessLevel())) {
                containsUpdate = true;
            } else if (ElasticMiAccessLevel.CREATE.equals(perm.getAccessLevel())) {
                containsCreate = true;
            } else {
                containsDelete = true;
            }
        }

        if (!containsRead) {
            return null;
        } else if (!containsUpdate) {
            return new ElasticMiTypePermission(perms.getKey(), ElasticMiAccessLevel.READ);
        } else if (!containsCreate) {
            return new ElasticMiTypePermission(perms.getKey(), ElasticMiAccessLevel.UPDATE);
        } else if (!containsDelete) {
            return new ElasticMiTypePermission(perms.getKey(), ElasticMiAccessLevel.CREATE);
        } else {
            return new ElasticMiTypePermission(perms.getKey(), ElasticMiAccessLevel.DELETE);
        }
    }
}