/* * 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.isBlank; import static org.apache.commons.lang.StringUtils.isNotBlank; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_DEPENDENCY_ALIAS; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_DEPENDENCY_ID_ALIAS; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_DEPENDENCY_PROP; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ALIAS; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ALIAS_FQN; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ALIAS_ID; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_META_INFO_PROPERTY; import static org.kaaproject.kaa.server.common.dao.DaoConstants.CTL_SCHEMA_VERSION; import org.hibernate.Criteria; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.sql.JoinType; import org.kaaproject.kaa.server.common.dao.impl.CtlSchemaDao; import org.kaaproject.kaa.server.common.dao.model.sql.CtlSchema; 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.Arrays; import java.util.List; @Repository public class HibernateCtlSchemaDao extends HibernateAbstractDao<CtlSchema> implements CtlSchemaDao<CtlSchema> { private static final Logger LOG = LoggerFactory.getLogger(HibernateCtlSchemaDao.class); @Override protected Class<CtlSchema> getEntityClass() { return CtlSchema.class; } private Criterion buildScopeCriterion(String tenantId, String applicationId) { if (isBlank(tenantId)) { // SYSTEM - tenantId=null && appId=null return Restrictions.and(Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID), Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID)); } else { if (isBlank(applicationId)) { // TENANT - (tenantId=id or tenantId=null) && appId=null return Restrictions.and(Restrictions.or( Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID, Long.valueOf(tenantId)), Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID) ), Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID)); } else { // APPLICATION - (tenantId=id or tenantId=null) && (appId=id or appId=null) return Restrictions.and(Restrictions.or( Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID, Long.valueOf(tenantId)), Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID) ), Restrictions.or( Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID, Long.valueOf(applicationId)), Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID))); } } } @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public CtlSchema save(CtlSchema object) { return super.save(object); } @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public CtlSchema save(CtlSchema object, boolean flush) { return super.save(object, flush); } @Override public List<CtlSchema> findSystemSchemas() { LOG.debug("Searching system ctl metadata"); List<CtlSchema> schemas = findListByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, buildScopeCriterion(null, null)); if (LOG.isTraceEnabled()) { LOG.trace("Search result: [{}].", Arrays.toString(schemas.toArray())); } else { LOG.debug("Search result: [{}].", schemas.size()); } return schemas; } @Override public List<CtlSchema> findAvailableSchemasForTenant(String tenantId) { LOG.debug("Searching available ctl schemas for tenant with id [{}]", tenantId); List<CtlSchema> availableSchemas = findListByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, buildScopeCriterion(tenantId, null)); if (LOG.isTraceEnabled()) { LOG.trace("[{}] Search result: [{}].", tenantId, Arrays.toString(availableSchemas.toArray())); } else { LOG.debug("[{}] Search result: [{}].", tenantId, availableSchemas.size()); } return availableSchemas; } @Override public List<CtlSchema> findAvailableSchemasForApplication(String tenantId, String appId) { LOG.debug("Searching available ctl schemas for application by tenant id [{}] " + "and application id [{}]", tenantId, appId); List<CtlSchema> availableSchemas = findListByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, buildScopeCriterion(tenantId, appId)); if (LOG.isTraceEnabled()) { LOG.trace("[{}][{}] Search result: [{}].", tenantId, appId, Arrays.toString(availableSchemas.toArray())); } else { LOG.debug("[{}][{}] Search result: [{}].", tenantId, appId, availableSchemas.size()); } return availableSchemas; } @Override public CtlSchema findByFqnAndVerAndTenantIdAndApplicationId( String fqn, Integer version, String tenantId, String applicationId) { CtlSchema ctlSchema = null; LOG.debug("Searching ctl schema by fqn [{}], version [{}], tenant [{}] and applicationId [{}]", fqn, version, tenantId, applicationId); if (isNotBlank(fqn) && version != null) { ctlSchema = findOneByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, Restrictions.and(Restrictions.eq(CTL_SCHEMA_VERSION, version), Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_FQN, fqn), tenantId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID, Long.valueOf(tenantId)) : Restrictions.isNull( CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID), applicationId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID, Long.valueOf(applicationId)) : Restrictions.isNull( CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID))); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{},{}] Search result: [{}].", fqn, version, tenantId, applicationId, ctlSchema); } else { LOG.debug("[{},{},{},{}] Search result: [{}].", fqn, version, tenantId, applicationId, ctlSchema != null); } return ctlSchema; } @Override public CtlSchema findByMetaInfoIdAndVer(String metaInfoId, Integer version) { CtlSchema ctlSchema = null; LOG.debug("Searching ctl schema by meta info id [{}] and version [{}]", metaInfoId, version); if (isNotBlank(metaInfoId) && version != null) { ctlSchema = findOneByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, Restrictions.and(Restrictions.eq(CTL_SCHEMA_VERSION, version), Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_ID, Long.valueOf(metaInfoId)))); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{}] Search result: [{}].", metaInfoId, version, ctlSchema); } else { LOG.debug("[{},{}] Search result: [{}].", metaInfoId, version, ctlSchema != null); } return ctlSchema; } @Override public CtlSchema findAnyByFqnAndVerAndTenantIdAndApplicationId(String fqn, Integer version, String tenantId, String applicationId) { CtlSchema ctlSchema = null; LOG.debug("Searching any ctl schema by fqn [{}], version [{}], " + "tenant [{}] and applicationId [{}]", fqn, version, tenantId, applicationId); if (isNotBlank(fqn) && version != null) { ctlSchema = findOneByCriterionWithAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS, Restrictions.and(Restrictions.eq(CTL_SCHEMA_VERSION, version), Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_FQN, fqn), buildScopeCriterion(tenantId, applicationId))); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{},{}] Search result: [{}].", fqn, version, tenantId, applicationId, ctlSchema); } else { LOG.debug("[{},{},{},{}] Search result: [{}].", fqn, version, tenantId, applicationId, ctlSchema != null); } return ctlSchema; } @Override public CtlSchema findLatestByFqnAndTenantIdAndApplicationId(String fqn, String tenantId, String applicationId) { LOG.debug("Searching latest ctl schema by fqn [{}], tenantId [{}] and applicationId [{}]", fqn, tenantId, applicationId); Criteria criteria = getCriteria().createAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS) .add(Restrictions.and( Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_FQN, fqn), tenantId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID, Long.valueOf(tenantId)) : Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID), applicationId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID, Long.valueOf(applicationId)) : Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID)) ).addOrder(Order.desc(CTL_SCHEMA_VERSION)) .setMaxResults(FIRST); CtlSchema latestSchema = findOneByCriteria(criteria); if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{}] Search result: [{}].", fqn, tenantId, applicationId, latestSchema); } else { LOG.debug("[{},{},{}] Search result: [{}].", fqn, tenantId, applicationId, latestSchema != null); } return latestSchema; } @Override public CtlSchema findLatestByMetaInfoId(String metaInfoId) { CtlSchema latestSchema = null; LOG.debug("Searching latest version of ctl schema by meta info id [{}]", metaInfoId); if (isNotBlank(metaInfoId)) { Criteria criteria = getCriteria() .createAlias(CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS) .add(Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_ID, Long.valueOf(metaInfoId))) .addOrder(Order.desc(CTL_SCHEMA_VERSION)) .setMaxResults(FIRST); latestSchema = findOneByCriteria(criteria); } if (LOG.isTraceEnabled()) { LOG.trace("[{}] Search result: [{}].", metaInfoId, latestSchema); } else { LOG.debug("[{}] Search result: [{}].", metaInfoId, latestSchema != null); } return latestSchema; } @Override public List<CtlSchema> findAllByFqnAndTenantIdAndApplicationId(String fqn, String tenantId, String applicationId) { LOG.debug("Searching available version of ctl schema by fqn [{}], " + "tenantId [{}] and applicationId [{}]", fqn, tenantId, applicationId); Criteria criteria = getCriteria().createAlias( CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS) .add(Restrictions.and( Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_FQN, fqn), tenantId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID, Long.valueOf(tenantId)) : Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_TENANT_ID), applicationId != null ? Restrictions.eq( CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID, Long.valueOf(applicationId)) : Restrictions.isNull(CTL_SCHEMA_META_INFO_ALIAS_APPLICATION_ID)) ).addOrder(Order.asc(CTL_SCHEMA_VERSION)); List<CtlSchema> schemas = findListByCriteria(criteria); if (LOG.isTraceEnabled()) { LOG.trace("Search result: [{}].", Arrays.toString(schemas.toArray())); } else { LOG.debug("Search result: [{}].", schemas.size()); } return schemas; } @Override public List<CtlSchema> findAllByMetaInfoId(String metaInfoId) { LOG.debug("Searching available version of ctl schema by meta info id [{}]", metaInfoId); Criteria criteria = getCriteria() .createAlias(CTL_SCHEMA_META_INFO_PROPERTY, CTL_SCHEMA_META_INFO_ALIAS) .add(Restrictions.eq(CTL_SCHEMA_META_INFO_ALIAS_ID, Long.valueOf(metaInfoId))) .addOrder(Order.asc(CTL_SCHEMA_VERSION)); List<CtlSchema> schemas = findListByCriteria(criteria); if (LOG.isTraceEnabled()) { LOG.trace("Search result: [{}].", Arrays.toString(schemas.toArray())); } else { LOG.debug("Search result: [{}].", schemas.size()); } return schemas; } @Override public List<CtlSchema> findDependentSchemas(String schemaId) { LOG.debug("Searching dependents ctl schemas for schema with id [{}]", schemaId); List<CtlSchema> dependentsList = findListByCriterionWithAlias( CTL_SCHEMA_DEPENDENCY_PROP, CTL_SCHEMA_DEPENDENCY_ALIAS, JoinType.INNER_JOIN, Restrictions.eq(CTL_SCHEMA_DEPENDENCY_ID_ALIAS, Long.valueOf(schemaId))); if (LOG.isTraceEnabled()) { LOG.trace("[{}] Search result: [{}].", schemaId, Arrays.toString(dependentsList.toArray())); } else { LOG.debug("[{}] Search result: [{}].", schemaId, dependentsList.size()); } return dependentsList; } }