/*
* 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.CLASS_NAME_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.EVENT_CLASS_FAMILY_ID;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.EVENT_CLASS_FAMILY_TABLE_NAME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.EVENT_CLASS_FAMILY_VERSION_TABLE_NAME;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.ID_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.NAME_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.TENANT_ALIAS;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.TENANT_PROPERTY;
import static org.kaaproject.kaa.server.common.dao.DaoConstants.TENANT_REFERENCE;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.kaaproject.kaa.server.common.dao.impl.EventClassFamilyDao;
import org.kaaproject.kaa.server.common.dao.model.sql.EventClassFamily;
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 HibernateEventClassFamilyDao extends HibernateAbstractDao<EventClassFamily>
implements EventClassFamilyDao<EventClassFamily> {
private static final Logger LOG = LoggerFactory.getLogger(HibernateEventClassFamilyDao.class);
@Override
protected Class<EventClassFamily> getEntityClass() {
return EventClassFamily.class;
}
@Override
public List<EventClassFamily> findByTenantId(String tenantId) {
LOG.debug("Searching event class families by tenant id [{}] ", tenantId);
List<EventClassFamily> eventClassFamilies = Collections.emptyList();
if (isNotBlank(tenantId)) {
eventClassFamilies = findListByCriterionWithAlias(TENANT_PROPERTY, TENANT_ALIAS,
Restrictions.eq(TENANT_REFERENCE, Long.valueOf(tenantId)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{}] Search result: {}.", tenantId, Arrays.toString(eventClassFamilies.toArray()));
} else {
LOG.debug("[{}] Search result: {}.", tenantId, eventClassFamilies.size());
}
return eventClassFamilies;
}
@Override
public EventClassFamily findByTenantIdAndName(String tenantId, String name) {
LOG.debug("Searching event class family by tenant id [{}] and name [{}]", tenantId, name);
EventClassFamily eventClassFamily = null;
if (isNotBlank(tenantId)) {
eventClassFamily = findOneByCriterionWithAlias(TENANT_PROPERTY, TENANT_ALIAS,
Restrictions.and(
Restrictions.eq(TENANT_REFERENCE, Long.valueOf(tenantId)),
Restrictions.eq(NAME_PROPERTY, name)));
}
if (LOG.isTraceEnabled()) {
LOG.trace("[{},{}] Search result: {}.", tenantId, name, eventClassFamily);
} else {
LOG.debug("[{},{}] Search result: {}.", tenantId, name, eventClassFamily != null);
}
return eventClassFamily;
}
@Override
public EventClassFamily findByEcfvId(String ecfvId) {
LOG.debug("Searching event class family by ecfv id [{}]", ecfvId);
Query query = getSession().createSQLQuery(
"select ecf.*"
+ " from " + EVENT_CLASS_FAMILY_TABLE_NAME + " as ecf"
+ " join " + EVENT_CLASS_FAMILY_VERSION_TABLE_NAME + " as ecfv"
+ " on ecf.id = ecfv." + EVENT_CLASS_FAMILY_ID
+ " where ecfv.id = :id").addEntity(getEntityClass());
query.setLong("id", Long.valueOf(ecfvId));
EventClassFamily eventClassFamily = (EventClassFamily) query.uniqueResult();
LOG.debug("[{}] Search result: {}.", ecfvId, eventClassFamily);
return eventClassFamily;
}
@Override
public void removeByTenantId(String tenantId) {
if (isNotBlank(tenantId)) {
List<EventClassFamily> eventClassFamilies = findListByCriterionWithAlias(
TENANT_PROPERTY, TENANT_ALIAS,
Restrictions.eq(TENANT_REFERENCE, Long.valueOf(tenantId)));
removeList(eventClassFamilies);
}
LOG.debug("Removed event class families by tenant id [{}] ", tenantId);
}
@Override
public boolean validateName(String tenantId, String ecfId, String name) {
LOG.debug("Validating by tenant id [{}], ecf id [{}], name [{}]", tenantId, ecfId, name);
Criteria criteria = getCriteria();
criteria.createAlias(TENANT_PROPERTY, TENANT_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(TENANT_REFERENCE, Long.valueOf(tenantId)),
Restrictions.eq(NAME_PROPERTY, name)));
if (isNotBlank(ecfId)) {
criteria = criteria.add(Restrictions.ne(ID_PROPERTY, Long.valueOf(ecfId)));
}
List<EventClassFamily> eventClassFamilies = findListByCriteria(criteria);
boolean result = eventClassFamilies == null || eventClassFamilies.isEmpty();
LOG.debug("[{},{},{}] Validating result: {}", tenantId, ecfId, name, result);
return result;
}
@Override
public boolean validateClassName(String tenantId, String ecfId, String className) {
LOG.debug("Validating fqn, tenant id [{}], ecf id [{}], className [{}]",
tenantId, ecfId, className);
Criteria criteria = getCriteria();
criteria.createAlias(TENANT_PROPERTY, TENANT_ALIAS);
criteria.add(Restrictions.and(
Restrictions.eq(TENANT_REFERENCE, Long.valueOf(tenantId)),
Restrictions.eq(CLASS_NAME_PROPERTY, className)));
if (isNotBlank(ecfId)) {
criteria = criteria.add(Restrictions.ne(ID_PROPERTY, Long.valueOf(ecfId)));
}
List<EventClassFamily> eventClassFamilies = findListByCriteria(criteria);
boolean result = eventClassFamilies == null || eventClassFamilies.isEmpty();
LOG.debug("[{},{},{}] Validating result: {}", tenantId, ecfId, className, result);
return result;
}
}