/* * 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.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.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.ENDPOINT_PROFILE_SCHEMA_ALIAS; import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_PROFILE_SCHEMA_PROPERTY; import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_PROFILE_SCHEMA_REFERENCE; import static org.kaaproject.kaa.server.common.dao.DaoConstants.ENDPOINT_PROFILE_SCHEMA_VERSION_REFERENCE; import static org.kaaproject.kaa.server.common.dao.DaoConstants.SEQUENCE_NUMBER_PROPERTY; import static org.kaaproject.kaa.server.common.dao.DaoConstants.SERVER_PROFILE_SCHEMA_ALIAS; import static org.kaaproject.kaa.server.common.dao.DaoConstants.SERVER_PROFILE_SCHEMA_PROPERTY; import static org.kaaproject.kaa.server.common.dao.DaoConstants.SERVER_PROFILE_SCHEMA_REFERENCE; import static org.kaaproject.kaa.server.common.dao.DaoConstants.SERVER_PROFILE_SCHEMA_VERSION_REFERENCE; 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.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.sql.JoinType; import org.kaaproject.kaa.common.dto.UpdateStatus; import org.kaaproject.kaa.server.common.dao.impl.ProfileFilterDao; import org.kaaproject.kaa.server.common.dao.model.sql.ModelUtils; import org.kaaproject.kaa.server.common.dao.model.sql.ProfileFilter; 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 HibernateProfileFilterDao extends HibernateAbstractDao<ProfileFilter> implements ProfileFilterDao<ProfileFilter> { private static final Logger LOG = LoggerFactory.getLogger(HibernateProfileFilterDao.class); @Override public List<ProfileFilter> findActualByEndpointGroupId(String groupId) { LOG.debug("Searching actual profile filters by endpoint group id [{}] ", groupId); List<ProfileFilter> filters = Collections.emptyList(); if (isNotBlank(groupId)) { filters = 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(filters.toArray())); } else { LOG.debug("[{}] Search result: {}.", groupId, filters.size()); } return filters; } @Override public List<ProfileFilter> findActualBySchemaIdAndGroupId( String endpointProfileSchemaId, String serverProfileSchemaId, String groupId) { LOG.debug("Searching actual profile filters by endpoint schema id [{}], " + "server schema id [{}] and group id [{}] ", endpointProfileSchemaId, serverProfileSchemaId, groupId); List<ProfileFilter> filters = Collections.emptyList(); if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.ne(STATUS_PROPERTY, UpdateStatus.DEPRECATED))); filters = findListByCriteria(criteria); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, Arrays.toString(filters.toArray())); } else { LOG.debug("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filters.size()); } return filters; } @Override public ProfileFilter findLatestDeprecated(String endpointProfileSchemaId, String serverProfileSchemaId, String groupId) { LOG.debug("Searching latest deprecated profile filter by endpoint profile schema id [{}], " + "server profile schema id [{}] and group id [{}] ", endpointProfileSchemaId, serverProfileSchemaId, groupId); ProfileFilter filter = null; if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); Criterion crit = Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.DEPRECATED)); filter = (ProfileFilter) criteria.add(crit).addOrder(Order.desc(SEQUENCE_NUMBER_PROPERTY)) .setMaxResults(FIRST).uniqueResult(); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filter); } else { LOG.debug("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filter != null); } return filter; } @Override public List<ProfileFilter> findByAppIdAndSchemaVersionsCombination(String appId, int endpointSchemaVersion, int serverSchemaVersion) { List<ProfileFilter> filters = null; LOG.debug("Searching configuration by application id [{}] and schema version [{}]", appId, serverSchemaVersion); if (isNotBlank(appId)) { Criteria criteria = getCriteria(); criteria.createAlias(APPLICATION_PROPERTY, APPLICATION_ALIAS); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); Criterion criterion = Restrictions.and( Restrictions.eq(APPLICATION_REFERENCE, Long.valueOf(appId)), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE), Restrictions.or(Restrictions.and( Restrictions.eq(ENDPOINT_PROFILE_SCHEMA_VERSION_REFERENCE, endpointSchemaVersion), Restrictions.eq(SERVER_PROFILE_SCHEMA_VERSION_REFERENCE, serverSchemaVersion) ), Restrictions.and( Restrictions.eq(ENDPOINT_PROFILE_SCHEMA_VERSION_REFERENCE, endpointSchemaVersion), Restrictions.isNull(SERVER_PROFILE_SCHEMA_VERSION_REFERENCE) ), Restrictions.and( Restrictions.eq(SERVER_PROFILE_SCHEMA_VERSION_REFERENCE, serverSchemaVersion), Restrictions.isNull(ENDPOINT_PROFILE_SCHEMA_VERSION_REFERENCE) ))); criteria.add(criterion); filters = findListByCriteria(criteria); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{}] Search result: {}.", appId, serverSchemaVersion, Arrays.toString(filters.toArray())); } else { LOG.debug("[{},{}] Search result: {}.", appId, serverSchemaVersion, filters.size()); } return filters; } @Override public ProfileFilter findInactiveFilter(String endpointProfileSchemaId, String serverProfileSchemaId, String groupId) { ProfileFilter filter = null; LOG.debug("Searching inactive profile filter by endpoint profile schema id [{}], " + "server profile schema id [{}] and group id [{}] ", endpointProfileSchemaId, serverProfileSchemaId, groupId); if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); criteria.add(Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.INACTIVE))); filter = findOneByCriteria(criteria); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filter); } else { LOG.debug("[{},{},{}] Search result: {}.", endpointProfileSchemaId, groupId, serverProfileSchemaId, filter != null); } return filter; } @Override public ProfileFilter findLatestFilter(String endpointProfileSchemaId, String serverProfileSchemaId, String groupId) { LOG.debug("Searching latest active profile filter by profile schema id [{}] and group id [{}]", endpointProfileSchemaId, serverProfileSchemaId, groupId); ProfileFilter filter = null; if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); criteria.add(Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE))); filter = findOneByCriteria(criteria); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filter); } else { LOG.debug("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, filter != null); } return filter; } @Override public ProfileFilter activate(String id, String username) { LOG.debug("Activating profile filter with id [{}] by username [{}]", id, username); ProfileFilter filter = findById(id); if (filter != null) { filter.setStatus(UpdateStatus.ACTIVE); filter.setActivatedTime(System.currentTimeMillis()); filter.setActivatedUsername(username); filter.incrementSequenceNumber(); filter = save(filter); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{}] Activating result: {}.", id, username, filter); } else { LOG.debug("[{},{}] Activating result: {}.", id, username, filter != null); } return filter; } @Override public ProfileFilter deactivate(String id, String username) { LOG.debug("Deactivating profile filter with id [{}] ", id); ProfileFilter filter = findById(id); if (filter != null) { filter.setStatus(UpdateStatus.DEPRECATED); filter.setDeactivatedTime(System.currentTimeMillis()); filter.setDeactivatedUsername(username); filter = save(filter); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{}] Deactivating result: {}.", id, username, filter); } else { LOG.debug("[{},{}] Deactivating result: {}.", id, username, filter != null); } return filter; } @Override public ProfileFilter deactivateOldFilter(String endpointProfileSchemaId, String serverProfileSchemaId, String groupId, String username) { LOG.debug("Deactivating old profile filter with endpoint profile schema id [{}], " + "server profile schema id [{}], group id [{}] by username [{}]", endpointProfileSchemaId, serverProfileSchemaId, groupId, username); ProfileFilter filter = null; if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); criteria.add(Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE))); filter = findOneByCriteria(criteria); } if (filter != null) { filter.setStatus(UpdateStatus.DEPRECATED); filter.setDeactivatedTime(System.currentTimeMillis()); filter.setDeactivatedUsername(username); filter = save(filter); } if (LOG.isTraceEnabled()) { LOG.trace("[{},{},{},{}] Deactivating result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, username, filter); } else { LOG.debug("[{},{},{},{}] Deactivating result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, username, filter != null); } return filter; } @Override public ProfileFilter save(ProfileFilter object) { ProfileFilter saved = super.save(object); getSession().flush(); return saved; } @Override public long findActiveFilterCount(String endpointProfileSchemaId, String serverProfileSchemaId, String groupId) { long count = 0; LOG.debug("Searching active profile filters by endpoint profile schema id [{}], " + "server profile schema id [{}] and group id [{}]", endpointProfileSchemaId, serverProfileSchemaId, groupId); if (isNotBlank(groupId)) { Criteria criteria = getCriteria(); criteria.createAlias(ENDPOINT_PROFILE_SCHEMA_PROPERTY, ENDPOINT_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(SERVER_PROFILE_SCHEMA_PROPERTY, SERVER_PROFILE_SCHEMA_ALIAS, JoinType.LEFT_OUTER_JOIN); criteria.createAlias(ENDPOINT_GROUP_PROPERTY, ENDPOINT_GROUP_ALIAS); criteria.add(Restrictions.and( Restrictions.eq(ENDPOINT_GROUP_REFERENCE, Long.valueOf(groupId)), buildEqIdCriterion(ENDPOINT_PROFILE_SCHEMA_REFERENCE, endpointProfileSchemaId), buildEqIdCriterion(SERVER_PROFILE_SCHEMA_REFERENCE, serverProfileSchemaId), Restrictions.eq(STATUS_PROPERTY, UpdateStatus.ACTIVE))); count = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); } LOG.debug("[{},{},{}] Search result: {}.", endpointProfileSchemaId, serverProfileSchemaId, groupId, count); return count; } @Override protected Class<ProfileFilter> getEntityClass() { return ProfileFilter.class; } private Criterion buildEqIdCriterion(String reference, String id) { Criterion criterion; if (isBlank(id)) { criterion = Restrictions.isNull(reference); } else { criterion = Restrictions.eq(reference, ModelUtils.getLongId(id)); } return criterion; } }