@ -27,11 +27,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.util.CollectionUtils ;
import org.thingsboard.common.util.ThingsBoardThreadFactory ;
import org.thingsboard.server.common.data.Customer ;
import org.thingsboard.server.common.data.Dashboard ;
import org.thingsboard.server.common.data.Device ;
import org.thingsboard.server.common.data.EntityView ;
import org.thingsboard.server.common.data.Tenant ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.alarm.Alarm ;
import org.thingsboard.server.common.data.alarm.AlarmInfo ;
@ -40,15 +35,10 @@ import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity ;
import org.thingsboard.server.common.data.alarm.AlarmStatus ;
import org.thingsboard.server.common.data.alarm.EntityAlarm ;
import org.thingsboard.server.common.data.asset.Asset ;
import org.thingsboard.server.common.data.exception.ApiUsageLimitsExceededException ;
import org.thingsboard.server.common.data.id.AlarmId ;
import org.thingsboard.server.common.data.id.AssetId ;
import org.thingsboard.server.common.data.id.CustomerId ;
import org.thingsboard.server.common.data.id.DashboardId ;
import org.thingsboard.server.common.data.id.DeviceId ;
import org.thingsboard.server.common.data.id.EntityId ;
import org.thingsboard.server.common.data.id.EntityViewId ;
import org.thingsboard.server.common.data.id.TenantId ;
import org.thingsboard.server.common.data.id.UserId ;
import org.thingsboard.server.common.data.page.PageData ;
@ -58,15 +48,9 @@ import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.EntityRelationsQuery ;
import org.thingsboard.server.common.data.relation.EntitySearchDirection ;
import org.thingsboard.server.common.data.relation.RelationsSearchParameters ;
import org.thingsboard.server.dao.asset.AssetService ;
import org.thingsboard.server.dao.customer.CustomerService ;
import org.thingsboard.server.dao.dashboard.DashboardService ;
import org.thingsboard.server.dao.device.DeviceService ;
import org.thingsboard.server.dao.entity.AbstractEntityService ;
import org.thingsboard.server.dao.entity.EntityService ;
import org.thingsboard.server.dao.entityview.EntityViewService ;
import org.thingsboard.server.dao.service.DataValidator ;
import org.thingsboard.server.dao.tenant.TenantService ;
import org.thingsboard.server.dao.user.UserService ;
import javax.annotation.Nullable ;
@ -102,24 +86,6 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
@Autowired
private UserService userService ;
@Autowired
private TenantService tenantService ;
@Autowired
private CustomerService customerService ;
@Autowired
private DashboardService dashboardService ;
@Autowired
private AssetService assetService ;
@Autowired
private DeviceService deviceService ;
@Autowired
private EntityViewService entityViewService ;
@Autowired
private DataValidator < Alarm > alarmDataValidator ;
@ -190,8 +156,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
if ( alarm = = null ) {
return new AlarmOperationResult ( alarm , false ) ;
}
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( tenantId , alarm ) ;
AlarmOperationResult result = new AlarmOperationResult ( alarm , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( tenantId , alarm ) ;
AlarmOperationResult result = new AlarmOperationResult ( alarmInfo , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) ) ;
deleteEntityRelations ( tenantId , alarm . getId ( ) ) ;
alarmDao . removeById ( tenantId , alarm . getUuidId ( ) ) ;
return result ;
@ -201,8 +167,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
log . debug ( "New Alarm : {}" , alarm ) ;
Alarm saved = alarmDao . save ( alarm . getTenantId ( ) , alarm ) ;
List < EntityId > propagatedEntitiesList = createEntityAlarmRecords ( saved ) ;
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( alarm . getTenantId ( ) , alarm ) ;
return new AlarmOperationResult ( saved , true , true , propagatedEntitiesList , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( alarm . getTenantId ( ) , alarm ) ;
return new AlarmOperationResult ( alarmInfo , true , true , propagatedEntitiesList ) ;
}
private List < EntityId > createEntityAlarmRecords ( Alarm alarm ) throws InterruptedException , ExecutionException {
@ -257,8 +223,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
} else {
propagatedEntitiesList = new ArrayList < > ( getPropagationEntityIds ( result ) ) ;
}
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( newAlarm . getTenantId ( ) , newAlarm ) ;
return new AlarmOperationResult ( result , true , propagatedEntitiesList , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( newAlarm . getTenantId ( ) , newAlarm ) ;
return new AlarmOperationResult ( alarmInfo , true , propagatedEntitiesList ) ;
}
@Override
@ -275,8 +241,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
alarm . setStatus ( newStatus ) ;
alarm . setAckTs ( ackTime ) ;
alarm = alarmDao . save ( alarm . getTenantId ( ) , alarm ) ;
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarm , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarmInfo , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) ) ;
}
}
} ) ;
@ -299,8 +265,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
alarm . setDetails ( details ) ;
}
alarm = alarmDao . save ( alarm . getTenantId ( ) , alarm ) ;
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarm , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarmInfo , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) ) ;
}
}
} ) ;
@ -318,8 +284,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
alarm . setAssigneeId ( assigneeId ) ;
alarm . setAssignTs ( assignTime ) ;
alarm = alarmDao . save ( alarm . getTenantId ( ) , alarm ) ;
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarm , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarmInfo , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) ) ;
}
}
} ) ;
@ -337,8 +303,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
alarm . setAssigneeId ( null ) ;
alarm . setAssignTs ( assignTime ) ;
alarm = alarmDao . save ( alarm . getTenantId ( ) , alarm ) ;
AlarmAdditional Info alarmAdditional Info = getAlarmAdditional Info ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarm , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) , alarmAdditionalInfo ) ;
AlarmInfo alarmInfo = getAlarmInfo ( tenantId , alarm ) ;
return new AlarmOperationResult ( alarmInfo , true , new ArrayList < > ( getPropagationEntityIds ( alarm ) ) ) ;
}
}
} ) ;
@ -362,15 +328,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
public ListenableFuture < AlarmInfo > findAlarmInfoByIdAsync ( TenantId tenantId , AlarmId alarmId ) {
log . trace ( "Executing findAlarmInfoByIdAsync [{}]" , alarmId ) ;
validateId ( alarmId , "Incorrect alarmId " + alarmId ) ;
return Futures . transformAsync ( alarmDao . findAlarmByIdAsync ( tenantId , alarmId . getId ( ) ) ,
a - > {
AlarmInfo alarmInfo = new AlarmInfo ( a ) ;
return Futures . transform (
entityService . fetchEntityNameAsync ( tenantId , alarmInfo . getOriginator ( ) ) , originatorName - > {
alarmInfo . setOriginatorName ( originatorName ) ;
return alarmInfo ;
} , MoreExecutors . directExecutor ( ) ) ;
} , MoreExecutors . directExecutor ( ) ) ;
return Futures . transform ( alarmDao . findAlarmByIdAsync ( tenantId , alarmId . getId ( ) ) ,
a - > getAlarmInfo ( tenantId , a ) , MoreExecutors . directExecutor ( ) ) ;
}
@Override
@ -478,7 +437,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
private void createEntityAlarmRecord ( TenantId tenantId , EntityId entityId , Alarm alarm ) {
// TODO Add ability to automatically assign created alarm to some user
EntityAlarm entityAlarm = new EntityAlarm ( tenantId , entityId , alarm . getCreatedTime ( ) , alarm . getType ( ) , alarm . getCustomerId ( ) , null , alarm . getId ( ) ) ;
EntityAlarm entityAlarm = new EntityAlarm ( tenantId , entityId , alarm . getCreatedTime ( ) , alarm . getType ( ) , alarm . getCustomerId ( ) , null , alarm . getId ( ) ) ;
try {
alarmDao . createEntityAlarmRecord ( entityAlarm ) ;
} catch ( Exception e ) {
@ -498,62 +457,22 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
return function . apply ( entity ) ;
}
private AlarmAdditionalInfo getAlarmAdditionalInfo ( TenantId tenantId , Alarm alarm ) {
AlarmAdditionalInfo . AlarmAdditionalInfoBuilder builder = AlarmAdditionalInfo . builder ( ) ;
private AlarmInfo getAlarmInfo ( TenantId tenantId , Alarm alarm ) {
String originatorName = null ;
String originatorLabel = null ;
String assigneeFirstName = null ;
String assigneeLastName = null ;
String assigneeEmail = null ;
addAlarmOriginatorNameAndLabel ( tenantId , alarm . getOriginator ( ) , builder ) ;
originatorName = entityService . fetchEntityName ( tenantId , alarm . getOriginator ( ) ) ;
originatorLabel = entityService . fetchEntityLabel ( tenantId , alarm . getOriginator ( ) ) ;
if ( alarm . getAssigneeId ( ) ! = null ) {
User assignedUser = userService . findUserById ( tenantId , alarm . getAssigneeId ( ) ) ;
builder . firstName ( assignedUser . getFirstName ( ) ) ;
builder . lastName ( assignedUser . getLastName ( ) ) ;
builder . email ( assignedUser . getEmail ( ) ) ;
assigneeFirstName = assignedUser . getFirstName ( ) ;
assigneeLastName = assignedUser . getLastName ( ) ;
assigneeEmail = assignedUser . getEmail ( ) ;
}
return builder . build ( ) ;
}
private void addAlarmOriginatorNameAndLabel ( TenantId tenantId , EntityId originatorId , AlarmAdditionalInfo . AlarmAdditionalInfoBuilder builder ) {
String originatorName = "Unknown" ;
String originatorLabel = "Unknown" ;
switch ( originatorId . getEntityType ( ) ) {
case TENANT :
Tenant tenantOriginator = tenantService . findTenantById ( ( TenantId ) originatorId ) ;
originatorName = tenantOriginator . getTitle ( ) ;
originatorLabel = tenantOriginator . getEmail ( ) ;
break ;
case CUSTOMER :
Customer customerOriginator = customerService . findCustomerById ( tenantId , ( CustomerId ) originatorId ) ;
originatorName = customerOriginator . getTitle ( ) ;
originatorLabel = customerOriginator . getEmail ( ) ;
break ;
case USER :
User userOriginator = userService . findUserById ( tenantId , ( UserId ) originatorId ) ;
originatorName = userOriginator . getEmail ( ) ;
originatorLabel = userOriginator . getName ( ) ;
break ;
case DASHBOARD :
Dashboard dashboardOriginator = dashboardService . findDashboardById ( tenantId , ( DashboardId ) originatorId ) ;
originatorName = dashboardOriginator . getTitle ( ) ;
originatorLabel = dashboardOriginator . getName ( ) ;
break ;
case ASSET :
Asset assetOriginator = assetService . findAssetById ( tenantId , ( AssetId ) originatorId ) ;
originatorName = assetOriginator . getName ( ) ;
originatorLabel = assetOriginator . getLabel ( ) ;
break ;
case DEVICE :
Device deviceOriginator = deviceService . findDeviceById ( tenantId , ( DeviceId ) originatorId ) ;
originatorName = deviceOriginator . getName ( ) ;
originatorLabel = deviceOriginator . getLabel ( ) ;
break ;
case ENTITY_VIEW :
EntityView entityViewOriginator = entityViewService . findEntityViewById ( tenantId , ( EntityViewId ) originatorId ) ;
originatorName = entityViewOriginator . getName ( ) ;
originatorLabel = entityViewOriginator . getType ( ) ; // TODO Should we use something else?
break ;
}
builder . originatorName ( originatorName ) ;
builder . originatorLabel ( originatorLabel ) ;
return new AlarmInfo ( alarm , originatorName , originatorLabel , assigneeFirstName , assigneeLastName , assigneeEmail ) ;
}
}