thingsboard-developers

Rule Chain Service

3/13/2018 5:46:12 AM

Details

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 0000000..eb6be43
--- /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<RuleChain> findSystemRuleChains(TextPageLink pageLink) {
+        Validator.validatePageLink(pageLink, "Incorrect PageLink object for search system rule chain request.");
+        List<RuleChain> ruleChains = ruleChainDao.findRuleChainsByTenantId(SYSTEM_TENANT.getId(), pageLink);
+        return new TextPageData<>(ruleChains, pageLink);
+    }
+
+    @Override
+    public TextPageData<RuleChain> 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<RuleChain> ruleChains = ruleChainDao.findRuleChainsByTenantId(tenantId.getId(), pageLink);
+        return new TextPageData<>(ruleChains, pageLink);
+    }
+
+    @Override
+    public TextPageData<RuleChain> 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<RuleChain> 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<RuleChain> ruleChainValidator =
+            new DataValidator<RuleChain>() {
+                @Override
+                protected void validateDataImpl(RuleChain ruleChain) {
+                    if (StringUtils.isEmpty(ruleChain.getName())) {
+                        throw new DataValidationException("Rule chain name should be specified!.");
+                    }
+                }
+            };
+
+    private PaginatedRemover<TenantId, RuleChain> tenantRuleChainsRemover =
+            new PaginatedRemover<TenantId, RuleChain>() {
+
+                @Override
+                protected List<RuleChain> 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 863904b..47c8e86 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<RuleCh
         return DaoUtil.convertDataList(ruleChainEntities);
     }
 
+    @Override
+    public List<RuleChain> findAllRuleChainsByTenantId(UUID tenantId, TextPageLink pageLink) {
+        log.debug("Try to find all rule chains by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
+        List<RuleChainEntity> 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 4a7cfae..b9a9932 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<RuleChain> {
      */
     List<RuleChain> 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<RuleChain> 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 c6c947b..00dc973 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<RuleChain> findSystemRuleChains(TextPageLink pageLink);
+
+    TextPageData<RuleChain> findTenantRuleChains(TenantId tenantId, TextPageLink pageLink);
+
+    TextPageData<RuleChain> 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 fb5d20a..425369f 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<RuleChainEntity, R
                         new PageRequest(0, pageLink.getLimit())));
     }
 
+    @Override
+    public List<RuleChain> 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 58d4aac..3b5e4db 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<RuleChainEntity, Str
                                          @Param("idOffset") String idOffset,
                                          Pageable pageable);
 
+    @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId IN (:tenantId, :nullTenantId) " +
+            "AND LOWER(rc.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
+            "AND rc.id > :idOffset ORDER BY rc.id")
+    List<RuleChainEntity> findAllTenantRuleChainsByTenantId(@Param("tenantId") String tenantId,
+                                                            @Param("nullTenantId") String nullTenantId,
+                                                            @Param("searchText") String searchText,
+                                                            @Param("idOffset") String idOffset,
+                                                            Pageable pageable);
 }