1 changed files with 281 additions and 0 deletions
@ -0,0 +1,281 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2018 The Thingsboard Authors |
||||
|
* |
||||
|
* 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.thingsboard.server.dao.entityview; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.cache.Cache; |
||||
|
import org.springframework.cache.CacheManager; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.thingsboard.server.common.data.Customer; |
||||
|
import org.thingsboard.server.common.data.EntityView; |
||||
|
import org.thingsboard.server.common.data.Tenant; |
||||
|
import org.thingsboard.server.common.data.id.CustomerId; |
||||
|
import org.thingsboard.server.common.data.id.EntityViewId; |
||||
|
import org.thingsboard.server.common.data.id.TenantId; |
||||
|
import org.thingsboard.server.common.data.page.TextPageData; |
||||
|
import org.thingsboard.server.common.data.page.TextPageLink; |
||||
|
import org.thingsboard.server.dao.customer.CustomerDao; |
||||
|
import org.thingsboard.server.dao.entity.AbstractEntityService; |
||||
|
import org.thingsboard.server.dao.exception.DataValidationException; |
||||
|
import org.thingsboard.server.dao.service.DataValidator; |
||||
|
import org.thingsboard.server.dao.service.PaginatedRemover; |
||||
|
import org.thingsboard.server.dao.tenant.TenantDao; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
import java.util.Optional; |
||||
|
|
||||
|
import static org.thingsboard.server.common.data.CacheConstants.ENTITY_VIEW_CACHE; |
||||
|
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; |
||||
|
import static org.thingsboard.server.dao.service.Validator.validateId; |
||||
|
import static org.thingsboard.server.dao.service.Validator.validatePageLink; |
||||
|
import static org.thingsboard.server.dao.service.Validator.validateString; |
||||
|
|
||||
|
/** |
||||
|
* Created by Victor Basanets on 8/28/2017. |
||||
|
*/ |
||||
|
@Service |
||||
|
@Slf4j |
||||
|
public class EntityViewServiceImpl extends AbstractEntityService |
||||
|
implements EntityViewService { |
||||
|
|
||||
|
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; |
||||
|
public static final String INCORRECT_PAGE_LINK = "Incorrect page link "; |
||||
|
public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; |
||||
|
public static final String INCORRECT_ENTITY_VIEW_ID = "Incorrect entityViewId "; |
||||
|
|
||||
|
@Autowired |
||||
|
private EntityViewDao entityViewDao; |
||||
|
|
||||
|
@Autowired |
||||
|
private TenantDao tenantDao; |
||||
|
|
||||
|
@Autowired |
||||
|
private CustomerDao customerDao; |
||||
|
|
||||
|
@Autowired |
||||
|
private CacheManager cacheManager; |
||||
|
|
||||
|
@Override |
||||
|
public EntityView findEntityViewById(EntityViewId entityViewId) { |
||||
|
log.trace("Executing findEntityViewById [{}]", entityViewId); |
||||
|
validateId(entityViewId, INCORRECT_ENTITY_VIEW_ID + entityViewId); |
||||
|
return entityViewDao.findById(entityViewId.getId()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public EntityView findEntityViewByTenantIdAndName(TenantId tenantId, String name) { |
||||
|
log.trace("Executing findEntityViewByTenantIdAndName [{}][{}]", tenantId, name); |
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
return entityViewDao.findEntityViewByTenantIdAndName(tenantId.getId(), name) |
||||
|
.orElse(null); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public EntityView saveEntityView(EntityView entityView) { |
||||
|
log.trace("Executing save entity view [{}]", entityView); |
||||
|
entityViewValidator.validate(entityView); |
||||
|
return entityViewDao.save(entityView); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public EntityView assignEntityViewToCustomer(EntityViewId entityViewId, CustomerId customerId) { |
||||
|
EntityView entityView = findEntityViewById(entityViewId); |
||||
|
entityView.setCustomerId(customerId); |
||||
|
return saveEntityView(entityView); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public EntityView unassignEntityViewFromCustomer(EntityViewId entityViewId) { |
||||
|
EntityView entityView = findEntityViewById(entityViewId); |
||||
|
entityView.setCustomerId(null); |
||||
|
return saveEntityView(entityView); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void deleteEntityView(EntityViewId entityViewId) { |
||||
|
log.trace("Executing deleteEntityView [{}]", entityViewId); |
||||
|
Cache cache = cacheManager.getCache(ENTITY_VIEW_CACHE); |
||||
|
validateId(entityViewId, INCORRECT_ENTITY_VIEW_ID + entityViewId); |
||||
|
deleteEntityRelations(entityViewId); |
||||
|
EntityView entityView = entityViewDao.findById(entityViewId.getId()); |
||||
|
List<Object> list = new ArrayList<>(); |
||||
|
list.add(entityView.getTenantId()); |
||||
|
list.add(entityView.getName()); |
||||
|
cache.evict(list); |
||||
|
entityViewDao.removeById(entityViewId.getId()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public TextPageData<EntityView> findEntityViewByTenantId(TenantId tenantId, TextPageLink pageLink) { |
||||
|
log.trace("Executing findEntityViewByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); |
||||
|
List<EntityView> entityViews = entityViewDao.findEntityViewByTenantId(tenantId.getId(), pageLink); |
||||
|
return new TextPageData<>(entityViews, pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public TextPageData<EntityView> findEntityViewByTenantIdAndType(TenantId tenantId, String type, |
||||
|
TextPageLink pageLink) { |
||||
|
|
||||
|
log.trace("Executing findEntityViewByTenantIdAndType, tenantId [{}], type [{}], pageLink [{}]", |
||||
|
tenantId, type, pageLink); |
||||
|
|
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
validateString(type, "Incorrect type " + type); |
||||
|
validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); |
||||
|
List<EntityView> entityViews = entityViewDao.findEntityViewByTenantIdAndType(tenantId.getId(), |
||||
|
type, pageLink); |
||||
|
|
||||
|
return new TextPageData<>(entityViews, pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void deleteEntityViewByTenantId(TenantId tenantId) { |
||||
|
log.trace("Executing deleteEntityViewByTenantId, tenantId [{}]", tenantId); |
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
tenantEntityViewRemover.removeEntities(tenantId); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public TextPageData<EntityView> findEntityViewsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, |
||||
|
TextPageLink pageLink) { |
||||
|
|
||||
|
log.trace("Executing findEntityViewByTenantIdAndCustomerId, tenantId [{}], customerId [{}], pageLink [{}]", |
||||
|
tenantId, customerId, pageLink); |
||||
|
|
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); |
||||
|
validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); |
||||
|
List<EntityView> entityViews = entityViewDao.findEntityViewsByTenantIdAndCustomerId(tenantId.getId(), |
||||
|
customerId.getId(), pageLink); |
||||
|
|
||||
|
return new TextPageData<>(entityViews, pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public TextPageData<EntityView> findEntityViewsByTenantIdAndCustomerIdAndType(TenantId tenantId, CustomerId customerId, |
||||
|
String type, TextPageLink pageLink) { |
||||
|
|
||||
|
log.trace("Executing findEntityViewsByTenantIdAndCustomerIdAndType, tenantId [{}], customerId [{}], type [{}]," + |
||||
|
" pageLink [{}]", tenantId, customerId, type, pageLink); |
||||
|
|
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); |
||||
|
validateString(type, "Incorrect type " + type); |
||||
|
validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); |
||||
|
List<EntityView> entityViews = entityViewDao.findEntityViewsByTenantIdAndCustomerIdAndType(tenantId.getId(), |
||||
|
customerId.getId(), type, pageLink); |
||||
|
|
||||
|
return new TextPageData<>(entityViews, pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId) { |
||||
|
log.trace("Executing unassignCustomerEntityViews, tenantId [{}], customerId [{}]", tenantId, customerId); |
||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); |
||||
|
validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); |
||||
|
new CustomerEntityViewsUnAssigner(tenantId).removeEntities(customerId); |
||||
|
} |
||||
|
|
||||
|
private DataValidator<EntityView> entityViewValidator = |
||||
|
new DataValidator<EntityView>() { |
||||
|
|
||||
|
@Override |
||||
|
protected void validateCreate(EntityView entityView) { |
||||
|
entityViewDao.findEntityViewByTenantIdAndName(entityView.getTenantId().getId(), entityView.getName()) |
||||
|
.ifPresent( e -> { |
||||
|
throw new DataValidationException("Entity view with such name already exists!"); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void validateUpdate(EntityView entityView) { |
||||
|
entityViewDao.findEntityViewByTenantIdAndName(entityView.getTenantId().getId(), entityView.getName()) |
||||
|
.ifPresent( e -> { |
||||
|
if (!e.getUuidId().equals(entityView.getUuidId())) { |
||||
|
throw new DataValidationException("Entity view with such name already exists!"); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void validateDataImpl(EntityView entityView) { |
||||
|
if (StringUtils.isEmpty(String.join("", entityView.getKeys()))) { |
||||
|
throw new DataValidationException("Entity view type should be specified!"); |
||||
|
} |
||||
|
if (StringUtils.isEmpty(entityView.getName())) { |
||||
|
throw new DataValidationException("Entity view name should be specified!"); |
||||
|
} |
||||
|
if (entityView.getTenantId() == null) { |
||||
|
throw new DataValidationException("Entity view should be assigned to tenant!"); |
||||
|
} else { |
||||
|
Tenant tenant = tenantDao.findById(entityView.getTenantId().getId()); |
||||
|
if (tenant == null) { |
||||
|
throw new DataValidationException("Entity view is referencing to non-existent tenant!"); |
||||
|
} |
||||
|
} |
||||
|
if (entityView.getCustomerId() == null) { |
||||
|
entityView.setCustomerId(new CustomerId(NULL_UUID)); |
||||
|
} else if (!entityView.getCustomerId().getId().equals(NULL_UUID)) { |
||||
|
Customer customer = customerDao.findById(entityView.getCustomerId().getId()); |
||||
|
if (customer == null) { |
||||
|
throw new DataValidationException("Can't assign entity view to non-existent customer!"); |
||||
|
} |
||||
|
if (!customer.getTenantId().getId().equals(entityView.getTenantId().getId())) { |
||||
|
throw new DataValidationException("Can't assign entity view to customer from different tenant!"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
private PaginatedRemover<TenantId, EntityView> tenantEntityViewRemover = |
||||
|
new PaginatedRemover<TenantId, EntityView>() { |
||||
|
|
||||
|
@Override |
||||
|
protected List<EntityView> findEntities(TenantId id, TextPageLink pageLink) { |
||||
|
return entityViewDao.findEntityViewByTenantId(id.getId(), pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void removeEntity(EntityView entity) { |
||||
|
deleteEntityView(new EntityViewId(entity.getUuidId())); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
private class CustomerEntityViewsUnAssigner extends PaginatedRemover<CustomerId, EntityView> { |
||||
|
|
||||
|
private TenantId tenantId; |
||||
|
|
||||
|
CustomerEntityViewsUnAssigner(TenantId tenantId) { |
||||
|
this.tenantId = tenantId; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected List<EntityView> findEntities(CustomerId id, TextPageLink pageLink) { |
||||
|
return entityViewDao.findEntityViewsByTenantIdAndCustomerId(tenantId.getId(), id.getId(), pageLink); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void removeEntity(EntityView entity) { |
||||
|
unassignEntityViewFromCustomer(new EntityViewId(entity.getUuidId())); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue