From 5bfdf9decf760bed5f67672890ba52e9c7c4e826 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Tue, 13 Mar 2018 10:46:12 +0200 Subject: [PATCH] Rule Chain Service --- .../server/dao/rule/BaseRuleChainService.java | 130 ++++++++++++++++++ .../dao/rule/CassandraRuleChainDao.java | 14 ++ .../server/dao/rule/RuleChainDao.java | 9 ++ .../server/dao/rule/RuleChainService.java | 20 +++ .../server/dao/sql/rule/JpaRuleChainDao.java | 11 ++ .../dao/sql/rule/RuleChainRepository.java | 8 ++ 6 files changed, 192 insertions(+) create mode 100644 dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java new file mode 100644 index 0000000000..eb6be43fcf --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -0,0 +1,130 @@ +/** + * 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.rule; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.id.RuleChainId; +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.common.data.rule.RuleChain; +import org.thingsboard.server.dao.entity.AbstractEntityService; +import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.model.ModelConstants; +import org.thingsboard.server.dao.service.DataValidator; +import org.thingsboard.server.dao.service.PaginatedRemover; +import org.thingsboard.server.dao.service.Validator; + +import java.util.List; + +/** + * Created by igor on 3/12/18. + */ +@Service +@Slf4j +public class BaseRuleChainService extends AbstractEntityService implements RuleChainService { + + public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID); + + @Autowired + private RuleChainDao ruleChainDao; + + @Override + public RuleChain saveRuleChain(RuleChain ruleChain) { + ruleChainValidator.validate(ruleChain); + if (ruleChain.getTenantId() == null) { + log.trace("Save system rule chain with predefined id {}", SYSTEM_TENANT); + ruleChain.setTenantId(SYSTEM_TENANT); + } + return ruleChainDao.save(ruleChain); + } + + @Override + public RuleChain findRuleChainById(RuleChainId ruleChainId) { + Validator.validateId(ruleChainId, "Incorrect rule chain id for search request."); + return ruleChainDao.findById(ruleChainId.getId()); + } + + @Override + public TextPageData findSystemRuleChains(TextPageLink pageLink) { + Validator.validatePageLink(pageLink, "Incorrect PageLink object for search system rule chain request."); + List ruleChains = ruleChainDao.findRuleChainsByTenantId(SYSTEM_TENANT.getId(), pageLink); + return new TextPageData<>(ruleChains, pageLink); + } + + @Override + public TextPageData findTenantRuleChains(TenantId tenantId, TextPageLink pageLink) { + Validator.validateId(tenantId, "Incorrect tenant id for search rule chain request."); + Validator.validatePageLink(pageLink, "Incorrect PageLink object for search rule chain request."); + List ruleChains = ruleChainDao.findRuleChainsByTenantId(tenantId.getId(), pageLink); + return new TextPageData<>(ruleChains, pageLink); + } + + @Override + public TextPageData findAllTenantRuleChainsByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) { + log.trace("Executing findAllTenantRuleChainsByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink); + Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); + Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); + List ruleChains = ruleChainDao.findAllRuleChainsByTenantId(tenantId.getId(), pageLink); + return new TextPageData<>(ruleChains, pageLink); + } + + @Override + public void deleteRuleChainById(RuleChainId ruleChainId) { + Validator.validateId(ruleChainId, "Incorrect rule chain id for delete request."); + checkRuleNodesAndDelete(ruleChainId); + } + + private void checkRuleNodesAndDelete(RuleChainId ruleChainId) { + //TODO: + deleteEntityRelations(ruleChainId); + ruleChainDao.removeById(ruleChainId.getId()); + } + + @Override + public void deleteRuleChainsByTenantId(TenantId tenantId) { + Validator.validateId(tenantId, "Incorrect tenant id for delete rule chains request."); + tenantRuleChainsRemover.removeEntities(tenantId); + } + + private DataValidator ruleChainValidator = + new DataValidator() { + @Override + protected void validateDataImpl(RuleChain ruleChain) { + if (StringUtils.isEmpty(ruleChain.getName())) { + throw new DataValidationException("Rule chain name should be specified!."); + } + } + }; + + private PaginatedRemover tenantRuleChainsRemover = + new PaginatedRemover() { + + @Override + protected List findEntities(TenantId id, TextPageLink pageLink) { + return ruleChainDao.findRuleChainsByTenantId(id.getId(), pageLink); + } + + @Override + protected void removeEntity(RuleChain entity) { + checkRuleNodesAndDelete(entity.getId()); + } + }; +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java index 863904be65..47c8e86d61 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java @@ -20,15 +20,18 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.dao.DaoUtil; +import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.nosql.RuleChainEntity; import org.thingsboard.server.dao.nosql.CassandraAbstractSearchTextDao; import org.thingsboard.server.dao.util.NoSqlDao; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.UUID; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; +import static com.datastax.driver.core.querybuilder.QueryBuilder.in; import static org.thingsboard.server.dao.model.ModelConstants.*; @Component @@ -57,4 +60,15 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao findAllRuleChainsByTenantId(UUID tenantId, TextPageLink pageLink) { + log.debug("Try to find all rule chains by tenantId [{}] and pageLink [{}]", tenantId, pageLink); + List ruleChainEntities = findPageWithTextSearch(RULE_CHAIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, + Arrays.asList(in(ModelConstants.RULE_CHAIN_TENANT_ID_PROPERTY, Arrays.asList(NULL_UUID, tenantId))), + pageLink); + + log.trace("Found rule chains [{}] by tenantId [{}] and pageLink [{}]", ruleChainEntities, tenantId, pageLink); + return DaoUtil.convertDataList(ruleChainEntities); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java index 4a7cfaea7c..b9a9932ad3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java @@ -37,4 +37,13 @@ public interface RuleChainDao extends Dao { */ List findRuleChainsByTenantId(UUID tenantId, TextPageLink pageLink); + /** + * Find all rule chains by tenantId and page link. + * + * @param tenantId the tenantId + * @param pageLink the page link + * @return the list of rule chain objects + */ + List findAllRuleChainsByTenantId(UUID tenantId, TextPageLink pageLink); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java index c6c947ba9f..00dc97315e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java @@ -16,8 +16,16 @@ package org.thingsboard.server.dao.rule; +import org.thingsboard.server.common.data.id.PluginId; +import org.thingsboard.server.common.data.id.RuleChainId; +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.common.data.plugin.PluginMetaData; import org.thingsboard.server.common.data.rule.RuleChain; +import java.util.List; + /** * Created by igor on 3/12/18. */ @@ -25,4 +33,16 @@ public interface RuleChainService { RuleChain saveRuleChain(RuleChain ruleChain); + RuleChain findRuleChainById(RuleChainId ruleChainId); + + TextPageData findSystemRuleChains(TextPageLink pageLink); + + TextPageData findTenantRuleChains(TenantId tenantId, TextPageLink pageLink); + + TextPageData findAllTenantRuleChainsByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink); + + void deleteRuleChainById(RuleChainId ruleChainId); + + void deleteRuleChainsByTenantId(TenantId tenantId); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java index fb5d20a702..425369fa2e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java @@ -63,4 +63,15 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao findAllRuleChainsByTenantId(UUID tenantId, TextPageLink pageLink) { + return DaoUtil.convertDataList(ruleChainRepository + .findAllTenantRuleChainsByTenantId( + UUIDConverter.fromTimeUUID(tenantId), + NULL_UUID_STR, + Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getIdOffset() == null ? NULL_UUID_STR : UUIDConverter.fromTimeUUID(pageLink.getIdOffset()), + new PageRequest(0, pageLink.getLimit()))); + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java index 58d4aac70b..3b5e4dbcd7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java @@ -35,4 +35,12 @@ public interface RuleChainRepository extends CrudRepository :idOffset ORDER BY rc.id") + List findAllTenantRuleChainsByTenantId(@Param("tenantId") String tenantId, + @Param("nullTenantId") String nullTenantId, + @Param("searchText") String searchText, + @Param("idOffset") String idOffset, + Pageable pageable); }