Commit d65d788b5d4be0ee65f1003d716cada60dba0335

Authored by mp-loki
1 parent 5860a065

JPA Rule and Plugin DAO added

Showing 21 changed files with 837 additions and 235 deletions
@@ -33,7 +33,7 @@ public class ModelConstants { @@ -33,7 +33,7 @@ public class ModelConstants {
33 */ 33 */
34 public static final String ID_PROPERTY = "id"; 34 public static final String ID_PROPERTY = "id";
35 public static final String USER_ID_PROPERTY = "user_id"; 35 public static final String USER_ID_PROPERTY = "user_id";
36 - public static final String TENTANT_ID_PROPERTY = "tenant_id"; 36 + public static final String TENANT_ID_PROPERTY = "tenant_id";
37 public static final String CUSTOMER_ID_PROPERTY = "customer_id"; 37 public static final String CUSTOMER_ID_PROPERTY = "customer_id";
38 public static final String DEVICE_ID_PROPERTY = "device_id"; 38 public static final String DEVICE_ID_PROPERTY = "device_id";
39 public static final String TITLE_PROPERTY = "title"; 39 public static final String TITLE_PROPERTY = "title";
@@ -45,7 +45,7 @@ public class ModelConstants { @@ -45,7 +45,7 @@ public class ModelConstants {
45 * Cassandra user constants. 45 * Cassandra user constants.
46 */ 46 */
47 public static final String USER_COLUMN_FAMILY_NAME = "user"; 47 public static final String USER_COLUMN_FAMILY_NAME = "user";
48 - public static final String USER_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 48 + public static final String USER_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
49 public static final String USER_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY; 49 public static final String USER_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY;
50 public static final String USER_EMAIL_PROPERTY = "email"; 50 public static final String USER_EMAIL_PROPERTY = "email";
51 public static final String USER_AUTHORITY_PROPERTY = "authority"; 51 public static final String USER_AUTHORITY_PROPERTY = "authority";
@@ -106,7 +106,7 @@ public class ModelConstants { @@ -106,7 +106,7 @@ public class ModelConstants {
106 * Cassandra customer constants. 106 * Cassandra customer constants.
107 */ 107 */
108 public static final String CUSTOMER_COLUMN_FAMILY_NAME = "customer"; 108 public static final String CUSTOMER_COLUMN_FAMILY_NAME = "customer";
109 - public static final String CUSTOMER_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 109 + public static final String CUSTOMER_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
110 public static final String CUSTOMER_TITLE_PROPERTY = TITLE_PROPERTY; 110 public static final String CUSTOMER_TITLE_PROPERTY = TITLE_PROPERTY;
111 public static final String CUSTOMER_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY; 111 public static final String CUSTOMER_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY;
112 112
@@ -116,7 +116,7 @@ public class ModelConstants { @@ -116,7 +116,7 @@ public class ModelConstants {
116 * Cassandra device constants. 116 * Cassandra device constants.
117 */ 117 */
118 public static final String DEVICE_COLUMN_FAMILY_NAME = "device"; 118 public static final String DEVICE_COLUMN_FAMILY_NAME = "device";
119 - public static final String DEVICE_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 119 + public static final String DEVICE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
120 public static final String DEVICE_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY; 120 public static final String DEVICE_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY;
121 public static final String DEVICE_NAME_PROPERTY = "name"; 121 public static final String DEVICE_NAME_PROPERTY = "name";
122 public static final String DEVICE_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY; 122 public static final String DEVICE_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY;
@@ -142,7 +142,7 @@ public class ModelConstants { @@ -142,7 +142,7 @@ public class ModelConstants {
142 * Cassandra widgets_bundle constants. 142 * Cassandra widgets_bundle constants.
143 */ 143 */
144 public static final String WIDGETS_BUNDLE_COLUMN_FAMILY_NAME = "widgets_bundle"; 144 public static final String WIDGETS_BUNDLE_COLUMN_FAMILY_NAME = "widgets_bundle";
145 - public static final String WIDGETS_BUNDLE_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 145 + public static final String WIDGETS_BUNDLE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
146 public static final String WIDGETS_BUNDLE_ALIAS_PROPERTY = ALIAS_PROPERTY; 146 public static final String WIDGETS_BUNDLE_ALIAS_PROPERTY = ALIAS_PROPERTY;
147 public static final String WIDGETS_BUNDLE_TITLE_PROPERTY = TITLE_PROPERTY; 147 public static final String WIDGETS_BUNDLE_TITLE_PROPERTY = TITLE_PROPERTY;
148 public static final String WIDGETS_BUNDLE_IMAGE_PROPERTY = "image"; 148 public static final String WIDGETS_BUNDLE_IMAGE_PROPERTY = "image";
@@ -154,7 +154,7 @@ public class ModelConstants { @@ -154,7 +154,7 @@ public class ModelConstants {
154 * Cassandra widget_type constants. 154 * Cassandra widget_type constants.
155 */ 155 */
156 public static final String WIDGET_TYPE_COLUMN_FAMILY_NAME = "widget_type"; 156 public static final String WIDGET_TYPE_COLUMN_FAMILY_NAME = "widget_type";
157 - public static final String WIDGET_TYPE_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 157 + public static final String WIDGET_TYPE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
158 public static final String WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY = "bundle_alias"; 158 public static final String WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY = "bundle_alias";
159 public static final String WIDGET_TYPE_ALIAS_PROPERTY = ALIAS_PROPERTY; 159 public static final String WIDGET_TYPE_ALIAS_PROPERTY = ALIAS_PROPERTY;
160 public static final String WIDGET_TYPE_NAME_PROPERTY = "name"; 160 public static final String WIDGET_TYPE_NAME_PROPERTY = "name";
@@ -166,7 +166,7 @@ public class ModelConstants { @@ -166,7 +166,7 @@ public class ModelConstants {
166 * Cassandra dashboard constants. 166 * Cassandra dashboard constants.
167 */ 167 */
168 public static final String DASHBOARD_COLUMN_FAMILY_NAME = "dashboard"; 168 public static final String DASHBOARD_COLUMN_FAMILY_NAME = "dashboard";
169 - public static final String DASHBOARD_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 169 + public static final String DASHBOARD_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
170 public static final String DASHBOARD_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY; 170 public static final String DASHBOARD_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY;
171 public static final String DASHBOARD_TITLE_PROPERTY = TITLE_PROPERTY; 171 public static final String DASHBOARD_TITLE_PROPERTY = TITLE_PROPERTY;
172 public static final String DASHBOARD_CONFIGURATION_PROPERTY = "configuration"; 172 public static final String DASHBOARD_CONFIGURATION_PROPERTY = "configuration";
@@ -179,7 +179,7 @@ public class ModelConstants { @@ -179,7 +179,7 @@ public class ModelConstants {
179 * Cassandra plugin metadata constants. 179 * Cassandra plugin metadata constants.
180 */ 180 */
181 public static final String PLUGIN_COLUMN_FAMILY_NAME = "plugin"; 181 public static final String PLUGIN_COLUMN_FAMILY_NAME = "plugin";
182 - public static final String PLUGIN_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 182 + public static final String PLUGIN_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
183 public static final String PLUGIN_NAME_PROPERTY = "name"; 183 public static final String PLUGIN_NAME_PROPERTY = "name";
184 public static final String PLUGIN_API_TOKEN_PROPERTY = "api_token"; 184 public static final String PLUGIN_API_TOKEN_PROPERTY = "api_token";
185 public static final String PLUGIN_CLASS_PROPERTY = "plugin_class"; 185 public static final String PLUGIN_CLASS_PROPERTY = "plugin_class";
@@ -209,7 +209,7 @@ public class ModelConstants { @@ -209,7 +209,7 @@ public class ModelConstants {
209 * Cassandra rule metadata constants. 209 * Cassandra rule metadata constants.
210 */ 210 */
211 public static final String RULE_COLUMN_FAMILY_NAME = "rule"; 211 public static final String RULE_COLUMN_FAMILY_NAME = "rule";
212 - public static final String RULE_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 212 + public static final String RULE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
213 public static final String RULE_NAME_PROPERTY = "name"; 213 public static final String RULE_NAME_PROPERTY = "name";
214 public static final String RULE_STATE_PROPERTY = "state"; 214 public static final String RULE_STATE_PROPERTY = "state";
215 public static final String RULE_WEIGHT_PROPERTY = "weight"; 215 public static final String RULE_WEIGHT_PROPERTY = "weight";
@@ -225,7 +225,7 @@ public class ModelConstants { @@ -225,7 +225,7 @@ public class ModelConstants {
225 * Cassandra event constants. 225 * Cassandra event constants.
226 */ 226 */
227 public static final String EVENT_COLUMN_FAMILY_NAME = "event"; 227 public static final String EVENT_COLUMN_FAMILY_NAME = "event";
228 - public static final String EVENT_TENANT_ID_PROPERTY = TENTANT_ID_PROPERTY; 228 + public static final String EVENT_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
229 public static final String EVENT_TYPE_PROPERTY = "event_type"; 229 public static final String EVENT_TYPE_PROPERTY = "event_type";
230 public static final String EVENT_UID_PROPERTY = "event_uid"; 230 public static final String EVENT_UID_PROPERTY = "event_uid";
231 public static final String EVENT_ENTITY_TYPE_PROPERTY = "entity_type"; 231 public static final String EVENT_ENTITY_TYPE_PROPERTY = "entity_type";
@@ -22,6 +22,9 @@ import javax.persistence.Id; @@ -22,6 +22,9 @@ import javax.persistence.Id;
22 import javax.persistence.Table; 22 import javax.persistence.Table;
23 import javax.persistence.Transient; 23 import javax.persistence.Transient;
24 import com.fasterxml.jackson.databind.JsonNode; 24 import com.fasterxml.jackson.databind.JsonNode;
  25 +import com.fasterxml.jackson.databind.ObjectMapper;
  26 +import lombok.Data;
  27 +import lombok.extern.slf4j.Slf4j;
25 import org.thingsboard.server.common.data.id.PluginId; 28 import org.thingsboard.server.common.data.id.PluginId;
26 import org.thingsboard.server.common.data.id.TenantId; 29 import org.thingsboard.server.common.data.id.TenantId;
27 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; 30 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
@@ -29,23 +32,25 @@ import org.thingsboard.server.common.data.plugin.PluginMetaData; @@ -29,23 +32,25 @@ import org.thingsboard.server.common.data.plugin.PluginMetaData;
29 import org.thingsboard.server.dao.model.ModelConstants; 32 import org.thingsboard.server.dao.model.ModelConstants;
30 import org.thingsboard.server.dao.model.SearchTextEntity; 33 import org.thingsboard.server.dao.model.SearchTextEntity;
31 34
  35 +import java.io.IOException;
32 import java.util.Objects; 36 import java.util.Objects;
33 import java.util.UUID; 37 import java.util.UUID;
34 -  
35 -//@Entity 38 +@Slf4j
  39 +@Data
  40 +@Entity
36 @Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME) 41 @Table(name = ModelConstants.PLUGIN_COLUMN_FAMILY_NAME)
37 public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> { 42 public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
38 43
39 @Transient 44 @Transient
40 private static final long serialVersionUID = -6164321050824823149L; 45 private static final long serialVersionUID = -6164321050824823149L;
41 @Id 46 @Id
42 - @Column(name = ModelConstants.ID_PROPERTY) 47 + @Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "BINARY(16)")
43 private UUID id; 48 private UUID id;
44 49
45 @Column(name = ModelConstants.PLUGIN_API_TOKEN_PROPERTY) 50 @Column(name = ModelConstants.PLUGIN_API_TOKEN_PROPERTY)
46 private String apiToken; 51 private String apiToken;
47 52
48 - @Column(name = ModelConstants.PLUGIN_TENANT_ID_PROPERTY) 53 + @Column(name = ModelConstants.PLUGIN_TENANT_ID_PROPERTY, columnDefinition = "BINARY(16)")
49 private UUID tenantId; 54 private UUID tenantId;
50 55
51 @Column(name = ModelConstants.PLUGIN_NAME_PROPERTY) 56 @Column(name = ModelConstants.PLUGIN_NAME_PROPERTY)
@@ -61,13 +66,13 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> { @@ -61,13 +66,13 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
61 private ComponentLifecycleState state; 66 private ComponentLifecycleState state;
62 67
63 @Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY) 68 @Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY)
64 - private JsonNode configuration; 69 + private String configuration;
65 70
66 @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY) 71 @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
67 private String searchText; 72 private String searchText;
68 73
69 @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY) 74 @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
70 - private JsonNode additionalInfo; 75 + private String additionalInfo;
71 76
72 public PluginMetaDataEntity() { 77 public PluginMetaDataEntity() {
73 } 78 }
@@ -82,9 +87,13 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> { @@ -82,9 +87,13 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
82 this.name = pluginMetaData.getName(); 87 this.name = pluginMetaData.getName();
83 this.publicAccess = pluginMetaData.isPublicAccess(); 88 this.publicAccess = pluginMetaData.isPublicAccess();
84 this.state = pluginMetaData.getState(); 89 this.state = pluginMetaData.getState();
85 - this.configuration = pluginMetaData.getConfiguration();  
86 this.searchText = pluginMetaData.getName(); 90 this.searchText = pluginMetaData.getName();
87 - this.additionalInfo = pluginMetaData.getAdditionalInfo(); 91 + if (pluginMetaData.getConfiguration() != null) {
  92 + this.configuration = pluginMetaData.getConfiguration().toString();
  93 + }
  94 + if (pluginMetaData.getAdditionalInfo() != null) {
  95 + this.additionalInfo = pluginMetaData.getAdditionalInfo().toString();
  96 + }
88 } 97 }
89 98
90 @Override 99 @Override
@@ -107,86 +116,33 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> { @@ -107,86 +116,33 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
107 this.id = id; 116 this.id = id;
108 } 117 }
109 118
110 - public String getApiToken() {  
111 - return apiToken;  
112 - }  
113 -  
114 - public void setApiToken(String apiToken) {  
115 - this.apiToken = apiToken;  
116 - }  
117 -  
118 - public UUID getTenantId() {  
119 - return tenantId;  
120 - }  
121 -  
122 - public void setTenantId(UUID tenantId) {  
123 - this.tenantId = tenantId;  
124 - }  
125 -  
126 - public String getName() {  
127 - return name;  
128 - }  
129 -  
130 - public void setName(String name) {  
131 - this.name = name;  
132 - }  
133 -  
134 - public String getClazz() {  
135 - return clazz;  
136 - }  
137 -  
138 - public void setClazz(String clazz) {  
139 - this.clazz = clazz;  
140 - }  
141 -  
142 - public JsonNode getConfiguration() {  
143 - return configuration;  
144 - }  
145 -  
146 - public void setConfiguration(JsonNode configuration) {  
147 - this.configuration = configuration;  
148 - }  
149 -  
150 - public boolean isPublicAccess() {  
151 - return publicAccess;  
152 - }  
153 -  
154 - public void setPublicAccess(boolean publicAccess) {  
155 - this.publicAccess = publicAccess;  
156 - }  
157 -  
158 - public ComponentLifecycleState getState() {  
159 - return state;  
160 - }  
161 -  
162 - public void setState(ComponentLifecycleState state) {  
163 - this.state = state;  
164 - }  
165 -  
166 - public String getSearchText() {  
167 - return searchText;  
168 - }  
169 -  
170 - public JsonNode getAdditionalInfo() {  
171 - return additionalInfo;  
172 - }  
173 -  
174 - public void setAdditionalInfo(JsonNode additionalInfo) {  
175 - this.additionalInfo = additionalInfo;  
176 - }  
177 -  
178 @Override 119 @Override
179 public PluginMetaData toData() { 120 public PluginMetaData toData() {
180 PluginMetaData data = new PluginMetaData(new PluginId(id)); 121 PluginMetaData data = new PluginMetaData(new PluginId(id));
181 data.setTenantId(new TenantId(tenantId)); 122 data.setTenantId(new TenantId(tenantId));
182 data.setCreatedTime(UUIDs.unixTimestamp(id)); 123 data.setCreatedTime(UUIDs.unixTimestamp(id));
183 data.setName(name); 124 data.setName(name);
184 - data.setConfiguration(configuration);  
185 data.setClazz(clazz); 125 data.setClazz(clazz);
186 data.setPublicAccess(publicAccess); 126 data.setPublicAccess(publicAccess);
187 data.setState(state); 127 data.setState(state);
188 data.setApiToken(apiToken); 128 data.setApiToken(apiToken);
189 - data.setAdditionalInfo(additionalInfo); 129 + ObjectMapper mapper = new ObjectMapper();
  130 + if (configuration != null) {
  131 + try {
  132 + JsonNode jsonNode = mapper.readTree(configuration);
  133 + data.setConfiguration(jsonNode);
  134 + } catch (IOException e) {
  135 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", configuration, e.getMessage()), e);
  136 + }
  137 + }
  138 + if (additionalInfo != null) {
  139 + try {
  140 + JsonNode jsonNode = mapper.readTree(additionalInfo);
  141 + data.setAdditionalInfo(jsonNode);
  142 + } catch (IOException e) {
  143 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", additionalInfo, e.getMessage()), e);
  144 + }
  145 + }
190 return data; 146 return data;
191 } 147 }
192 148
@@ -16,12 +16,17 @@ @@ -16,12 +16,17 @@
16 package org.thingsboard.server.dao.model.sql; 16 package org.thingsboard.server.dao.model.sql;
17 17
18 import com.datastax.driver.core.utils.UUIDs; 18 import com.datastax.driver.core.utils.UUIDs;
  19 +
19 import javax.persistence.Column; 20 import javax.persistence.Column;
20 import javax.persistence.Entity; 21 import javax.persistence.Entity;
21 import javax.persistence.Id; 22 import javax.persistence.Id;
22 import javax.persistence.Table; 23 import javax.persistence.Table;
23 import javax.persistence.Transient; 24 import javax.persistence.Transient;
  25 +
24 import com.fasterxml.jackson.databind.JsonNode; 26 import com.fasterxml.jackson.databind.JsonNode;
  27 +import com.fasterxml.jackson.databind.ObjectMapper;
  28 +import lombok.Data;
  29 +import lombok.extern.slf4j.Slf4j;
25 import org.thingsboard.server.common.data.id.RuleId; 30 import org.thingsboard.server.common.data.id.RuleId;
26 import org.thingsboard.server.common.data.id.TenantId; 31 import org.thingsboard.server.common.data.id.TenantId;
27 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; 32 import org.thingsboard.server.common.data.plugin.ComponentLifecycleState;
@@ -30,19 +35,22 @@ import org.thingsboard.server.dao.DaoUtil; @@ -30,19 +35,22 @@ import org.thingsboard.server.dao.DaoUtil;
30 import org.thingsboard.server.dao.model.ModelConstants; 35 import org.thingsboard.server.dao.model.ModelConstants;
31 import org.thingsboard.server.dao.model.SearchTextEntity; 36 import org.thingsboard.server.dao.model.SearchTextEntity;
32 37
  38 +import java.io.IOException;
33 import java.util.Objects; 39 import java.util.Objects;
34 import java.util.UUID; 40 import java.util.UUID;
35 41
36 -//@Entity 42 +@Slf4j
  43 +@Data
  44 +@Entity
37 @Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME) 45 @Table(name = ModelConstants.RULE_COLUMN_FAMILY_NAME)
38 public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> { 46 public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
39 47
40 @Transient 48 @Transient
41 private static final long serialVersionUID = -1506905644259463884L; 49 private static final long serialVersionUID = -1506905644259463884L;
42 @Id 50 @Id
43 - @Column(name = ModelConstants.ID_PROPERTY) 51 + @Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "BINARY(16)")
44 private UUID id; 52 private UUID id;
45 - @Column(name = ModelConstants.RULE_TENANT_ID_PROPERTY) 53 + @Column(name = ModelConstants.RULE_TENANT_ID_PROPERTY, columnDefinition = "BINARY(16)")
46 private UUID tenantId; 54 private UUID tenantId;
47 @Column(name = ModelConstants.RULE_NAME_PROPERTY) 55 @Column(name = ModelConstants.RULE_NAME_PROPERTY)
48 private String name; 56 private String name;
@@ -55,13 +63,13 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> { @@ -55,13 +63,13 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
55 @Column(name = ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY) 63 @Column(name = ModelConstants.RULE_PLUGIN_TOKEN_PROPERTY)
56 private String pluginToken; 64 private String pluginToken;
57 @Column(name = ModelConstants.RULE_FILTERS) 65 @Column(name = ModelConstants.RULE_FILTERS)
58 - private JsonNode filters; 66 + private String filters;
59 @Column(name = ModelConstants.RULE_PROCESSOR) 67 @Column(name = ModelConstants.RULE_PROCESSOR)
60 - private JsonNode processor; 68 + private String processor;
61 @Column(name = ModelConstants.RULE_ACTION) 69 @Column(name = ModelConstants.RULE_ACTION)
62 - private JsonNode action; 70 + private String action;
63 @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY) 71 @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
64 - private JsonNode additionalInfo; 72 + private String additionalInfo;
65 73
66 public RuleMetaDataEntity() { 74 public RuleMetaDataEntity() {
67 } 75 }
@@ -76,10 +84,18 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> { @@ -76,10 +84,18 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
76 this.state = rule.getState(); 84 this.state = rule.getState();
77 this.weight = rule.getWeight(); 85 this.weight = rule.getWeight();
78 this.searchText = rule.getName(); 86 this.searchText = rule.getName();
79 - this.filters = rule.getFilters();  
80 - this.processor = rule.getProcessor();  
81 - this.action = rule.getAction();  
82 - this.additionalInfo = rule.getAdditionalInfo(); 87 + if (rule.getFilters() != null) {
  88 + this.filters = rule.getFilters().toString();
  89 + }
  90 + if (rule.getProcessor() != null) {
  91 + this.processor = rule.getProcessor().toString();
  92 + }
  93 + if (rule.getAction() != null) {
  94 + this.action = rule.getAction().toString();
  95 + }
  96 + if (rule.getAdditionalInfo() != null) {
  97 + this.additionalInfo = rule.getAdditionalInfo().toString();
  98 + }
83 } 99 }
84 100
85 @Override 101 @Override
@@ -102,82 +118,6 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> { @@ -102,82 +118,6 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
102 this.id = id; 118 this.id = id;
103 } 119 }
104 120
105 - public UUID getTenantId() {  
106 - return tenantId;  
107 - }  
108 -  
109 - public void setTenantId(UUID tenantId) {  
110 - this.tenantId = tenantId;  
111 - }  
112 -  
113 - public String getName() {  
114 - return name;  
115 - }  
116 -  
117 - public void setName(String name) {  
118 - this.name = name;  
119 - }  
120 -  
121 - public ComponentLifecycleState getState() {  
122 - return state;  
123 - }  
124 -  
125 - public void setState(ComponentLifecycleState state) {  
126 - this.state = state;  
127 - }  
128 -  
129 - public int getWeight() {  
130 - return weight;  
131 - }  
132 -  
133 - public void setWeight(int weight) {  
134 - this.weight = weight;  
135 - }  
136 -  
137 - public String getPluginToken() {  
138 - return pluginToken;  
139 - }  
140 -  
141 - public void setPluginToken(String pluginToken) {  
142 - this.pluginToken = pluginToken;  
143 - }  
144 -  
145 - public String getSearchText() {  
146 - return searchText;  
147 - }  
148 -  
149 - public JsonNode getFilters() {  
150 - return filters;  
151 - }  
152 -  
153 - public void setFilters(JsonNode filters) {  
154 - this.filters = filters;  
155 - }  
156 -  
157 - public JsonNode getProcessor() {  
158 - return processor;  
159 - }  
160 -  
161 - public void setProcessor(JsonNode processor) {  
162 - this.processor = processor;  
163 - }  
164 -  
165 - public JsonNode getAction() {  
166 - return action;  
167 - }  
168 -  
169 - public void setAction(JsonNode action) {  
170 - this.action = action;  
171 - }  
172 -  
173 - public JsonNode getAdditionalInfo() {  
174 - return additionalInfo;  
175 - }  
176 -  
177 - public void setAdditionalInfo(JsonNode additionalInfo) {  
178 - this.additionalInfo = additionalInfo;  
179 - }  
180 -  
181 @Override 121 @Override
182 public RuleMetaData toData() { 122 public RuleMetaData toData() {
183 RuleMetaData rule = new RuleMetaData(new RuleId(id)); 123 RuleMetaData rule = new RuleMetaData(new RuleId(id));
@@ -187,10 +127,39 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> { @@ -187,10 +127,39 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
187 rule.setWeight(weight); 127 rule.setWeight(weight);
188 rule.setCreatedTime(UUIDs.unixTimestamp(id)); 128 rule.setCreatedTime(UUIDs.unixTimestamp(id));
189 rule.setPluginToken(pluginToken); 129 rule.setPluginToken(pluginToken);
190 - rule.setFilters(filters);  
191 - rule.setProcessor(processor);  
192 - rule.setAction(action);  
193 - rule.setAdditionalInfo(additionalInfo); 130 + ObjectMapper mapper = new ObjectMapper();
  131 + if (filters != null) {
  132 + try {
  133 + JsonNode jsonNode = mapper.readTree(filters);
  134 + rule.setFilters(jsonNode);
  135 + } catch (IOException e) {
  136 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", filters, e.getMessage()), e);
  137 + }
  138 + }
  139 + if (processor != null) {
  140 + try {
  141 + JsonNode jsonNode = mapper.readTree(processor);
  142 + rule.setProcessor(jsonNode);
  143 + } catch (IOException e) {
  144 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", processor, e.getMessage()), e);
  145 + }
  146 + }
  147 + if (action != null) {
  148 + try {
  149 + JsonNode jsonNode = mapper.readTree(action);
  150 + rule.setAction(jsonNode);
  151 + } catch (IOException e) {
  152 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", action, e.getMessage()), e);
  153 + }
  154 + }
  155 + if (additionalInfo != null) {
  156 + try {
  157 + JsonNode jsonNode = mapper.readTree(additionalInfo);
  158 + rule.setAdditionalInfo(jsonNode);
  159 + } catch (IOException e) {
  160 + log.warn(String.format("Error parsing JsonNode: %s. Reason: %s ", additionalInfo, e.getMessage()), e);
  161 + }
  162 + }
194 return rule; 163 return rule;
195 } 164 }
196 165
1 /** 1 /**
2 * Copyright © 2016-2017 The Thingsboard Authors 2 * Copyright © 2016-2017 The Thingsboard Authors
3 - * <p> 3 + *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at 6 * You may obtain a copy of the License at
7 - * <p>  
8 - * http://www.apache.org/licenses/LICENSE-2.0  
9 - * <p> 7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
10 * Unless required by applicable law or agreed to in writing, software 10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, 11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -25,6 +25,7 @@ import javax.persistence.Transient; @@ -25,6 +25,7 @@ import javax.persistence.Transient;
25 import com.datastax.driver.mapping.annotations.PartitionKey; 25 import com.datastax.driver.mapping.annotations.PartitionKey;
26 import com.fasterxml.jackson.databind.JsonNode; 26 import com.fasterxml.jackson.databind.JsonNode;
27 import com.fasterxml.jackson.databind.ObjectMapper; 27 import com.fasterxml.jackson.databind.ObjectMapper;
  28 +import lombok.Data;
28 import lombok.extern.slf4j.Slf4j; 29 import lombok.extern.slf4j.Slf4j;
29 import org.thingsboard.server.common.data.id.TenantId; 30 import org.thingsboard.server.common.data.id.TenantId;
30 import org.thingsboard.server.common.data.id.WidgetTypeId; 31 import org.thingsboard.server.common.data.id.WidgetTypeId;
@@ -36,6 +37,7 @@ import java.io.IOException; @@ -36,6 +37,7 @@ import java.io.IOException;
36 import java.util.UUID; 37 import java.util.UUID;
37 38
38 @Slf4j 39 @Slf4j
  40 +@Data
39 @Entity 41 @Entity
40 @Table(name = ModelConstants.WIDGET_TYPE_COLUMN_FAMILY_NAME) 42 @Table(name = ModelConstants.WIDGET_TYPE_COLUMN_FAMILY_NAME)
41 public final class WidgetTypeEntity implements BaseEntity<WidgetType> { 43 public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
@@ -93,46 +95,6 @@ public final class WidgetTypeEntity implements BaseEntity<WidgetType> { @@ -93,46 +95,6 @@ public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
93 this.id = id; 95 this.id = id;
94 } 96 }
95 97
96 - public UUID getTenantId() {  
97 - return tenantId;  
98 - }  
99 -  
100 - public void setTenantId(UUID tenantId) {  
101 - this.tenantId = tenantId;  
102 - }  
103 -  
104 - public String getBundleAlias() {  
105 - return bundleAlias;  
106 - }  
107 -  
108 - public void setBundleAlias(String bundleAlias) {  
109 - this.bundleAlias = bundleAlias;  
110 - }  
111 -  
112 - public String getAlias() {  
113 - return alias;  
114 - }  
115 -  
116 - public void setAlias(String alias) {  
117 - this.alias = alias;  
118 - }  
119 -  
120 - public String getName() {  
121 - return name;  
122 - }  
123 -  
124 - public void setName(String name) {  
125 - this.name = name;  
126 - }  
127 -  
128 - public String getDescriptor() {  
129 - return descriptor;  
130 - }  
131 -  
132 - public void setDescriptor(String descriptor) {  
133 - this.descriptor = descriptor;  
134 - }  
135 -  
136 @Override 98 @Override
137 public int hashCode() { 99 public int hashCode() {
138 int result = id != null ? id.hashCode() : 0; 100 int result = id != null ? id.hashCode() : 0;
1 /** 1 /**
2 * Copyright © 2016-2017 The Thingsboard Authors 2 * Copyright © 2016-2017 The Thingsboard Authors
3 - * <p> 3 + *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at 6 * You may obtain a copy of the License at
7 - * <p>  
8 - * http://www.apache.org/licenses/LICENSE-2.0  
9 - * <p> 7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
10 * Unless required by applicable law or agreed to in writing, software 10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, 11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.plugin;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  21 +import org.springframework.data.repository.CrudRepository;
  22 +import org.springframework.stereotype.Component;
  23 +import org.thingsboard.server.common.data.id.PluginId;
  24 +import org.thingsboard.server.common.data.id.TenantId;
  25 +import org.thingsboard.server.common.data.page.TextPageLink;
  26 +import org.thingsboard.server.common.data.plugin.PluginMetaData;
  27 +import org.thingsboard.server.dao.DaoUtil;
  28 +import org.thingsboard.server.dao.model.ModelConstants;
  29 +import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity;
  30 +import org.thingsboard.server.dao.plugin.PluginDao;
  31 +import org.thingsboard.server.dao.sql.JpaAbstractDao;
  32 +
  33 +import java.util.Arrays;
  34 +import java.util.List;
  35 +import java.util.UUID;
  36 +
  37 +/**
  38 + * Created by Valerii Sosliuk on 5/1/2017.
  39 + */
  40 +@Slf4j
  41 +@Component
  42 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
  43 +public class JpaBasePluginDao extends JpaAbstractDao<PluginMetaDataEntity, PluginMetaData> implements PluginDao {
  44 +
  45 + @Autowired
  46 + private PluginMetaDataRepository pluginMetaDataRepository;
  47 +
  48 + @Override
  49 + protected Class<PluginMetaDataEntity> getEntityClass() {
  50 + return PluginMetaDataEntity.class;
  51 + }
  52 +
  53 + @Override
  54 + protected String getColumnFamilyName() {
  55 + return ModelConstants.PLUGIN_COLUMN_FAMILY_NAME;
  56 + }
  57 +
  58 + @Override
  59 + protected CrudRepository<PluginMetaDataEntity, UUID> getCrudRepository() {
  60 + return pluginMetaDataRepository;
  61 + }
  62 +
  63 + @Override
  64 + protected boolean isSearchTextDao() {
  65 + return true;
  66 + }
  67 +
  68 + @Override
  69 + public PluginMetaData findById(PluginId pluginId) {
  70 + log.debug("Search plugin meta-data entity by id [{}]", pluginId);
  71 + PluginMetaData pluginMetaData = super.findById(pluginId.getId());
  72 + if (log.isTraceEnabled()) {
  73 + log.trace("Search result: [{}] for plugin entity [{}]", pluginMetaData != null, pluginMetaData);
  74 + } else {
  75 + log.debug("Search result: [{}]", pluginMetaData != null);
  76 + }
  77 + return pluginMetaData;
  78 + }
  79 +
  80 + @Override
  81 + public PluginMetaData findByApiToken(String apiToken) {
  82 + log.debug("Search plugin meta-data entity by api token [{}]", apiToken);
  83 + PluginMetaDataEntity entity = pluginMetaDataRepository.findByApiToken(apiToken);
  84 + if (log.isTraceEnabled()) {
  85 + log.trace("Search result: [{}] for plugin entity [{}]", entity != null, entity);
  86 + } else {
  87 + log.debug("Search result: [{}]", entity != null);
  88 + }
  89 + return DaoUtil.getData(entity);
  90 + }
  91 +
  92 + @Override
  93 + public void deleteById(UUID id) {
  94 + log.debug("Delete plugin meta-data entity by id [{}]", id);
  95 + pluginMetaDataRepository.delete(id);
  96 + }
  97 +
  98 + @Override
  99 + public void deleteById(PluginId pluginId) {
  100 + deleteById(pluginId.getId());
  101 + }
  102 +
  103 + @Override
  104 + public List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
  105 + log.debug("Try to find здгпшты by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
  106 + List<PluginMetaDataEntity> entities;
  107 + if (pageLink.getIdOffset() == null) {
  108 + entities = pluginMetaDataRepository
  109 + .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch());
  110 + } else {
  111 + entities = pluginMetaDataRepository
  112 + .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset());
  113 + }
  114 + if (log.isTraceEnabled()) {
  115 + log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
  116 + } else {
  117 + log.debug("Search result: [{}]", entities.size());
  118 + }
  119 + return DaoUtil.convertDataList(entities);
  120 + }
  121 +
  122 + @Override
  123 + public List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) {
  124 + log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
  125 + List<PluginMetaDataEntity> entities;
  126 + if (pageLink.getIdOffset() == null) {
  127 + entities = pluginMetaDataRepository
  128 + .findAllTenantPluginsByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch());
  129 + } else {
  130 + entities = pluginMetaDataRepository
  131 + .findAllTenantPluginsByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset());
  132 + }
  133 + if (log.isTraceEnabled()) {
  134 + log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
  135 + } else {
  136 + log.debug("Search result: [{}]", entities.size());
  137 + }
  138 + return DaoUtil.convertDataList(entities);
  139 + }
  140 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.plugin;
  17 +
  18 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  19 +import org.springframework.data.jpa.repository.Query;
  20 +import org.springframework.data.repository.CrudRepository;
  21 +import org.thingsboard.server.common.data.plugin.PluginMetaData;
  22 +import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity;
  23 +import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
  24 +
  25 +import java.util.List;
  26 +import java.util.UUID;
  27 +
  28 +/**
  29 + * Created by Valerii Sosliuk on 5/1/2017.
  30 + */
  31 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
  32 +public interface PluginMetaDataRepository extends CrudRepository<PluginMetaDataEntity, UUID> {
  33 +
  34 + PluginMetaDataEntity findByApiToken(String apiToken);
  35 +
  36 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " +
  37 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  38 + "ORDER BY ID LIMIT ?1")
  39 + List<PluginMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch);
  40 +
  41 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " +
  42 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  43 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  44 + List<PluginMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  45 +
  46 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
  47 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  48 + "ORDER BY ID LIMIT ?1")
  49 + List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
  50 +
  51 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
  52 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  53 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  54 + List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  55 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.rule;
  17 +
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  21 +import org.springframework.data.repository.CrudRepository;
  22 +import org.springframework.stereotype.Component;
  23 +import org.thingsboard.server.common.data.id.RuleId;
  24 +import org.thingsboard.server.common.data.id.TenantId;
  25 +import org.thingsboard.server.common.data.page.TextPageLink;
  26 +import org.thingsboard.server.common.data.rule.RuleMetaData;
  27 +import org.thingsboard.server.dao.DaoUtil;
  28 +import org.thingsboard.server.dao.model.ModelConstants;
  29 +import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
  30 +import org.thingsboard.server.dao.rule.RuleDao;
  31 +import org.thingsboard.server.dao.sql.JpaAbstractDao;
  32 +
  33 +import java.util.Arrays;
  34 +import java.util.List;
  35 +import java.util.UUID;
  36 +
  37 +/**
  38 + * Created by Valerii Sosliuk on 4/30/2017.
  39 + */
  40 +@Slf4j
  41 +@Component
  42 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
  43 +public class JpaBaseRuleDao extends JpaAbstractDao<RuleMetaDataEntity, RuleMetaData> implements RuleDao {
  44 +
  45 + @Autowired
  46 + private RuleMetaDataRepository ruleMetaDataRepository;
  47 +
  48 + @Override
  49 + protected Class<RuleMetaDataEntity> getEntityClass() {
  50 + return RuleMetaDataEntity.class;
  51 + }
  52 + @Override
  53 + protected String getColumnFamilyName() {
  54 + return ModelConstants.RULE_COLUMN_FAMILY_NAME;
  55 + }
  56 +
  57 + @Override
  58 + protected CrudRepository<RuleMetaDataEntity, UUID> getCrudRepository() {
  59 + return ruleMetaDataRepository;
  60 + }
  61 +
  62 + @Override
  63 + protected boolean isSearchTextDao() {
  64 + return true;
  65 + }
  66 +
  67 + @Override
  68 + public RuleMetaData findById(RuleId ruleId) {
  69 + return findById(ruleId.getId());
  70 + }
  71 +
  72 + @Override
  73 + public List<RuleMetaData> findRulesByPlugin(String pluginToken) {
  74 + log.debug("Search rules by api token [{}]", pluginToken);
  75 + return DaoUtil.convertDataList(ruleMetaDataRepository.findByPluginToken(pluginToken));
  76 + }
  77 +
  78 + @Override
  79 + public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
  80 + log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
  81 + List<RuleMetaDataEntity> entities;
  82 + if (pageLink.getIdOffset() == null) {
  83 + entities = ruleMetaDataRepository
  84 + .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch());
  85 + } else {
  86 + entities = ruleMetaDataRepository
  87 + .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset());
  88 + }
  89 + if (log.isTraceEnabled()) {
  90 + log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
  91 + } else {
  92 + log.debug("Search result: [{}]", entities.size());
  93 + }
  94 + return DaoUtil.convertDataList(entities);
  95 + }
  96 +
  97 + @Override
  98 + public List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) {
  99 + log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
  100 + List<RuleMetaDataEntity> entities;
  101 + if (pageLink.getIdOffset() == null) {
  102 + entities = ruleMetaDataRepository
  103 + .findAllTenantRulesByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch());
  104 + } else {
  105 + entities = ruleMetaDataRepository
  106 + .findAllTenantRulesByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset());
  107 + }
  108 + if (log.isTraceEnabled()) {
  109 + log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
  110 + } else {
  111 + log.debug("Search result: [{}]", entities.size());
  112 + }
  113 + return DaoUtil.convertDataList(entities);
  114 + }
  115 +
  116 + @Override
  117 + public void deleteById(UUID id) {
  118 + log.debug("Delete rule meta-data entity by id [{}]", id);
  119 + ruleMetaDataRepository.delete(id);
  120 + }
  121 +
  122 + @Override
  123 + public void deleteById(RuleId ruleId) {
  124 + deleteById(ruleId.getId());
  125 + }
  126 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.rule;
  17 +
  18 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  19 +import org.springframework.data.jpa.repository.Query;
  20 +import org.springframework.data.repository.CrudRepository;
  21 +import org.thingsboard.server.common.data.id.TenantId;
  22 +import org.thingsboard.server.dao.model.ToData;
  23 +import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
  24 +
  25 +import java.util.Collection;
  26 +import java.util.List;
  27 +import java.util.UUID;
  28 +
  29 +/**
  30 + * Created by Valerii Sosliuk on 4/30/2017.
  31 + */
  32 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
  33 +public interface RuleMetaDataRepository extends CrudRepository<RuleMetaDataEntity, UUID> {
  34 +
  35 + List<RuleMetaDataEntity> findByPluginToken(String pluginToken);
  36 +
  37 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " +
  38 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  39 + "ORDER BY ID LIMIT ?1")
  40 + List<RuleMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch);
  41 +
  42 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " +
  43 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  44 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  45 + List<RuleMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  46 +
  47 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
  48 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  49 + "ORDER BY ID LIMIT ?1")
  50 + List<RuleMetaDataEntity> findAllTenantRulesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
  51 +
  52 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
  53 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
  54 + "AND ID > ?4 ORDER BY ID LIMIT ?1")
  55 + List<RuleMetaDataEntity> findAllTenantRulesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  56 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.tenant; 16 package org.thingsboard.server.dao.sql.tenant;
2 17
3 import org.springframework.beans.factory.annotation.Autowired; 18 import org.springframework.beans.factory.annotation.Autowired;
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.tenant; 16 package org.thingsboard.server.dao.sql.tenant;
2 17
3 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1 /** 1 /**
2 * Copyright © 2016-2017 The Thingsboard Authors 2 * Copyright © 2016-2017 The Thingsboard Authors
3 - * <p> 3 + *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at 6 * You may obtain a copy of the License at
7 - * <p>  
8 - * http://www.apache.org/licenses/LICENSE-2.0  
9 - * <p> 7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
10 * Unless required by applicable law or agreed to in writing, software 10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, 11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1 /** 1 /**
2 * Copyright © 2016-2017 The Thingsboard Authors 2 * Copyright © 2016-2017 The Thingsboard Authors
3 - * <p> 3 + *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at 6 * You may obtain a copy of the License at
7 - * <p>  
8 - * http://www.apache.org/licenses/LICENSE-2.0  
9 - * <p> 7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
10 * Unless required by applicable law or agreed to in writing, software 10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, 11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.widget; 16 package org.thingsboard.server.dao.sql.widget;
2 17
3 import org.springframework.beans.factory.annotation.Autowired; 18 import org.springframework.beans.factory.annotation.Autowired;
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.widget; 16 package org.thingsboard.server.dao.sql.widget;
2 17
3 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.plugin;
  17 +
  18 +import com.datastax.driver.core.utils.UUIDs;
  19 +import com.github.springtestdbunit.annotation.DatabaseSetup;
  20 +import org.junit.Test;
  21 +import org.springframework.beans.factory.annotation.Autowired;
  22 +import org.thingsboard.server.common.data.id.PluginId;
  23 +import org.thingsboard.server.common.data.id.TenantId;
  24 +import org.thingsboard.server.common.data.page.TextPageLink;
  25 +import org.thingsboard.server.common.data.plugin.PluginMetaData;
  26 +import org.thingsboard.server.common.data.rule.RuleMetaData;
  27 +import org.thingsboard.server.dao.AbstractJpaDaoTest;
  28 +import org.thingsboard.server.dao.plugin.PluginDao;
  29 +
  30 +import java.util.List;
  31 +import java.util.UUID;
  32 +
  33 +import static org.junit.Assert.assertEquals;
  34 +
  35 +/**
  36 + * Created by Valerii Sosliuk on 5/1/2017.
  37 + */
  38 +public class JpaBasePluginDaoTest extends AbstractJpaDaoTest {
  39 +
  40 + @Autowired
  41 + private PluginDao pluginDao;
  42 +
  43 + @Test
  44 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  45 + public void testFindByTenantIdAndPageLink() {
  46 + UUID tenantId1 = UUIDs.timeBased();
  47 + UUID tenantId2 = UUIDs.timeBased();
  48 + createPluginsTwoTenants(tenantId1, tenantId2, "plugin_");
  49 + assertEquals(60, pluginDao.find().size());
  50 + List<PluginMetaData> rules1 = pluginDao.findByTenantIdAndPageLink(
  51 + new TenantId(tenantId1), new TextPageLink(20, "plugin_"));
  52 + assertEquals(20, rules1.size());
  53 +
  54 + List<PluginMetaData> rules2 = pluginDao.findByTenantIdAndPageLink(new TenantId(tenantId1),
  55 + new TextPageLink(20, "plugin_", rules1.get(19).getId().getId(), null));
  56 + assertEquals(10, rules2.size());
  57 +
  58 + List<PluginMetaData> rules3 = pluginDao.findByTenantIdAndPageLink(new TenantId(tenantId1),
  59 + new TextPageLink(20, "plugin_", rules2.get(9).getId().getId(), null));
  60 + assertEquals(0, rules3.size());
  61 + }
  62 +
  63 + @Test
  64 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  65 + public void testFindAllTenantRulesByTenantId() {
  66 + UUID tenantId1 = UUIDs.timeBased();
  67 + UUID tenantId2 = UUIDs.timeBased();
  68 + createTenantsAndSystemPlugins(tenantId1, tenantId2, "name_");
  69 + List<PluginMetaData> rules1 = pluginDao.findAllTenantPluginsByTenantId(
  70 + tenantId1, new TextPageLink(40, "name_"));
  71 + assertEquals(40, rules1.size());
  72 +
  73 + List<PluginMetaData> rules2 = pluginDao.findAllTenantPluginsByTenantId(tenantId1,
  74 + new TextPageLink(40, "name_", rules1.get(39).getId().getId(), null));
  75 + assertEquals(20, rules2.size());
  76 +
  77 + List<PluginMetaData> rules3 = pluginDao.findAllTenantPluginsByTenantId(tenantId1,
  78 + new TextPageLink(40, "name_", rules2.get(19).getId().getId(), null));
  79 + assertEquals(0, rules3.size());
  80 + }
  81 +
  82 + private void createTenantsAndSystemPlugins(UUID tenantId1, UUID tenantId2, String namePrefix) {
  83 + for (int i = 0; i < 30; i++) {
  84 + createPlugin(tenantId1, namePrefix, i);
  85 + createPlugin(tenantId2, namePrefix, i);
  86 + createPlugin(null, namePrefix, i);
  87 + }
  88 + }
  89 +
  90 + private void createPluginsTwoTenants(UUID tenantId1, UUID tenantId2, String namePrefix) {
  91 + for (int i = 0; i < 30; i++) {
  92 + createPlugin(tenantId1, namePrefix, i);
  93 + createPlugin(tenantId2, namePrefix, i);
  94 + }
  95 + }
  96 +
  97 + private void createPlugin(UUID tenantId, String namePrefix, int i) {
  98 + PluginMetaData plugin = new PluginMetaData();
  99 + plugin.setId(new PluginId(UUIDs.timeBased()));
  100 + plugin.setTenantId(new TenantId(tenantId));
  101 + plugin.setName(namePrefix + i);
  102 + pluginDao.save(plugin);
  103 + }
  104 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao.sql.rule;
  17 +
  18 +import com.datastax.driver.core.utils.UUIDs;
  19 +import com.github.springtestdbunit.annotation.DatabaseSetup;
  20 +import org.junit.Test;
  21 +import org.springframework.beans.factory.annotation.Autowired;
  22 +import org.thingsboard.server.common.data.id.RuleId;
  23 +import org.thingsboard.server.common.data.id.TenantId;
  24 +import org.thingsboard.server.common.data.page.TextPageLink;
  25 +import org.thingsboard.server.common.data.rule.RuleMetaData;
  26 +import org.thingsboard.server.dao.AbstractJpaDaoTest;
  27 +import org.thingsboard.server.dao.rule.RuleDao;
  28 +
  29 +import java.util.List;
  30 +import java.util.UUID;
  31 +
  32 +import static org.junit.Assert.assertEquals;
  33 +import static org.junit.Assert.assertNotNull;
  34 +
  35 +/**
  36 + * Created by Valerii Sosliuk on 4/30/2017.
  37 + */
  38 +public class JpaBaseRuleDaoTest extends AbstractJpaDaoTest {
  39 +
  40 + @Autowired
  41 + private RuleDao jpaBaseRuleDao;
  42 +
  43 + @Test
  44 + @DatabaseSetup("classpath:dbunit/rule.xml")
  45 + public void testFindRulesByPlugin() {
  46 + assertEquals(3, jpaBaseRuleDao.findRulesByPlugin("token_1").size());
  47 + }
  48 +
  49 + @Test
  50 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  51 + public void testFindByTenantIdAndPageLink() {
  52 + UUID tenantId1 = UUIDs.timeBased();
  53 + UUID tenantId2 = UUIDs.timeBased();
  54 + createRulesTwoTenants(tenantId1, tenantId2, "name_", "token");
  55 + List<RuleMetaData> rules1 = jpaBaseRuleDao.findByTenantIdAndPageLink(
  56 + new TenantId(tenantId1), new TextPageLink(20, "name_"));
  57 + assertEquals(20, rules1.size());
  58 +
  59 + List<RuleMetaData> rules2 = jpaBaseRuleDao.findByTenantIdAndPageLink(new TenantId(tenantId1),
  60 + new TextPageLink(20, "name_", rules1.get(19).getId().getId(), null));
  61 + assertEquals(10, rules2.size());
  62 +
  63 + List<RuleMetaData> rules3 = jpaBaseRuleDao.findByTenantIdAndPageLink(new TenantId(tenantId1),
  64 + new TextPageLink(20, "name_", rules2.get(9).getId().getId(), null));
  65 + assertEquals(0, rules3.size());
  66 + }
  67 +
  68 + @Test
  69 + @DatabaseSetup("classpath:dbunit/empty_dataset.xml")
  70 + public void testFindAllTenantRulesByTenantId() {
  71 + UUID tenantId1 = UUIDs.timeBased();
  72 + UUID tenantId2 = UUIDs.timeBased();
  73 + createTenantsAndSystemRules(tenantId1, tenantId2, "name_", "token");
  74 + List<RuleMetaData> rules1 = jpaBaseRuleDao.findAllTenantRulesByTenantId(
  75 + tenantId1, new TextPageLink(40, "name_"));
  76 + assertEquals(40, rules1.size());
  77 +
  78 + List<RuleMetaData> rules2 = jpaBaseRuleDao.findAllTenantRulesByTenantId(tenantId1,
  79 + new TextPageLink(40, "name_", rules1.get(39).getId().getId(), null));
  80 + assertEquals(20, rules2.size());
  81 +
  82 + List<RuleMetaData> rules3 = jpaBaseRuleDao.findAllTenantRulesByTenantId(tenantId1,
  83 + new TextPageLink(40, "name_", rules2.get(19).getId().getId(), null));
  84 + assertEquals(0, rules3.size());
  85 + }
  86 +
  87 + private void createRulesTwoTenants(UUID tenantId1, UUID tenantId2, String namePrefix, String pluginToken) {
  88 + for (int i = 0; i < 30; i++) {
  89 + createRule(tenantId1, namePrefix, pluginToken, i);
  90 + createRule(tenantId2, namePrefix, pluginToken, i);
  91 + }
  92 + }
  93 +
  94 + private void createTenantsAndSystemRules(UUID tenantId1, UUID tenantId2, String namePrefix, String pluginToken) {
  95 + for (int i = 0; i < 30; i++) {
  96 + createRule(tenantId1, namePrefix, pluginToken, i);
  97 + createRule(tenantId2, namePrefix, pluginToken, i);
  98 + createRule(null, namePrefix, pluginToken, i);
  99 + }
  100 + }
  101 +
  102 + private void createRule(UUID tenantId, String namePrefix, String pluginToken, int i) {
  103 + RuleMetaData ruleMetaData = new RuleMetaData();
  104 + ruleMetaData.setId(new RuleId(UUIDs.timeBased()));
  105 + ruleMetaData.setTenantId(new TenantId(tenantId));
  106 + ruleMetaData.setName(namePrefix + i);
  107 + ruleMetaData.setPluginToken(pluginToken);
  108 + jpaBaseRuleDao.save(ruleMetaData);
  109 + }
  110 +}
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.tenant; 16 package org.thingsboard.server.dao.sql.tenant;
2 17
3 import com.datastax.driver.core.utils.UUIDs; 18 import com.datastax.driver.core.utils.UUIDs;
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.dao.sql.widget; 16 package org.thingsboard.server.dao.sql.widget;
2 17
3 import com.datastax.driver.core.utils.UUIDs; 18 import com.datastax.driver.core.utils.UUIDs;
  1 +<dataset>
  2 + <rule
  3 + id="uuid'8e834e11-2e0a-11e7-83ec-f7f6dbfb4833'"
  4 + tenant_id="uuid'8e834e10-2e0a-11e7-83ec-f7f6dbfb4833'"
  5 + name="RULE_11"
  6 + weight="1"
  7 + search_text="rule_11"
  8 + plugin_token="token_1"
  9 + />
  10 + <rule
  11 + id="uuid'8e834e12-2e0a-11e7-83ec-f7f6dbfb4833'"
  12 + tenant_id="uuid'8e834e10-2e0a-11e7-83ec-f7f6dbfb4833'"
  13 + name="RULE_12"
  14 + weight="1"
  15 + search_text="rule_12"
  16 + plugin_token="token_1"
  17 + />
  18 + <rule
  19 + id="uuid'8e834e13-2e0a-11e7-83ec-f7f6dbfb4833'"
  20 + tenant_id="uuid'8e834e10-2e0a-11e7-83ec-f7f6dbfb4833'"
  21 + name="RULE_13"
  22 + weight="1"
  23 + search_text="rule_13"
  24 + plugin_token="token_1"
  25 + />
  26 + <rule
  27 + id="uuid'8e834e14-2e0a-11e7-83ec-f7f6dbfb4833'"
  28 + tenant_id="uuid'8e834e10-2e0a-11e7-83ec-f7f6dbfb4833'"
  29 + name="RULE_14"
  30 + weight="2"
  31 + search_text="rule_14"
  32 + plugin_token="token_2"
  33 + />
  34 +</dataset>