From 1bf3f6066e4d8366e3cb0a9d5feffa0a06355751 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Mon, 30 Oct 2023 12:27:16 +0200 Subject: [PATCH 1/3] Add base implementation of new tags search --- .../sql/widget/WidgetTypeInfoRepository.java | 81 ++++++++++++++++--- .../sql/widget/WidgetsBundleRepository.java | 40 ++++++++- 2 files changed, 108 insertions(+), 13 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java index f3f3bf5139..f9114a9e40 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java @@ -33,14 +33,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, @@ -57,13 +72,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @@ -81,13 +112,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, @@ -111,7 +158,15 @@ public interface WidgetTypeInfoRepository extends JpaRepository findWidgetTypesInfosByWidgetsBundleId(@Param("widgetsBundleId") UUID widgetsBundleId, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 53bda50ba4..893bebb2ed 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -46,7 +46,15 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundlesFullSearch(@Param("systemTenantId") UUID systemTenantId, @Param("textSearch") String textSearch, @@ -81,7 +97,15 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, From 631658b710b00b3dda069fede1fbbc1dc53e1668 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Mon, 30 Oct 2023 15:34:49 +0200 Subject: [PATCH 2/3] Fix copy-paste error --- .../sql/widget/WidgetsBundleRepository.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 893bebb2ed..ac09ae1a2b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -49,11 +49,11 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundlesFullSearch(@Param("systemTenantId") UUID systemTenantId, @@ -100,11 +100,11 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, From 416d178f749354088e497d52a23a2c3eee3bea1a Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Mon, 30 Oct 2023 15:35:06 +0200 Subject: [PATCH 3/3] Add tests for new tag searching logic --- .../dao/sql/widget/JpaWidgetTypeDaoTest.java | 173 ++++++++++++++++++ .../sql/widget/JpaWidgetsBundleDaoTest.java | 122 ++++++++++++ 2 files changed, 295 insertions(+) diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java index 7f4b2c6cfa..e6d46bb942 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java @@ -41,8 +41,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -51,6 +53,26 @@ import static org.junit.Assert.assertNotNull; */ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { + // given search text should find a widget with tags, when searching by tags + final Map SHOULD_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "A", new String[]{"a", "b", "c"}, + "test A test", new String[]{"a", "b", "c"}, + "test x y test", new String[]{"x y", "b", "c"}, + "x y test", new String[]{"x y", "b", "c"}, + "x y", new String[]{"x y", "b", "c"}, + "test x y", new String[]{"x y", "b", "c"} + ); + + // given search text should not find a widget with tags, when searching by tags + final Map SHOULDNT_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "testA test", new String[]{"a", "b", "c"}, + "testx y test", new String[]{"x y", "b", "c"}, + "testx ytest", new String[]{"x y", "b", "c"}, + "x ytest", new String[]{"x y", "b", "c"}, + "testx y", new String[]{"x y", "b", "c"}, + "x", new String[]{"x y", "b", "c"} + ); + final String BUNDLE_ALIAS = "BUNDLE_ALIAS"; final int WIDGET_TYPE_COUNT = 3; List widgetTypeList; @@ -96,6 +118,19 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { return widgetTypeDao.save(TenantId.SYS_TENANT_ID, widgetType); } + WidgetTypeDetails createAndSaveWidgetType(TenantId tenantId, int number, String[] tags) { + WidgetTypeDetails widgetType = new WidgetTypeDetails(); + widgetType.setTenantId(tenantId); + widgetType.setName("WIDGET_TYPE_" + number); + widgetType.setDescription("WIDGET_TYPE_DESCRIPTION" + number); + widgetType.setFqn("FQN_" + number); + var descriptor = JacksonUtil.newObjectNode(); + descriptor.put("type", number % 2 == 0 ? "latest" : "static"); + widgetType.setDescriptor(descriptor); + widgetType.setTags(tags); + return widgetTypeDao.save(TenantId.SYS_TENANT_ID, widgetType); + } + @After public void tearDown() { widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, widgetsBundle.getUuidId()); @@ -123,6 +158,40 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(2)), widgetTypes.getData().get(0)); } + @Test + public void testTagsSearchInFindBySystemWidgetTypes() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findSystemWidgetTypes( + TenantId.SYS_TENANT_ID, true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findSystemWidgetTypes( + TenantId.SYS_TENANT_ID, true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindTenantWidgetTypesByTenantId() { UUID tenantId = Uuids.timeBased(); @@ -138,6 +207,74 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(5)), widgetTypes.getData().get(2)); } + @Test + public void testTagsSearchInFindTenantWidgetTypesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + + @Test + public void testTagsSearchInFindAllTenantWidgetTypesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findAllTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findAllTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindByWidgetTypeInfosByBundleId() { PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId(TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(),true, DeprecatedFilter.ALL, Collections.singletonList("latest"), @@ -152,6 +289,42 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(0)), widgetTypes.getData().get(0)); } + @Test + public void testTagsSearchInFindByWidgetTypeInfosByBundleId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(this.widgetsBundle.getId(), savedWidgetType.getId(), WIDGET_TYPE_COUNT + 1)); + + PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId( + TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(this.widgetsBundle.getId(), savedWidgetType.getId(), WIDGET_TYPE_COUNT + 1)); + + PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId( + TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindByTenantIdAndFqn() { WidgetType result = widgetTypeList.get(0); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java index 424bda88f7..6eae6f8219 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java @@ -36,9 +36,11 @@ import org.thingsboard.server.dao.widget.WidgetsBundleDao; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; /** @@ -46,6 +48,27 @@ import static org.junit.Assert.assertEquals; */ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { + + // given search text should find a widget with tags, when searching by tags + final Map SHOULD_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "A", new String[]{"a", "b", "c"}, + "test A test", new String[]{"a", "b", "c"}, + "test x y test", new String[]{"x y", "b", "c"}, + "x y test", new String[]{"x y", "b", "c"}, + "x y", new String[]{"x y", "b", "c"}, + "test x y", new String[]{"x y", "b", "c"} + ); + + // given search text should not find a widget with tags, when searching by tags + final Map SHOULDNT_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "testA test", new String[]{"a", "b", "c"}, + "testx y test", new String[]{"x y", "b", "c"}, + "testx ytest", new String[]{"x y", "b", "c"}, + "x ytest", new String[]{"x y", "b", "c"}, + "testx y", new String[]{"x y", "b", "c"}, + "x", new String[]{"x y", "b", "c"} + ); + List widgetsBundles; List widgetTypeList; @@ -140,6 +163,51 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { assertEquals(widgetsBundle3, widgetsBundles3.getData().get(1)); } + @Test + public void testTagsSearchInFindBySystemWidgetTypes() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findSystemWidgetsBundles( + TenantId.SYS_TENANT_ID, true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(systemWidgetBundle.getId()); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findSystemWidgetsBundles( + TenantId.SYS_TENANT_ID, true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + widgetsBundles = new ArrayList<>(); + widgetTypeList = new ArrayList<>(); + } + @Test public void testFindWidgetsBundlesByTenantId() { UUID tenantId1 = Uuids.timeBased(); @@ -245,6 +313,51 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { assertEquals(widgetsBundle3, widgetsBundles5.getData().get(0)); } + @Test + public void testTagsSearchInFindAllWidgetsBundlesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(systemWidgetBundle.getId()); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + widgetsBundles = new ArrayList<>(); + widgetTypeList = new ArrayList<>(); + } + @Test public void testSearchTextNotFound() { UUID tenantId = Uuids.timeBased(); @@ -279,6 +392,15 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { } } + private WidgetsBundle createSystemWidgetBundle(String alias, String title) { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setAlias(alias); + widgetsBundle.setTitle(title); + widgetsBundle.setTenantId(TenantId.SYS_TENANT_ID); + widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); + return widgetsBundleDao.save(TenantId.SYS_TENANT_ID, widgetsBundle); + } + WidgetType createAndSaveWidgetType(TenantId tenantId, int number, String name, String description, String[] tags) { WidgetTypeDetails widgetType = new WidgetTypeDetails(); widgetType.setTenantId(tenantId);