org.kaaproject.kaa.server.common.dao.impl.sql.HibernateCtlSchemaMetaInfoDao.java Source code

Java tutorial

Introduction

Here is the source code for org.kaaproject.kaa.server.common.dao.impl.sql.HibernateCtlSchemaMetaInfoDao.java

Source

/*
 * Copyright 2014-2016 CyberVision, Inc.
 *
 * 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 org.kaaproject.kaa.server.common.dao.impl.sql;

import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_FQN;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.ID_PROPERTY;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.kaaproject.kaa.server.common.dao.impl.CtlSchemaMetaInfoDao;
import org.kaaproject.kaa.server.common.dao.model.sql.CtlSchemaMetaInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Repository
public class HibernateCtlSchemaMetaInfoDao extends HibernateAbstractDao<CtlSchemaMetaInfo>
        implements CtlSchemaMetaInfoDao<CtlSchemaMetaInfo> {

    private static final Logger LOG = LoggerFactory.getLogger(HibernateCtlSchemaMetaInfoDao.class);

    public HibernateCtlSchemaMetaInfoDao() {
    }

    @Override
    protected Class<CtlSchemaMetaInfo> getEntityClass() {
        return CtlSchemaMetaInfo.class;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public CtlSchemaMetaInfo save(CtlSchemaMetaInfo object) {
        String tenantId = object.getTenant() != null ? object.getTenant().getStringId() : null;
        String applicationId = object.getApplication() != null ? object.getApplication().getStringId() : null;
        LOG.debug("Try to save or find meta info with fqn [{}], tenantId [{}] and applicationId [{}]",
                object.getFqn(), tenantId, applicationId);
        CtlSchemaMetaInfo uniqueMetaInfo = findByFqnTenantIdAndApplicationId(object.getFqn(), tenantId,
                applicationId);
        if (uniqueMetaInfo == null) {
            uniqueMetaInfo = super.save(object, true);
            LOG.debug("Save result: {}", uniqueMetaInfo);
        } else {
            LOG.debug("Search result: {}", uniqueMetaInfo);
        }
        return uniqueMetaInfo;
    }

    private Criterion buildSearchCriterion(String fqn, String tenantId, String applicationId) {
        List<Criterion> searchCriterions = new ArrayList<>();
        searchCriterions.add(Restrictions.eq(CTL_SCHEMA_META_INFO_FQN, fqn));
        if (isNotBlank(tenantId)) {
            searchCriterions.add(Restrictions.eq(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS, Long.valueOf(tenantId)));
        } else {
            searchCriterions.add(Restrictions.isNull(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS));
        }
        if (isNotBlank(applicationId)) {
            searchCriterions
                    .add(Restrictions.eq(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS, Long.valueOf(applicationId)));
        } else {
            searchCriterions.add(Restrictions.isNull(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS));
        }
        return Restrictions.and(searchCriterions.toArray(new Criterion[searchCriterions.size()]));
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public CtlSchemaMetaInfo findByFqnTenantIdAndApplicationId(String fqn, String tenantId, String applicationId) {
        LOG.debug("Searching ctl metadata by fqn [{}], tenantId [{}] and applicationId [{}]", fqn, tenantId,
                applicationId);
        CtlSchemaMetaInfo ctlSchemaMetaInfo = findOneByCriterion(
                buildSearchCriterion(fqn, tenantId, applicationId));
        if (LOG.isTraceEnabled()) {
            LOG.trace("[{},{},{}] Search result: {}.", fqn, tenantId, applicationId, ctlSchemaMetaInfo);
        } else {
            LOG.debug("[{},{},{}] Search result: {}.", fqn, tenantId, applicationId, ctlSchemaMetaInfo != null);
        }
        return ctlSchemaMetaInfo;
    }

    @Override
    public List<CtlSchemaMetaInfo> findSiblingsByFqnTenantIdAndApplicationId(String fqn, String tenantId,
            String applicationId) {
        LOG.debug("Searching siblings of ctl by fqn [{}], tenantId [{}] and applicationId [{}]", fqn, tenantId,
                applicationId);
        List<CtlSchemaMetaInfo> ctlSchemaMetaInfos;
        if (isNotBlank(fqn) && isNotBlank(tenantId) && isNotBlank(applicationId)) {
            ctlSchemaMetaInfos = findListByCriterion(Restrictions.and(
                    Restrictions.eq(CTL_SCHEMA_META_INFO_FQN, fqn),
                    Restrictions.eq(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS, Long.valueOf(tenantId)),
                    Restrictions.isNotNull(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS),
                    Restrictions.ne(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS, Long.valueOf(applicationId))));
        } else {
            ctlSchemaMetaInfos = Collections.emptyList();
        }
        if (LOG.isTraceEnabled()) {
            LOG.trace("[{}][{}][{}] Search result: [{}].", fqn, tenantId, applicationId,
                    Arrays.toString(ctlSchemaMetaInfos.toArray()));
        } else {
            LOG.debug("[{}][{}][{}] Search result: [{}].", fqn, tenantId, applicationId, ctlSchemaMetaInfos.size());
        }
        return ctlSchemaMetaInfos;
    }

    private Criterion buildExludingSearchCriterion(String fqn, String excludingTenantId,
            String excludingApplicationId) {
        List<Criterion> searchCriterions = new ArrayList<>();
        if (isNotBlank(excludingTenantId)) {
            searchCriterions.add(Restrictions.isNull(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS));
            if (isNotBlank(excludingApplicationId)) {
                searchCriterions.add(Restrictions.and(
                        Restrictions.eq(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS, Long.valueOf(excludingTenantId)),
                        Restrictions.isNull(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS)));
            } else {
                searchCriterions.add(Restrictions.and(
                        Restrictions.eq(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS, Long.valueOf(excludingTenantId)),
                        Restrictions.isNotNull(CTL_SCHEMA_META_INFO_APPLICATION_ID_ALIAS)));
            }
        } else {
            searchCriterions.add(Restrictions.isNotNull(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS));
        }
        return Restrictions.and(Restrictions.eq(CTL_SCHEMA_META_INFO_FQN, fqn),
                Restrictions.or(searchCriterions.toArray(new Criterion[searchCriterions.size()])));
    }

    @Override
    public List<CtlSchemaMetaInfo> findExistingFqns(String fqn, String excludingTenantId,
            String excludingApplicationId) {
        LOG.debug("Searching ctl metadata by fqn [{}], excludingTenantId [{}] " + "and excludingApplicationId [{}]",
                fqn, excludingTenantId, excludingApplicationId);
        List<CtlSchemaMetaInfo> ctlSchemasMetaInfos = findListByCriterion(
                buildExludingSearchCriterion(fqn, excludingTenantId, excludingApplicationId));
        if (LOG.isTraceEnabled()) {
            LOG.trace("[{},{},{}] Search result: {}.", fqn, excludingTenantId, excludingApplicationId,
                    Arrays.toString(ctlSchemasMetaInfos.toArray()));
        } else {
            LOG.debug("[{},{},{}] Search result: {}.", fqn, excludingTenantId, excludingApplicationId,
                    ctlSchemasMetaInfos.size());
        }
        return ctlSchemasMetaInfos;
    }

    @Override
    public List<CtlSchemaMetaInfo> findOthersByFqnAndTenantId(String fqn, String tenantId, String excludingId) {
        LOG.debug("Searching other ctl schema meta infos by fqn [{}], " + "tenant id [{}] and excluding id [{}]",
                fqn, tenantId, excludingId);
        List<CtlSchemaMetaInfo> availableSchemas = findListByCriterion(
                Restrictions.and(Restrictions.ne(ID_PROPERTY, Long.valueOf(excludingId)),
                        Restrictions.eq(CTL_SCHEMA_META_INFO_FQN, fqn),
                        Restrictions.or(
                                Restrictions.eq(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS, Long.valueOf(tenantId)),
                                Restrictions.isNull(CTL_SCHEMA_META_INFO_TENANT_ID_ALIAS))));
        if (LOG.isTraceEnabled()) {
            LOG.trace("[{}][{}][{}] Search result: [{}].", fqn, tenantId, excludingId,
                    Arrays.toString(availableSchemas.toArray()));
        } else {
            LOG.debug("[{}][{}][{}] Search result: [{}].", fqn, tenantId, excludingId, availableSchemas.size());
        }
        return availableSchemas;
    }

    @Override
    public CtlSchemaMetaInfo updateScope(CtlSchemaMetaInfo ctlSchemaMetaInfo) {
        LOG.debug("Updating ctl meta info scope {}", ctlSchemaMetaInfo);
        CtlSchemaMetaInfo metaInfo = findById(ctlSchemaMetaInfo.getStringId());
        if (metaInfo != null) {
            metaInfo.setTenant(ctlSchemaMetaInfo.getTenant());
            metaInfo.setApplication(ctlSchemaMetaInfo.getApplication());
            metaInfo = super.save(metaInfo);
        }
        LOG.debug("Update result: {}", metaInfo != null);
        return metaInfo;
    }

}