private void updateChildObjectsOfServiceDef()

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


    private void updateChildObjectsOfServiceDef(XXServiceDef createdSvcDef, List<RangerServiceConfigDef> configs,
            List<RangerResourceDef> resources, List<RangerAccessTypeDef> accessTypes,
            List<RangerPolicyConditionDef> policyConditions, List<RangerContextEnricherDef> contextEnrichers,
            List<RangerEnumDef> enums, RangerDataMaskDef dataMaskDef, RangerRowFilterDef rowFilterDef) {
        Long                       serviceDefId       = createdSvcDef.getId();
        List<XXServiceConfigDef>   xxConfigs          = daoMgr.getXXServiceConfigDef().findByServiceDefId(serviceDefId);
        List<XXResourceDef>        xxResources        = daoMgr.getXXResourceDef().findByServiceDefId(serviceDefId);
        List<XXAccessTypeDef>      xxAccessTypes      = daoMgr.getXXAccessTypeDef().findByServiceDefId(serviceDefId);
        List<XXPolicyConditionDef> xxPolicyConditions = daoMgr.getXXPolicyConditionDef().findByServiceDefId(serviceDefId);
        List<XXContextEnricherDef> xxContextEnrichers = daoMgr.getXXContextEnricherDef().findByServiceDefId(serviceDefId);
        List<XXEnumDef>            xxEnums            = daoMgr.getXXEnumDef().findByServiceDefId(serviceDefId);
        XXServiceConfigDefDao      xxServiceConfigDao = daoMgr.getXXServiceConfigDef();

        for (int i = 0; i < configs.size(); i++) {
            RangerServiceConfigDef config = configs.get(i);
            boolean                found  = false;

            for (XXServiceConfigDef xConfig : xxConfigs) {
                if (config.getItemId() != null && config.getItemId().equals(xConfig.getItemId())) {
                    found   = true;
                    xConfig = serviceDefService.populateRangerServiceConfigDefToXX(config, xConfig, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xConfig.setOrder(i);

                    xConfig = xxServiceConfigDao.update(xConfig);
                    config  = serviceDefService.populateXXToRangerServiceConfigDef(xConfig);
                    break;
                }
            }

            if (!found) {
                XXServiceConfigDef xConfig = new XXServiceConfigDef();

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

                xConfig.setOrder(i);

                xConfig = xxServiceConfigDao.create(xConfig);

                serviceDefService.populateXXToRangerServiceConfigDef(xConfig);
            }
        }

        for (XXServiceConfigDef xConfig : xxConfigs) {
            boolean found = false;

            for (RangerServiceConfigDef config : configs) {
                if (xConfig.getItemId() != null && xConfig.getItemId().equals(config.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                xxServiceConfigDao.remove(xConfig);
            }
        }

        XXResourceDefDao xxResDefDao = daoMgr.getXXResourceDef();

        for (RangerResourceDef resource : resources) {
            boolean found = false;

            for (XXResourceDef xRes : xxResources) {
                if (resource.getItemId() != null && resource.getItemId().equals(xRes.getItemId())) {
                    found = true;
                    xRes  = serviceDefService.populateRangerResourceDefToXX(resource, xRes, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xxResDefDao.update(xRes);

                    resource = serviceDefService.populateXXToRangerResourceDef(xRes);
                    break;
                }
            }

            if (!found) {
                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.setParent(parentId);

                xxResDefDao.create(xResource);
            }
        }

        for (XXResourceDef xRes : xxResources) {
            boolean found = false;

            for (RangerResourceDef resource : resources) {
                if (xRes.getItemId() != null && xRes.getItemId().equals(resource.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                List<XXPolicyRefResource> xxPolicyRefResource = daoMgr.getXXPolicyRefResource().findByResourceDefID(xRes.getId());

                if (!stringUtil.isEmpty(xxPolicyRefResource)) {
                    throw restErrorUtil.createRESTException("Policy/Policies are referring to this resource: " + xRes.getName() + ". Please remove such references from policy before updating service-def.", MessageEnums.DATA_NOT_UPDATABLE);
                }

                deleteXXResourceDef(xRes);
            }
        }

        XXAccessTypeDefDao xxATDDao = daoMgr.getXXAccessTypeDef();

        for (int i = 0; i < accessTypes.size(); i++) {
            RangerAccessTypeDef access = accessTypes.get(i);
            boolean             found  = false;

            for (XXAccessTypeDef xAccess : xxAccessTypes) {
                if (access.getItemId() != null && access.getItemId().equals(xAccess.getItemId())) {
                    found   = true;
                    xAccess = serviceDefService.populateRangerAccessTypeDefToXX(access, xAccess, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xAccess.setOrder(i);

                    xAccess = xxATDDao.update(xAccess);

                    Collection<String>       impliedGrants   = access.getImpliedGrants();
                    XXAccessTypeDefGrantsDao xxATDGrantDao   = daoMgr.getXXAccessTypeDefGrants();
                    List<String>             xxImpliedGrants = xxATDGrantDao.findImpliedGrantsByATDId(xAccess.getId());

                    for (String impliedGrant : impliedGrants) {
                        boolean foundGrant = false;

                        for (String xImpliedGrant : xxImpliedGrants) {
                            if (StringUtils.equalsIgnoreCase(impliedGrant, xImpliedGrant)) {
                                foundGrant = true;
                                break;
                            }
                        }

                        if (!foundGrant) {
                            XXAccessTypeDefGrants xImpliedGrant = new XXAccessTypeDefGrants();

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

                            xxATDGrantDao.create(xImpliedGrant);
                        }
                    }

                    for (String xImpliedGrant : xxImpliedGrants) {
                        boolean foundGrant = false;

                        for (String impliedGrant : impliedGrants) {
                            if (StringUtils.equalsIgnoreCase(xImpliedGrant, impliedGrant)) {
                                foundGrant = true;
                                break;
                            }
                        }

                        if (!foundGrant) {
                            XXAccessTypeDefGrants xATDGrant = xxATDGrantDao.findByNameAndATDId(xAccess.getId(), xImpliedGrant);

                            xxATDGrantDao.remove(xATDGrant);
                        }
                    }

                    access = serviceDefService.populateXXToRangerAccessTypeDef(xAccess);
                    break;
                }
            }

            if (!found) {
                XXAccessTypeDef xAccessType = new XXAccessTypeDef();

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

                xAccessType.setOrder(i);

                xAccessType = xxATDDao.create(xAccessType);

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

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

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

                    xxATDGrantDao.create(xImpliedGrant);
                }

                serviceDefService.populateXXToRangerAccessTypeDef(xAccessType);
            }
        }

        for (XXAccessTypeDef xAccess : xxAccessTypes) {
            boolean found = false;

            for (RangerAccessTypeDef access : accessTypes) {
                if (xAccess.getItemId() != null && xAccess.getItemId().equals(access.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                List<XXPolicyRefAccessType> policyRefAccessTypeList = daoMgr.getXXPolicyRefAccessType().findByAccessTypeDefId(xAccess.getId());

                if (!stringUtil.isEmpty(policyRefAccessTypeList)) {
                    throw restErrorUtil.createRESTException("Policy/Policies are referring to this access-type: " + xAccess.getName() + ". Please remove such references from policy before updating service-def.", MessageEnums.DATA_NOT_UPDATABLE);
                }

                deleteXXAccessTypeDef(xAccess);
            }
        }

        XXPolicyConditionDefDao xxPolCondDao = daoMgr.getXXPolicyConditionDef();

        for (int i = 0; i < policyConditions.size(); i++) {
            RangerPolicyConditionDef condition = policyConditions.get(i);
            boolean                  found     = false;

            for (XXPolicyConditionDef xCondition : xxPolicyConditions) {
                if (condition.getItemId() != null && condition.getItemId().equals(xCondition.getItemId())) {
                    found      = true;
                    xCondition = serviceDefService.populateRangerPolicyConditionDefToXX(condition, xCondition, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xCondition.setOrder(i);

                    xCondition = xxPolCondDao.update(xCondition);
                    condition  = serviceDefService.populateXXToRangerPolicyConditionDef(xCondition);
                    break;
                }
            }

            if (!found) {
                XXPolicyConditionDef xCondition = new XXPolicyConditionDef();

                xCondition = serviceDefService.populateRangerPolicyConditionDefToXX(condition, xCondition, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

                xCondition.setOrder(i);

                xCondition = xxPolCondDao.create(xCondition);

                serviceDefService.populateXXToRangerPolicyConditionDef(xCondition);
            }
        }

        for (XXPolicyConditionDef xCondition : xxPolicyConditions) {
            boolean found = false;

            for (RangerPolicyConditionDef condition : policyConditions) {
                if (xCondition.getItemId() != null && xCondition.getItemId().equals(condition.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                List<XXPolicyRefCondition> xxPolicyRefConditions = daoMgr.getXXPolicyRefCondition().findByConditionDefId(xCondition.getId());

                if (!stringUtil.isEmpty(xxPolicyRefConditions)) {
                    throw restErrorUtil.createRESTException("Policy/Policies are referring to this policy-condition: " + xCondition.getName() + ". Please remove such references from policy before updating service-def.", MessageEnums.DATA_NOT_UPDATABLE);
                }

                for (XXPolicyRefCondition xxPolicyRefCondition : xxPolicyRefConditions) {
                    daoMgr.getXXPolicyRefCondition().remove(xxPolicyRefCondition);
                }

                xxPolCondDao.remove(xCondition);
            }
        }

        XXContextEnricherDefDao xxContextEnricherDao = daoMgr.getXXContextEnricherDef();

        for (int i = 0; i < contextEnrichers.size(); i++) {
            RangerContextEnricherDef context = contextEnrichers.get(i);
            boolean                  found   = false;

            for (XXContextEnricherDef xContext : xxContextEnrichers) {
                if (context.getItemId() != null && context.getItemId().equals(xContext.getItemId())) {
                    found    = true;
                    xContext = serviceDefService.populateRangerContextEnricherDefToXX(context, xContext, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xContext.setOrder(i);

                    xContext = xxContextEnricherDao.update(xContext);
                    context  = serviceDefService.populateXXToRangerContextEnricherDef(xContext);
                    break;
                }
            }

            if (!found) {
                XXContextEnricherDef xContext = new XXContextEnricherDef();

                xContext = serviceDefService.populateRangerContextEnricherDefToXX(context, xContext, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                xContext.setOrder(i);

                xContext = xxContextEnricherDao.create(xContext);

                serviceDefService.populateXXToRangerContextEnricherDef(xContext);
            }
        }

        for (XXContextEnricherDef xContext : xxContextEnrichers) {
            boolean found = false;

            for (RangerContextEnricherDef context : contextEnrichers) {
                if (xContext.getItemId() != null && xContext.getItemId().equals(context.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                daoMgr.getXXContextEnricherDef().remove(xContext);
            }
        }

        XXEnumDefDao xxEnumDefDao = daoMgr.getXXEnumDef();

        for (RangerEnumDef enumDef : enums) {
            boolean found = false;

            for (XXEnumDef xEnumDef : xxEnums) {
                if (enumDef.getItemId() != null && enumDef.getItemId().equals(xEnumDef.getItemId())) {
                    found    = true;
                    xEnumDef = serviceDefService.populateRangerEnumDefToXX(enumDef, xEnumDef, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);
                    xEnumDef = xxEnumDefDao.update(xEnumDef);

                    XXEnumElementDefDao        xEnumEleDao   = daoMgr.getXXEnumElementDef();
                    List<XXEnumElementDef>     xxEnumEleDefs = xEnumEleDao.findByEnumDefId(xEnumDef.getId());
                    List<RangerEnumElementDef> enumEleDefs   = enumDef.getElements();

                    for (int i = 0; i < enumEleDefs.size(); i++) {
                        RangerEnumElementDef eleDef   = enumEleDefs.get(i);
                        boolean              foundEle = false;

                        for (XXEnumElementDef xEleDef : xxEnumEleDefs) {
                            if (eleDef.getItemId() != null && eleDef.getItemId().equals(xEleDef.getItemId())) {
                                foundEle = true;
                                xEleDef  = serviceDefService.populateRangerEnumElementDefToXX(eleDef, xEleDef, xEnumDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                                xEleDef.setOrder(i);

                                xEnumEleDao.update(xEleDef);
                                break;
                            }
                        }

                        if (!foundEle) {
                            XXEnumElementDef xElement = new XXEnumElementDef();

                            xElement = serviceDefService.populateRangerEnumElementDefToXX(eleDef, xElement, xEnumDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

                            xElement.setOrder(i);

                            xEnumEleDao.create(xElement);
                        }
                    }

                    for (XXEnumElementDef xxEleDef : xxEnumEleDefs) {
                        boolean foundEle = false;

                        for (RangerEnumElementDef enumEle : enumEleDefs) {
                            if (xxEleDef.getItemId() != null && xxEleDef.getItemId().equals(enumEle.getItemId())) {
                                foundEle = true;
                                break;
                            }
                        }

                        if (!foundEle) {
                            xEnumEleDao.remove(xxEleDef);
                        }
                    }

                    enumDef = serviceDefService.populateXXToRangerEnumDef(xEnumDef);
                    break;
                }
            }

            if (!found) {
                XXEnumDef xEnum = new XXEnumDef();

                xEnum = serviceDefService.populateRangerEnumDefToXX(enumDef, xEnum, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT);

                xEnum = xxEnumDefDao.create(xEnum);

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

                for (RangerEnumElementDef element : elements) {
                    XXEnumElementDef xElement = new XXEnumElementDef();

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

                    xxEnumEleDefDao.create(xElement);
                }

                serviceDefService.populateXXToRangerEnumDef(xEnum);
            }
        }

        for (XXEnumDef xEnumDef : xxEnums) {
            boolean found = false;

            for (RangerEnumDef enumDef : enums) {
                if (xEnumDef.getItemId() != null && xEnumDef.getItemId().equals(enumDef.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                List<XXEnumElementDef> enumEleDefList = daoMgr.getXXEnumElementDef().findByEnumDefId(xEnumDef.getId());

                for (XXEnumElementDef eleDef : enumEleDefList) {
                    daoMgr.getXXEnumElementDef().remove(eleDef);
                }

                xxEnumDefDao.remove(xEnumDef);
            }
        }

        List<RangerDataMaskTypeDef> dataMasks            = 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();
        XXDataMaskTypeDefDao        dataMaskTypeDao      = daoMgr.getXXDataMaskTypeDef();
        List<XXDataMaskTypeDef>     xxDataMaskTypes      = dataMaskTypeDao.findByServiceDefId(serviceDefId);
        List<XXAccessTypeDef>       xxAccessTypeDefs     = xxATDDao.findByServiceDefId(serviceDefId);
        List<XXResourceDef>         xxResourceDefs       = xxResDefDao.findByServiceDefId(serviceDefId);

        // create or update dataMasks
        for (int i = 0; i < dataMasks.size(); i++) {
            RangerDataMaskTypeDef dataMask = dataMasks.get(i);
            boolean               found    = false;

            for (XXDataMaskTypeDef xxDataMask : xxDataMaskTypes) {
                if (xxDataMask.getItemId() != null && xxDataMask.getItemId().equals(dataMask.getItemId())) {
                    LOG.debug("Updating existing dataMask with itemId={}", dataMask.getItemId());

                    found      = true;
                    xxDataMask = serviceDefService.populateRangerDataMaskDefToXX(dataMask, xxDataMask, createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT);

                    xxDataMask.setOrder(i);

                    xxDataMask = dataMaskTypeDao.update(xxDataMask);
                    dataMask   = serviceDefService.populateXXToRangerDataMaskTypeDef(xxDataMask);
                    break;
                }
            }

            if (!found) {
                LOG.debug("Creating dataMask with itemId={}", dataMask.getItemId());

                XXDataMaskTypeDef xxDataMask = new XXDataMaskTypeDef();

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

                xxDataMask.setOrder(i);

                dataMaskTypeDao.create(xxDataMask);
            }
        }

        // remove dataMasks
        for (XXDataMaskTypeDef xxDataMask : xxDataMaskTypes) {
            boolean found = false;

            for (RangerDataMaskTypeDef dataMask : dataMasks) {
                if (xxDataMask.getItemId() != null && xxDataMask.getItemId().equals(dataMask.getItemId())) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                LOG.debug("Deleting dataMask with itemId={}", xxDataMask.getItemId());

                dataMaskTypeDao.remove(xxDataMask);
            }
        }

        for (RangerAccessTypeDef accessType : dataMaskAccessTypes) {
            if (!isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) {
                throw restErrorUtil.createRESTException("accessType with name: " + accessType.getName() + " does not exist", 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);
            }
        }

        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);
            }
        }
    }