public RangerServiceDef createServiceDef()

in security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java [475:743]


    public RangerServiceDef createServiceDef(RangerServiceDef serviceDef) throws Exception {
        LOG.debug("==> ServiceDBStore.createServiceDef({})", serviceDef);

        XXServiceDef xServiceDef = daoMgr.getXXServiceDef().findByName(serviceDef.getName());

        if (xServiceDef != null) {
            throw restErrorUtil.createRESTException("service-def with name: " + serviceDef.getName() + " already exists", MessageEnums.ERROR_DUPLICATE_OBJECT);
        }

        List<RangerServiceConfigDef> configs   = serviceDef.getConfigs();
        List<RangerResourceDef>      resources = serviceDef.getResources();

        if (CollectionUtils.isNotEmpty(resources)) {
            RangerServiceDefValidator      validator        = new RangerServiceDefValidator(this);
            List<ValidationFailureDetails> failures         = new ArrayList<>();
            boolean                        isValidResources = validator.isValidResources(serviceDef, failures, RangerValidator.Action.CREATE);

            if (!isValidResources) {
                throw restErrorUtil.createRESTException("service-def with name: " + serviceDef.getName() + " has invalid resources:[" + failures + "]", MessageEnums.INVALID_INPUT_DATA);
            }
        }

        List<RangerAccessTypeDef>      accessTypes          = serviceDef.getAccessTypes();
        List<RangerPolicyConditionDef> policyConditions     = serviceDef.getPolicyConditions();
        List<RangerContextEnricherDef> contextEnrichers     = serviceDef.getContextEnrichers();
        List<RangerEnumDef>            enums                = serviceDef.getEnums();
        RangerDataMaskDef              dataMaskDef          = serviceDef.getDataMaskDef();
        RangerRowFilterDef             rowFilterDef         = serviceDef.getRowFilterDef();
        List<RangerDataMaskTypeDef>    dataMaskTypes        = dataMaskDef == null || dataMaskDef.getMaskTypes() == null ? new ArrayList<>() : dataMaskDef.getMaskTypes();
        List<RangerAccessTypeDef>      dataMaskAccessTypes  = dataMaskDef == null || dataMaskDef.getAccessTypes() == null ? new ArrayList<>() : dataMaskDef.getAccessTypes();
        List<RangerResourceDef>        dataMaskResources    = dataMaskDef == null || dataMaskDef.getResources() == null ? new ArrayList<>() : dataMaskDef.getResources();
        List<RangerAccessTypeDef>      rowFilterAccessTypes = rowFilterDef == null || rowFilterDef.getAccessTypes() == null ? new ArrayList<>() : rowFilterDef.getAccessTypes();
        List<RangerResourceDef>        rowFilterResources   = rowFilterDef == null || rowFilterDef.getResources() == null ? new ArrayList<>() : rowFilterDef.getResources();

        RangerServiceDefHelper defHelper = new RangerServiceDefHelper(serviceDef, false);

        defHelper.patchServiceDefWithDefaultValues();

        // While creating, value of version should be 1.
        serviceDef.setVersion(1L);

        if (populateExistingBaseFields) {
            svcDefServiceWithAssignedId.setPopulateExistingBaseFields(true);

            daoMgr.getXXServiceDef().setIdentityInsert(true);

            svcDefServiceWithAssignedId.create(serviceDef);

            svcDefServiceWithAssignedId.setPopulateExistingBaseFields(false);

            daoMgr.getXXServiceDef().updateSequence();
            daoMgr.getXXServiceDef().setIdentityInsert(false);
        } else {
            // following fields will be auto populated
            serviceDef.setId(null);
            serviceDef.setCreateTime(null);
            serviceDef.setUpdateTime(null);

            serviceDef = serviceDefService.create(serviceDef);
        }

        Long                  serviceDefId       = serviceDef.getId();
        XXServiceDef          createdSvcDef      = daoMgr.getXXServiceDef().getById(serviceDefId);
        XXServiceConfigDefDao xxServiceConfigDao = daoMgr.getXXServiceConfigDef();

        for (int i = 0; i < configs.size(); i++) {
            RangerServiceConfigDef config  = configs.get(i);
            XXServiceConfigDef     xConfig = new XXServiceConfigDef();

            xConfig = serviceDefService.populateRangerServiceConfigDefToXX(config, xConfig, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xConfig.setOrder(i);

            xxServiceConfigDao.create(xConfig);
        }

        XXResourceDefDao xxResDefDao = daoMgr.getXXResourceDef();

        for (int i = 0; i < resources.size(); i++) {
            RangerResourceDef resource  = resources.get(i);
            XXResourceDef     parent    = xxResDefDao.findByNameAndServiceDefId(resource.getParent(), serviceDefId);
            Long              parentId  = (parent != null) ? parent.getId() : null;
            XXResourceDef     xResource = new XXResourceDef();

            xResource = serviceDefService.populateRangerResourceDefToXX(resource, xResource, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xResource.setOrder(i);
            xResource.setParent(parentId);

            xxResDefDao.create(xResource);
        }

        XXAccessTypeDefDao xxATDDao = daoMgr.getXXAccessTypeDef();

        for (int i = 0; i < accessTypes.size(); i++) {
            RangerAccessTypeDef accessType  = accessTypes.get(i);
            XXAccessTypeDef     xAccessType = new XXAccessTypeDef();

            xAccessType = serviceDefService.populateRangerAccessTypeDefToXX(accessType, xAccessType, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xAccessType.setOrder(i);

            xAccessType = xxATDDao.create(xAccessType);

            Collection<String>       impliedGrants = accessType.getImpliedGrants();
            XXAccessTypeDefGrantsDao xxATDGrantDao = daoMgr.getXXAccessTypeDefGrants();

            for (String impliedGrant : impliedGrants) {
                XXAccessTypeDefGrants xImpliedGrant = new XXAccessTypeDefGrants();

                xImpliedGrant.setAtdId(xAccessType.getId());
                xImpliedGrant.setImpliedGrant(impliedGrant);

                xxATDGrantDao.create(xImpliedGrant);
            }
        }

        XXPolicyConditionDefDao xxPolCondDao = daoMgr.getXXPolicyConditionDef();

        for (int i = 0; i < policyConditions.size(); i++) {
            RangerPolicyConditionDef policyCondition  = policyConditions.get(i);
            XXPolicyConditionDef     xPolicyCondition = new XXPolicyConditionDef();

            xPolicyCondition = serviceDefService.populateRangerPolicyConditionDefToXX(policyCondition, xPolicyCondition, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xPolicyCondition.setOrder(i);

            xxPolCondDao.create(xPolicyCondition);
        }

        XXContextEnricherDefDao xxContextEnricherDao = daoMgr.getXXContextEnricherDef();

        for (int i = 0; i < contextEnrichers.size(); i++) {
            RangerContextEnricherDef contextEnricher  = contextEnrichers.get(i);
            XXContextEnricherDef     xContextEnricher = new XXContextEnricherDef();

            xContextEnricher = serviceDefService.populateRangerContextEnricherDefToXX(contextEnricher, xContextEnricher, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xContextEnricher.setOrder(i);

            xxContextEnricherDao.create(xContextEnricher);
        }

        XXEnumDefDao xxEnumDefDao = daoMgr.getXXEnumDef();

        for (RangerEnumDef vEnum : enums) {
            XXEnumDef xEnum = new XXEnumDef();

            xEnum = serviceDefService.populateRangerEnumDefToXX(vEnum, xEnum, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);
            xEnum = xxEnumDefDao.create(xEnum);

            List<RangerEnumElementDef> elements        = vEnum.getElements();
            XXEnumElementDefDao        xxEnumEleDefDao = daoMgr.getXXEnumElementDef();

            for (int i = 0; i < elements.size(); i++) {
                RangerEnumElementDef element  = elements.get(i);
                XXEnumElementDef     xElement = new XXEnumElementDef();

                xElement = serviceDefService.populateRangerEnumElementDefToXX(element, xElement, xEnum, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

                xElement.setOrder(i);

                xxEnumEleDefDao.create(xElement);
            }
        }

        XXDataMaskTypeDefDao xxDataMaskDefDao = daoMgr.getXXDataMaskTypeDef();

        for (int i = 0; i < dataMaskTypes.size(); i++) {
            RangerDataMaskTypeDef dataMask     = dataMaskTypes.get(i);
            XXDataMaskTypeDef     xDataMaskDef = new XXDataMaskTypeDef();

            xDataMaskDef = serviceDefService.populateRangerDataMaskDefToXX(dataMask, xDataMaskDef, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

            xDataMaskDef.setOrder(i);

            xxDataMaskDefDao.create(xDataMaskDef);
        }

        List<XXAccessTypeDef> xxAccessTypeDefs = xxATDDao.findByServiceDefId(createdSvcDef.getId());

        for (RangerAccessTypeDef accessType : dataMaskAccessTypes) {
            if (!isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) {
                throw restErrorUtil.createRESTException("accessType with name: " + accessType.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND);
            }
        }

        for (RangerAccessTypeDef accessType : rowFilterAccessTypes) {
            if (!isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) {
                throw restErrorUtil.createRESTException("accessType with name: " + accessType.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND);
            }
        }

        for (XXAccessTypeDef xxAccessTypeDef : xxAccessTypeDefs) {
            String dataMaskOptions  = null;
            String rowFilterOptions = null;

            for (RangerAccessTypeDef accessTypeDef : dataMaskAccessTypes) {
                if (StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) {
                    dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef);
                    break;
                }
            }

            for (RangerAccessTypeDef accessTypeDef : rowFilterAccessTypes) {
                if (StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) {
                    rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef);
                    break;
                }
            }

            if (!StringUtils.equals(dataMaskOptions, xxAccessTypeDef.getDataMaskOptions()) || !StringUtils.equals(rowFilterOptions, xxAccessTypeDef.getRowFilterOptions())) {
                xxAccessTypeDef.setDataMaskOptions(dataMaskOptions);
                xxAccessTypeDef.setRowFilterOptions(rowFilterOptions);

                xxATDDao.update(xxAccessTypeDef);
            }
        }

        List<XXResourceDef> xxResourceDefs = xxResDefDao.findByServiceDefId(createdSvcDef.getId());

        for (RangerResourceDef resource : dataMaskResources) {
            if (!isResourceInList(resource.getName(), xxResourceDefs)) {
                throw restErrorUtil.createRESTException("resource with name: " + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND);
            }
        }

        for (RangerResourceDef resource : rowFilterResources) {
            if (!isResourceInList(resource.getName(), xxResourceDefs)) {
                throw restErrorUtil.createRESTException("resource with name: " + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND);
            }
        }

        for (XXResourceDef xxResourceDef : xxResourceDefs) {
            String dataMaskOptions  = null;
            String rowFilterOptions = null;

            for (RangerResourceDef resource : dataMaskResources) {
                if (StringUtils.equals(resource.getName(), xxResourceDef.getName())) {
                    dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(resource);
                    break;
                }
            }

            for (RangerResourceDef resource : rowFilterResources) {
                if (StringUtils.equals(resource.getName(), xxResourceDef.getName())) {
                    rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(resource);
                    break;
                }
            }

            if (!StringUtils.equals(dataMaskOptions, xxResourceDef.getDataMaskOptions()) || !StringUtils.equals(rowFilterOptions, xxResourceDef.getRowFilterOptions())) {
                xxResourceDef.setDataMaskOptions(dataMaskOptions);
                xxResourceDef.setRowFilterOptions(rowFilterOptions);

                xxResDefDao.update(xxResourceDef);
            }
        }

        RangerServiceDef createdServiceDef = serviceDefService.getPopulatedViewObject(createdSvcDef);

        dataHistService.createObjectDataHistory(createdServiceDef, RangerDataHistService.ACTION_CREATE);

        postCreate(createdServiceDef);

        LOG.debug("<== ServiceDBStore.createServiceDef({}): {}", serviceDef, createdServiceDef);

        return createdServiceDef;
    }