Filter devices according to their devicetype

geofence-revoke-fix
prathabanKavin 5 months ago
parent 68a4de92d6
commit 953f72afdc

@ -1720,8 +1720,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
int appReleaseId = applicationReleaseDTO.getId(); int appReleaseId = applicationReleaseDTO.getId();
int deviceTypeId = applicationDTO.getDeviceTypeId();
List<SubscriptionsDTO> groupDetailsWithDevices = new ArrayList<>(); List<SubscriptionsDTO> groupDetailsWithDevices = new ArrayList<>();
List<GroupSubscriptionDTO> groupDetails = List<GroupSubscriptionDTO> groupDetails =
@ -1737,7 +1738,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
// Retrieve group details and device IDs for the group using the service layer // Retrieve group details and device IDs for the group using the service layer
GroupDetailsDTO groupDetailWithDevices = GroupDetailsDTO groupDetailWithDevices =
groupManagementProviderService.getGroupDetailsWithDevices(groupName, offset, limit); groupManagementProviderService.getGroupDetailsWithDevices(groupName, deviceTypeId, offset, limit);
SubscriptionsDTO groupDetailDTO = new SubscriptionsDTO(); SubscriptionsDTO groupDetailDTO = new SubscriptionsDTO();
groupDetailDTO.setId(groupDetailWithDevices.getGroupId()); groupDetailDTO.setId(groupDetailWithDevices.getGroupId());
@ -1910,8 +1911,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
int appReleaseId = applicationReleaseDTO.getId(); int appReleaseId = applicationReleaseDTO.getId();
int deviceTypeId = applicationDTO.getDeviceTypeId();
List<SubscriptionsDTO> userSubscriptionsWithDevices = new ArrayList<>(); List<SubscriptionsDTO> userSubscriptionsWithDevices = new ArrayList<>();
List<SubscriptionsDTO> userSubscriptions = List<SubscriptionsDTO> userSubscriptions =
@ -1927,7 +1929,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
// Retrieve owner details and device IDs for the user using the service layer // Retrieve owner details and device IDs for the user using the service layer
OwnerWithDeviceDTO ownerDetailsWithDevices = OwnerWithDeviceDTO ownerDetailsWithDevices =
deviceManagementProviderService.getOwnersWithDeviceIds(userName); deviceManagementProviderService.getOwnersWithDeviceIds(userName, deviceTypeId);
SubscriptionsDTO userSubscriptionDTO = new SubscriptionsDTO(); SubscriptionsDTO userSubscriptionDTO = new SubscriptionsDTO();
userSubscriptionDTO.setName(userSubscription.getName()); userSubscriptionDTO.setName(userSubscription.getName());
@ -2097,8 +2099,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
int appReleaseId = applicationReleaseDTO.getId(); int appReleaseId = applicationReleaseDTO.getId();
int deviceTypeId = applicationDTO.getDeviceTypeId();
List<SubscriptionsDTO> roleSubscriptionsWithDevices = new ArrayList<>(); List<SubscriptionsDTO> roleSubscriptionsWithDevices = new ArrayList<>();
List<SubscriptionsDTO> roleSubscriptions = List<SubscriptionsDTO> roleSubscriptions =
@ -2139,7 +2142,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
for (String user : users) { for (String user : users) {
OwnerWithDeviceDTO ownerDetailsWithDevices; OwnerWithDeviceDTO ownerDetailsWithDevices;
try { try {
ownerDetailsWithDevices = deviceManagementProviderService.getOwnersWithDeviceIds(user); ownerDetailsWithDevices = deviceManagementProviderService.getOwnersWithDeviceIds(user, deviceTypeId);
} catch (DeviceManagementDAOException e) { } catch (DeviceManagementDAOException e) {
throw new ApplicationManagementException("Error retrieving owner details with devices for user: " + user, e); throw new ApplicationManagementException("Error retrieving owner details with devices for user: " + user, e);
} }
@ -2307,7 +2310,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
int appReleaseId = applicationReleaseDTO.getId(); int appReleaseId = applicationReleaseDTO.getId();
int deviceTypeId = applicationDTO.getDeviceTypeId();
DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService(); DeviceManagementProviderService deviceManagementProviderService = HelperUtil.getDeviceManagementProviderService();
List<DeviceSubscriptionDTO> deviceSubscriptions = List<DeviceSubscriptionDTO> deviceSubscriptions =
@ -2321,7 +2326,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
} }
List<DeviceDetailsDTO> allDevices = List<DeviceDetailsDTO> allDevices =
deviceManagementProviderService.getDevicesByTenantId(tenantId); deviceManagementProviderService.getDevicesByTenantId(tenantId, deviceTypeId);
List<Integer> deviceIds = allDevices.stream() List<Integer> deviceIds = allDevices.stream()
.map(DeviceDetailsDTO::getDeviceId) .map(DeviceDetailsDTO::getDeviceId)
@ -2493,7 +2498,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(uuid, tenantId);
int appReleaseId = applicationReleaseDTO.getId(); int appReleaseId = applicationReleaseDTO.getId();
int deviceTypeId = applicationDTO.getDeviceTypeId();
List<DeviceSubscriptionDTO> allSubscriptions = List<DeviceSubscriptionDTO> allSubscriptions =
subscriptionDAO.getAllSubscriptionsDetails(appReleaseId, unsubscribe, tenantId, offset, limit); subscriptionDAO.getAllSubscriptionsDetails(appReleaseId, unsubscribe, tenantId, offset, limit);
@ -2522,7 +2529,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
statusCounts.put("NEW", 0); statusCounts.put("NEW", 0);
List<DeviceDetailsDTO> allDevices = List<DeviceDetailsDTO> allDevices =
deviceManagementProviderService.getDevicesByTenantId(tenantId); deviceManagementProviderService.getDevicesByTenantId(tenantId, deviceTypeId);
for (DeviceDetailsDTO device : allDevices) { for (DeviceDetailsDTO device : allDevices) {
Integer deviceId = device.getDeviceId(); Integer deviceId = device.getDeviceId();

@ -106,7 +106,7 @@ public interface EnrollmentDAO {
* @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user * @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user
* @throws DeviceManagementDAOException if an error occurs while fetching the data * @throws DeviceManagementDAOException if an error occurs while fetching the data
*/ */
OwnerWithDeviceDTO getOwnersWithDevices(String owner, List<String> allowingDeviceStatuses, int tenantId) throws DeviceManagementDAOException; OwnerWithDeviceDTO getOwnersWithDevices(String owner, List<String> allowingDeviceStatuses, int tenantId, int deviceTypeId) throws DeviceManagementDAOException;
/** /**
* Retrieves a list of device IDs with owners and device status. * Retrieves a list of device IDs with owners and device status.
@ -123,8 +123,10 @@ public interface EnrollmentDAO {
* Retrieves owners and the list of device IDs with device status. * Retrieves owners and the list of device IDs with device status.
* *
* @param tenantId the ID of the tenant * @param tenantId the ID of the tenant
* @param allowingDeviceStatuses the allowed device statuses of devices
* @param deviceTypeId the device type id
* @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user * @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user
* @throws DeviceManagementDAOException if an error occurs while fetching the data * @throws DeviceManagementDAOException if an error occurs while fetching the data
*/ */
List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, List<String> allowingDeviceStatuses) throws DeviceManagementDAOException; List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, List<String> allowingDeviceStatuses, int deviceTypeId) throws DeviceManagementDAOException;
} }

@ -473,13 +473,15 @@ public interface GroupDAO {
* Get group details and list of device IDs related to the group. * Get group details and list of device IDs related to the group.
* *
* @param groupName Group name * @param groupName Group name
* @param allowingDeviceStatuses the statuses of devices
* @param deviceTypeId the device type id
* @param tenantId Tenant ID * @param tenantId Tenant ID
* @param offset the offset for the data set * @param offset the offset for the data set
* @param limit the limit for the data set * @param limit the limit for the data set
* @return {@link GroupDetailsDTO} which containing group details and a list of device IDs * @return {@link GroupDetailsDTO} which containing group details and a list of device IDs
* @throws GroupManagementDAOException if an error occurs while retrieving the group details and devices * @throws GroupManagementDAOException if an error occurs while retrieving the group details and devices
*/ */
GroupDetailsDTO getGroupDetailsWithDevices(String groupName, List<String> allowingDeviceStatuses, int tenantId, int offset, int limit) GroupDetailsDTO getGroupDetailsWithDevices(String groupName, List<String> allowingDeviceStatuses, int deviceTypeId, int tenantId, int offset, int limit)
throws GroupManagementDAOException; throws GroupManagementDAOException;
} }

@ -564,7 +564,7 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
} }
@Override @Override
public OwnerWithDeviceDTO getOwnersWithDevices(String owner, List<String> allowingDeviceStatuses, int tenantId) public OwnerWithDeviceDTO getOwnersWithDevices(String owner, List<String> allowingDeviceStatuses, int tenantId, int deviceTypeId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn = null; Connection conn = null;
OwnerWithDeviceDTO ownerDetails = new OwnerWithDeviceDTO(); OwnerWithDeviceDTO ownerDetails = new OwnerWithDeviceDTO();
@ -582,15 +582,16 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
String sql = "SELECT e.DEVICE_ID, e.OWNER, e.STATUS AS DEVICE_STATUS, d.NAME AS DEVICE_NAME, e.DEVICE_TYPE AS DEVICE_TYPE, e.DEVICE_IDENTIFICATION AS DEVICE_IDENTIFICATION " + String sql = "SELECT e.DEVICE_ID, e.OWNER, e.STATUS AS DEVICE_STATUS, d.NAME AS DEVICE_NAME, e.DEVICE_TYPE AS DEVICE_TYPE, e.DEVICE_IDENTIFICATION AS DEVICE_IDENTIFICATION " +
"FROM DM_ENROLMENT e " + "FROM DM_ENROLMENT e " +
"JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " + "JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " +
"WHERE e.OWNER = ? AND e.TENANT_ID = ? AND e.STATUS IN (" + deviceFilters.toString() + ")"; "WHERE e.OWNER = ? AND e.TENANT_ID = ? AND d.DEVICE_TYPE_ID = ? AND e.STATUS IN (" + deviceFilters.toString() + ")";
try { try {
conn = this.getConnection(); conn = this.getConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, owner); stmt.setString(1, owner);
stmt.setInt(2, tenantId); stmt.setInt(2, tenantId);
stmt.setInt(3, deviceTypeId);
for (int i = 0; i < allowingDeviceStatuses.size(); i++) { for (int i = 0; i < allowingDeviceStatuses.size(); i++) {
stmt.setString(3 + i, allowingDeviceStatuses.get(i)); stmt.setString(4 + i, allowingDeviceStatuses.get(i));
} }
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -654,7 +655,7 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
} }
@Override @Override
public List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, List<String> allowingDeviceStatuses) public List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, List<String> allowingDeviceStatuses, int deviceTypeId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<DeviceDetailsDTO> devices = new ArrayList<>(); List<DeviceDetailsDTO> devices = new ArrayList<>();
if (allowingDeviceStatuses.isEmpty()) { if (allowingDeviceStatuses.isEmpty()) {
@ -669,9 +670,10 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
} }
} }
String sql = "SELECT DEVICE_ID, OWNER, STATUS, DEVICE_TYPE, DEVICE_IDENTIFICATION " + String sql = "SELECT e.DEVICE_ID, e.OWNER, e.STATUS, e.DEVICE_TYPE, e.DEVICE_IDENTIFICATION " +
"FROM DM_ENROLMENT " + "FROM DM_ENROLMENT e " +
"WHERE TENANT_ID = ? AND STATUS IN (" + deviceFilters.toString() + ")"; "JOIN DM_DEVICE d ON e.DEVICE_ID = d.ID " +
"WHERE e.TENANT_ID = ? AND e.STATUS IN (" + deviceFilters.toString() + ") AND d.DEVICE_TYPE_ID = ?";
Connection conn = null; Connection conn = null;
try { try {
@ -682,6 +684,7 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
for (String status : allowingDeviceStatuses) { for (String status : allowingDeviceStatuses) {
stmt.setString(index++, status); stmt.setString(index++, status);
} }
stmt.setInt(index++, deviceTypeId);
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -702,6 +705,4 @@ public abstract class AbstractEnrollmentDAOImpl implements EnrollmentDAO {
} }
return devices; return devices;
} }
} }

@ -1441,7 +1441,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
} }
@Override @Override
public GroupDetailsDTO getGroupDetailsWithDevices(String groupName, List<String> allowedStatuses, int tenantId, int offset, int limit) public GroupDetailsDTO getGroupDetailsWithDevices(String groupName, List<String> allowedStatuses, int deviceTypeId, int tenantId, int offset, int limit)
throws GroupManagementDAOException { throws GroupManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to get group details and device IDs for group: " + groupName); log.debug("Request received in DAO Layer to get group details and device IDs for group: " + groupName);
@ -1481,6 +1481,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
"WHERE " + "WHERE " +
" g.GROUP_NAME = ? " + " g.GROUP_NAME = ? " +
" AND g.TENANT_ID = ? " + " AND g.TENANT_ID = ? " +
" AND d.DEVICE_TYPE_ID = ? " +
" AND e.STATUS IN (" + deviceFilters.toString() + ") " + " AND e.STATUS IN (" + deviceFilters.toString() + ") " +
"LIMIT ? OFFSET ?"; "LIMIT ? OFFSET ?";
@ -1491,6 +1492,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
int index = 1; int index = 1;
stmt.setString(index++, groupName); stmt.setString(index++, groupName);
stmt.setInt(index++, tenantId); stmt.setInt(index++, tenantId);
stmt.setInt(index++, deviceTypeId);
for (String status : allowedStatuses) { for (String status : allowedStatuses) {
stmt.setString(index++, status); stmt.setString(index++, status);
} }

@ -1082,10 +1082,11 @@ public interface DeviceManagementProviderService {
* Get owner details and device IDs for a given owner and tenant. * Get owner details and device IDs for a given owner and tenant.
* *
* @param owner the name of the owner. * @param owner the name of the owner.
* @param deviceTypeId the device type id
* @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user. * @return {@link OwnerWithDeviceDTO} which contains a list of devices related to a user.
* @throws DeviceManagementException if an error occurs while fetching owner details. * @throws DeviceManagementException if an error occurs while fetching owner details.
*/ */
OwnerWithDeviceDTO getOwnersWithDeviceIds(String owner) throws DeviceManagementDAOException; OwnerWithDeviceDTO getOwnersWithDeviceIds(String owner, int deviceTypeId) throws DeviceManagementDAOException;
/** /**
* Get owner details and device IDs for a given owner and tenant. * Get owner details and device IDs for a given owner and tenant.
@ -1099,10 +1100,11 @@ public interface DeviceManagementProviderService {
/** /**
* Get owner details and device IDs for a given owner and tenant. * Get owner details and device IDs for a given owner and tenant.
* @param tenantId the tenant id which devices need to be retried * @param tenantId the tenant id which devices need to be retried
* @param deviceTypeId the device type id
* @return {@link DeviceDetailsDTO} which contains devices details. * @return {@link DeviceDetailsDTO} which contains devices details.
* @throws DeviceManagementException if an error occurs while fetching owner details. * @throws DeviceManagementException if an error occurs while fetching owner details.
*/ */
List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId) throws DeviceManagementDAOException; List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, int deviceTypeId) throws DeviceManagementDAOException;
/** /**
* Get operation details by operation code. * Get operation details by operation code.

@ -5354,7 +5354,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
} }
@Override @Override
public OwnerWithDeviceDTO getOwnersWithDeviceIds(String owner) throws DeviceManagementDAOException { public OwnerWithDeviceDTO getOwnersWithDeviceIds(String owner, int deviceTypeId) throws DeviceManagementDAOException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
OwnerWithDeviceDTO ownerWithDeviceDTO; OwnerWithDeviceDTO ownerWithDeviceDTO;
@ -5365,7 +5365,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
try { try {
DeviceManagementDAOFactory.openConnection(); DeviceManagementDAOFactory.openConnection();
ownerWithDeviceDTO = this.enrollmentDAO.getOwnersWithDevices(owner, allowingDeviceStatuses, tenantId); ownerWithDeviceDTO = this.enrollmentDAO.getOwnersWithDevices(owner, allowingDeviceStatuses, tenantId, deviceTypeId);
if (ownerWithDeviceDTO == null) { if (ownerWithDeviceDTO == null) {
String msg = "No data found for owner: " + owner; String msg = "No data found for owner: " + owner;
log.error(msg); log.error(msg);
@ -5416,7 +5416,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
} }
@Override @Override
public List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId) throws DeviceManagementDAOException { public List<DeviceDetailsDTO> getDevicesByTenantId(int tenantId, int deviceTypeId) throws DeviceManagementDAOException {
List<DeviceDetailsDTO> devices; List<DeviceDetailsDTO> devices;
List<String> allowingDeviceStatuses = new ArrayList<>(); List<String> allowingDeviceStatuses = new ArrayList<>();
allowingDeviceStatuses.add(EnrolmentInfo.Status.ACTIVE.toString()); allowingDeviceStatuses.add(EnrolmentInfo.Status.ACTIVE.toString());
@ -5424,7 +5424,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
allowingDeviceStatuses.add(EnrolmentInfo.Status.UNREACHABLE.toString()); allowingDeviceStatuses.add(EnrolmentInfo.Status.UNREACHABLE.toString());
try { try {
DeviceManagementDAOFactory.openConnection(); DeviceManagementDAOFactory.openConnection();
devices = enrollmentDAO.getDevicesByTenantId(tenantId, allowingDeviceStatuses); devices = enrollmentDAO.getDevicesByTenantId(tenantId, allowingDeviceStatuses, deviceTypeId);
if (devices == null || devices.isEmpty()) { if (devices == null || devices.isEmpty()) {
String msg = "No devices found for tenant ID: " + tenantId; String msg = "No devices found for tenant ID: " + tenantId;
log.error(msg); log.error(msg);

@ -377,11 +377,12 @@ public interface GroupManagementProviderService {
* Get group details and device IDs for a given group name. * Get group details and device IDs for a given group name.
* *
* @param groupName the name of the group. * @param groupName the name of the group.
* @param deviceTypeId the device type id
* @param offset the offset for the data set * @param offset the offset for the data set
* @param limit the limit for the data set * @param limit the limit for the data set
* @return {@link GroupDetailsDTO} which containing group details and a list of device IDs * @return {@link GroupDetailsDTO} which containing group details and a list of device IDs
* @throws GroupManagementException if an error occurs while fetching group details. * @throws GroupManagementException if an error occurs while fetching group details.
*/ */
GroupDetailsDTO getGroupDetailsWithDevices(String groupName, int offset, int limit) throws GroupManagementException; GroupDetailsDTO getGroupDetailsWithDevices(String groupName, int deviceTypeId, int offset, int limit) throws GroupManagementException;
} }

@ -1684,7 +1684,7 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
} }
@Override @Override
public GroupDetailsDTO getGroupDetailsWithDevices(String groupName, int offset, int limit) public GroupDetailsDTO getGroupDetailsWithDevices(String groupName, int deviceTypeId, int offset, int limit)
throws GroupManagementException { throws GroupManagementException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Retrieving group details and device IDs for group: " + groupName); log.debug("Retrieving group details and device IDs for group: " + groupName);
@ -1698,7 +1698,7 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
try { try {
GroupManagementDAOFactory.openConnection(); GroupManagementDAOFactory.openConnection();
groupDetailsWithDevices = this.groupDAO.getGroupDetailsWithDevices(groupName, allowingDeviceStatuses, tenantId, offset, limit); groupDetailsWithDevices = this.groupDAO.getGroupDetailsWithDevices(groupName, allowingDeviceStatuses, deviceTypeId, tenantId, offset, limit);
} catch (GroupManagementDAOException | SQLException e) { } catch (GroupManagementDAOException | SQLException e) {
String msg = "Error occurred while retrieving group details and device IDs for group: " + groupName; String msg = "Error occurred while retrieving group details and device IDs for group: " + groupName;
log.error(msg, e); log.error(msg, e);

Loading…
Cancel
Save