/*
* 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.APPLICATION_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_REFERENCE;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CONFIGURATION_SCHEMA_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CONFIGURATION_SCHEMA_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.CONFIGURATION_SCHEMA_REFERENCE;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_GROUP_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_GROUP_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_GROUP_REFERENCE;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.SCHEMA_VERSION_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.SEQUENCE_NUMBER_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.STATUS_PROPERTY;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.kaaproject.kaa.common.dto.UpdateStatus;
import org.kaaproject.kaa.server.common.dao.impl.ConfigurationDao;
import org.kaaproject.kaa.server.common.dao.model.sql.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@Repository
public class HibernateConfigurationDao extends HibernateAbstractDao<Configuration>
implements ConfigurationDao<Configuration> {
private static final Logger LOG = LoggerFactory.getLogger(HibernateConfigurationDao.class);
@Override
public Configuration findConfigurationByAppIdAndVersion(String appId, int version) {
Configuration configuration = null;
LOG.debug("Searching configuration by application id [{}] and schema version [{}]",
appId, version);
if (isNotBlank(appId)) {
configuration = findOneByCriterionWithAlias(
APPLICATION_PROPERTY,
APPLICATION_ALIAS,
Restrictions.and(
Restrictions.eq(APPLICATION_REFERENCE, Long.valueOf(appId)),
Restrictions.eq(SCHEMA_VERSION_PROPERTY, version),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", appId, version, configuration);
} else {
LOG.debug("[{},{}] Search result: {}.", appId, version, configuration != null);
}
return configuration;
}
@Override
public Configuration findConfigurationByEndpointGroupIdAndVersion(String groupId, int version) {
Configuration configuration = null;
LOG.debug("Searching configuration by endpoint group id [{}] and schema version [{}]",
groupId, version);
if (isNotBlank(groupId)) {
configuration = findOneByCriterionWithAlias(
ENDPOINT_GROUP_PROPERTY,
ENDPOINT_GROUP_ALIAS,
Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(SCHEMA_VERSION_PROPERTY, version),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", groupId, version, configuration);
} else {
LOG.debug("[{},{}] Search result: {}.", groupId, version, configuration != null);
}
return configuration;
}
@Override
public Configuration findLatestActiveBySchemaIdAndGroupId(String schemaId, String groupId) {
Configuration configuration = null;
LOG.debug("Searching latest active configuration by configuration schema id [{}] "
+ "and group id [{}]",
schemaId, groupId);
if (isNotBlank(schemaId) && isNotBlank(groupId)) {
Criteria criteria = getCriteria();
criteria.createAlias(CONFIGURATION_SCHEMA_PROPERTY, CONFIGURATION_SCHEMA_ALIAS);
criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE)));
configuration = findOneByCriteria(criteria);
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", schemaId, groupId, configuration);
} else {
LOG.debug("[{},{}] Search result: {}.", schemaId, groupId, configuration != null);
}
return configuration;
}
@Override
public Configuration findInactiveBySchemaIdAndGroupId(String schemaId, String groupId) {
Configuration configuration = null;
LOG.debug("Searching inactive configuration by configuration schema id [{}] and "
+ "group id [{}] ",
schemaId, groupId);
if (isNotBlank(schemaId) && isNotBlank(groupId)) {
Criteria criteria = getCriteria();
criteria.createAlias(CONFIGURATION_SCHEMA_PROPERTY, CONFIGURATION_SCHEMA_ALIAS);
criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.INACTIVE)));
configuration = findOneByCriteria(criteria);
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", schemaId, groupId, configuration);
} else {
LOG.debug("[{},{}] Search result: {}.", schemaId, groupId, configuration != null);
}
return configuration;
}
@Override
public List<Configuration> findActiveByEndpointGroupId(String groupId) {
List<Configuration> configurations = null;
LOG.debug("Searching active configurations by endpoint group id [{}] ", groupId);
if (isNotBlank(groupId)) {
configurations = findListByCriterionWithAlias(
ENDPOINT_GROUP_PROPERTY,
ENDPOINT_GROUP_ALIAS,
Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{}] Search result: {}.",
groupId, Arrays.toString(configurations.toArray()));
} else {
LOG.debug("[{}] Search result: {}.",
groupId, configurations.size());
}
return configurations;
}
@Override
public List<Configuration> findActualByEndpointGroupId(String groupId) {
List<Configuration> configurations = null;
LOG.debug("Searching actual configurations by endpoint group id [{}] ", groupId);
if (isNotBlank(groupId)) {
configurations = findListByCriterionWithAlias(
ENDPOINT_GROUP_PROPERTY,
ENDPOINT_GROUP_ALIAS,
Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.ne(STATUS_PROPERTY, UpdateStatus.DEPRECATED)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{}] Search result: {}.",
groupId, Arrays.toString(configurations.toArray()));
} else {
LOG.debug("[{}] Search result: {}.",
groupId, configurations.size());
}
return configurations;
}
@Override
public List<Configuration> findActualBySchemaIdAndGroupId(String schemaId, String groupId) {
List<Configuration> configurations = Collections.emptyList();
LOG.debug("Searching actual configurations by configuration schema id [{}] "
+ "and group id [{}] ",
schemaId, groupId);
if (isNotBlank(schemaId) && isNotBlank(groupId)) {
Criteria criteria = getCriteria();
criteria.createAlias(CONFIGURATION_SCHEMA_PROPERTY, CONFIGURATION_SCHEMA_ALIAS);
criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)),
Restrictions.ne(STATUS_PROPERTY, UpdateStatus.DEPRECATED)));
configurations = findListByCriteria(criteria);
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.",
schemaId, groupId, Arrays.toString(configurations.toArray()));
} else {
LOG.debug("[{},{}] Search result: {}.",
schemaId, groupId, configurations.size());
}
return configurations;
}
@Override
public Configuration findLatestDeprecated(String schemaId, String groupId) {
Configuration configuration = null;
LOG.debug("Searching latest deprecated configurations by configuration schema id [{}] "
+ "and group id [{}] ",
schemaId, groupId);
if (isNotBlank(schemaId) && isNotBlank(groupId)) {
Criteria criteria = getCriteria();
criteria.createAlias(CONFIGURATION_SCHEMA_PROPERTY, CONFIGURATION_SCHEMA_ALIAS);
criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.DEPRECATED)));
criteria.addOrder(Order.desc(SEQUENCE_NUMBER_PROPERTY)).setMaxResults(FIRST);
configuration = findOneByCriteria(criteria);
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", schemaId, groupId, configuration);
} else {
LOG.debug("[{},{}] Search result: {}.", schemaId, groupId, configuration != null);
}
return configuration;
}
@Override
public void removeByConfigurationSchemaId(String schemaId) {
if (isNotBlank(schemaId)) {
List<Configuration> configurations = findListByCriterionWithAlias(
CONFIGURATION_SCHEMA_PROPERTY,
CONFIGURATION_SCHEMA_ALIAS,
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)));
removeList(configurations);
}
LOG.debug("Removed configurations by configuration schema id [{}]", schemaId);
}
@Override
public void removeByEndpointGroupId(String groupId) {
if (isNotBlank(groupId)) {
List<Configuration> configurations = findListByCriterionWithAlias(
ENDPOINT_GROUP_PROPERTY,
ENDPOINT_GROUP_ALIAS,
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)));
removeList(configurations);
}
LOG.debug("Removed configurations by endpoint group id [{}]", groupId);
}
@Override
public Configuration activate(String id, String username) {
LOG.debug("Activating configuration with id [{}] by user [{}]", id, username);
Configuration configuration = findById(id);
if (configuration != null) {
configuration.setStatus(UpdateStatus.ACTIVE);
configuration.setSequenceNumber(configuration.getSequenceNumber() + 1);
configuration.setActivatedUsername(username);
configuration.setActivatedTime(System.currentTimeMillis());
save(configuration);
}
LOG.debug("[{},{}] Configuration activated.", id, username);
return configuration;
}
@Override
public Configuration deactivate(String id, String username) {
LOG.debug("Deactivating configuration with id [{}] by user [{}]", id, username);
Configuration configuration = findById(id);
if (configuration != null) {
configuration.setStatus(UpdateStatus.DEPRECATED);
configuration.setDeactivatedUsername(username);
configuration.setDeactivatedTime(System.currentTimeMillis());
save(configuration);
}
LOG.debug("[{},{}] Configuration deactivated.", id, username);
return configuration;
}
@Override
public Configuration deactivateOldConfiguration(String schemaId,
String groupId,
String username) {
LOG.debug("Deactivating old configurations by configuration schema id [{}] and"
+ " endpoint group id [{}] ",
schemaId, groupId);
Configuration configuration = null;
if (isNotBlank(schemaId) && isNotBlank(groupId)) {
Criteria criteria = getCriteria();
criteria.createAlias(CONFIGURATION_SCHEMA_PROPERTY, CONFIGURATION_SCHEMA_ALIAS);
criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS);
Criterion criterion = Restrictions.and(
Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)),
Restrictions.eq(CONFIGURATION_SCHEMA_REFERENCE, Long.valueOf(schemaId)),
Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE));
criteria.add(criterion);
configuration = findOneByCriteria(criteria);
if (configuration != null) {
configuration.setDeactivatedUsername(username);
configuration.setDeactivatedTime(System.currentTimeMillis());
configuration.setStatus(UpdateStatus.DEPRECATED);
save(configuration);
}
}
LOG.debug("[{},{},{}] Configuration deactivated.", schemaId, groupId, username);
return configuration;
}
@Override
public Configuration save(Configuration object) {
Configuration saved = super.save(object);
getSession().flush();
return saved;
}
@Override
protected Class<Configuration> getEntityClass() {
return Configuration.class;
}
}