package com.devicehive.dao.rdbms;
/*
* #%L
* DeviceHive Dao RDBMS Implementation
* %%
* Copyright (C) 2016 DataArt
* %%
* 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.
* #L%
*/
import com.devicehive.dao.DeviceClassDao;
import com.devicehive.model.DeviceClass;
import com.devicehive.model.DeviceClassEquipment;
import com.devicehive.vo.DeviceClassEquipmentVO;
import com.devicehive.vo.DeviceClassWithEquipmentVO;
import org.springframework.stereotype.Repository;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.Optional.ofNullable;
@Repository
public class DeviceClassDaoRdbmsImpl extends RdbmsGenericDao implements DeviceClassDao {
@Override
public void remove(long id) {
DeviceClass deviceClass = find(DeviceClass.class, id);
if (deviceClass != null) {
remove(deviceClass);
}
}
@Override
public DeviceClassWithEquipmentVO find(long id) {
DeviceClass entity = find(DeviceClass.class, id);
return DeviceClass.convertToVo(entity);
}
@Override
public DeviceClassWithEquipmentVO persist(DeviceClassWithEquipmentVO deviceClass) {
DeviceClass dc = DeviceClass.convertWithEquipmentToEntity(deviceClass);
super.persist(dc);
deviceClass.setId(dc.getId());
return DeviceClass.convertToVo(dc);
}
@Override
public DeviceClassWithEquipmentVO merge(DeviceClassWithEquipmentVO deviceClass) {
DeviceClass entity = DeviceClass.convertWithEquipmentToEntity(deviceClass);
List<DeviceClassEquipment> existingEquipments = createNamedQuery(DeviceClassEquipment.class, "Equipment.getByDeviceClass", Optional.empty())
.setParameter("deviceClass", entity)
.getResultList();
Set<String> codes = new HashSet<>();
if (entity.getEquipment() != null) {
for (DeviceClassEquipment equipment : entity.getEquipment()) {
codes.add(equipment.getCode());
equipment.setDeviceClass(entity);
}
}
DeviceClass merged = super.merge(entity);
for (DeviceClassEquipment equipment : existingEquipments) {
if (!codes.contains(equipment.getCode())) {
remove(equipment);
}
}
return DeviceClass.convertToVo(merged);
}
@Override
public List<DeviceClassWithEquipmentVO> list(String name, String namePattern, String sortField, Boolean sortOrderAsc, Integer take, Integer skip) {
final CriteriaBuilder cb = criteriaBuilder();
final CriteriaQuery<DeviceClass> criteria = cb.createQuery(DeviceClass.class);
final Root<DeviceClass> from = criteria.from(DeviceClass.class);
final Predicate[] predicates = CriteriaHelper.deviceClassListPredicates(cb, from, ofNullable(name), ofNullable(namePattern));
criteria.where(predicates);
CriteriaHelper.order(cb, criteria, from, ofNullable(sortField), Boolean.TRUE.equals(sortOrderAsc));
final TypedQuery<DeviceClass> query = createQuery(criteria);
ofNullable(take).ifPresent(query::setMaxResults);
ofNullable(skip).ifPresent(query::setFirstResult);
CacheHelper.cacheable(query);
List<DeviceClass> resultList = query.getResultList();
Stream<DeviceClassWithEquipmentVO> objectStream = resultList.stream().map(DeviceClass::convertToVo);
return objectStream.collect(Collectors.toList());
}
@Override
public DeviceClassWithEquipmentVO findByName(@NotNull String name) {
DeviceClass deviceClass = createNamedQuery(DeviceClass.class, "DeviceClass.findByName", Optional.of(CacheConfig.get()))
.setParameter("name", name)
.getResultList()
.stream().findFirst().orElse(null);
return DeviceClass.convertToVo(deviceClass);
}
@Override
public DeviceClassEquipmentVO findDeviceClassEquipment(@NotNull long deviceClassId, @NotNull long equipmentId) {
DeviceClassEquipment equipment = createNamedQuery(DeviceClassEquipment.class, "Equipment.getByDeviceClassAndId", Optional.of(CacheConfig.get()))
.setParameter("id", equipmentId)
.setParameter("deviceClassId", deviceClassId)
.getResultList()
.stream().findFirst().orElse(null);
return DeviceClassEquipment.convertDeviceClassEquipment(equipment);
}
}