diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 5c0044836c..b133f03439 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -241,7 +241,7 @@ spring: password: "${SPRING_DATASOURCE_PASSWORD:}" -# Postgres DAO Configuration +# PostgreSQL DAO Configuration #spring: # data: # jpa: diff --git a/application/src/main/scripts/windows/install.bat b/application/src/main/scripts/windows/install.bat index b49ca84628..b54c0d9c9a 100644 --- a/application/src/main/scripts/windows/install.bat +++ b/application/src/main/scripts/windows/install.bat @@ -82,6 +82,8 @@ SET SQL_DATA_FOLDER=%BASE%\data\sql SET jarfile=%BASE%\lib\${pkg.name}.jar SET installDir=%BASE%\data +PUSHD %BASE%\conf + java -cp %jarfile% -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication^ -Dinstall.data_dir=%installDir%^ -Dinstall.load_demo=%loadDemo%^ @@ -92,8 +94,10 @@ java -cp %jarfile% -Dloader.main=org.thingsboard.server.ThingsboardInstallApplic if errorlevel 1 ( @echo ThingsBoard installation failed! + POPD exit /b %errorlevel% ) +POPD %BASE%${pkg.name}.exe install diff --git a/application/src/main/scripts/windows/upgrade.bat b/application/src/main/scripts/windows/upgrade.bat index 9039d50a6c..d1381bb495 100644 --- a/application/src/main/scripts/windows/upgrade.bat +++ b/application/src/main/scripts/windows/upgrade.bat @@ -26,6 +26,8 @@ SET SQL_DATA_FOLDER=%BASE%\data\sql SET jarfile=%BASE%\lib\${pkg.name}.jar SET installDir=%BASE%\data +PUSHD %BASE%\conf + java -cp %jarfile% -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication^ -Dinstall.data_dir=%installDir%^ -Dspring.jpa.hibernate.ddl-auto=none^ @@ -36,8 +38,10 @@ java -cp %jarfile% -Dloader.main=org.thingsboard.server.ThingsboardInstallApplic if errorlevel 1 ( @echo ThingsBoard upgrade failed! + POPD exit /b %errorlevel% ) +POPD @ECHO ThingsBoard upgraded successfully! diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 4fb9db5f6e..3486960375 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -118,17 +118,23 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ private Alarm createAlarm(Alarm alarm) throws InterruptedException, ExecutionException { log.debug("New Alarm : {}", alarm); Alarm saved = alarmDao.save(alarm); - EntityRelationsQuery query = new EntityRelationsQuery(); - query.setParameters(new RelationsSearchParameters(saved.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE)); - List parentEntities = relationService.findByQuery(query).get().stream().map(r -> r.getFrom()).collect(Collectors.toList()); - for (EntityId parentId : parentEntities) { - createAlarmRelation(parentId, saved.getId(), saved.getStatus(), true); - } - createAlarmRelation(alarm.getOriginator(), saved.getId(), saved.getStatus(), true); + createAlarmRelations(saved); return saved; } - protected ListenableFuture updateAlarm(Alarm update) { + private void createAlarmRelations(Alarm alarm) throws InterruptedException, ExecutionException { + if (alarm.isPropagate()) { + EntityRelationsQuery query = new EntityRelationsQuery(); + query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE)); + List parentEntities = relationService.findByQuery(query).get().stream().map(r -> r.getFrom()).collect(Collectors.toList()); + for (EntityId parentId : parentEntities) { + createAlarmRelation(parentId, alarm.getId(), alarm.getStatus(), true); + } + } + createAlarmRelation(alarm.getOriginator(), alarm.getId(), alarm.getStatus(), true); + } + + private ListenableFuture updateAlarm(Alarm update) { alarmDataValidator.validate(update); return getAndUpdate(update.getId(), new Function() { @Nullable @@ -146,8 +152,17 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ private Alarm updateAlarm(Alarm oldAlarm, Alarm newAlarm) { AlarmStatus oldStatus = oldAlarm.getStatus(); AlarmStatus newStatus = newAlarm.getStatus(); + boolean oldPropagate = oldAlarm.isPropagate(); + boolean newPropagate = newAlarm.isPropagate(); Alarm result = alarmDao.save(merge(oldAlarm, newAlarm)); - if (oldStatus != newStatus) { + if (!oldPropagate && newPropagate) { + try { + createAlarmRelations(result); + } catch (InterruptedException | ExecutionException e) { + log.warn("Failed to update alarm relations [{}]", result, e); + throw new RuntimeException(e); + } + } else if (oldStatus != newStatus) { updateRelations(oldAlarm, oldStatus, newStatus); } return result; @@ -315,16 +330,19 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ existing.setStatus(alarm.getStatus()); existing.setSeverity(alarm.getSeverity()); existing.setDetails(alarm.getDetails()); + existing.setPropagate(existing.isPropagate() || alarm.isPropagate()); return existing; } private void updateRelations(Alarm alarm, AlarmStatus oldStatus, AlarmStatus newStatus) { try { - EntityRelationsQuery query = new EntityRelationsQuery(); - query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE)); - List parentEntities = relationService.findByQuery(query).get().stream().map(r -> r.getFrom()).collect(Collectors.toList()); - for (EntityId parentId : parentEntities) { - updateAlarmRelation(parentId, alarm.getId(), oldStatus, newStatus); + if (alarm.isPropagate()) { + EntityRelationsQuery query = new EntityRelationsQuery(); + query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE)); + List parentEntities = relationService.findByQuery(query).get().stream().map(r -> r.getFrom()).collect(Collectors.toList()); + for (EntityId parentId : parentEntities) { + updateAlarmRelation(parentId, alarm.getId(), oldStatus, newStatus); + } } updateAlarmRelation(alarm.getOriginator(), alarm.getId(), oldStatus, newStatus); } catch (ExecutionException | InterruptedException e) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java index e94fb4d223..ee324442e9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import org.thingsboard.server.common.data.UUIDConverter; import org.thingsboard.server.common.data.id.ComponentDescriptorId; import org.thingsboard.server.common.data.page.TextPageLink; @@ -102,11 +103,13 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao